react-zeugma 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -109,9 +109,9 @@ The context provider that sets up the drag-and-drop state machine, monitors acti
109
109
  | `onFullscreenChange` | `(paneId: string \| null) => void` | No | Callback triggered when a pane enters or leaves fullscreen. |
110
110
  | `onRemove` | `(paneId: string) => void` | No | Callback triggered when a pane is closed/removed from the layout tree. |
111
111
  | `dragActivationDistance` | `number` | No | Minimum pointer drag distance (in pixels) required to activate dragging. Defaults to `8`. |
112
+ | `enableDragToDismiss` | `boolean` | No | If true, enables the drag-out-to-dismiss gesture where panes can be closed by dragging them outside. Defaults to `false`. |
112
113
  | `dragOutThreshold` | `number` | No | Distance in pixels outside the container bounds required to trigger drag-out mode. Defaults to `60`. |
113
114
  | `onDragOutChange` | `(activeId: string \| null) => void` | No | Callback triggered when the drag-out state changes. Receives the pane ID or `null`. |
114
- | `onDragOut` | `(activeId: string) => void` | No | Callback triggered when a pane is dropped outside the container. If not provided, the pane is automatically removed. |
115
115
  | `onDragStart` | `(activeId: string) => void` | No | Callback triggered when dragging starts on a pane. |
116
116
  | `onDragEnd` | `(activeId: string, overId: string \| null, dropAction: any) => void` | No | Callback triggered when dragging ends, providing swap or split details. The `overId` is set to `'root'` if dropped onto outer boundaries to split the entire dashboard root. |
117
117
  | `onResizeStart` | `(currentNode: SplitNode) => void` | No | Callback triggered when resizing starts on a split node. |
@@ -370,9 +370,9 @@ The root context provider. It handles the drag-and-drop event loop and coordinat
370
370
  - `onFullscreenChange?: (paneId: string | null) => void` — (Optional) Callback triggered when a pane enters/leaves fullscreen.
371
371
  - `onRemove?: (paneId: string) => void` — (Optional) Callback triggered when a pane is closed/removed.
372
372
  - `dragActivationDistance?: number` — (Optional) Minimum pointer drag distance (in pixels) required to activate dragging. Defaults to `8`.
373
+ - `enableDragToDismiss?: boolean` — (Optional) Whether to enable the drag-out-to-dismiss gesture. Defaults to `false`.
373
374
  - `dragOutThreshold?: number` — (Optional) Distance in pixels outside the container boundaries required to activate drag-out mode. Defaults to `60`.
374
375
  - `onDragOutChange?: (activeId: string | null) => void` — (Optional) Callback triggered when the drag-out state changes.
375
- - `onDragOut?: (activeId: string) => void` — (Optional) Callback triggered when a pane is dropped/released outside the container. If not provided, defaults to removing the pane.
376
376
  - `onDragStart?: (activeId: string) => void` — (Optional) Callback triggered when dragging starts on a pane.
377
377
  - `onDragEnd?: (activeId: string, overId: string | null, dropAction: any) => void` — (Optional) Callback triggered when dragging ends. The `overId` will be `'root'` if the pane was dropped onto the outer dashboard boundaries to split the root layout.
378
378
  - `onResizeStart?: (currentNode: SplitNode) => void` — (Optional) Callback triggered when resizing starts.
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
- 'use strict';var react=require('react'),core=require('@dnd-kit/core'),jsxRuntime=require('react/jsx-runtime');var de=react.createContext(void 0),ce=react.createContext(void 0);var k=()=>{let e=react.useContext(de);if(!e)throw new Error("useDashboardState must be used within a DashboardProvider");return e},be=()=>{let e=react.useContext(ce);if(!e)throw new Error("useDashboardActions must be used within a DashboardProvider");return e};function Z(e,t){if(e===null)return null;if(e.type==="pane")return e.paneId===t?null:e;let o=Z(e.first,t),r=Z(e.second,t);return o===null?r:r===null?o:{...e,first:o,second:r}}function ae(e,t,o,r,n){if(e===null)return typeof n=="string"?{type:"pane",paneId:n}:n;if(e.type==="pane"){if(e.paneId===t){let d=typeof n=="string"?{type:"pane",paneId:n}:n,a=r==="left"||r==="top";return {type:"split",direction:o,first:a?d:e,second:a?e:d,splitPercentage:50}}return e}return {...e,first:ae(e.first,t,o,r,n)||e.first,second:ae(e.second,t,o,r,n)||e.second}}function Pe(e,t,o){if(e===null)return null;let r=A(e,t),n=A(e,o);if(!r||!n)return e;function d(a){return a.type==="pane"?a.paneId===t?{...n}:a.paneId===o?{...r}:a:{...a,first:d(a.first),second:d(a.second)}}return d(e)}function Ze(e,t){if(e===null)return {type:"pane",paneId:t};function o(r,n){return r.type==="pane"?{type:"split",direction:n==="row"?"column":"row",splitPercentage:50,first:r,second:{type:"pane",paneId:t}}:{...r,second:o(r.second,r.direction)}}return o(e,null)}function G(e,t,o){return e===null?null:e===t?{...e,splitPercentage:o}:e.type==="split"?{...e,first:G(e.first,t,o)||e.first,second:G(e.second,t,o)||e.second}:e}function $e(e,t,o){let r=A(e,t)??{type:"pane",paneId:t},n=Z(e,t);if(n===null)return {...r};let d=o==="left"||o==="right"?"row":"column",a=o==="left"||o==="top",p={...r};return {type:"split",direction:d,first:a?p:n,second:a?n:p,splitPercentage:50}}function A(e,t){return e===null?null:e.type==="pane"?e.paneId===t?e:null:A(e.first,t)??A(e.second,t)}function ue(e,t,o){if(e===null)return null;if(e.type==="pane"){if(e.paneId===t){let r=o(e.metadata);if(r===void 0){let{metadata:n,...d}=e;return d}return {...e,metadata:r}}return e}return {...e,first:ue(e.first,t,o)??e.first,second:ue(e.second,t,o)??e.second}}var Je=8,Ke=8,Zt=4;var rt=({activeId:e,render:t,className:o})=>{let r=react.useRef(null);return react.useEffect(()=>{let n=d=>{r.current&&(r.current.style.transform=`translate(${d.clientX+12}px, ${d.clientY+12}px)`);};return document.addEventListener("pointermove",n),()=>document.removeEventListener("pointermove",n)},[]),jsxRuntime.jsx("div",{ref:r,className:o,style:{position:"fixed",top:0,left:0,zIndex:9999,pointerEvents:"none"},children:t(e)})},Ne=class extends core.PointerSensor{static activators=[{eventName:"onPointerDown",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},De=class extends core.TouchSensor{static activators=[{eventName:"onTouchStart",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},it=({layout:e,onChange:t,renderPane:o,renderDragOverlay:r,classNames:n={},fullscreenPaneId:d=null,onFullscreenChange:a,onRemove:p,dragActivationDistance:C=8,snapThreshold:N=8,onDragStart:x,onDragEnd:c,onResizeStart:h,onResize:z,onResizeEnd:D,renderResizer:v,minSplitPercentage:f=5,maxSplitPercentage:b=95,dragOutThreshold:J=60,onDragOutChange:P,onDragOut:K,children:ne})=>{let[g,R]=react.useState(e),me=react.useRef(e);e!==me.current&&(me.current=e,R(e));let[U,X]=react.useState(null),[M,Y]=react.useState(null),S=react.useRef(null),I=react.useRef(null),Q=react.useCallback(s=>{S.current=s;},[]),B=react.useRef(P);B.current=P;let j=react.useRef(K);j.current=K;let w=react.useRef(g);w.current=g;let T=react.useRef(t);T.current=t;let W=react.useRef(o);W.current=o;let ee=react.useRef(D);ee.current=D;let oe=react.useCallback(s=>W.current(s),[]),re=react.useMemo(()=>n,[n.pane,n.dropPreview,n.swapPreview,n.dragOverlay,n.resizer,n.dragOut]),ie=core.useSensors(core.useSensor(Ne,{activationConstraint:{distance:C}}),core.useSensor(De,{activationConstraint:{delay:250,tolerance:5}})),Xe=s=>{let u=s.active.id.toString();X(u),S.current?I.current=S.current.getBoundingClientRect():I.current=null,x&&x(u);},Ye=s=>{let u=s.active.id.toString(),i=I.current;if(!i){M!==null&&(Y(null),B.current?.(null));return}let l=s.activatorEvent,L=null,E=null;if(l instanceof MouseEvent||l instanceof PointerEvent)L=l.clientX+s.delta.x,E=l.clientY+s.delta.y;else if(typeof TouchEvent<"u"&&l instanceof TouchEvent){let m=l.touches[0]||l.changedTouches[0];m&&(L=m.clientX+s.delta.x,E=m.clientY+s.delta.y);}let H=0;if(L!==null&&E!==null){let m=0,y=0;L<i.left?m=i.left-L:L>i.right&&(m=L-i.right),E<i.top?y=i.top-E:E>i.bottom&&(y=E-i.bottom),H=Math.sqrt(m*m+y*y);}else {let m=s.active.rect.current.translated;if(m){let y=m.left+m.width/2,V=m.top+m.height/2,q=0,te=0;y<i.left?q=i.left-y:y>i.right&&(q=y-i.right),V<i.top?te=i.top-V:V>i.bottom&&(te=V-i.bottom),H=Math.sqrt(q*q+te*te);}}H>J?M!==u&&(Y(u),B.current?.(u)):M!==null&&(Y(null),B.current?.(null));},Be=s=>{X(null);let{active:u,over:i}=s,l=u.id.toString(),L=M===l;if(Y(null),B.current?.(null),I.current=null,L){j.current?j.current(l):p?p(l):he(l),c&&c(l,null,null);return}if(!i){c&&c(l,null,null);return}let E=i.id.toString(),H=E.match(/^drop-root-(left|right|top|bottom)$/);if(H){let[,_]=H,se=$e(g,l,_);R(se),t(se),c&&c(l,"root",{type:"split",direction:_==="left"||_==="right"?"row":"column",position:_});return}let ve=E.match(/^drop-center-(.+)$/);if(ve){let[,_]=ve;if(l!==_){let se=Pe(g,l,_);R(se),t(se);}c&&c(l,_,{type:"swap",position:"center"});return}let m=E.match(/^drop-(left|right|top|bottom)-(.+)$/);if(!m){c&&c(l,null,null);return}let[,y,V]=m;if(l===V){c&&c(l,null,null);return}let q=y==="left"||y==="right"?"row":"column",te=A(g,l)??{type:"pane",paneId:l},Ge=Z(g,l),Oe=ae(Ge,V,q,y,te);R(Oe),t(Oe),c&&c(l,V,{type:"split",direction:q,position:y});},Ie=react.useCallback(s=>{R(s);},[]),he=react.useCallback(s=>{let u=Z(w.current,s);R(u),T.current(u);},[]),Ee=react.useCallback(s=>{let u=Ze(w.current,s);R(u),T.current(u);},[]),Ce=react.useCallback((s,u)=>{let i=Pe(w.current,s,u);R(i),T.current(i);},[]),Te=react.useCallback((s,u,i,l)=>{let L=A(w.current,l)??{type:"pane",paneId:l},E=Z(w.current,l),H=ae(E,s,u,i,L);R(H),T.current(H);},[]),Le=react.useCallback((s,u)=>{let i=G(w.current,s,u);R(i),T.current(i);},[]),Me=react.useCallback((s,u)=>{let i=ue(w.current,s,u);R(i),T.current(i);},[]),Ae=react.useCallback((s,u)=>{let i=G(w.current,s,u);R(i),T.current(i),ee.current&&ee.current(s,u);},[]),We=react.useMemo(()=>({layout:g,onLayoutChange:Ie,renderPane:oe,activeId:U,draggedOutId:M,setContainerRef:Q,fullscreenPaneId:d,classNames:re,onRemove:p,onFullscreenChange:a,snapThreshold:N,onResizeStart:h,onResize:z,onResizeEnd:Ae,renderResizer:v,minSplitPercentage:f,maxSplitPercentage:b}),[g,U,M,Q,d,re,p,a,N,h,z,v,f,b,Ie,oe,Ae]),qe=react.useMemo(()=>({removePane:he,addPane:Ee,swapPanes:Ce,splitPane:Te,updateSplitPercentage:Le,updatePaneMetadata:Me}),[he,Ee,Ce,Te,Le,Me]);return jsxRuntime.jsx(ce.Provider,{value:qe,children:jsxRuntime.jsxs(de.Provider,{value:We,children:[jsxRuntime.jsx(core.DndContext,{id:"zeugma-dnd-context",sensors:ie,collisionDetection:core.pointerWithin,onDragStart:Xe,onDragMove:Ye,onDragEnd:Be,children:ne}),U&&r&&jsxRuntime.jsx(rt,{activeId:U,render:r,className:`${n.dragOverlay||""} ${U===M?n.dragOut||"zeugma-dragout":""}`.trim()})]})})};var lt={top:{position:"absolute",top:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},left:{position:"absolute",top:0,bottom:0,left:0,width:"32px",zIndex:30,pointerEvents:"auto"},right:{position:"absolute",top:0,bottom:0,right:0,width:"32px",zIndex:30,pointerEvents:"auto"}},dt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"}},ct=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=core.useDroppable({id:e});return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{ref:r,style:lt[t]}),n&&jsxRuntime.jsx("div",{className:o,style:dt[t]})]})},_e=({activeId:e,hasOtherPanes:t,dropPreviewClassName:o})=>!e||!t?null:jsxRuntime.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:30,pointerEvents:"none"},children:["top","bottom","left","right"].map(r=>jsxRuntime.jsx(ct,{id:`drop-root-${r}`,position:r,activeClassName:o},r))});function Se({containerRef:e,isRow:t,direction:o,splitPercentage:r,resizerSize:n,snapThreshold:d,layout:a,currentNode:p,onLayoutChange:C,onResizeStart:N,onResizeEnd:x}){let{onResizeStart:c,onResize:h,onResizeEnd:z,minSplitPercentage:D=5,maxSplitPercentage:v=95}=k();return react.useCallback(f=>{f.preventDefault();let b=e.current;if(!b)return;document.body.classList.add("zeugma-resizing");let J=document.createElement("style");J.id="zeugma-global-cursor-style",J.textContent=`
1
+ 'use strict';var react=require('react'),core=require('@dnd-kit/core'),jsxRuntime=require('react/jsx-runtime');var de=react.createContext(void 0),ce=react.createContext(void 0);var X=()=>{let e=react.useContext(de);if(!e)throw new Error("useDashboardState must be used within a DashboardProvider");return e},be=()=>{let e=react.useContext(ce);if(!e)throw new Error("useDashboardActions must be used within a DashboardProvider");return e};function Z(e,t){if(e===null)return null;if(e.type==="pane")return e.paneId===t?null:e;let o=Z(e.first,t),r=Z(e.second,t);return o===null?r:r===null?o:{...e,first:o,second:r}}function se(e,t,o,r,n){if(e===null)return typeof n=="string"?{type:"pane",paneId:n}:n;if(e.type==="pane"){if(e.paneId===t){let l=typeof n=="string"?{type:"pane",paneId:n}:n,a=r==="left"||r==="top";return {type:"split",direction:o,first:a?l:e,second:a?e:l,splitPercentage:50}}return e}return {...e,first:se(e.first,t,o,r,n)||e.first,second:se(e.second,t,o,r,n)||e.second}}function Pe(e,t,o){if(e===null)return null;let r=A(e,t),n=A(e,o);if(!r||!n)return e;function l(a){return a.type==="pane"?a.paneId===t?{...n}:a.paneId===o?{...r}:a:{...a,first:l(a.first),second:l(a.second)}}return l(e)}function $e(e,t){if(e===null)return {type:"pane",paneId:t};function o(r,n){return r.type==="pane"?{type:"split",direction:n==="row"?"column":"row",splitPercentage:50,first:r,second:{type:"pane",paneId:t}}:{...r,second:o(r.second,r.direction)}}return o(e,null)}function J(e,t,o){return e===null?null:e===t?{...e,splitPercentage:o}:e.type==="split"?{...e,first:J(e.first,t,o)||e.first,second:J(e.second,t,o)||e.second}:e}function Ve(e,t,o){let r=A(e,t)??{type:"pane",paneId:t},n=Z(e,t);if(n===null)return {...r};let l=o==="left"||o==="right"?"row":"column",a=o==="left"||o==="top",p={...r};return {type:"split",direction:l,first:a?p:n,second:a?n:p,splitPercentage:50}}function A(e,t){return e===null?null:e.type==="pane"?e.paneId===t?e:null:A(e.first,t)??A(e.second,t)}function ue(e,t,o){if(e===null)return null;if(e.type==="pane"){if(e.paneId===t){let r=o(e.metadata);if(r===void 0){let{metadata:n,...l}=e;return l}return {...e,metadata:r}}return e}return {...e,first:ue(e.first,t,o)??e.first,second:ue(e.second,t,o)??e.second}}var Ge=8,Je=8,Zt=4;var ot=({activeId:e,render:t,className:o})=>{let r=react.useRef(null);return react.useEffect(()=>{let n=l=>{r.current&&(r.current.style.transform=`translate(${l.clientX+12}px, ${l.clientY+12}px)`);};return document.addEventListener("pointermove",n),()=>document.removeEventListener("pointermove",n)},[]),jsxRuntime.jsx("div",{ref:r,className:o,style:{position:"fixed",top:0,left:0,zIndex:9999,pointerEvents:"none"},children:t(e)})},Ne=class extends core.PointerSensor{static activators=[{eventName:"onPointerDown",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},De=class extends core.TouchSensor{static activators=[{eventName:"onTouchStart",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},rt=({layout:e,onChange:t,renderPane:o,renderDragOverlay:r,classNames:n={},fullscreenPaneId:l=null,onFullscreenChange:a,onRemove:p,dragActivationDistance:C=8,snapThreshold:N=8,onDragStart:R,onDragEnd:c,onResizeStart:h,onResize:y,onResizeEnd:D,renderResizer:v,minSplitPercentage:f=5,maxSplitPercentage:b=95,enableDragToDismiss:O=false,dismissThreshold:x=60,onDismissIntentChange:K,children:ee})=>{let[g,P]=react.useState(e),me=react.useRef(e);e!==me.current&&(me.current=e,P(e));let[Y,B]=react.useState(null),[M,W]=react.useState(null),S=react.useRef(null),I=react.useRef(null),Q=react.useCallback(s=>{S.current=s;},[]),q=react.useRef(K);q.current=K;let T=react.useRef(g);T.current=g;let z=react.useRef(t);z.current=t;let te=react.useRef(o);te.current=o;let _=react.useRef(D);_.current=D;let ne=react.useCallback(s=>te.current(s),[]),oe=react.useMemo(()=>n,[n.pane,n.dropPreview,n.swapPreview,n.dragOverlay,n.resizer,n.dismissPreview]),le=core.useSensors(core.useSensor(Ne,{activationConstraint:{distance:C}}),core.useSensor(De,{activationConstraint:{delay:250,tolerance:5}})),re=s=>{let u=s.active.id.toString();B(u),O&&S.current?I.current=S.current.getBoundingClientRect():I.current=null,R&&R(u);},Xe=s=>{if(!O)return;let u=s.active.id.toString(),i=I.current;if(!i){M!==null&&(W(null),q.current?.(null));return}let d=s.activatorEvent,L=null,E=null;if(d instanceof MouseEvent||d instanceof PointerEvent)L=d.clientX+s.delta.x,E=d.clientY+s.delta.y;else if(typeof TouchEvent<"u"&&d instanceof TouchEvent){let m=d.touches[0]||d.changedTouches[0];m&&(L=m.clientX+s.delta.x,E=m.clientY+s.delta.y);}let H=0;if(L!==null&&E!==null){let m=0,w=0;L<i.left?m=i.left-L:L>i.right&&(m=L-i.right),E<i.top?w=i.top-E:E>i.bottom&&(w=E-i.bottom),H=Math.sqrt(m*m+w*w);}else {let m=s.active.rect.current.translated;if(m){let w=m.left+m.width/2,k=m.top+m.height/2,G=0,j=0;w<i.left?G=i.left-w:w>i.right&&(G=w-i.right),k<i.top?j=i.top-k:k>i.bottom&&(j=k-i.bottom),H=Math.sqrt(G*G+j*j);}}H>x?M!==u&&(W(u),q.current?.(u)):M!==null&&(W(null),q.current?.(null));},Ye=s=>{B(null);let{active:u,over:i}=s,d=u.id.toString(),L=O&&M===d;if(W(null),q.current?.(null),I.current=null,L){p?p(d):he(d),c&&c(d,null,null);return}if(!i){c&&c(d,null,null);return}let E=i.id.toString(),H=E.match(/^drop-root-(left|right|top|bottom)$/);if(H){let[,U]=H,ie=Ve(g,d,U);P(ie),t(ie),c&&c(d,"root",{type:"split",direction:U==="left"||U==="right"?"row":"column",position:U});return}let ve=E.match(/^drop-center-(.+)$/);if(ve){let[,U]=ve;if(d!==U){let ie=Pe(g,d,U);P(ie),t(ie);}c&&c(d,U,{type:"swap",position:"center"});return}let m=E.match(/^drop-(left|right|top|bottom)-(.+)$/);if(!m){c&&c(d,null,null);return}let[,w,k]=m;if(d===k){c&&c(d,null,null);return}let G=w==="left"||w==="right"?"row":"column",j=A(g,d)??{type:"pane",paneId:d},qe=Z(g,d),Fe=se(qe,k,G,w,j);P(Fe),t(Fe),c&&c(d,k,{type:"split",direction:G,position:w});},ze=react.useCallback(s=>{P(s);},[]),he=react.useCallback(s=>{let u=Z(T.current,s);P(u),z.current(u);},[]),Ee=react.useCallback(s=>{let u=$e(T.current,s);P(u),z.current(u);},[]),Ce=react.useCallback((s,u)=>{let i=Pe(T.current,s,u);P(i),z.current(i);},[]),Te=react.useCallback((s,u,i,d)=>{let L=A(T.current,d)??{type:"pane",paneId:d},E=Z(T.current,d),H=se(E,s,u,i,L);P(H),z.current(H);},[]),Le=react.useCallback((s,u)=>{let i=J(T.current,s,u);P(i),z.current(i);},[]),Me=react.useCallback((s,u)=>{let i=ue(T.current,s,u);P(i),z.current(i);},[]),Ae=react.useCallback((s,u)=>{let i=J(T.current,s,u);P(i),z.current(i),_.current&&_.current(s,u);},[]),Be=react.useMemo(()=>({layout:g,onLayoutChange:ze,renderPane:ne,activeId:Y,dismissIntentId:M,setContainerRef:Q,fullscreenPaneId:l,classNames:oe,onRemove:p,onFullscreenChange:a,snapThreshold:N,onResizeStart:h,onResize:y,onResizeEnd:Ae,renderResizer:v,minSplitPercentage:f,maxSplitPercentage:b}),[g,Y,M,Q,l,oe,p,a,N,h,y,v,f,b,ze,ne,Ae]),We=react.useMemo(()=>({removePane:he,addPane:Ee,swapPanes:Ce,splitPane:Te,updateSplitPercentage:Le,updatePaneMetadata:Me}),[he,Ee,Ce,Te,Le,Me]);return jsxRuntime.jsx(ce.Provider,{value:We,children:jsxRuntime.jsxs(de.Provider,{value:Be,children:[jsxRuntime.jsx(core.DndContext,{id:"zeugma-dnd-context",sensors:le,collisionDetection:core.pointerWithin,onDragStart:re,onDragMove:Xe,onDragEnd:Ye,children:ee}),Y&&r&&jsxRuntime.jsx(ot,{activeId:Y,render:r,className:`${n.dragOverlay||""} ${Y===M?n.dismissPreview||"zeugma-dismiss-preview":""}`.trim()})]})})};var at={top:{position:"absolute",top:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},left:{position:"absolute",top:0,bottom:0,left:0,width:"32px",zIndex:30,pointerEvents:"auto"},right:{position:"absolute",top:0,bottom:0,right:0,width:"32px",zIndex:30,pointerEvents:"auto"}},lt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"}},dt=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=core.useDroppable({id:e});return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{ref:r,style:at[t]}),n&&jsxRuntime.jsx("div",{className:o,style:lt[t]})]})},_e=({activeId:e,hasOtherPanes:t,dropPreviewClassName:o})=>!e||!t?null:jsxRuntime.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:30,pointerEvents:"none"},children:["top","bottom","left","right"].map(r=>jsxRuntime.jsx(dt,{id:`drop-root-${r}`,position:r,activeClassName:o},r))});function Se({containerRef:e,isRow:t,direction:o,splitPercentage:r,resizerSize:n,snapThreshold:l,layout:a,currentNode:p,onLayoutChange:C,onResizeStart:N,onResizeEnd:R}){let{onResizeStart:c,onResize:h,onResizeEnd:y,minSplitPercentage:D=5,maxSplitPercentage:v=95}=X();return react.useCallback(f=>{f.preventDefault();let b=e.current;if(!b)return;document.body.classList.add("zeugma-resizing");let O=document.createElement("style");O.id="zeugma-global-cursor-style",O.textContent=`
2
2
  * {
3
3
  cursor: ${t?"col-resize":"row-resize"} !important;
4
4
  user-select: none !important;
5
5
  }
6
- `,document.head.appendChild(J),N&&N(),c&&c(p);let P=b.getBoundingClientRect(),K=f.clientX,ne=f.clientY,g=r,R=f.currentTarget;R.setAttribute("data-resizing","true");let U=Array.from(document.querySelectorAll('div[role="separator"][data-direction]')).filter(S=>S!==R&&S.getAttribute("data-direction")===o).map(S=>{let I=S.getBoundingClientRect();return t?I.left+I.width/2:I.top+I.height/2}),X=g,M=S=>{let I=t?(S.clientX-K)/P.width*100:(S.clientY-ne)/P.height*100,Q=g+I,B=t?P.left+(P.width-n)*(Q/100)+n/2:P.top+(P.height-n)*(Q/100)+n/2,j=1/0,w=null;for(let re of U){let ie=Math.abs(B-re);ie<d&&ie<j&&(j=ie,w=re);}let T=Q;w!==null&&(T=t?(w-n/2-P.left)/(P.width-n)*100:(w-n/2-P.top)/(P.height-n)*100);let W=Math.max(D,Math.min(v,T));X=W;let ee=b.children[0],oe=b.children[b.children.length-1];ee&&oe&&(ee.style.flex=`${W} 1 0%`,oe.style.flex=`${100-W} 1 0%`),h&&h(p,W);},Y=()=>{document.body.classList.remove("zeugma-resizing"),R.removeAttribute("data-resizing");let S=document.getElementById("zeugma-global-cursor-style");S&&S.remove(),document.removeEventListener("pointermove",M),document.removeEventListener("pointerup",Y);let I=G(a,p,X);console.log("onLayoutChange (finalized) called with percentage:",X),C(I),x&&x(),z&&z(p,X);};document.addEventListener("pointermove",M),document.addEventListener("pointerup",Y);},[e,t,o,r,n,d,a,p,C,N,x,c,h,z,D,v])}var vt=({currentNode:e,resizerSize:t,snapThreshold:o,renderResizer:r})=>{let{layout:n,onLayoutChange:d,classNames:a,renderResizer:p}=k(),[C,N]=react.useState(false),x=r||p,c=react.useRef(null),{direction:h,first:z,second:D,splitPercentage:v}=e,f=h==="row",b=Se({containerRef:c,isRow:f,direction:h,splitPercentage:v,resizerSize:t,snapThreshold:o??8,layout:n,currentNode:e,onLayoutChange:d,onResizeStart:()=>N(true),onResizeEnd:()=>N(false)});return jsxRuntime.jsxs("div",{ref:c,style:{display:"flex",flexDirection:f?"row":"column",width:"100%",height:"100%",overflow:"hidden"},children:[jsxRuntime.jsx("div",{style:{flex:`${v} 1 0%`,overflow:"hidden"},children:jsxRuntime.jsx(we,{tree:z,resizerSize:t,snapThreshold:o,renderResizer:r})}),x?x({direction:h,splitPercentage:v,resizerSize:t,isResizing:C,onPointerDown:b}):jsxRuntime.jsx("div",{className:a.resizer,"data-direction":h,style:{width:f?`${t}px`:"100%",height:f?"100%":`${t}px`,cursor:f?"col-resize":"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:b,role:"separator","aria-valuenow":v,"aria-valuemin":5,"aria-valuemax":95}),jsxRuntime.jsx("div",{style:{flex:`${100-v} 1 0%`,overflow:"hidden"},children:jsxRuntime.jsx(we,{tree:D,resizerSize:t,snapThreshold:o,renderResizer:r})})]})},we=({tree:e,resizerSize:t=4,snapThreshold:o,renderResizer:r})=>{let{layout:n,renderPane:d,activeId:a,draggedOutId:p,setContainerRef:C,classNames:N,fullscreenPaneId:x,snapThreshold:c}=k(),h=o!==void 0?o:c,z=react.useMemo(()=>e!==void 0||!a?false:Z(n,a)!==null,[e,n,a]);if(x&&!e)return jsxRuntime.jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:d(x)});let D=e!==void 0?e:n;if(!D)return null;let v=()=>D.type==="pane"?jsxRuntime.jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:d(D.paneId)}):jsxRuntime.jsx(vt,{currentNode:D,resizerSize:t,snapThreshold:h,renderResizer:r});return e===void 0?jsxRuntime.jsxs("div",{ref:C,className:`zeugma-dashboard-root ${a!==null&&a===p?"zeugma-dashboard-dragout-active":""}`.trim(),style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:[v(),jsxRuntime.jsx(_e,{activeId:a,hasOtherPanes:z,dropPreviewClassName:N.dropPreview})]}):v()};var ge=react.createContext(null);var xt={top:{position:"absolute",top:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},left:{position:"absolute",top:"25%",left:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},right:{position:"absolute",top:"25%",right:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},center:{position:"absolute",top:"25%",left:"25%",width:"50%",height:"50%",zIndex:20,pointerEvents:"auto"}},Nt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},center:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:21,pointerEvents:"none",boxSizing:"border-box"}},Ue=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=core.useDroppable({id:e});return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{ref:r,style:xt[t]}),n&&jsxRuntime.jsx("div",{className:o,style:Nt[t]})]})},Dt=({id:e,children:t,style:o})=>{let{layout:r,activeId:n,classNames:d,fullscreenPaneId:a,onRemove:p,onFullscreenChange:C}=k(),{removePane:N,updatePaneMetadata:x}=be(),c=n!==null&&n!==e,{attributes:h,listeners:z,setNodeRef:D,isDragging:v}=core.useDraggable({id:e}),f=n===e||v,b=a===e,P=react.useMemo(()=>A(r,e),[r,e])?.metadata,K=react.useMemo(()=>({isDragging:f,isFullscreen:b,toggleFullscreen:()=>C?.(b?null:e),remove:()=>{b&&C?.(null),p?p(e):N(e);},metadata:P,updateMetadata:g=>{x(e,g);}}),[f,b,C,e,p,N,P,x]),ne=react.useMemo(()=>({...z,...h}),[z,h]);return jsxRuntime.jsx(ge.Provider,{value:ne,children:jsxRuntime.jsxs("div",{ref:D,className:d.pane,style:{position:"relative",width:"100%",height:"100%",...o},children:[t(K),c&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:15,pointerEvents:"none"},children:[["top","bottom","left","right"].map(g=>jsxRuntime.jsx(Ue,{id:`drop-${g}-${e}`,position:g,activeClassName:d.dropPreview},g)),jsxRuntime.jsx(Ue,{id:`drop-center-${e}`,position:"center",activeClassName:d.swapPreview})]})]})})};var yt=({children:e,className:t,style:o})=>{let r=react.useContext(ge);if(!r)throw new Error("<DragHandle> must be used inside a <Pane>");return jsxRuntime.jsx("div",{className:t,style:{cursor:"grab",userSelect:"none",touchAction:"none",...o},...r,children:e})};exports.DEFAULT_DRAG_ACTIVATION_DISTANCE=Ke;exports.DEFAULT_RESIZER_SIZE=Zt;exports.DEFAULT_SNAP_THRESHOLD=Je;exports.DashboardProvider=it;exports.DragHandle=yt;exports.Pane=Dt;exports.PaneTree=we;exports.addPane=Ze;exports.findPane=A;exports.removePane=Z;exports.splitPane=ae;exports.splitRoot=$e;exports.swapPanes=Pe;exports.updatePaneMetadata=ue;exports.updateSplitPercentage=G;exports.useDashboardActions=be;exports.useDashboardState=k;exports.useResizer=Se;//# sourceMappingURL=index.cjs.map
6
+ `,document.head.appendChild(O),N&&N(),c&&c(p);let x=b.getBoundingClientRect(),K=f.clientX,ee=f.clientY,g=r,P=f.currentTarget;P.setAttribute("data-resizing","true");let Y=Array.from(document.querySelectorAll('div[role="separator"][data-direction]')).filter(S=>S!==P&&S.getAttribute("data-direction")===o).map(S=>{let I=S.getBoundingClientRect();return t?I.left+I.width/2:I.top+I.height/2}),B=g,M=S=>{let I=t?(S.clientX-K)/x.width*100:(S.clientY-ee)/x.height*100,Q=g+I,q=t?x.left+(x.width-n)*(Q/100)+n/2:x.top+(x.height-n)*(Q/100)+n/2,T=1/0,z=null;for(let le of Y){let re=Math.abs(q-le);re<l&&re<T&&(T=re,z=le);}let te=Q;z!==null&&(te=t?(z-n/2-x.left)/(x.width-n)*100:(z-n/2-x.top)/(x.height-n)*100);let _=Math.max(D,Math.min(v,te));B=_;let ne=b.children[0],oe=b.children[b.children.length-1];ne&&oe&&(ne.style.flex=`${_} 1 0%`,oe.style.flex=`${100-_} 1 0%`),h&&h(p,_);},W=()=>{document.body.classList.remove("zeugma-resizing"),P.removeAttribute("data-resizing");let S=document.getElementById("zeugma-global-cursor-style");S&&S.remove(),document.removeEventListener("pointermove",M),document.removeEventListener("pointerup",W);let I=J(a,p,B);console.log("onLayoutChange (finalized) called with percentage:",B),C(I),R&&R(),y&&y(p,B);};document.addEventListener("pointermove",M),document.addEventListener("pointerup",W);},[e,t,o,r,n,l,a,p,C,N,R,c,h,y,D,v])}var ht=({currentNode:e,resizerSize:t,snapThreshold:o,renderResizer:r})=>{let{layout:n,onLayoutChange:l,classNames:a,renderResizer:p}=X(),[C,N]=react.useState(false),R=r||p,c=react.useRef(null),{direction:h,first:y,second:D,splitPercentage:v}=e,f=h==="row",b=Se({containerRef:c,isRow:f,direction:h,splitPercentage:v,resizerSize:t,snapThreshold:o??8,layout:n,currentNode:e,onLayoutChange:l,onResizeStart:()=>N(true),onResizeEnd:()=>N(false)});return jsxRuntime.jsxs("div",{ref:c,style:{display:"flex",flexDirection:f?"row":"column",width:"100%",height:"100%",overflow:"hidden"},children:[jsxRuntime.jsx("div",{style:{flex:`${v} 1 0%`,overflow:"hidden"},children:jsxRuntime.jsx(we,{tree:y,resizerSize:t,snapThreshold:o,renderResizer:r})}),R?R({direction:h,splitPercentage:v,resizerSize:t,isResizing:C,onPointerDown:b}):jsxRuntime.jsx("div",{className:a.resizer,"data-direction":h,style:{width:f?`${t}px`:"100%",height:f?"100%":`${t}px`,cursor:f?"col-resize":"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:b,role:"separator","aria-valuenow":v,"aria-valuemin":5,"aria-valuemax":95}),jsxRuntime.jsx("div",{style:{flex:`${100-v} 1 0%`,overflow:"hidden"},children:jsxRuntime.jsx(we,{tree:D,resizerSize:t,snapThreshold:o,renderResizer:r})})]})},we=({tree:e,resizerSize:t=4,snapThreshold:o,renderResizer:r})=>{let{layout:n,renderPane:l,activeId:a,dismissIntentId:p,setContainerRef:C,classNames:N,fullscreenPaneId:R,snapThreshold:c}=X(),h=o!==void 0?o:c,y=react.useMemo(()=>e!==void 0||!a?false:Z(n,a)!==null,[e,n,a]);if(R&&!e)return jsxRuntime.jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:l(R)});let D=e!==void 0?e:n;if(!D)return null;let v=()=>D.type==="pane"?jsxRuntime.jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:l(D.paneId)}):jsxRuntime.jsx(ht,{currentNode:D,resizerSize:t,snapThreshold:h,renderResizer:r});return e===void 0?jsxRuntime.jsxs("div",{ref:C,className:`zeugma-dashboard-root ${a!==null&&a===p?"zeugma-dashboard-dismiss-active":""}`.trim(),style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:[v(),jsxRuntime.jsx(_e,{activeId:a,hasOtherPanes:y,dropPreviewClassName:N.dropPreview})]}):v()};var ge=react.createContext(null);var Rt={top:{position:"absolute",top:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},left:{position:"absolute",top:"25%",left:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},right:{position:"absolute",top:"25%",right:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},center:{position:"absolute",top:"25%",left:"25%",width:"50%",height:"50%",zIndex:20,pointerEvents:"auto"}},xt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},center:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:21,pointerEvents:"none",boxSizing:"border-box"}},Ue=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=core.useDroppable({id:e});return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{ref:r,style:Rt[t]}),n&&jsxRuntime.jsx("div",{className:o,style:xt[t]})]})},Nt=({id:e,children:t,style:o})=>{let{layout:r,activeId:n,classNames:l,fullscreenPaneId:a,onRemove:p,onFullscreenChange:C}=X(),{removePane:N,updatePaneMetadata:R}=be(),c=n!==null&&n!==e,{attributes:h,listeners:y,setNodeRef:D,isDragging:v}=core.useDraggable({id:e}),f=n===e||v,b=a===e,x=react.useMemo(()=>A(r,e),[r,e])?.metadata,K=react.useMemo(()=>({isDragging:f,isFullscreen:b,toggleFullscreen:()=>C?.(b?null:e),remove:()=>{b&&C?.(null),p?p(e):N(e);},metadata:x,updateMetadata:g=>{R(e,g);}}),[f,b,C,e,p,N,x,R]),ee=react.useMemo(()=>({...y,...h}),[y,h]);return jsxRuntime.jsx(ge.Provider,{value:ee,children:jsxRuntime.jsxs("div",{ref:D,className:l.pane,style:{position:"relative",width:"100%",height:"100%",...o},children:[t(K),c&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:15,pointerEvents:"none"},children:[["top","bottom","left","right"].map(g=>jsxRuntime.jsx(Ue,{id:`drop-${g}-${e}`,position:g,activeClassName:l.dropPreview},g)),jsxRuntime.jsx(Ue,{id:`drop-center-${e}`,position:"center",activeClassName:l.swapPreview})]})]})})};var wt=({children:e,className:t,style:o})=>{let r=react.useContext(ge);if(!r)throw new Error("<DragHandle> must be used inside a <Pane>");return jsxRuntime.jsx("div",{className:t,style:{cursor:"grab",userSelect:"none",touchAction:"none",...o},...r,children:e})};exports.DEFAULT_DRAG_ACTIVATION_DISTANCE=Je;exports.DEFAULT_RESIZER_SIZE=Zt;exports.DEFAULT_SNAP_THRESHOLD=Ge;exports.DashboardProvider=rt;exports.DragHandle=wt;exports.Pane=Nt;exports.PaneTree=we;exports.addPane=$e;exports.findPane=A;exports.removePane=Z;exports.splitPane=se;exports.splitRoot=Ve;exports.swapPanes=Pe;exports.updatePaneMetadata=ue;exports.updateSplitPercentage=J;exports.useDashboardActions=be;exports.useDashboardState=X;exports.useResizer=Se;//# sourceMappingURL=index.cjs.map
7
7
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entities/dashboard/model/context.ts","../src/entities/dashboard/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/dashboard/ui/DashboardProvider.tsx","../src/entities/dashboard/ui/RootDropZone.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx"],"names":["DashboardStateContext","createContext","DashboardActionsContext","useDashboardState","state","useContext","useDashboardActions","actions","removePane","tree","idToRemove","newFirst","newSecond","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","swapPanes","idA","idB","nodeA","findPane","nodeB","swap","node","addPane","insert","parentDirection","updateSplitPercentage","target","newPercentage","splitRoot","draggingId","draggedPaneNode","treeWithoutDragging","draggedNode","paneId","updatePaneMetadata","updater","newMetadata","_","rest","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","activeId","render","className","ref","useRef","useEffect","handleMove","e","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","DashboardProvider","layout","onChange","renderPane","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","renderResizer","minSplitPercentage","maxSplitPercentage","dragOutThreshold","onDragOutChange","onDragOut","children","localLayout","setLocalLayout","useState","prevLayoutRef","setActiveId","draggedOutId","setDraggedOutId","containerRef","containerRectRef","setContainerRef","useCallback","element","onDragOutChangeRef","onDragOutRef","layoutRef","onChangeRef","renderPaneRef","onResizeEndPropRef","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","handleDragMove","containerRect","ae","px","py","touch","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDraggedOut","handleRemovePane","overIdStr","rootMatch","dropZone","newLayout","swapMatch","match","handleLocalLayoutChange","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleResizeEnd","finalLayout","stateValue","actionsValue","jsxs","DndContext","pointerWithin","rootActivationPositions","rootPreviewPositions","RootDropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Fragment","RootDropZones","hasOtherPanes","dropPreviewClassName","pos","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","styleEl","rect","startX","startY","startPercentage","resizerEl","otherPositions","el","r","currentPercentage","handlePointerMove","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","dist","snappedPercentage","finalPercentage","firstChild","secondChild","handlePointerUp","globalStyle","PaneSplit","propRenderResizer","contextRenderResizer","isResizing","setIsResizing","first","second","handlePointerDown","PaneTree","propSnapThreshold","contextSnapThreshold","renderContent","DragListenersCtx","activationPositions","previewPositions","DropZone","Pane","style","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","isFullscreen","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, ReactNode } from 'react'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\n\nexport interface ZeugmaClassNames {\n pane?: string\n dropPreview?: string\n swapPreview?: string\n dragOverlay?: string\n resizer?: string\n dragOut?: string\n}\n\nexport interface ResizerRenderProps {\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n isResizing: boolean\n onPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void\n}\n\n/**\n * State context — holds reactive values that change during runtime.\n * All consumers of this context will re-render when any of these values change.\n */\nexport interface DashboardStateValue {\n layout: TreeNode | null\n onLayoutChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n activeId: string | null\n draggedOutId: string | null\n setContainerRef: (element: HTMLElement | null) => void\n fullscreenPaneId: string | null\n classNames: ZeugmaClassNames\n onRemove?: (paneId: string) => void\n onFullscreenChange?: (paneId: string | null) => void\n snapThreshold?: number\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n}\n\n/**\n * Actions context — holds stable dispatch functions with permanent identity.\n * Consumers of only this context will never re-render from layout/drag state changes.\n */\nexport interface DashboardActionsValue {\n removePane: (paneId: string) => void\n addPane: (paneId: string) => void\n swapPanes: (paneIdA: string, paneIdB: string) => void\n splitPane: (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => void\n updateSplitPercentage: (currentNode: SplitNode, percentage: number) => void\n updatePaneMetadata: (\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n ) => void\n}\nexport const DashboardStateContext = createContext<DashboardStateValue | undefined>(undefined)\nexport const DashboardActionsContext = createContext<DashboardActionsValue | undefined>(undefined)\n","import { useContext } from 'react'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n DashboardStateValue,\n DashboardActionsValue,\n} from './context'\n\n/** Returns only reactive state. Use when you need layout, activeId, classNames, etc. */\nexport const useDashboardState = (): DashboardStateValue => {\n const state = useContext(DashboardStateContext)\n if (!state) {\n throw new Error('useDashboardState must be used within a DashboardProvider')\n }\n return state\n}\n\n/** Returns only stable action dispatchers. Consumers of this hook never re-render from state changes. */\nexport const useDashboardActions = (): DashboardActionsValue => {\n const actions = useContext(DashboardActionsContext)\n if (!actions) {\n throw new Error('useDashboardActions must be used within a DashboardProvider')\n }\n return actions\n}\n","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\n\n/**\n * Tree Helper: Remove a pane and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, idToRemove: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === idToRemove ? null : tree\n }\n const newFirst = removePane(tree.first, idToRemove)\n const newSecond = removePane(tree.second, idToRemove)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n return typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.paneId === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Swap the position of two panes in the tree structure.\n */\nexport function swapPanes(tree: TreeNode | null, idA: string, idB: string): TreeNode | null {\n if (tree === null) return null\n\n // First pass: collect the full PaneNode references\n const nodeA = findPane(tree, idA)\n const nodeB = findPane(tree, idB)\n if (!nodeA || !nodeB) return tree\n\n // Second pass: replace each location with the other node\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.paneId === idA) return { ...nodeB! }\n if (node.paneId === idB) return { ...nodeA! }\n return node\n }\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', paneId: paneToAdd }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: { type: 'pane', paneId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Split the entire tree at the root using a dragged pane.\n */\nexport function splitRoot(\n tree: TreeNode | null,\n draggingId: string,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n): TreeNode | null {\n // Preserve dragged pane's metadata\n const draggedPaneNode: PaneNode = findPane(tree, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(tree, draggingId)\n if (treeWithoutDragging === null) {\n return { ...draggedPaneNode }\n }\n\n const direction: SplitDirection = splitType === 'left' || splitType === 'right' ? 'row' : 'column'\n const isFirst = splitType === 'left' || splitType === 'top'\n const draggedNode: TreeNode = { ...draggedPaneNode }\n\n return {\n type: 'split',\n direction,\n first: isFirst ? draggedNode : treeWithoutDragging,\n second: isFirst ? treeWithoutDragging : draggedNode,\n splitPercentage: 50,\n }\n}\n\n/**\n * Find a PaneNode by its paneId.\n */\nexport function findPane(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === paneId ? tree : null\n }\n return findPane(tree.first, paneId) ?? findPane(tree.second, paneId)\n}\n\n/**\n * Update metadata on a specific pane node using an updater function.\n */\nexport function updatePaneMetadata(\n tree: TreeNode | null,\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.paneId === paneId) {\n const newMetadata = updater(tree.metadata)\n if (newMetadata === undefined) {\n // Remove metadata key\n const { metadata: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, metadata: newMetadata }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneMetadata(tree.first, paneId, updater) ?? tree.first,\n second: updatePaneMetadata(tree.second, paneId, updater) ?? tree.second,\n }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import React, { useState, useEffect, useRef, ReactNode, useMemo, useCallback } from 'react'\nimport {\n DndContext,\n useSensor,\n useSensors,\n PointerSensor,\n TouchSensor,\n DragStartEvent,\n DragEndEvent,\n DragMoveEvent,\n pointerWithin,\n} from '@dnd-kit/core'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\nimport {\n removePane,\n splitPane,\n swapPanes,\n addPane,\n updateSplitPercentage,\n splitRoot,\n updatePaneMetadata,\n findPane,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n ZeugmaClassNames,\n ResizerRenderProps,\n} from '../model/context'\n\n/** Cursor-following overlay rendered via portal */\nconst CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n\nclass SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nclass SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\ninterface DashboardProviderProps {\n layout: TreeNode | null\n onChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n renderDragOverlay?: (activeId: string) => ReactNode\n classNames?: ZeugmaClassNames\n fullscreenPaneId?: string | null\n onFullscreenChange?: (paneId: string | null) => void\n onRemove?: (paneId: string) => void\n dragActivationDistance?: number\n snapThreshold?: number\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'swap'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n dragOutThreshold?: number\n onDragOutChange?: (paneId: string | null) => void\n onDragOut?: (paneId: string) => void\n children: ReactNode\n}\n\nexport const DashboardProvider: React.FC<DashboardProviderProps> = ({\n layout,\n onChange,\n renderPane,\n renderDragOverlay,\n classNames = {},\n fullscreenPaneId = null,\n onFullscreenChange,\n onRemove,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n renderResizer,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n dragOutThreshold = 60,\n onDragOutChange,\n onDragOut,\n children,\n}) => {\n const [localLayout, setLocalLayout] = useState<TreeNode | null>(layout)\n const prevLayoutRef = useRef(layout)\n\n if (layout !== prevLayoutRef.current) {\n prevLayoutRef.current = layout\n setLocalLayout(layout)\n }\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [draggedOutId, setDraggedOutId] = useState<string | null>(null)\n const containerRef = useRef<HTMLElement | null>(null)\n const containerRectRef = useRef<DOMRect | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n const onDragOutChangeRef = useRef(onDragOutChange)\n onDragOutChangeRef.current = onDragOutChange\n\n const onDragOutRef = useRef(onDragOut)\n onDragOutRef.current = onDragOut\n\n // Refs for stable closure access — prevents callback identity changes on every layout update\n const layoutRef = useRef(localLayout)\n layoutRef.current = localLayout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const renderPaneRef = useRef(renderPane)\n renderPaneRef.current = renderPane\n\n const onResizeEndPropRef = useRef(onResizeEnd)\n onResizeEndPropRef.current = onResizeEnd\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPaneRef.current(paneId), [])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.pane,\n classNames.dropPreview,\n classNames.swapPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dragOut,\n ],\n )\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const handleDragStart = (event: DragStartEvent) => {\n const draggingId = event.active.id.toString()\n setActiveId(draggingId)\n if (containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n if (onDragStart) {\n onDragStart(draggingId)\n }\n }\n\n const handleDragMove = (event: DragMoveEvent) => {\n const draggingId = event.active.id.toString()\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (draggedOutId !== null) {\n setDraggedOutId(null)\n onDragOutChangeRef.current?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (ae instanceof MouseEvent || ae instanceof PointerEvent) {\n px = ae.clientX + event.delta.x\n py = ae.clientY + event.delta.y\n } else if (typeof TouchEvent !== 'undefined' && ae instanceof TouchEvent) {\n const touch = ae.touches[0] || ae.changedTouches[0]\n if (touch) {\n px = touch.clientX + event.delta.x\n py = touch.clientY + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDraggedOut = distance > dragOutThreshold\n if (isDraggedOut) {\n if (draggedOutId !== draggingId) {\n setDraggedOutId(draggingId)\n onDragOutChangeRef.current?.(draggingId)\n }\n } else {\n if (draggedOutId !== null) {\n setDraggedOutId(null)\n onDragOutChangeRef.current?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n const { active, over } = event\n const draggingId = active.id.toString()\n\n const wasDraggedOut = draggedOutId === draggingId\n\n setDraggedOutId(null)\n onDragOutChangeRef.current?.(null)\n containerRectRef.current = null\n\n if (wasDraggedOut) {\n if (onDragOutRef.current) {\n onDragOutRef.current(draggingId)\n } else {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n handleRemovePane(draggingId)\n }\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n // Check for root drop (places pane like half of the root)\n const rootMatch = overIdStr.match(/^drop-root-(left|right|top|bottom)$/)\n if (rootMatch) {\n const [, dropZone] = rootMatch\n const newLayout = splitRoot(\n localLayout,\n draggingId,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n\n if (onDragEnd) {\n const direction: SplitDirection =\n dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n return\n }\n\n // Check for center (swap) drop\n const swapMatch = overIdStr.match(/^drop-center-(.+)$/)\n if (swapMatch) {\n const [, targetId] = swapMatch\n if (draggingId !== targetId) {\n const newLayout = swapPanes(localLayout, draggingId, targetId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, { type: 'swap', position: 'center' })\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n if (draggingId === targetId) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n const draggedPaneNode = findPane(localLayout, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(localLayout, draggingId)\n\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleLocalLayoutChange = useCallback((newLayout: TreeNode | null) => {\n setLocalLayout(newLayout)\n }, [])\n\n const handleRemovePane = useCallback((paneId: string) => {\n const newLayout = removePane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleAddPane = useCallback((paneId: string) => {\n const newLayout = addPane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSwapPanes = useCallback((paneIdA: string, paneIdB: string) => {\n const newLayout = swapPanes(layoutRef.current, paneIdA, paneIdB)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSplitPane = useCallback(\n (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const draggedPaneNode = findPane(layoutRef.current, paneToAdd) ?? {\n type: 'pane',\n paneId: paneToAdd,\n }\n const treeWithoutDragging = removePane(layoutRef.current, paneToAdd)\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n splitType,\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleUpdateSplitPercentage = useCallback((currentNode: SplitNode, percentage: number) => {\n const newLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleUpdatePaneMetadata = useCallback(\n (\n paneId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => {\n const newLayout = updatePaneMetadata(layoutRef.current, paneId, updater)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleResizeEnd = useCallback((currentNode: SplitNode, percentage: number) => {\n const finalLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(finalLayout)\n onChangeRef.current(finalLayout)\n if (onResizeEndPropRef.current) {\n onResizeEndPropRef.current(currentNode, percentage)\n }\n }, [])\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout: localLayout,\n onLayoutChange: handleLocalLayoutChange,\n renderPane: stableRenderPane,\n activeId,\n draggedOutId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n }),\n [\n localLayout,\n activeId,\n draggedOutId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n // Stable callbacks (empty deps) — included for exhaustive-deps lint rule\n handleLocalLayoutChange,\n stableRenderPane,\n handleResizeEnd,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane: handleRemovePane,\n addPane: handleAddPane,\n swapPanes: handleSwapPanes,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updatePaneMetadata: handleUpdatePaneMetadata,\n }),\n [\n handleRemovePane,\n handleAddPane,\n handleSwapPanes,\n handleSplitPane,\n handleUpdateSplitPercentage,\n handleUpdatePaneMetadata,\n ],\n )\n\n return (\n <DashboardActionsContext.Provider value={actionsValue}>\n <DashboardStateContext.Provider value={stateValue}>\n <DndContext\n id=\"zeugma-dnd-context\"\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n {activeId && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={renderDragOverlay}\n className={`${classNames.dragOverlay || ''} ${\n activeId === draggedOutId ? classNames.dragOut || 'zeugma-dragout' : ''\n }`.trim()}\n />\n )}\n </DashboardStateContext.Provider>\n </DashboardActionsContext.Provider>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nconst rootActivationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n}\n\nconst rootPreviewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport interface RootDropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nexport const RootDropZone: React.FC<RootDropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={rootActivationPositions[position]} />\n {isOver && <div className={activeClassName} style={rootPreviewPositions[position]} />}\n </>\n )\n}\n\nexport interface RootDropZonesProps {\n activeId: string | null\n hasOtherPanes: boolean\n dropPreviewClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({\n activeId,\n hasOtherPanes,\n dropPreviewClassName,\n}) => {\n if (!activeId || !hasOtherPanes) return null\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 30,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <RootDropZone\n key={pos}\n id={`drop-root-${pos}`}\n position={pos}\n activeClassName={dropPreviewClassName}\n />\n ))}\n </div>\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage } from '../../../shared/lib/tree'\nimport { useDashboardState } from '../../../entities/dashboard'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = useDashboardState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n document.body.classList.add('zeugma-resizing')\n\n // Inject global cursor style to keep resizing cursor active across the entire page during drag\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${isRow ? 'col-resize' : 'row-resize'} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const resizerEl = e.currentTarget\n resizerEl.setAttribute('data-resizing', 'true')\n\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / rect.width) * 100\n : ((moveEvent.clientY - startY) / rect.height) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? rect.left + (rect.width - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n : rect.top + (rect.height - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - rect.left) / (rect.width - resizerSize)) * 100\n : ((bestTarget - resizerSize / 2 - rect.top) / (rect.height - resizerSize)) * 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Imperatively update the sibling pane container flex sizes during drag\n const firstChild = container.children[0] as HTMLElement\n const secondChild = container.children[container.children.length - 1] as HTMLElement\n if (firstChild && secondChild) {\n firstChild.style.flex = `${finalPercentage} 1 0%`\n secondChild.style.flex = `${100 - finalPercentage} 1 0%`\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n }\n\n const handlePointerUp = () => {\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Write to React state once resizing completes\n const newLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n console.log('onLayoutChange (finalized) called with percentage:', currentPercentage)\n onLayoutChange(newLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n ],\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { useDashboardState, ResizerRenderProps, RootDropZones } from '../../../entities/dashboard'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode } from '../../../shared/model'\nimport { removePane } from '../../../shared'\n\nexport interface PaneTreeProps {\n tree?: TreeNode | null\n /** Size of the resizer in pixels (default 4) */\n resizerSize?: number\n /** Threshold in pixels to snap to adjacent resizer edges (default 8) */\n snapThreshold?: number\n /** Custom resizer renderer to override context-level renderResizer */\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\ninterface PaneSplitProps {\n currentNode: SplitNode\n resizerSize: number\n snapThreshold?: number\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\nconst PaneSplit: React.FC<PaneSplitProps> = ({\n currentNode,\n resizerSize,\n snapThreshold,\n renderResizer: propRenderResizer,\n}) => {\n const {\n layout,\n onLayoutChange,\n classNames,\n renderResizer: contextRenderResizer,\n } = useDashboardState()\n const [isResizing, setIsResizing] = useState(false)\n\n const renderResizer = propRenderResizer || contextRenderResizer\n\n const containerRef = useRef<HTMLDivElement>(null)\n const { direction, first, second, splitPercentage } = currentNode\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold: snapThreshold ?? 8,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n })\n\n return (\n <div\n ref={containerRef}\n style={{\n display: 'flex',\n flexDirection: isRow ? 'row' : 'column',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <div style={{ flex: `${splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={first}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n {renderResizer ? (\n renderResizer({\n direction,\n splitPercentage,\n resizerSize,\n isResizing,\n onPointerDown: handlePointerDown,\n })\n ) : (\n <div\n className={classNames.resizer}\n data-direction={direction}\n style={{\n width: isRow ? `${resizerSize}px` : '100%',\n height: isRow ? '100%' : `${resizerSize}px`,\n cursor: isRow ? 'col-resize' : 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )}\n <div style={{ flex: `${100 - splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={second}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n </div>\n )\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n renderResizer,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n draggedOutId,\n setContainerRef,\n classNames,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n } = useDashboardState()\n\n const snapThreshold = propSnapThreshold !== undefined ? propSnapThreshold : contextSnapThreshold\n\n const hasOtherPanes = useMemo(() => {\n if (tree !== undefined || !activeId) return false\n return removePane(layout, activeId) !== null\n }, [tree, layout, activeId])\n\n // Fullscreen bypass\n if (fullscreenPaneId && !tree) {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(fullscreenPaneId)}\n </div>\n )\n }\n\n const currentNode = tree !== undefined ? tree : layout\n\n if (!currentNode) return null\n\n const renderContent = () => {\n if (currentNode.type === 'pane') {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(currentNode.paneId)}\n </div>\n )\n }\n\n return (\n <PaneSplit\n currentNode={currentNode}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={renderResizer}\n />\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDragOutActive = activeId !== null && activeId === draggedOutId\n return (\n <div\n ref={setContainerRef}\n className={`zeugma-dashboard-root ${isDragOutActive ? 'zeugma-dashboard-dragout-active' : ''}`.trim()}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n <RootDropZones\n activeId={activeId}\n hasOtherPanes={hasOtherPanes}\n dropPreviewClassName={classNames.dropPreview}\n />\n </div>\n )\n }\n\n return renderContent()\n}\n","import { createContext } from 'react'\n\nexport const DragListenersCtx = createContext<Record<string, unknown> | null>(null)\n","import React, { useMemo } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useDashboardState, useDashboardActions } from '../../dashboard'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPane } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'center'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n center: {\n position: 'absolute',\n top: '25%',\n left: '25%',\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n center: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\ninterface PaneProps {\n id: string\n children: (props: PaneRenderProps) => React.ReactNode\n style?: React.CSSProperties\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style }) => {\n const { layout, activeId, classNames, fullscreenPaneId, onRemove, onFullscreenChange } =\n useDashboardState()\n const { removePane, updatePaneMetadata } = useDashboardActions()\n const showDropZones = activeId !== null && activeId !== id\n\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id })\n const dragging = activeId === id || isDragging\n const isFullscreen = fullscreenPaneId === id\n\n const paneNode = useMemo(() => findPane(layout, id), [layout, id])\n const metadata = paneNode?.metadata\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n if (onRemove) {\n onRemove(id)\n } else {\n removePane(id)\n }\n },\n metadata,\n updateMetadata: (updater) => {\n updatePaneMetadata(id, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n onRemove,\n removePane,\n metadata,\n updatePaneMetadata,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(\n () => ({\n ...listeners,\n ...attributes,\n }),\n [listeners, attributes],\n )\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={classNames.pane}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={classNames.swapPreview}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\ninterface DragHandleProps {\n children: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n return (\n <div\n className={className}\n style={{ cursor: 'grab', userSelect: 'none', touchAction: 'none', ...style }}\n {...dragProps}\n >\n {children}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/entities/dashboard/model/context.ts","../src/entities/dashboard/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/dashboard/ui/DashboardProvider.tsx","../src/entities/dashboard/ui/RootDropZone.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx"],"names":["DashboardStateContext","createContext","DashboardActionsContext","useDashboardState","state","useContext","useDashboardActions","actions","removePane","tree","idToRemove","newFirst","newSecond","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","swapPanes","idA","idB","nodeA","findPane","nodeB","swap","node","addPane","insert","parentDirection","updateSplitPercentage","target","newPercentage","splitRoot","draggingId","draggedPaneNode","treeWithoutDragging","draggedNode","paneId","updatePaneMetadata","updater","newMetadata","_","rest","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","activeId","render","className","ref","useRef","useEffect","handleMove","e","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","DashboardProvider","layout","onChange","renderPane","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","renderResizer","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onDismissIntentChange","children","localLayout","setLocalLayout","useState","prevLayoutRef","setActiveId","dismissIntentId","setDismissIntentId","containerRef","containerRectRef","setContainerRef","useCallback","element","onDismissIntentChangeRef","layoutRef","onChangeRef","renderPaneRef","onResizeEndPropRef","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","handleDragMove","containerRect","ae","px","py","touch","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDismissIntent","handleRemovePane","overIdStr","rootMatch","dropZone","newLayout","swapMatch","match","handleLocalLayoutChange","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleResizeEnd","finalLayout","stateValue","actionsValue","jsxs","DndContext","pointerWithin","rootActivationPositions","rootPreviewPositions","RootDropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Fragment","RootDropZones","hasOtherPanes","dropPreviewClassName","pos","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","styleEl","rect","startX","startY","startPercentage","resizerEl","otherPositions","el","r","currentPercentage","handlePointerMove","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","dist","snappedPercentage","finalPercentage","firstChild","secondChild","handlePointerUp","globalStyle","PaneSplit","propRenderResizer","contextRenderResizer","isResizing","setIsResizing","first","second","handlePointerDown","PaneTree","propSnapThreshold","contextSnapThreshold","renderContent","DragListenersCtx","activationPositions","previewPositions","DropZone","Pane","style","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","isFullscreen","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, ReactNode } from 'react'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\n\nexport interface ZeugmaClassNames {\n pane?: string\n dropPreview?: string\n swapPreview?: string\n dragOverlay?: string\n resizer?: string\n dismissPreview?: string\n}\n\nexport interface ResizerRenderProps {\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n isResizing: boolean\n onPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void\n}\n\n/**\n * State context — holds reactive values that change during runtime.\n * All consumers of this context will re-render when any of these values change.\n */\nexport interface DashboardStateValue {\n layout: TreeNode | null\n onLayoutChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n activeId: string | null\n dismissIntentId: string | null\n setContainerRef: (element: HTMLElement | null) => void\n fullscreenPaneId: string | null\n classNames: ZeugmaClassNames\n onRemove?: (paneId: string) => void\n onFullscreenChange?: (paneId: string | null) => void\n snapThreshold?: number\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n}\n\n/**\n * Actions context — holds stable dispatch functions with permanent identity.\n * Consumers of only this context will never re-render from layout/drag state changes.\n */\nexport interface DashboardActionsValue {\n removePane: (paneId: string) => void\n addPane: (paneId: string) => void\n swapPanes: (paneIdA: string, paneIdB: string) => void\n splitPane: (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => void\n updateSplitPercentage: (currentNode: SplitNode, percentage: number) => void\n updatePaneMetadata: (\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n ) => void\n}\nexport const DashboardStateContext = createContext<DashboardStateValue | undefined>(undefined)\nexport const DashboardActionsContext = createContext<DashboardActionsValue | undefined>(undefined)\n","import { useContext } from 'react'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n DashboardStateValue,\n DashboardActionsValue,\n} from './context'\n\n/** Returns only reactive state. Use when you need layout, activeId, classNames, etc. */\nexport const useDashboardState = (): DashboardStateValue => {\n const state = useContext(DashboardStateContext)\n if (!state) {\n throw new Error('useDashboardState must be used within a DashboardProvider')\n }\n return state\n}\n\n/** Returns only stable action dispatchers. Consumers of this hook never re-render from state changes. */\nexport const useDashboardActions = (): DashboardActionsValue => {\n const actions = useContext(DashboardActionsContext)\n if (!actions) {\n throw new Error('useDashboardActions must be used within a DashboardProvider')\n }\n return actions\n}\n","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\n\n/**\n * Tree Helper: Remove a pane and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, idToRemove: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === idToRemove ? null : tree\n }\n const newFirst = removePane(tree.first, idToRemove)\n const newSecond = removePane(tree.second, idToRemove)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n return typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.paneId === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Swap the position of two panes in the tree structure.\n */\nexport function swapPanes(tree: TreeNode | null, idA: string, idB: string): TreeNode | null {\n if (tree === null) return null\n\n // First pass: collect the full PaneNode references\n const nodeA = findPane(tree, idA)\n const nodeB = findPane(tree, idB)\n if (!nodeA || !nodeB) return tree\n\n // Second pass: replace each location with the other node\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.paneId === idA) return { ...nodeB! }\n if (node.paneId === idB) return { ...nodeA! }\n return node\n }\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', paneId: paneToAdd }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: { type: 'pane', paneId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Split the entire tree at the root using a dragged pane.\n */\nexport function splitRoot(\n tree: TreeNode | null,\n draggingId: string,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n): TreeNode | null {\n // Preserve dragged pane's metadata\n const draggedPaneNode: PaneNode = findPane(tree, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(tree, draggingId)\n if (treeWithoutDragging === null) {\n return { ...draggedPaneNode }\n }\n\n const direction: SplitDirection = splitType === 'left' || splitType === 'right' ? 'row' : 'column'\n const isFirst = splitType === 'left' || splitType === 'top'\n const draggedNode: TreeNode = { ...draggedPaneNode }\n\n return {\n type: 'split',\n direction,\n first: isFirst ? draggedNode : treeWithoutDragging,\n second: isFirst ? treeWithoutDragging : draggedNode,\n splitPercentage: 50,\n }\n}\n\n/**\n * Find a PaneNode by its paneId.\n */\nexport function findPane(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === paneId ? tree : null\n }\n return findPane(tree.first, paneId) ?? findPane(tree.second, paneId)\n}\n\n/**\n * Update metadata on a specific pane node using an updater function.\n */\nexport function updatePaneMetadata(\n tree: TreeNode | null,\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.paneId === paneId) {\n const newMetadata = updater(tree.metadata)\n if (newMetadata === undefined) {\n // Remove metadata key\n const { metadata: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, metadata: newMetadata }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneMetadata(tree.first, paneId, updater) ?? tree.first,\n second: updatePaneMetadata(tree.second, paneId, updater) ?? tree.second,\n }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import React, { useState, useEffect, useRef, ReactNode, useMemo, useCallback } from 'react'\nimport {\n DndContext,\n useSensor,\n useSensors,\n PointerSensor,\n TouchSensor,\n DragStartEvent,\n DragEndEvent,\n DragMoveEvent,\n pointerWithin,\n} from '@dnd-kit/core'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\nimport {\n removePane,\n splitPane,\n swapPanes,\n addPane,\n updateSplitPercentage,\n splitRoot,\n updatePaneMetadata,\n findPane,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n ZeugmaClassNames,\n ResizerRenderProps,\n} from '../model/context'\n\n/** Cursor-following overlay rendered via portal */\nconst CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n\nclass SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nclass SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\ninterface DashboardProviderProps {\n layout: TreeNode | null\n onChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n renderDragOverlay?: (activeId: string) => ReactNode\n classNames?: ZeugmaClassNames\n fullscreenPaneId?: string | null\n onFullscreenChange?: (paneId: string | null) => void\n onRemove?: (paneId: string) => void\n dragActivationDistance?: number\n snapThreshold?: number\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'swap'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n enableDragToDismiss?: boolean\n dismissThreshold?: number\n onDismissIntentChange?: (paneId: string | null) => void\n children: ReactNode\n}\n\nexport const DashboardProvider: React.FC<DashboardProviderProps> = ({\n layout,\n onChange,\n renderPane,\n renderDragOverlay,\n classNames = {},\n fullscreenPaneId = null,\n onFullscreenChange,\n onRemove,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n renderResizer,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onDismissIntentChange,\n children,\n}) => {\n const [localLayout, setLocalLayout] = useState<TreeNode | null>(layout)\n const prevLayoutRef = useRef(layout)\n\n if (layout !== prevLayoutRef.current) {\n prevLayoutRef.current = layout\n setLocalLayout(layout)\n }\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n const containerRef = useRef<HTMLElement | null>(null)\n const containerRectRef = useRef<DOMRect | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n const onDismissIntentChangeRef = useRef(onDismissIntentChange)\n onDismissIntentChangeRef.current = onDismissIntentChange\n\n // Refs for stable closure access — prevents callback identity changes on every layout update\n const layoutRef = useRef(localLayout)\n layoutRef.current = localLayout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const renderPaneRef = useRef(renderPane)\n renderPaneRef.current = renderPane\n\n const onResizeEndPropRef = useRef(onResizeEnd)\n onResizeEndPropRef.current = onResizeEnd\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPaneRef.current(paneId), [])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.pane,\n classNames.dropPreview,\n classNames.swapPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n ],\n )\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const handleDragStart = (event: DragStartEvent) => {\n const draggingId = event.active.id.toString()\n setActiveId(draggingId)\n if (enableDragToDismiss && containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n if (onDragStart) {\n onDragStart(draggingId)\n }\n }\n\n const handleDragMove = (event: DragMoveEvent) => {\n if (!enableDragToDismiss) return\n\n const draggingId = event.active.id.toString()\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChangeRef.current?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (ae instanceof MouseEvent || ae instanceof PointerEvent) {\n px = ae.clientX + event.delta.x\n py = ae.clientY + event.delta.y\n } else if (typeof TouchEvent !== 'undefined' && ae instanceof TouchEvent) {\n const touch = ae.touches[0] || ae.changedTouches[0]\n if (touch) {\n px = touch.clientX + event.delta.x\n py = touch.clientY + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n onDismissIntentChangeRef.current?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChangeRef.current?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n const { active, over } = event\n const draggingId = active.id.toString()\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChangeRef.current?.(null)\n containerRectRef.current = null\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n handleRemovePane(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n // Check for root drop (places pane like half of the root)\n const rootMatch = overIdStr.match(/^drop-root-(left|right|top|bottom)$/)\n if (rootMatch) {\n const [, dropZone] = rootMatch\n const newLayout = splitRoot(\n localLayout,\n draggingId,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n\n if (onDragEnd) {\n const direction: SplitDirection =\n dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n return\n }\n\n // Check for center (swap) drop\n const swapMatch = overIdStr.match(/^drop-center-(.+)$/)\n if (swapMatch) {\n const [, targetId] = swapMatch\n if (draggingId !== targetId) {\n const newLayout = swapPanes(localLayout, draggingId, targetId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, { type: 'swap', position: 'center' })\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n if (draggingId === targetId) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n const draggedPaneNode = findPane(localLayout, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(localLayout, draggingId)\n\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleLocalLayoutChange = useCallback((newLayout: TreeNode | null) => {\n setLocalLayout(newLayout)\n }, [])\n\n const handleRemovePane = useCallback((paneId: string) => {\n const newLayout = removePane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleAddPane = useCallback((paneId: string) => {\n const newLayout = addPane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSwapPanes = useCallback((paneIdA: string, paneIdB: string) => {\n const newLayout = swapPanes(layoutRef.current, paneIdA, paneIdB)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSplitPane = useCallback(\n (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const draggedPaneNode = findPane(layoutRef.current, paneToAdd) ?? {\n type: 'pane',\n paneId: paneToAdd,\n }\n const treeWithoutDragging = removePane(layoutRef.current, paneToAdd)\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n splitType,\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleUpdateSplitPercentage = useCallback((currentNode: SplitNode, percentage: number) => {\n const newLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleUpdatePaneMetadata = useCallback(\n (\n paneId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => {\n const newLayout = updatePaneMetadata(layoutRef.current, paneId, updater)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleResizeEnd = useCallback((currentNode: SplitNode, percentage: number) => {\n const finalLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(finalLayout)\n onChangeRef.current(finalLayout)\n if (onResizeEndPropRef.current) {\n onResizeEndPropRef.current(currentNode, percentage)\n }\n }, [])\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout: localLayout,\n onLayoutChange: handleLocalLayoutChange,\n renderPane: stableRenderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n }),\n [\n localLayout,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n // Stable callbacks (empty deps) — included for exhaustive-deps lint rule\n handleLocalLayoutChange,\n stableRenderPane,\n handleResizeEnd,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane: handleRemovePane,\n addPane: handleAddPane,\n swapPanes: handleSwapPanes,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updatePaneMetadata: handleUpdatePaneMetadata,\n }),\n [\n handleRemovePane,\n handleAddPane,\n handleSwapPanes,\n handleSplitPane,\n handleUpdateSplitPercentage,\n handleUpdatePaneMetadata,\n ],\n )\n\n return (\n <DashboardActionsContext.Provider value={actionsValue}>\n <DashboardStateContext.Provider value={stateValue}>\n <DndContext\n id=\"zeugma-dnd-context\"\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n {activeId && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={renderDragOverlay}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId\n ? classNames.dismissPreview || 'zeugma-dismiss-preview'\n : ''\n }`.trim()}\n />\n )}\n </DashboardStateContext.Provider>\n </DashboardActionsContext.Provider>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nconst rootActivationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n}\n\nconst rootPreviewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport interface RootDropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nexport const RootDropZone: React.FC<RootDropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={rootActivationPositions[position]} />\n {isOver && <div className={activeClassName} style={rootPreviewPositions[position]} />}\n </>\n )\n}\n\nexport interface RootDropZonesProps {\n activeId: string | null\n hasOtherPanes: boolean\n dropPreviewClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({\n activeId,\n hasOtherPanes,\n dropPreviewClassName,\n}) => {\n if (!activeId || !hasOtherPanes) return null\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 30,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <RootDropZone\n key={pos}\n id={`drop-root-${pos}`}\n position={pos}\n activeClassName={dropPreviewClassName}\n />\n ))}\n </div>\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage } from '../../../shared/lib/tree'\nimport { useDashboardState } from '../../../entities/dashboard'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = useDashboardState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n document.body.classList.add('zeugma-resizing')\n\n // Inject global cursor style to keep resizing cursor active across the entire page during drag\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${isRow ? 'col-resize' : 'row-resize'} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const resizerEl = e.currentTarget\n resizerEl.setAttribute('data-resizing', 'true')\n\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / rect.width) * 100\n : ((moveEvent.clientY - startY) / rect.height) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? rect.left + (rect.width - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n : rect.top + (rect.height - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - rect.left) / (rect.width - resizerSize)) * 100\n : ((bestTarget - resizerSize / 2 - rect.top) / (rect.height - resizerSize)) * 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Imperatively update the sibling pane container flex sizes during drag\n const firstChild = container.children[0] as HTMLElement\n const secondChild = container.children[container.children.length - 1] as HTMLElement\n if (firstChild && secondChild) {\n firstChild.style.flex = `${finalPercentage} 1 0%`\n secondChild.style.flex = `${100 - finalPercentage} 1 0%`\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n }\n\n const handlePointerUp = () => {\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Write to React state once resizing completes\n const newLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n console.log('onLayoutChange (finalized) called with percentage:', currentPercentage)\n onLayoutChange(newLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n ],\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { useDashboardState, ResizerRenderProps, RootDropZones } from '../../../entities/dashboard'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode } from '../../../shared/model'\nimport { removePane } from '../../../shared'\n\nexport interface PaneTreeProps {\n tree?: TreeNode | null\n /** Size of the resizer in pixels (default 4) */\n resizerSize?: number\n /** Threshold in pixels to snap to adjacent resizer edges (default 8) */\n snapThreshold?: number\n /** Custom resizer renderer to override context-level renderResizer */\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\ninterface PaneSplitProps {\n currentNode: SplitNode\n resizerSize: number\n snapThreshold?: number\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\nconst PaneSplit: React.FC<PaneSplitProps> = ({\n currentNode,\n resizerSize,\n snapThreshold,\n renderResizer: propRenderResizer,\n}) => {\n const {\n layout,\n onLayoutChange,\n classNames,\n renderResizer: contextRenderResizer,\n } = useDashboardState()\n const [isResizing, setIsResizing] = useState(false)\n\n const renderResizer = propRenderResizer || contextRenderResizer\n\n const containerRef = useRef<HTMLDivElement>(null)\n const { direction, first, second, splitPercentage } = currentNode\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold: snapThreshold ?? 8,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n })\n\n return (\n <div\n ref={containerRef}\n style={{\n display: 'flex',\n flexDirection: isRow ? 'row' : 'column',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <div style={{ flex: `${splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={first}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n {renderResizer ? (\n renderResizer({\n direction,\n splitPercentage,\n resizerSize,\n isResizing,\n onPointerDown: handlePointerDown,\n })\n ) : (\n <div\n className={classNames.resizer}\n data-direction={direction}\n style={{\n width: isRow ? `${resizerSize}px` : '100%',\n height: isRow ? '100%' : `${resizerSize}px`,\n cursor: isRow ? 'col-resize' : 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )}\n <div style={{ flex: `${100 - splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={second}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n </div>\n )\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n renderResizer,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n classNames,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n } = useDashboardState()\n\n const snapThreshold = propSnapThreshold !== undefined ? propSnapThreshold : contextSnapThreshold\n\n const hasOtherPanes = useMemo(() => {\n if (tree !== undefined || !activeId) return false\n return removePane(layout, activeId) !== null\n }, [tree, layout, activeId])\n\n // Fullscreen bypass\n if (fullscreenPaneId && !tree) {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(fullscreenPaneId)}\n </div>\n )\n }\n\n const currentNode = tree !== undefined ? tree : layout\n\n if (!currentNode) return null\n\n const renderContent = () => {\n if (currentNode.type === 'pane') {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(currentNode.paneId)}\n </div>\n )\n }\n\n return (\n <PaneSplit\n currentNode={currentNode}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={renderResizer}\n />\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n return (\n <div\n ref={setContainerRef}\n className={`zeugma-dashboard-root ${isDismissActive ? 'zeugma-dashboard-dismiss-active' : ''}`.trim()}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n <RootDropZones\n activeId={activeId}\n hasOtherPanes={hasOtherPanes}\n dropPreviewClassName={classNames.dropPreview}\n />\n </div>\n )\n }\n\n return renderContent()\n}\n","import { createContext } from 'react'\n\nexport const DragListenersCtx = createContext<Record<string, unknown> | null>(null)\n","import React, { useMemo } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useDashboardState, useDashboardActions } from '../../dashboard'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPane } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'center'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n center: {\n position: 'absolute',\n top: '25%',\n left: '25%',\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n center: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\ninterface PaneProps {\n id: string\n children: (props: PaneRenderProps) => React.ReactNode\n style?: React.CSSProperties\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style }) => {\n const { layout, activeId, classNames, fullscreenPaneId, onRemove, onFullscreenChange } =\n useDashboardState()\n const { removePane, updatePaneMetadata } = useDashboardActions()\n const showDropZones = activeId !== null && activeId !== id\n\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id })\n const dragging = activeId === id || isDragging\n const isFullscreen = fullscreenPaneId === id\n\n const paneNode = useMemo(() => findPane(layout, id), [layout, id])\n const metadata = paneNode?.metadata\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n if (onRemove) {\n onRemove(id)\n } else {\n removePane(id)\n }\n },\n metadata,\n updateMetadata: (updater) => {\n updatePaneMetadata(id, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n onRemove,\n removePane,\n metadata,\n updatePaneMetadata,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(\n () => ({\n ...listeners,\n ...attributes,\n }),\n [listeners, attributes],\n )\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={classNames.pane}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={classNames.swapPreview}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\ninterface DragHandleProps {\n children: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n return (\n <div\n className={className}\n style={{ cursor: 'grab', userSelect: 'none', touchAction: 'none', ...style }}\n {...dragProps}\n >\n {children}\n </div>\n )\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -21,7 +21,7 @@ interface ZeugmaClassNames {
21
21
  swapPreview?: string;
22
22
  dragOverlay?: string;
23
23
  resizer?: string;
24
- dragOut?: string;
24
+ dismissPreview?: string;
25
25
  }
26
26
  interface ResizerRenderProps {
27
27
  direction: SplitDirection;
@@ -39,7 +39,7 @@ interface DashboardStateValue {
39
39
  onLayoutChange: (newLayout: TreeNode | null) => void;
40
40
  renderPane: (paneId: string) => ReactNode;
41
41
  activeId: string | null;
42
- draggedOutId: string | null;
42
+ dismissIntentId: string | null;
43
43
  setContainerRef: (element: HTMLElement | null) => void;
44
44
  fullscreenPaneId: string | null;
45
45
  classNames: ZeugmaClassNames;
@@ -94,9 +94,9 @@ interface DashboardProviderProps {
94
94
  renderResizer?: (props: ResizerRenderProps) => ReactNode;
95
95
  minSplitPercentage?: number;
96
96
  maxSplitPercentage?: number;
97
- dragOutThreshold?: number;
98
- onDragOutChange?: (paneId: string | null) => void;
99
- onDragOut?: (paneId: string) => void;
97
+ enableDragToDismiss?: boolean;
98
+ dismissThreshold?: number;
99
+ onDismissIntentChange?: (paneId: string | null) => void;
100
100
  children: ReactNode;
101
101
  }
102
102
  declare const DashboardProvider: React$1.FC<DashboardProviderProps>;
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ interface ZeugmaClassNames {
21
21
  swapPreview?: string;
22
22
  dragOverlay?: string;
23
23
  resizer?: string;
24
- dragOut?: string;
24
+ dismissPreview?: string;
25
25
  }
26
26
  interface ResizerRenderProps {
27
27
  direction: SplitDirection;
@@ -39,7 +39,7 @@ interface DashboardStateValue {
39
39
  onLayoutChange: (newLayout: TreeNode | null) => void;
40
40
  renderPane: (paneId: string) => ReactNode;
41
41
  activeId: string | null;
42
- draggedOutId: string | null;
42
+ dismissIntentId: string | null;
43
43
  setContainerRef: (element: HTMLElement | null) => void;
44
44
  fullscreenPaneId: string | null;
45
45
  classNames: ZeugmaClassNames;
@@ -94,9 +94,9 @@ interface DashboardProviderProps {
94
94
  renderResizer?: (props: ResizerRenderProps) => ReactNode;
95
95
  minSplitPercentage?: number;
96
96
  maxSplitPercentage?: number;
97
- dragOutThreshold?: number;
98
- onDragOutChange?: (paneId: string | null) => void;
99
- onDragOut?: (paneId: string) => void;
97
+ enableDragToDismiss?: boolean;
98
+ dismissThreshold?: number;
99
+ onDismissIntentChange?: (paneId: string | null) => void;
100
100
  children: ReactNode;
101
101
  }
102
102
  declare const DashboardProvider: React$1.FC<DashboardProviderProps>;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import {createContext,useContext,useState,useRef,useCallback,useMemo,useEffect}from'react';import {useSensors,useSensor,DndContext,pointerWithin,useDraggable,PointerSensor,TouchSensor,useDroppable}from'@dnd-kit/core';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var de=createContext(void 0),ce=createContext(void 0);var k=()=>{let e=useContext(de);if(!e)throw new Error("useDashboardState must be used within a DashboardProvider");return e},be=()=>{let e=useContext(ce);if(!e)throw new Error("useDashboardActions must be used within a DashboardProvider");return e};function Z(e,t){if(e===null)return null;if(e.type==="pane")return e.paneId===t?null:e;let o=Z(e.first,t),r=Z(e.second,t);return o===null?r:r===null?o:{...e,first:o,second:r}}function ae(e,t,o,r,n){if(e===null)return typeof n=="string"?{type:"pane",paneId:n}:n;if(e.type==="pane"){if(e.paneId===t){let d=typeof n=="string"?{type:"pane",paneId:n}:n,a=r==="left"||r==="top";return {type:"split",direction:o,first:a?d:e,second:a?e:d,splitPercentage:50}}return e}return {...e,first:ae(e.first,t,o,r,n)||e.first,second:ae(e.second,t,o,r,n)||e.second}}function Pe(e,t,o){if(e===null)return null;let r=A(e,t),n=A(e,o);if(!r||!n)return e;function d(a){return a.type==="pane"?a.paneId===t?{...n}:a.paneId===o?{...r}:a:{...a,first:d(a.first),second:d(a.second)}}return d(e)}function Ze(e,t){if(e===null)return {type:"pane",paneId:t};function o(r,n){return r.type==="pane"?{type:"split",direction:n==="row"?"column":"row",splitPercentage:50,first:r,second:{type:"pane",paneId:t}}:{...r,second:o(r.second,r.direction)}}return o(e,null)}function G(e,t,o){return e===null?null:e===t?{...e,splitPercentage:o}:e.type==="split"?{...e,first:G(e.first,t,o)||e.first,second:G(e.second,t,o)||e.second}:e}function $e(e,t,o){let r=A(e,t)??{type:"pane",paneId:t},n=Z(e,t);if(n===null)return {...r};let d=o==="left"||o==="right"?"row":"column",a=o==="left"||o==="top",p={...r};return {type:"split",direction:d,first:a?p:n,second:a?n:p,splitPercentage:50}}function A(e,t){return e===null?null:e.type==="pane"?e.paneId===t?e:null:A(e.first,t)??A(e.second,t)}function ue(e,t,o){if(e===null)return null;if(e.type==="pane"){if(e.paneId===t){let r=o(e.metadata);if(r===void 0){let{metadata:n,...d}=e;return d}return {...e,metadata:r}}return e}return {...e,first:ue(e.first,t,o)??e.first,second:ue(e.second,t,o)??e.second}}var Je=8,Ke=8,Zt=4;var rt=({activeId:e,render:t,className:o})=>{let r=useRef(null);return useEffect(()=>{let n=d=>{r.current&&(r.current.style.transform=`translate(${d.clientX+12}px, ${d.clientY+12}px)`);};return document.addEventListener("pointermove",n),()=>document.removeEventListener("pointermove",n)},[]),jsx("div",{ref:r,className:o,style:{position:"fixed",top:0,left:0,zIndex:9999,pointerEvents:"none"},children:t(e)})},Ne=class extends PointerSensor{static activators=[{eventName:"onPointerDown",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},De=class extends TouchSensor{static activators=[{eventName:"onTouchStart",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},it=({layout:e,onChange:t,renderPane:o,renderDragOverlay:r,classNames:n={},fullscreenPaneId:d=null,onFullscreenChange:a,onRemove:p,dragActivationDistance:C=8,snapThreshold:N=8,onDragStart:x,onDragEnd:c,onResizeStart:h,onResize:z,onResizeEnd:D,renderResizer:v,minSplitPercentage:f=5,maxSplitPercentage:b=95,dragOutThreshold:J=60,onDragOutChange:P,onDragOut:K,children:ne})=>{let[g,R]=useState(e),me=useRef(e);e!==me.current&&(me.current=e,R(e));let[U,X]=useState(null),[M,Y]=useState(null),S=useRef(null),I=useRef(null),Q=useCallback(s=>{S.current=s;},[]),B=useRef(P);B.current=P;let j=useRef(K);j.current=K;let w=useRef(g);w.current=g;let T=useRef(t);T.current=t;let W=useRef(o);W.current=o;let ee=useRef(D);ee.current=D;let oe=useCallback(s=>W.current(s),[]),re=useMemo(()=>n,[n.pane,n.dropPreview,n.swapPreview,n.dragOverlay,n.resizer,n.dragOut]),ie=useSensors(useSensor(Ne,{activationConstraint:{distance:C}}),useSensor(De,{activationConstraint:{delay:250,tolerance:5}})),Xe=s=>{let u=s.active.id.toString();X(u),S.current?I.current=S.current.getBoundingClientRect():I.current=null,x&&x(u);},Ye=s=>{let u=s.active.id.toString(),i=I.current;if(!i){M!==null&&(Y(null),B.current?.(null));return}let l=s.activatorEvent,L=null,E=null;if(l instanceof MouseEvent||l instanceof PointerEvent)L=l.clientX+s.delta.x,E=l.clientY+s.delta.y;else if(typeof TouchEvent<"u"&&l instanceof TouchEvent){let m=l.touches[0]||l.changedTouches[0];m&&(L=m.clientX+s.delta.x,E=m.clientY+s.delta.y);}let H=0;if(L!==null&&E!==null){let m=0,y=0;L<i.left?m=i.left-L:L>i.right&&(m=L-i.right),E<i.top?y=i.top-E:E>i.bottom&&(y=E-i.bottom),H=Math.sqrt(m*m+y*y);}else {let m=s.active.rect.current.translated;if(m){let y=m.left+m.width/2,V=m.top+m.height/2,q=0,te=0;y<i.left?q=i.left-y:y>i.right&&(q=y-i.right),V<i.top?te=i.top-V:V>i.bottom&&(te=V-i.bottom),H=Math.sqrt(q*q+te*te);}}H>J?M!==u&&(Y(u),B.current?.(u)):M!==null&&(Y(null),B.current?.(null));},Be=s=>{X(null);let{active:u,over:i}=s,l=u.id.toString(),L=M===l;if(Y(null),B.current?.(null),I.current=null,L){j.current?j.current(l):p?p(l):he(l),c&&c(l,null,null);return}if(!i){c&&c(l,null,null);return}let E=i.id.toString(),H=E.match(/^drop-root-(left|right|top|bottom)$/);if(H){let[,_]=H,se=$e(g,l,_);R(se),t(se),c&&c(l,"root",{type:"split",direction:_==="left"||_==="right"?"row":"column",position:_});return}let ve=E.match(/^drop-center-(.+)$/);if(ve){let[,_]=ve;if(l!==_){let se=Pe(g,l,_);R(se),t(se);}c&&c(l,_,{type:"swap",position:"center"});return}let m=E.match(/^drop-(left|right|top|bottom)-(.+)$/);if(!m){c&&c(l,null,null);return}let[,y,V]=m;if(l===V){c&&c(l,null,null);return}let q=y==="left"||y==="right"?"row":"column",te=A(g,l)??{type:"pane",paneId:l},Ge=Z(g,l),Oe=ae(Ge,V,q,y,te);R(Oe),t(Oe),c&&c(l,V,{type:"split",direction:q,position:y});},Ie=useCallback(s=>{R(s);},[]),he=useCallback(s=>{let u=Z(w.current,s);R(u),T.current(u);},[]),Ee=useCallback(s=>{let u=Ze(w.current,s);R(u),T.current(u);},[]),Ce=useCallback((s,u)=>{let i=Pe(w.current,s,u);R(i),T.current(i);},[]),Te=useCallback((s,u,i,l)=>{let L=A(w.current,l)??{type:"pane",paneId:l},E=Z(w.current,l),H=ae(E,s,u,i,L);R(H),T.current(H);},[]),Le=useCallback((s,u)=>{let i=G(w.current,s,u);R(i),T.current(i);},[]),Me=useCallback((s,u)=>{let i=ue(w.current,s,u);R(i),T.current(i);},[]),Ae=useCallback((s,u)=>{let i=G(w.current,s,u);R(i),T.current(i),ee.current&&ee.current(s,u);},[]),We=useMemo(()=>({layout:g,onLayoutChange:Ie,renderPane:oe,activeId:U,draggedOutId:M,setContainerRef:Q,fullscreenPaneId:d,classNames:re,onRemove:p,onFullscreenChange:a,snapThreshold:N,onResizeStart:h,onResize:z,onResizeEnd:Ae,renderResizer:v,minSplitPercentage:f,maxSplitPercentage:b}),[g,U,M,Q,d,re,p,a,N,h,z,v,f,b,Ie,oe,Ae]),qe=useMemo(()=>({removePane:he,addPane:Ee,swapPanes:Ce,splitPane:Te,updateSplitPercentage:Le,updatePaneMetadata:Me}),[he,Ee,Ce,Te,Le,Me]);return jsx(ce.Provider,{value:qe,children:jsxs(de.Provider,{value:We,children:[jsx(DndContext,{id:"zeugma-dnd-context",sensors:ie,collisionDetection:pointerWithin,onDragStart:Xe,onDragMove:Ye,onDragEnd:Be,children:ne}),U&&r&&jsx(rt,{activeId:U,render:r,className:`${n.dragOverlay||""} ${U===M?n.dragOut||"zeugma-dragout":""}`.trim()})]})})};var lt={top:{position:"absolute",top:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},left:{position:"absolute",top:0,bottom:0,left:0,width:"32px",zIndex:30,pointerEvents:"auto"},right:{position:"absolute",top:0,bottom:0,right:0,width:"32px",zIndex:30,pointerEvents:"auto"}},dt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"}},ct=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=useDroppable({id:e});return jsxs(Fragment,{children:[jsx("div",{ref:r,style:lt[t]}),n&&jsx("div",{className:o,style:dt[t]})]})},_e=({activeId:e,hasOtherPanes:t,dropPreviewClassName:o})=>!e||!t?null:jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:30,pointerEvents:"none"},children:["top","bottom","left","right"].map(r=>jsx(ct,{id:`drop-root-${r}`,position:r,activeClassName:o},r))});function Se({containerRef:e,isRow:t,direction:o,splitPercentage:r,resizerSize:n,snapThreshold:d,layout:a,currentNode:p,onLayoutChange:C,onResizeStart:N,onResizeEnd:x}){let{onResizeStart:c,onResize:h,onResizeEnd:z,minSplitPercentage:D=5,maxSplitPercentage:v=95}=k();return useCallback(f=>{f.preventDefault();let b=e.current;if(!b)return;document.body.classList.add("zeugma-resizing");let J=document.createElement("style");J.id="zeugma-global-cursor-style",J.textContent=`
1
+ import {createContext,useContext,useState,useRef,useCallback,useMemo,useEffect}from'react';import {useSensors,useSensor,DndContext,pointerWithin,useDraggable,PointerSensor,TouchSensor,useDroppable}from'@dnd-kit/core';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var de=createContext(void 0),ce=createContext(void 0);var X=()=>{let e=useContext(de);if(!e)throw new Error("useDashboardState must be used within a DashboardProvider");return e},be=()=>{let e=useContext(ce);if(!e)throw new Error("useDashboardActions must be used within a DashboardProvider");return e};function Z(e,t){if(e===null)return null;if(e.type==="pane")return e.paneId===t?null:e;let o=Z(e.first,t),r=Z(e.second,t);return o===null?r:r===null?o:{...e,first:o,second:r}}function se(e,t,o,r,n){if(e===null)return typeof n=="string"?{type:"pane",paneId:n}:n;if(e.type==="pane"){if(e.paneId===t){let l=typeof n=="string"?{type:"pane",paneId:n}:n,a=r==="left"||r==="top";return {type:"split",direction:o,first:a?l:e,second:a?e:l,splitPercentage:50}}return e}return {...e,first:se(e.first,t,o,r,n)||e.first,second:se(e.second,t,o,r,n)||e.second}}function Pe(e,t,o){if(e===null)return null;let r=A(e,t),n=A(e,o);if(!r||!n)return e;function l(a){return a.type==="pane"?a.paneId===t?{...n}:a.paneId===o?{...r}:a:{...a,first:l(a.first),second:l(a.second)}}return l(e)}function $e(e,t){if(e===null)return {type:"pane",paneId:t};function o(r,n){return r.type==="pane"?{type:"split",direction:n==="row"?"column":"row",splitPercentage:50,first:r,second:{type:"pane",paneId:t}}:{...r,second:o(r.second,r.direction)}}return o(e,null)}function J(e,t,o){return e===null?null:e===t?{...e,splitPercentage:o}:e.type==="split"?{...e,first:J(e.first,t,o)||e.first,second:J(e.second,t,o)||e.second}:e}function Ve(e,t,o){let r=A(e,t)??{type:"pane",paneId:t},n=Z(e,t);if(n===null)return {...r};let l=o==="left"||o==="right"?"row":"column",a=o==="left"||o==="top",p={...r};return {type:"split",direction:l,first:a?p:n,second:a?n:p,splitPercentage:50}}function A(e,t){return e===null?null:e.type==="pane"?e.paneId===t?e:null:A(e.first,t)??A(e.second,t)}function ue(e,t,o){if(e===null)return null;if(e.type==="pane"){if(e.paneId===t){let r=o(e.metadata);if(r===void 0){let{metadata:n,...l}=e;return l}return {...e,metadata:r}}return e}return {...e,first:ue(e.first,t,o)??e.first,second:ue(e.second,t,o)??e.second}}var Ge=8,Je=8,Zt=4;var ot=({activeId:e,render:t,className:o})=>{let r=useRef(null);return useEffect(()=>{let n=l=>{r.current&&(r.current.style.transform=`translate(${l.clientX+12}px, ${l.clientY+12}px)`);};return document.addEventListener("pointermove",n),()=>document.removeEventListener("pointermove",n)},[]),jsx("div",{ref:r,className:o,style:{position:"fixed",top:0,left:0,zIndex:9999,pointerEvents:"none"},children:t(e)})},Ne=class extends PointerSensor{static activators=[{eventName:"onPointerDown",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},De=class extends TouchSensor{static activators=[{eventName:"onTouchStart",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},rt=({layout:e,onChange:t,renderPane:o,renderDragOverlay:r,classNames:n={},fullscreenPaneId:l=null,onFullscreenChange:a,onRemove:p,dragActivationDistance:C=8,snapThreshold:N=8,onDragStart:R,onDragEnd:c,onResizeStart:h,onResize:y,onResizeEnd:D,renderResizer:v,minSplitPercentage:f=5,maxSplitPercentage:b=95,enableDragToDismiss:O=false,dismissThreshold:x=60,onDismissIntentChange:K,children:ee})=>{let[g,P]=useState(e),me=useRef(e);e!==me.current&&(me.current=e,P(e));let[Y,B]=useState(null),[M,W]=useState(null),S=useRef(null),I=useRef(null),Q=useCallback(s=>{S.current=s;},[]),q=useRef(K);q.current=K;let T=useRef(g);T.current=g;let z=useRef(t);z.current=t;let te=useRef(o);te.current=o;let _=useRef(D);_.current=D;let ne=useCallback(s=>te.current(s),[]),oe=useMemo(()=>n,[n.pane,n.dropPreview,n.swapPreview,n.dragOverlay,n.resizer,n.dismissPreview]),le=useSensors(useSensor(Ne,{activationConstraint:{distance:C}}),useSensor(De,{activationConstraint:{delay:250,tolerance:5}})),re=s=>{let u=s.active.id.toString();B(u),O&&S.current?I.current=S.current.getBoundingClientRect():I.current=null,R&&R(u);},Xe=s=>{if(!O)return;let u=s.active.id.toString(),i=I.current;if(!i){M!==null&&(W(null),q.current?.(null));return}let d=s.activatorEvent,L=null,E=null;if(d instanceof MouseEvent||d instanceof PointerEvent)L=d.clientX+s.delta.x,E=d.clientY+s.delta.y;else if(typeof TouchEvent<"u"&&d instanceof TouchEvent){let m=d.touches[0]||d.changedTouches[0];m&&(L=m.clientX+s.delta.x,E=m.clientY+s.delta.y);}let H=0;if(L!==null&&E!==null){let m=0,w=0;L<i.left?m=i.left-L:L>i.right&&(m=L-i.right),E<i.top?w=i.top-E:E>i.bottom&&(w=E-i.bottom),H=Math.sqrt(m*m+w*w);}else {let m=s.active.rect.current.translated;if(m){let w=m.left+m.width/2,k=m.top+m.height/2,G=0,j=0;w<i.left?G=i.left-w:w>i.right&&(G=w-i.right),k<i.top?j=i.top-k:k>i.bottom&&(j=k-i.bottom),H=Math.sqrt(G*G+j*j);}}H>x?M!==u&&(W(u),q.current?.(u)):M!==null&&(W(null),q.current?.(null));},Ye=s=>{B(null);let{active:u,over:i}=s,d=u.id.toString(),L=O&&M===d;if(W(null),q.current?.(null),I.current=null,L){p?p(d):he(d),c&&c(d,null,null);return}if(!i){c&&c(d,null,null);return}let E=i.id.toString(),H=E.match(/^drop-root-(left|right|top|bottom)$/);if(H){let[,U]=H,ie=Ve(g,d,U);P(ie),t(ie),c&&c(d,"root",{type:"split",direction:U==="left"||U==="right"?"row":"column",position:U});return}let ve=E.match(/^drop-center-(.+)$/);if(ve){let[,U]=ve;if(d!==U){let ie=Pe(g,d,U);P(ie),t(ie);}c&&c(d,U,{type:"swap",position:"center"});return}let m=E.match(/^drop-(left|right|top|bottom)-(.+)$/);if(!m){c&&c(d,null,null);return}let[,w,k]=m;if(d===k){c&&c(d,null,null);return}let G=w==="left"||w==="right"?"row":"column",j=A(g,d)??{type:"pane",paneId:d},qe=Z(g,d),Fe=se(qe,k,G,w,j);P(Fe),t(Fe),c&&c(d,k,{type:"split",direction:G,position:w});},ze=useCallback(s=>{P(s);},[]),he=useCallback(s=>{let u=Z(T.current,s);P(u),z.current(u);},[]),Ee=useCallback(s=>{let u=$e(T.current,s);P(u),z.current(u);},[]),Ce=useCallback((s,u)=>{let i=Pe(T.current,s,u);P(i),z.current(i);},[]),Te=useCallback((s,u,i,d)=>{let L=A(T.current,d)??{type:"pane",paneId:d},E=Z(T.current,d),H=se(E,s,u,i,L);P(H),z.current(H);},[]),Le=useCallback((s,u)=>{let i=J(T.current,s,u);P(i),z.current(i);},[]),Me=useCallback((s,u)=>{let i=ue(T.current,s,u);P(i),z.current(i);},[]),Ae=useCallback((s,u)=>{let i=J(T.current,s,u);P(i),z.current(i),_.current&&_.current(s,u);},[]),Be=useMemo(()=>({layout:g,onLayoutChange:ze,renderPane:ne,activeId:Y,dismissIntentId:M,setContainerRef:Q,fullscreenPaneId:l,classNames:oe,onRemove:p,onFullscreenChange:a,snapThreshold:N,onResizeStart:h,onResize:y,onResizeEnd:Ae,renderResizer:v,minSplitPercentage:f,maxSplitPercentage:b}),[g,Y,M,Q,l,oe,p,a,N,h,y,v,f,b,ze,ne,Ae]),We=useMemo(()=>({removePane:he,addPane:Ee,swapPanes:Ce,splitPane:Te,updateSplitPercentage:Le,updatePaneMetadata:Me}),[he,Ee,Ce,Te,Le,Me]);return jsx(ce.Provider,{value:We,children:jsxs(de.Provider,{value:Be,children:[jsx(DndContext,{id:"zeugma-dnd-context",sensors:le,collisionDetection:pointerWithin,onDragStart:re,onDragMove:Xe,onDragEnd:Ye,children:ee}),Y&&r&&jsx(ot,{activeId:Y,render:r,className:`${n.dragOverlay||""} ${Y===M?n.dismissPreview||"zeugma-dismiss-preview":""}`.trim()})]})})};var at={top:{position:"absolute",top:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"32px",zIndex:30,pointerEvents:"auto"},left:{position:"absolute",top:0,bottom:0,left:0,width:"32px",zIndex:30,pointerEvents:"auto"},right:{position:"absolute",top:0,bottom:0,right:0,width:"32px",zIndex:30,pointerEvents:"auto"}},lt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:31,pointerEvents:"none",boxSizing:"border-box"}},dt=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=useDroppable({id:e});return jsxs(Fragment,{children:[jsx("div",{ref:r,style:at[t]}),n&&jsx("div",{className:o,style:lt[t]})]})},_e=({activeId:e,hasOtherPanes:t,dropPreviewClassName:o})=>!e||!t?null:jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:30,pointerEvents:"none"},children:["top","bottom","left","right"].map(r=>jsx(dt,{id:`drop-root-${r}`,position:r,activeClassName:o},r))});function Se({containerRef:e,isRow:t,direction:o,splitPercentage:r,resizerSize:n,snapThreshold:l,layout:a,currentNode:p,onLayoutChange:C,onResizeStart:N,onResizeEnd:R}){let{onResizeStart:c,onResize:h,onResizeEnd:y,minSplitPercentage:D=5,maxSplitPercentage:v=95}=X();return useCallback(f=>{f.preventDefault();let b=e.current;if(!b)return;document.body.classList.add("zeugma-resizing");let O=document.createElement("style");O.id="zeugma-global-cursor-style",O.textContent=`
2
2
  * {
3
3
  cursor: ${t?"col-resize":"row-resize"} !important;
4
4
  user-select: none !important;
5
5
  }
6
- `,document.head.appendChild(J),N&&N(),c&&c(p);let P=b.getBoundingClientRect(),K=f.clientX,ne=f.clientY,g=r,R=f.currentTarget;R.setAttribute("data-resizing","true");let U=Array.from(document.querySelectorAll('div[role="separator"][data-direction]')).filter(S=>S!==R&&S.getAttribute("data-direction")===o).map(S=>{let I=S.getBoundingClientRect();return t?I.left+I.width/2:I.top+I.height/2}),X=g,M=S=>{let I=t?(S.clientX-K)/P.width*100:(S.clientY-ne)/P.height*100,Q=g+I,B=t?P.left+(P.width-n)*(Q/100)+n/2:P.top+(P.height-n)*(Q/100)+n/2,j=1/0,w=null;for(let re of U){let ie=Math.abs(B-re);ie<d&&ie<j&&(j=ie,w=re);}let T=Q;w!==null&&(T=t?(w-n/2-P.left)/(P.width-n)*100:(w-n/2-P.top)/(P.height-n)*100);let W=Math.max(D,Math.min(v,T));X=W;let ee=b.children[0],oe=b.children[b.children.length-1];ee&&oe&&(ee.style.flex=`${W} 1 0%`,oe.style.flex=`${100-W} 1 0%`),h&&h(p,W);},Y=()=>{document.body.classList.remove("zeugma-resizing"),R.removeAttribute("data-resizing");let S=document.getElementById("zeugma-global-cursor-style");S&&S.remove(),document.removeEventListener("pointermove",M),document.removeEventListener("pointerup",Y);let I=G(a,p,X);console.log("onLayoutChange (finalized) called with percentage:",X),C(I),x&&x(),z&&z(p,X);};document.addEventListener("pointermove",M),document.addEventListener("pointerup",Y);},[e,t,o,r,n,d,a,p,C,N,x,c,h,z,D,v])}var vt=({currentNode:e,resizerSize:t,snapThreshold:o,renderResizer:r})=>{let{layout:n,onLayoutChange:d,classNames:a,renderResizer:p}=k(),[C,N]=useState(false),x=r||p,c=useRef(null),{direction:h,first:z,second:D,splitPercentage:v}=e,f=h==="row",b=Se({containerRef:c,isRow:f,direction:h,splitPercentage:v,resizerSize:t,snapThreshold:o??8,layout:n,currentNode:e,onLayoutChange:d,onResizeStart:()=>N(true),onResizeEnd:()=>N(false)});return jsxs("div",{ref:c,style:{display:"flex",flexDirection:f?"row":"column",width:"100%",height:"100%",overflow:"hidden"},children:[jsx("div",{style:{flex:`${v} 1 0%`,overflow:"hidden"},children:jsx(we,{tree:z,resizerSize:t,snapThreshold:o,renderResizer:r})}),x?x({direction:h,splitPercentage:v,resizerSize:t,isResizing:C,onPointerDown:b}):jsx("div",{className:a.resizer,"data-direction":h,style:{width:f?`${t}px`:"100%",height:f?"100%":`${t}px`,cursor:f?"col-resize":"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:b,role:"separator","aria-valuenow":v,"aria-valuemin":5,"aria-valuemax":95}),jsx("div",{style:{flex:`${100-v} 1 0%`,overflow:"hidden"},children:jsx(we,{tree:D,resizerSize:t,snapThreshold:o,renderResizer:r})})]})},we=({tree:e,resizerSize:t=4,snapThreshold:o,renderResizer:r})=>{let{layout:n,renderPane:d,activeId:a,draggedOutId:p,setContainerRef:C,classNames:N,fullscreenPaneId:x,snapThreshold:c}=k(),h=o!==void 0?o:c,z=useMemo(()=>e!==void 0||!a?false:Z(n,a)!==null,[e,n,a]);if(x&&!e)return jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:d(x)});let D=e!==void 0?e:n;if(!D)return null;let v=()=>D.type==="pane"?jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:d(D.paneId)}):jsx(vt,{currentNode:D,resizerSize:t,snapThreshold:h,renderResizer:r});return e===void 0?jsxs("div",{ref:C,className:`zeugma-dashboard-root ${a!==null&&a===p?"zeugma-dashboard-dragout-active":""}`.trim(),style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:[v(),jsx(_e,{activeId:a,hasOtherPanes:z,dropPreviewClassName:N.dropPreview})]}):v()};var ge=createContext(null);var xt={top:{position:"absolute",top:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},left:{position:"absolute",top:"25%",left:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},right:{position:"absolute",top:"25%",right:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},center:{position:"absolute",top:"25%",left:"25%",width:"50%",height:"50%",zIndex:20,pointerEvents:"auto"}},Nt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},center:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:21,pointerEvents:"none",boxSizing:"border-box"}},Ue=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=useDroppable({id:e});return jsxs(Fragment,{children:[jsx("div",{ref:r,style:xt[t]}),n&&jsx("div",{className:o,style:Nt[t]})]})},Dt=({id:e,children:t,style:o})=>{let{layout:r,activeId:n,classNames:d,fullscreenPaneId:a,onRemove:p,onFullscreenChange:C}=k(),{removePane:N,updatePaneMetadata:x}=be(),c=n!==null&&n!==e,{attributes:h,listeners:z,setNodeRef:D,isDragging:v}=useDraggable({id:e}),f=n===e||v,b=a===e,P=useMemo(()=>A(r,e),[r,e])?.metadata,K=useMemo(()=>({isDragging:f,isFullscreen:b,toggleFullscreen:()=>C?.(b?null:e),remove:()=>{b&&C?.(null),p?p(e):N(e);},metadata:P,updateMetadata:g=>{x(e,g);}}),[f,b,C,e,p,N,P,x]),ne=useMemo(()=>({...z,...h}),[z,h]);return jsx(ge.Provider,{value:ne,children:jsxs("div",{ref:D,className:d.pane,style:{position:"relative",width:"100%",height:"100%",...o},children:[t(K),c&&jsxs("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:15,pointerEvents:"none"},children:[["top","bottom","left","right"].map(g=>jsx(Ue,{id:`drop-${g}-${e}`,position:g,activeClassName:d.dropPreview},g)),jsx(Ue,{id:`drop-center-${e}`,position:"center",activeClassName:d.swapPreview})]})]})})};var yt=({children:e,className:t,style:o})=>{let r=useContext(ge);if(!r)throw new Error("<DragHandle> must be used inside a <Pane>");return jsx("div",{className:t,style:{cursor:"grab",userSelect:"none",touchAction:"none",...o},...r,children:e})};export{Ke as DEFAULT_DRAG_ACTIVATION_DISTANCE,Zt as DEFAULT_RESIZER_SIZE,Je as DEFAULT_SNAP_THRESHOLD,it as DashboardProvider,yt as DragHandle,Dt as Pane,we as PaneTree,Ze as addPane,A as findPane,Z as removePane,ae as splitPane,$e as splitRoot,Pe as swapPanes,ue as updatePaneMetadata,G as updateSplitPercentage,be as useDashboardActions,k as useDashboardState,Se as useResizer};//# sourceMappingURL=index.js.map
6
+ `,document.head.appendChild(O),N&&N(),c&&c(p);let x=b.getBoundingClientRect(),K=f.clientX,ee=f.clientY,g=r,P=f.currentTarget;P.setAttribute("data-resizing","true");let Y=Array.from(document.querySelectorAll('div[role="separator"][data-direction]')).filter(S=>S!==P&&S.getAttribute("data-direction")===o).map(S=>{let I=S.getBoundingClientRect();return t?I.left+I.width/2:I.top+I.height/2}),B=g,M=S=>{let I=t?(S.clientX-K)/x.width*100:(S.clientY-ee)/x.height*100,Q=g+I,q=t?x.left+(x.width-n)*(Q/100)+n/2:x.top+(x.height-n)*(Q/100)+n/2,T=1/0,z=null;for(let le of Y){let re=Math.abs(q-le);re<l&&re<T&&(T=re,z=le);}let te=Q;z!==null&&(te=t?(z-n/2-x.left)/(x.width-n)*100:(z-n/2-x.top)/(x.height-n)*100);let _=Math.max(D,Math.min(v,te));B=_;let ne=b.children[0],oe=b.children[b.children.length-1];ne&&oe&&(ne.style.flex=`${_} 1 0%`,oe.style.flex=`${100-_} 1 0%`),h&&h(p,_);},W=()=>{document.body.classList.remove("zeugma-resizing"),P.removeAttribute("data-resizing");let S=document.getElementById("zeugma-global-cursor-style");S&&S.remove(),document.removeEventListener("pointermove",M),document.removeEventListener("pointerup",W);let I=J(a,p,B);console.log("onLayoutChange (finalized) called with percentage:",B),C(I),R&&R(),y&&y(p,B);};document.addEventListener("pointermove",M),document.addEventListener("pointerup",W);},[e,t,o,r,n,l,a,p,C,N,R,c,h,y,D,v])}var ht=({currentNode:e,resizerSize:t,snapThreshold:o,renderResizer:r})=>{let{layout:n,onLayoutChange:l,classNames:a,renderResizer:p}=X(),[C,N]=useState(false),R=r||p,c=useRef(null),{direction:h,first:y,second:D,splitPercentage:v}=e,f=h==="row",b=Se({containerRef:c,isRow:f,direction:h,splitPercentage:v,resizerSize:t,snapThreshold:o??8,layout:n,currentNode:e,onLayoutChange:l,onResizeStart:()=>N(true),onResizeEnd:()=>N(false)});return jsxs("div",{ref:c,style:{display:"flex",flexDirection:f?"row":"column",width:"100%",height:"100%",overflow:"hidden"},children:[jsx("div",{style:{flex:`${v} 1 0%`,overflow:"hidden"},children:jsx(we,{tree:y,resizerSize:t,snapThreshold:o,renderResizer:r})}),R?R({direction:h,splitPercentage:v,resizerSize:t,isResizing:C,onPointerDown:b}):jsx("div",{className:a.resizer,"data-direction":h,style:{width:f?`${t}px`:"100%",height:f?"100%":`${t}px`,cursor:f?"col-resize":"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:b,role:"separator","aria-valuenow":v,"aria-valuemin":5,"aria-valuemax":95}),jsx("div",{style:{flex:`${100-v} 1 0%`,overflow:"hidden"},children:jsx(we,{tree:D,resizerSize:t,snapThreshold:o,renderResizer:r})})]})},we=({tree:e,resizerSize:t=4,snapThreshold:o,renderResizer:r})=>{let{layout:n,renderPane:l,activeId:a,dismissIntentId:p,setContainerRef:C,classNames:N,fullscreenPaneId:R,snapThreshold:c}=X(),h=o!==void 0?o:c,y=useMemo(()=>e!==void 0||!a?false:Z(n,a)!==null,[e,n,a]);if(R&&!e)return jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:l(R)});let D=e!==void 0?e:n;if(!D)return null;let v=()=>D.type==="pane"?jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:l(D.paneId)}):jsx(ht,{currentNode:D,resizerSize:t,snapThreshold:h,renderResizer:r});return e===void 0?jsxs("div",{ref:C,className:`zeugma-dashboard-root ${a!==null&&a===p?"zeugma-dashboard-dismiss-active":""}`.trim(),style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:[v(),jsx(_e,{activeId:a,hasOtherPanes:y,dropPreviewClassName:N.dropPreview})]}):v()};var ge=createContext(null);var Rt={top:{position:"absolute",top:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},left:{position:"absolute",top:"25%",left:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},right:{position:"absolute",top:"25%",right:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},center:{position:"absolute",top:"25%",left:"25%",width:"50%",height:"50%",zIndex:20,pointerEvents:"auto"}},xt={top:{position:"absolute",top:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},bottom:{position:"absolute",bottom:0,left:0,right:0,height:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},left:{position:"absolute",top:0,bottom:0,left:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},right:{position:"absolute",top:0,bottom:0,right:0,width:"50%",zIndex:21,pointerEvents:"none",boxSizing:"border-box"},center:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:21,pointerEvents:"none",boxSizing:"border-box"}},Ue=({id:e,position:t,activeClassName:o})=>{let{setNodeRef:r,isOver:n}=useDroppable({id:e});return jsxs(Fragment,{children:[jsx("div",{ref:r,style:Rt[t]}),n&&jsx("div",{className:o,style:xt[t]})]})},Nt=({id:e,children:t,style:o})=>{let{layout:r,activeId:n,classNames:l,fullscreenPaneId:a,onRemove:p,onFullscreenChange:C}=X(),{removePane:N,updatePaneMetadata:R}=be(),c=n!==null&&n!==e,{attributes:h,listeners:y,setNodeRef:D,isDragging:v}=useDraggable({id:e}),f=n===e||v,b=a===e,x=useMemo(()=>A(r,e),[r,e])?.metadata,K=useMemo(()=>({isDragging:f,isFullscreen:b,toggleFullscreen:()=>C?.(b?null:e),remove:()=>{b&&C?.(null),p?p(e):N(e);},metadata:x,updateMetadata:g=>{R(e,g);}}),[f,b,C,e,p,N,x,R]),ee=useMemo(()=>({...y,...h}),[y,h]);return jsx(ge.Provider,{value:ee,children:jsxs("div",{ref:D,className:l.pane,style:{position:"relative",width:"100%",height:"100%",...o},children:[t(K),c&&jsxs("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:15,pointerEvents:"none"},children:[["top","bottom","left","right"].map(g=>jsx(Ue,{id:`drop-${g}-${e}`,position:g,activeClassName:l.dropPreview},g)),jsx(Ue,{id:`drop-center-${e}`,position:"center",activeClassName:l.swapPreview})]})]})})};var wt=({children:e,className:t,style:o})=>{let r=useContext(ge);if(!r)throw new Error("<DragHandle> must be used inside a <Pane>");return jsx("div",{className:t,style:{cursor:"grab",userSelect:"none",touchAction:"none",...o},...r,children:e})};export{Je as DEFAULT_DRAG_ACTIVATION_DISTANCE,Zt as DEFAULT_RESIZER_SIZE,Ge as DEFAULT_SNAP_THRESHOLD,rt as DashboardProvider,wt as DragHandle,Nt as Pane,we as PaneTree,$e as addPane,A as findPane,Z as removePane,se as splitPane,Ve as splitRoot,Pe as swapPanes,ue as updatePaneMetadata,J as updateSplitPercentage,be as useDashboardActions,X as useDashboardState,Se as useResizer};//# sourceMappingURL=index.js.map
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entities/dashboard/model/context.ts","../src/entities/dashboard/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/dashboard/ui/DashboardProvider.tsx","../src/entities/dashboard/ui/RootDropZone.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx"],"names":["DashboardStateContext","createContext","DashboardActionsContext","useDashboardState","state","useContext","useDashboardActions","actions","removePane","tree","idToRemove","newFirst","newSecond","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","swapPanes","idA","idB","nodeA","findPane","nodeB","swap","node","addPane","insert","parentDirection","updateSplitPercentage","target","newPercentage","splitRoot","draggingId","draggedPaneNode","treeWithoutDragging","draggedNode","paneId","updatePaneMetadata","updater","newMetadata","_","rest","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","activeId","render","className","ref","useRef","useEffect","handleMove","e","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","DashboardProvider","layout","onChange","renderPane","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","renderResizer","minSplitPercentage","maxSplitPercentage","dragOutThreshold","onDragOutChange","onDragOut","children","localLayout","setLocalLayout","useState","prevLayoutRef","setActiveId","draggedOutId","setDraggedOutId","containerRef","containerRectRef","setContainerRef","useCallback","element","onDragOutChangeRef","onDragOutRef","layoutRef","onChangeRef","renderPaneRef","onResizeEndPropRef","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","handleDragMove","containerRect","ae","px","py","touch","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDraggedOut","handleRemovePane","overIdStr","rootMatch","dropZone","newLayout","swapMatch","match","handleLocalLayoutChange","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleResizeEnd","finalLayout","stateValue","actionsValue","jsxs","DndContext","pointerWithin","rootActivationPositions","rootPreviewPositions","RootDropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Fragment","RootDropZones","hasOtherPanes","dropPreviewClassName","pos","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","styleEl","rect","startX","startY","startPercentage","resizerEl","otherPositions","el","r","currentPercentage","handlePointerMove","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","dist","snappedPercentage","finalPercentage","firstChild","secondChild","handlePointerUp","globalStyle","PaneSplit","propRenderResizer","contextRenderResizer","isResizing","setIsResizing","first","second","handlePointerDown","PaneTree","propSnapThreshold","contextSnapThreshold","renderContent","DragListenersCtx","activationPositions","previewPositions","DropZone","Pane","style","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","isFullscreen","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, ReactNode } from 'react'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\n\nexport interface ZeugmaClassNames {\n pane?: string\n dropPreview?: string\n swapPreview?: string\n dragOverlay?: string\n resizer?: string\n dragOut?: string\n}\n\nexport interface ResizerRenderProps {\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n isResizing: boolean\n onPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void\n}\n\n/**\n * State context — holds reactive values that change during runtime.\n * All consumers of this context will re-render when any of these values change.\n */\nexport interface DashboardStateValue {\n layout: TreeNode | null\n onLayoutChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n activeId: string | null\n draggedOutId: string | null\n setContainerRef: (element: HTMLElement | null) => void\n fullscreenPaneId: string | null\n classNames: ZeugmaClassNames\n onRemove?: (paneId: string) => void\n onFullscreenChange?: (paneId: string | null) => void\n snapThreshold?: number\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n}\n\n/**\n * Actions context — holds stable dispatch functions with permanent identity.\n * Consumers of only this context will never re-render from layout/drag state changes.\n */\nexport interface DashboardActionsValue {\n removePane: (paneId: string) => void\n addPane: (paneId: string) => void\n swapPanes: (paneIdA: string, paneIdB: string) => void\n splitPane: (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => void\n updateSplitPercentage: (currentNode: SplitNode, percentage: number) => void\n updatePaneMetadata: (\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n ) => void\n}\nexport const DashboardStateContext = createContext<DashboardStateValue | undefined>(undefined)\nexport const DashboardActionsContext = createContext<DashboardActionsValue | undefined>(undefined)\n","import { useContext } from 'react'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n DashboardStateValue,\n DashboardActionsValue,\n} from './context'\n\n/** Returns only reactive state. Use when you need layout, activeId, classNames, etc. */\nexport const useDashboardState = (): DashboardStateValue => {\n const state = useContext(DashboardStateContext)\n if (!state) {\n throw new Error('useDashboardState must be used within a DashboardProvider')\n }\n return state\n}\n\n/** Returns only stable action dispatchers. Consumers of this hook never re-render from state changes. */\nexport const useDashboardActions = (): DashboardActionsValue => {\n const actions = useContext(DashboardActionsContext)\n if (!actions) {\n throw new Error('useDashboardActions must be used within a DashboardProvider')\n }\n return actions\n}\n","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\n\n/**\n * Tree Helper: Remove a pane and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, idToRemove: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === idToRemove ? null : tree\n }\n const newFirst = removePane(tree.first, idToRemove)\n const newSecond = removePane(tree.second, idToRemove)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n return typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.paneId === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Swap the position of two panes in the tree structure.\n */\nexport function swapPanes(tree: TreeNode | null, idA: string, idB: string): TreeNode | null {\n if (tree === null) return null\n\n // First pass: collect the full PaneNode references\n const nodeA = findPane(tree, idA)\n const nodeB = findPane(tree, idB)\n if (!nodeA || !nodeB) return tree\n\n // Second pass: replace each location with the other node\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.paneId === idA) return { ...nodeB! }\n if (node.paneId === idB) return { ...nodeA! }\n return node\n }\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', paneId: paneToAdd }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: { type: 'pane', paneId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Split the entire tree at the root using a dragged pane.\n */\nexport function splitRoot(\n tree: TreeNode | null,\n draggingId: string,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n): TreeNode | null {\n // Preserve dragged pane's metadata\n const draggedPaneNode: PaneNode = findPane(tree, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(tree, draggingId)\n if (treeWithoutDragging === null) {\n return { ...draggedPaneNode }\n }\n\n const direction: SplitDirection = splitType === 'left' || splitType === 'right' ? 'row' : 'column'\n const isFirst = splitType === 'left' || splitType === 'top'\n const draggedNode: TreeNode = { ...draggedPaneNode }\n\n return {\n type: 'split',\n direction,\n first: isFirst ? draggedNode : treeWithoutDragging,\n second: isFirst ? treeWithoutDragging : draggedNode,\n splitPercentage: 50,\n }\n}\n\n/**\n * Find a PaneNode by its paneId.\n */\nexport function findPane(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === paneId ? tree : null\n }\n return findPane(tree.first, paneId) ?? findPane(tree.second, paneId)\n}\n\n/**\n * Update metadata on a specific pane node using an updater function.\n */\nexport function updatePaneMetadata(\n tree: TreeNode | null,\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.paneId === paneId) {\n const newMetadata = updater(tree.metadata)\n if (newMetadata === undefined) {\n // Remove metadata key\n const { metadata: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, metadata: newMetadata }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneMetadata(tree.first, paneId, updater) ?? tree.first,\n second: updatePaneMetadata(tree.second, paneId, updater) ?? tree.second,\n }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import React, { useState, useEffect, useRef, ReactNode, useMemo, useCallback } from 'react'\nimport {\n DndContext,\n useSensor,\n useSensors,\n PointerSensor,\n TouchSensor,\n DragStartEvent,\n DragEndEvent,\n DragMoveEvent,\n pointerWithin,\n} from '@dnd-kit/core'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\nimport {\n removePane,\n splitPane,\n swapPanes,\n addPane,\n updateSplitPercentage,\n splitRoot,\n updatePaneMetadata,\n findPane,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n ZeugmaClassNames,\n ResizerRenderProps,\n} from '../model/context'\n\n/** Cursor-following overlay rendered via portal */\nconst CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n\nclass SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nclass SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\ninterface DashboardProviderProps {\n layout: TreeNode | null\n onChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n renderDragOverlay?: (activeId: string) => ReactNode\n classNames?: ZeugmaClassNames\n fullscreenPaneId?: string | null\n onFullscreenChange?: (paneId: string | null) => void\n onRemove?: (paneId: string) => void\n dragActivationDistance?: number\n snapThreshold?: number\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'swap'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n dragOutThreshold?: number\n onDragOutChange?: (paneId: string | null) => void\n onDragOut?: (paneId: string) => void\n children: ReactNode\n}\n\nexport const DashboardProvider: React.FC<DashboardProviderProps> = ({\n layout,\n onChange,\n renderPane,\n renderDragOverlay,\n classNames = {},\n fullscreenPaneId = null,\n onFullscreenChange,\n onRemove,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n renderResizer,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n dragOutThreshold = 60,\n onDragOutChange,\n onDragOut,\n children,\n}) => {\n const [localLayout, setLocalLayout] = useState<TreeNode | null>(layout)\n const prevLayoutRef = useRef(layout)\n\n if (layout !== prevLayoutRef.current) {\n prevLayoutRef.current = layout\n setLocalLayout(layout)\n }\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [draggedOutId, setDraggedOutId] = useState<string | null>(null)\n const containerRef = useRef<HTMLElement | null>(null)\n const containerRectRef = useRef<DOMRect | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n const onDragOutChangeRef = useRef(onDragOutChange)\n onDragOutChangeRef.current = onDragOutChange\n\n const onDragOutRef = useRef(onDragOut)\n onDragOutRef.current = onDragOut\n\n // Refs for stable closure access — prevents callback identity changes on every layout update\n const layoutRef = useRef(localLayout)\n layoutRef.current = localLayout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const renderPaneRef = useRef(renderPane)\n renderPaneRef.current = renderPane\n\n const onResizeEndPropRef = useRef(onResizeEnd)\n onResizeEndPropRef.current = onResizeEnd\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPaneRef.current(paneId), [])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.pane,\n classNames.dropPreview,\n classNames.swapPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dragOut,\n ],\n )\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const handleDragStart = (event: DragStartEvent) => {\n const draggingId = event.active.id.toString()\n setActiveId(draggingId)\n if (containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n if (onDragStart) {\n onDragStart(draggingId)\n }\n }\n\n const handleDragMove = (event: DragMoveEvent) => {\n const draggingId = event.active.id.toString()\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (draggedOutId !== null) {\n setDraggedOutId(null)\n onDragOutChangeRef.current?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (ae instanceof MouseEvent || ae instanceof PointerEvent) {\n px = ae.clientX + event.delta.x\n py = ae.clientY + event.delta.y\n } else if (typeof TouchEvent !== 'undefined' && ae instanceof TouchEvent) {\n const touch = ae.touches[0] || ae.changedTouches[0]\n if (touch) {\n px = touch.clientX + event.delta.x\n py = touch.clientY + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDraggedOut = distance > dragOutThreshold\n if (isDraggedOut) {\n if (draggedOutId !== draggingId) {\n setDraggedOutId(draggingId)\n onDragOutChangeRef.current?.(draggingId)\n }\n } else {\n if (draggedOutId !== null) {\n setDraggedOutId(null)\n onDragOutChangeRef.current?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n const { active, over } = event\n const draggingId = active.id.toString()\n\n const wasDraggedOut = draggedOutId === draggingId\n\n setDraggedOutId(null)\n onDragOutChangeRef.current?.(null)\n containerRectRef.current = null\n\n if (wasDraggedOut) {\n if (onDragOutRef.current) {\n onDragOutRef.current(draggingId)\n } else {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n handleRemovePane(draggingId)\n }\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n // Check for root drop (places pane like half of the root)\n const rootMatch = overIdStr.match(/^drop-root-(left|right|top|bottom)$/)\n if (rootMatch) {\n const [, dropZone] = rootMatch\n const newLayout = splitRoot(\n localLayout,\n draggingId,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n\n if (onDragEnd) {\n const direction: SplitDirection =\n dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n return\n }\n\n // Check for center (swap) drop\n const swapMatch = overIdStr.match(/^drop-center-(.+)$/)\n if (swapMatch) {\n const [, targetId] = swapMatch\n if (draggingId !== targetId) {\n const newLayout = swapPanes(localLayout, draggingId, targetId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, { type: 'swap', position: 'center' })\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n if (draggingId === targetId) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n const draggedPaneNode = findPane(localLayout, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(localLayout, draggingId)\n\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleLocalLayoutChange = useCallback((newLayout: TreeNode | null) => {\n setLocalLayout(newLayout)\n }, [])\n\n const handleRemovePane = useCallback((paneId: string) => {\n const newLayout = removePane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleAddPane = useCallback((paneId: string) => {\n const newLayout = addPane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSwapPanes = useCallback((paneIdA: string, paneIdB: string) => {\n const newLayout = swapPanes(layoutRef.current, paneIdA, paneIdB)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSplitPane = useCallback(\n (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const draggedPaneNode = findPane(layoutRef.current, paneToAdd) ?? {\n type: 'pane',\n paneId: paneToAdd,\n }\n const treeWithoutDragging = removePane(layoutRef.current, paneToAdd)\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n splitType,\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleUpdateSplitPercentage = useCallback((currentNode: SplitNode, percentage: number) => {\n const newLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleUpdatePaneMetadata = useCallback(\n (\n paneId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => {\n const newLayout = updatePaneMetadata(layoutRef.current, paneId, updater)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleResizeEnd = useCallback((currentNode: SplitNode, percentage: number) => {\n const finalLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(finalLayout)\n onChangeRef.current(finalLayout)\n if (onResizeEndPropRef.current) {\n onResizeEndPropRef.current(currentNode, percentage)\n }\n }, [])\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout: localLayout,\n onLayoutChange: handleLocalLayoutChange,\n renderPane: stableRenderPane,\n activeId,\n draggedOutId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n }),\n [\n localLayout,\n activeId,\n draggedOutId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n // Stable callbacks (empty deps) — included for exhaustive-deps lint rule\n handleLocalLayoutChange,\n stableRenderPane,\n handleResizeEnd,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane: handleRemovePane,\n addPane: handleAddPane,\n swapPanes: handleSwapPanes,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updatePaneMetadata: handleUpdatePaneMetadata,\n }),\n [\n handleRemovePane,\n handleAddPane,\n handleSwapPanes,\n handleSplitPane,\n handleUpdateSplitPercentage,\n handleUpdatePaneMetadata,\n ],\n )\n\n return (\n <DashboardActionsContext.Provider value={actionsValue}>\n <DashboardStateContext.Provider value={stateValue}>\n <DndContext\n id=\"zeugma-dnd-context\"\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n {activeId && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={renderDragOverlay}\n className={`${classNames.dragOverlay || ''} ${\n activeId === draggedOutId ? classNames.dragOut || 'zeugma-dragout' : ''\n }`.trim()}\n />\n )}\n </DashboardStateContext.Provider>\n </DashboardActionsContext.Provider>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nconst rootActivationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n}\n\nconst rootPreviewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport interface RootDropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nexport const RootDropZone: React.FC<RootDropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={rootActivationPositions[position]} />\n {isOver && <div className={activeClassName} style={rootPreviewPositions[position]} />}\n </>\n )\n}\n\nexport interface RootDropZonesProps {\n activeId: string | null\n hasOtherPanes: boolean\n dropPreviewClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({\n activeId,\n hasOtherPanes,\n dropPreviewClassName,\n}) => {\n if (!activeId || !hasOtherPanes) return null\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 30,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <RootDropZone\n key={pos}\n id={`drop-root-${pos}`}\n position={pos}\n activeClassName={dropPreviewClassName}\n />\n ))}\n </div>\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage } from '../../../shared/lib/tree'\nimport { useDashboardState } from '../../../entities/dashboard'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = useDashboardState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n document.body.classList.add('zeugma-resizing')\n\n // Inject global cursor style to keep resizing cursor active across the entire page during drag\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${isRow ? 'col-resize' : 'row-resize'} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const resizerEl = e.currentTarget\n resizerEl.setAttribute('data-resizing', 'true')\n\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / rect.width) * 100\n : ((moveEvent.clientY - startY) / rect.height) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? rect.left + (rect.width - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n : rect.top + (rect.height - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - rect.left) / (rect.width - resizerSize)) * 100\n : ((bestTarget - resizerSize / 2 - rect.top) / (rect.height - resizerSize)) * 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Imperatively update the sibling pane container flex sizes during drag\n const firstChild = container.children[0] as HTMLElement\n const secondChild = container.children[container.children.length - 1] as HTMLElement\n if (firstChild && secondChild) {\n firstChild.style.flex = `${finalPercentage} 1 0%`\n secondChild.style.flex = `${100 - finalPercentage} 1 0%`\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n }\n\n const handlePointerUp = () => {\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Write to React state once resizing completes\n const newLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n console.log('onLayoutChange (finalized) called with percentage:', currentPercentage)\n onLayoutChange(newLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n ],\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { useDashboardState, ResizerRenderProps, RootDropZones } from '../../../entities/dashboard'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode } from '../../../shared/model'\nimport { removePane } from '../../../shared'\n\nexport interface PaneTreeProps {\n tree?: TreeNode | null\n /** Size of the resizer in pixels (default 4) */\n resizerSize?: number\n /** Threshold in pixels to snap to adjacent resizer edges (default 8) */\n snapThreshold?: number\n /** Custom resizer renderer to override context-level renderResizer */\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\ninterface PaneSplitProps {\n currentNode: SplitNode\n resizerSize: number\n snapThreshold?: number\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\nconst PaneSplit: React.FC<PaneSplitProps> = ({\n currentNode,\n resizerSize,\n snapThreshold,\n renderResizer: propRenderResizer,\n}) => {\n const {\n layout,\n onLayoutChange,\n classNames,\n renderResizer: contextRenderResizer,\n } = useDashboardState()\n const [isResizing, setIsResizing] = useState(false)\n\n const renderResizer = propRenderResizer || contextRenderResizer\n\n const containerRef = useRef<HTMLDivElement>(null)\n const { direction, first, second, splitPercentage } = currentNode\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold: snapThreshold ?? 8,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n })\n\n return (\n <div\n ref={containerRef}\n style={{\n display: 'flex',\n flexDirection: isRow ? 'row' : 'column',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <div style={{ flex: `${splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={first}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n {renderResizer ? (\n renderResizer({\n direction,\n splitPercentage,\n resizerSize,\n isResizing,\n onPointerDown: handlePointerDown,\n })\n ) : (\n <div\n className={classNames.resizer}\n data-direction={direction}\n style={{\n width: isRow ? `${resizerSize}px` : '100%',\n height: isRow ? '100%' : `${resizerSize}px`,\n cursor: isRow ? 'col-resize' : 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )}\n <div style={{ flex: `${100 - splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={second}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n </div>\n )\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n renderResizer,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n draggedOutId,\n setContainerRef,\n classNames,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n } = useDashboardState()\n\n const snapThreshold = propSnapThreshold !== undefined ? propSnapThreshold : contextSnapThreshold\n\n const hasOtherPanes = useMemo(() => {\n if (tree !== undefined || !activeId) return false\n return removePane(layout, activeId) !== null\n }, [tree, layout, activeId])\n\n // Fullscreen bypass\n if (fullscreenPaneId && !tree) {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(fullscreenPaneId)}\n </div>\n )\n }\n\n const currentNode = tree !== undefined ? tree : layout\n\n if (!currentNode) return null\n\n const renderContent = () => {\n if (currentNode.type === 'pane') {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(currentNode.paneId)}\n </div>\n )\n }\n\n return (\n <PaneSplit\n currentNode={currentNode}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={renderResizer}\n />\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDragOutActive = activeId !== null && activeId === draggedOutId\n return (\n <div\n ref={setContainerRef}\n className={`zeugma-dashboard-root ${isDragOutActive ? 'zeugma-dashboard-dragout-active' : ''}`.trim()}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n <RootDropZones\n activeId={activeId}\n hasOtherPanes={hasOtherPanes}\n dropPreviewClassName={classNames.dropPreview}\n />\n </div>\n )\n }\n\n return renderContent()\n}\n","import { createContext } from 'react'\n\nexport const DragListenersCtx = createContext<Record<string, unknown> | null>(null)\n","import React, { useMemo } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useDashboardState, useDashboardActions } from '../../dashboard'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPane } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'center'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n center: {\n position: 'absolute',\n top: '25%',\n left: '25%',\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n center: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\ninterface PaneProps {\n id: string\n children: (props: PaneRenderProps) => React.ReactNode\n style?: React.CSSProperties\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style }) => {\n const { layout, activeId, classNames, fullscreenPaneId, onRemove, onFullscreenChange } =\n useDashboardState()\n const { removePane, updatePaneMetadata } = useDashboardActions()\n const showDropZones = activeId !== null && activeId !== id\n\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id })\n const dragging = activeId === id || isDragging\n const isFullscreen = fullscreenPaneId === id\n\n const paneNode = useMemo(() => findPane(layout, id), [layout, id])\n const metadata = paneNode?.metadata\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n if (onRemove) {\n onRemove(id)\n } else {\n removePane(id)\n }\n },\n metadata,\n updateMetadata: (updater) => {\n updatePaneMetadata(id, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n onRemove,\n removePane,\n metadata,\n updatePaneMetadata,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(\n () => ({\n ...listeners,\n ...attributes,\n }),\n [listeners, attributes],\n )\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={classNames.pane}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={classNames.swapPreview}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\ninterface DragHandleProps {\n children: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n return (\n <div\n className={className}\n style={{ cursor: 'grab', userSelect: 'none', touchAction: 'none', ...style }}\n {...dragProps}\n >\n {children}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/entities/dashboard/model/context.ts","../src/entities/dashboard/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/dashboard/ui/DashboardProvider.tsx","../src/entities/dashboard/ui/RootDropZone.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx"],"names":["DashboardStateContext","createContext","DashboardActionsContext","useDashboardState","state","useContext","useDashboardActions","actions","removePane","tree","idToRemove","newFirst","newSecond","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","swapPanes","idA","idB","nodeA","findPane","nodeB","swap","node","addPane","insert","parentDirection","updateSplitPercentage","target","newPercentage","splitRoot","draggingId","draggedPaneNode","treeWithoutDragging","draggedNode","paneId","updatePaneMetadata","updater","newMetadata","_","rest","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","activeId","render","className","ref","useRef","useEffect","handleMove","e","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","DashboardProvider","layout","onChange","renderPane","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","renderResizer","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onDismissIntentChange","children","localLayout","setLocalLayout","useState","prevLayoutRef","setActiveId","dismissIntentId","setDismissIntentId","containerRef","containerRectRef","setContainerRef","useCallback","element","onDismissIntentChangeRef","layoutRef","onChangeRef","renderPaneRef","onResizeEndPropRef","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","handleDragMove","containerRect","ae","px","py","touch","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDismissIntent","handleRemovePane","overIdStr","rootMatch","dropZone","newLayout","swapMatch","match","handleLocalLayoutChange","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleResizeEnd","finalLayout","stateValue","actionsValue","jsxs","DndContext","pointerWithin","rootActivationPositions","rootPreviewPositions","RootDropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Fragment","RootDropZones","hasOtherPanes","dropPreviewClassName","pos","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","styleEl","rect","startX","startY","startPercentage","resizerEl","otherPositions","el","r","currentPercentage","handlePointerMove","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","dist","snappedPercentage","finalPercentage","firstChild","secondChild","handlePointerUp","globalStyle","PaneSplit","propRenderResizer","contextRenderResizer","isResizing","setIsResizing","first","second","handlePointerDown","PaneTree","propSnapThreshold","contextSnapThreshold","renderContent","DragListenersCtx","activationPositions","previewPositions","DropZone","Pane","style","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","isFullscreen","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, ReactNode } from 'react'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\n\nexport interface ZeugmaClassNames {\n pane?: string\n dropPreview?: string\n swapPreview?: string\n dragOverlay?: string\n resizer?: string\n dismissPreview?: string\n}\n\nexport interface ResizerRenderProps {\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n isResizing: boolean\n onPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void\n}\n\n/**\n * State context — holds reactive values that change during runtime.\n * All consumers of this context will re-render when any of these values change.\n */\nexport interface DashboardStateValue {\n layout: TreeNode | null\n onLayoutChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n activeId: string | null\n dismissIntentId: string | null\n setContainerRef: (element: HTMLElement | null) => void\n fullscreenPaneId: string | null\n classNames: ZeugmaClassNames\n onRemove?: (paneId: string) => void\n onFullscreenChange?: (paneId: string | null) => void\n snapThreshold?: number\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n}\n\n/**\n * Actions context — holds stable dispatch functions with permanent identity.\n * Consumers of only this context will never re-render from layout/drag state changes.\n */\nexport interface DashboardActionsValue {\n removePane: (paneId: string) => void\n addPane: (paneId: string) => void\n swapPanes: (paneIdA: string, paneIdB: string) => void\n splitPane: (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => void\n updateSplitPercentage: (currentNode: SplitNode, percentage: number) => void\n updatePaneMetadata: (\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n ) => void\n}\nexport const DashboardStateContext = createContext<DashboardStateValue | undefined>(undefined)\nexport const DashboardActionsContext = createContext<DashboardActionsValue | undefined>(undefined)\n","import { useContext } from 'react'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n DashboardStateValue,\n DashboardActionsValue,\n} from './context'\n\n/** Returns only reactive state. Use when you need layout, activeId, classNames, etc. */\nexport const useDashboardState = (): DashboardStateValue => {\n const state = useContext(DashboardStateContext)\n if (!state) {\n throw new Error('useDashboardState must be used within a DashboardProvider')\n }\n return state\n}\n\n/** Returns only stable action dispatchers. Consumers of this hook never re-render from state changes. */\nexport const useDashboardActions = (): DashboardActionsValue => {\n const actions = useContext(DashboardActionsContext)\n if (!actions) {\n throw new Error('useDashboardActions must be used within a DashboardProvider')\n }\n return actions\n}\n","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\n\n/**\n * Tree Helper: Remove a pane and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, idToRemove: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === idToRemove ? null : tree\n }\n const newFirst = removePane(tree.first, idToRemove)\n const newSecond = removePane(tree.second, idToRemove)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n return typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.paneId === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Swap the position of two panes in the tree structure.\n */\nexport function swapPanes(tree: TreeNode | null, idA: string, idB: string): TreeNode | null {\n if (tree === null) return null\n\n // First pass: collect the full PaneNode references\n const nodeA = findPane(tree, idA)\n const nodeB = findPane(tree, idB)\n if (!nodeA || !nodeB) return tree\n\n // Second pass: replace each location with the other node\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.paneId === idA) return { ...nodeB! }\n if (node.paneId === idB) return { ...nodeA! }\n return node\n }\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', paneId: paneToAdd }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: { type: 'pane', paneId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Split the entire tree at the root using a dragged pane.\n */\nexport function splitRoot(\n tree: TreeNode | null,\n draggingId: string,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n): TreeNode | null {\n // Preserve dragged pane's metadata\n const draggedPaneNode: PaneNode = findPane(tree, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(tree, draggingId)\n if (treeWithoutDragging === null) {\n return { ...draggedPaneNode }\n }\n\n const direction: SplitDirection = splitType === 'left' || splitType === 'right' ? 'row' : 'column'\n const isFirst = splitType === 'left' || splitType === 'top'\n const draggedNode: TreeNode = { ...draggedPaneNode }\n\n return {\n type: 'split',\n direction,\n first: isFirst ? draggedNode : treeWithoutDragging,\n second: isFirst ? treeWithoutDragging : draggedNode,\n splitPercentage: 50,\n }\n}\n\n/**\n * Find a PaneNode by its paneId.\n */\nexport function findPane(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === paneId ? tree : null\n }\n return findPane(tree.first, paneId) ?? findPane(tree.second, paneId)\n}\n\n/**\n * Update metadata on a specific pane node using an updater function.\n */\nexport function updatePaneMetadata(\n tree: TreeNode | null,\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.paneId === paneId) {\n const newMetadata = updater(tree.metadata)\n if (newMetadata === undefined) {\n // Remove metadata key\n const { metadata: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, metadata: newMetadata }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneMetadata(tree.first, paneId, updater) ?? tree.first,\n second: updatePaneMetadata(tree.second, paneId, updater) ?? tree.second,\n }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import React, { useState, useEffect, useRef, ReactNode, useMemo, useCallback } from 'react'\nimport {\n DndContext,\n useSensor,\n useSensors,\n PointerSensor,\n TouchSensor,\n DragStartEvent,\n DragEndEvent,\n DragMoveEvent,\n pointerWithin,\n} from '@dnd-kit/core'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\nimport {\n removePane,\n splitPane,\n swapPanes,\n addPane,\n updateSplitPercentage,\n splitRoot,\n updatePaneMetadata,\n findPane,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n DashboardStateContext,\n DashboardActionsContext,\n ZeugmaClassNames,\n ResizerRenderProps,\n} from '../model/context'\n\n/** Cursor-following overlay rendered via portal */\nconst CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n\nclass SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nclass SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\ninterface DashboardProviderProps {\n layout: TreeNode | null\n onChange: (newLayout: TreeNode | null) => void\n renderPane: (paneId: string) => ReactNode\n renderDragOverlay?: (activeId: string) => ReactNode\n classNames?: ZeugmaClassNames\n fullscreenPaneId?: string | null\n onFullscreenChange?: (paneId: string | null) => void\n onRemove?: (paneId: string) => void\n dragActivationDistance?: number\n snapThreshold?: number\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'swap'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onResizeStart?: (currentNode: SplitNode) => void\n onResize?: (currentNode: SplitNode, percentage: number) => void\n onResizeEnd?: (currentNode: SplitNode, percentage: number) => void\n renderResizer?: (props: ResizerRenderProps) => ReactNode\n minSplitPercentage?: number\n maxSplitPercentage?: number\n enableDragToDismiss?: boolean\n dismissThreshold?: number\n onDismissIntentChange?: (paneId: string | null) => void\n children: ReactNode\n}\n\nexport const DashboardProvider: React.FC<DashboardProviderProps> = ({\n layout,\n onChange,\n renderPane,\n renderDragOverlay,\n classNames = {},\n fullscreenPaneId = null,\n onFullscreenChange,\n onRemove,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n renderResizer,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onDismissIntentChange,\n children,\n}) => {\n const [localLayout, setLocalLayout] = useState<TreeNode | null>(layout)\n const prevLayoutRef = useRef(layout)\n\n if (layout !== prevLayoutRef.current) {\n prevLayoutRef.current = layout\n setLocalLayout(layout)\n }\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n const containerRef = useRef<HTMLElement | null>(null)\n const containerRectRef = useRef<DOMRect | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n const onDismissIntentChangeRef = useRef(onDismissIntentChange)\n onDismissIntentChangeRef.current = onDismissIntentChange\n\n // Refs for stable closure access — prevents callback identity changes on every layout update\n const layoutRef = useRef(localLayout)\n layoutRef.current = localLayout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const renderPaneRef = useRef(renderPane)\n renderPaneRef.current = renderPane\n\n const onResizeEndPropRef = useRef(onResizeEnd)\n onResizeEndPropRef.current = onResizeEnd\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPaneRef.current(paneId), [])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.pane,\n classNames.dropPreview,\n classNames.swapPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n ],\n )\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const handleDragStart = (event: DragStartEvent) => {\n const draggingId = event.active.id.toString()\n setActiveId(draggingId)\n if (enableDragToDismiss && containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n if (onDragStart) {\n onDragStart(draggingId)\n }\n }\n\n const handleDragMove = (event: DragMoveEvent) => {\n if (!enableDragToDismiss) return\n\n const draggingId = event.active.id.toString()\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChangeRef.current?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (ae instanceof MouseEvent || ae instanceof PointerEvent) {\n px = ae.clientX + event.delta.x\n py = ae.clientY + event.delta.y\n } else if (typeof TouchEvent !== 'undefined' && ae instanceof TouchEvent) {\n const touch = ae.touches[0] || ae.changedTouches[0]\n if (touch) {\n px = touch.clientX + event.delta.x\n py = touch.clientY + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n onDismissIntentChangeRef.current?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChangeRef.current?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n const { active, over } = event\n const draggingId = active.id.toString()\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChangeRef.current?.(null)\n containerRectRef.current = null\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n handleRemovePane(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n // Check for root drop (places pane like half of the root)\n const rootMatch = overIdStr.match(/^drop-root-(left|right|top|bottom)$/)\n if (rootMatch) {\n const [, dropZone] = rootMatch\n const newLayout = splitRoot(\n localLayout,\n draggingId,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n\n if (onDragEnd) {\n const direction: SplitDirection =\n dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n return\n }\n\n // Check for center (swap) drop\n const swapMatch = overIdStr.match(/^drop-center-(.+)$/)\n if (swapMatch) {\n const [, targetId] = swapMatch\n if (draggingId !== targetId) {\n const newLayout = swapPanes(localLayout, draggingId, targetId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, { type: 'swap', position: 'center' })\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n if (draggingId === targetId) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n const draggedPaneNode = findPane(localLayout, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(localLayout, draggingId)\n\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleLocalLayoutChange = useCallback((newLayout: TreeNode | null) => {\n setLocalLayout(newLayout)\n }, [])\n\n const handleRemovePane = useCallback((paneId: string) => {\n const newLayout = removePane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleAddPane = useCallback((paneId: string) => {\n const newLayout = addPane(layoutRef.current, paneId)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSwapPanes = useCallback((paneIdA: string, paneIdB: string) => {\n const newLayout = swapPanes(layoutRef.current, paneIdA, paneIdB)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleSplitPane = useCallback(\n (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const draggedPaneNode = findPane(layoutRef.current, paneToAdd) ?? {\n type: 'pane',\n paneId: paneToAdd,\n }\n const treeWithoutDragging = removePane(layoutRef.current, paneToAdd)\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n splitType,\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleUpdateSplitPercentage = useCallback((currentNode: SplitNode, percentage: number) => {\n const newLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n }, [])\n\n const handleUpdatePaneMetadata = useCallback(\n (\n paneId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => {\n const newLayout = updatePaneMetadata(layoutRef.current, paneId, updater)\n setLocalLayout(newLayout)\n onChangeRef.current(newLayout)\n },\n [],\n )\n\n const handleResizeEnd = useCallback((currentNode: SplitNode, percentage: number) => {\n const finalLayout = updateSplitPercentage(layoutRef.current, currentNode, percentage)\n setLocalLayout(finalLayout)\n onChangeRef.current(finalLayout)\n if (onResizeEndPropRef.current) {\n onResizeEndPropRef.current(currentNode, percentage)\n }\n }, [])\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout: localLayout,\n onLayoutChange: handleLocalLayoutChange,\n renderPane: stableRenderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n }),\n [\n localLayout,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n renderResizer,\n minSplitPercentage,\n maxSplitPercentage,\n // Stable callbacks (empty deps) — included for exhaustive-deps lint rule\n handleLocalLayoutChange,\n stableRenderPane,\n handleResizeEnd,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane: handleRemovePane,\n addPane: handleAddPane,\n swapPanes: handleSwapPanes,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updatePaneMetadata: handleUpdatePaneMetadata,\n }),\n [\n handleRemovePane,\n handleAddPane,\n handleSwapPanes,\n handleSplitPane,\n handleUpdateSplitPercentage,\n handleUpdatePaneMetadata,\n ],\n )\n\n return (\n <DashboardActionsContext.Provider value={actionsValue}>\n <DashboardStateContext.Provider value={stateValue}>\n <DndContext\n id=\"zeugma-dnd-context\"\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n {activeId && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={renderDragOverlay}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId\n ? classNames.dismissPreview || 'zeugma-dismiss-preview'\n : ''\n }`.trim()}\n />\n )}\n </DashboardStateContext.Provider>\n </DashboardActionsContext.Provider>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nconst rootActivationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n}\n\nconst rootPreviewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport interface RootDropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nexport const RootDropZone: React.FC<RootDropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={rootActivationPositions[position]} />\n {isOver && <div className={activeClassName} style={rootPreviewPositions[position]} />}\n </>\n )\n}\n\nexport interface RootDropZonesProps {\n activeId: string | null\n hasOtherPanes: boolean\n dropPreviewClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({\n activeId,\n hasOtherPanes,\n dropPreviewClassName,\n}) => {\n if (!activeId || !hasOtherPanes) return null\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 30,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <RootDropZone\n key={pos}\n id={`drop-root-${pos}`}\n position={pos}\n activeClassName={dropPreviewClassName}\n />\n ))}\n </div>\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage } from '../../../shared/lib/tree'\nimport { useDashboardState } from '../../../entities/dashboard'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = useDashboardState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n document.body.classList.add('zeugma-resizing')\n\n // Inject global cursor style to keep resizing cursor active across the entire page during drag\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${isRow ? 'col-resize' : 'row-resize'} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const resizerEl = e.currentTarget\n resizerEl.setAttribute('data-resizing', 'true')\n\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / rect.width) * 100\n : ((moveEvent.clientY - startY) / rect.height) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? rect.left + (rect.width - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n : rect.top + (rect.height - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - rect.left) / (rect.width - resizerSize)) * 100\n : ((bestTarget - resizerSize / 2 - rect.top) / (rect.height - resizerSize)) * 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Imperatively update the sibling pane container flex sizes during drag\n const firstChild = container.children[0] as HTMLElement\n const secondChild = container.children[container.children.length - 1] as HTMLElement\n if (firstChild && secondChild) {\n firstChild.style.flex = `${finalPercentage} 1 0%`\n secondChild.style.flex = `${100 - finalPercentage} 1 0%`\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n }\n\n const handlePointerUp = () => {\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Write to React state once resizing completes\n const newLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n console.log('onLayoutChange (finalized) called with percentage:', currentPercentage)\n onLayoutChange(newLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n ],\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { useDashboardState, ResizerRenderProps, RootDropZones } from '../../../entities/dashboard'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode } from '../../../shared/model'\nimport { removePane } from '../../../shared'\n\nexport interface PaneTreeProps {\n tree?: TreeNode | null\n /** Size of the resizer in pixels (default 4) */\n resizerSize?: number\n /** Threshold in pixels to snap to adjacent resizer edges (default 8) */\n snapThreshold?: number\n /** Custom resizer renderer to override context-level renderResizer */\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\ninterface PaneSplitProps {\n currentNode: SplitNode\n resizerSize: number\n snapThreshold?: number\n renderResizer?: (props: ResizerRenderProps) => React.ReactNode\n}\n\nconst PaneSplit: React.FC<PaneSplitProps> = ({\n currentNode,\n resizerSize,\n snapThreshold,\n renderResizer: propRenderResizer,\n}) => {\n const {\n layout,\n onLayoutChange,\n classNames,\n renderResizer: contextRenderResizer,\n } = useDashboardState()\n const [isResizing, setIsResizing] = useState(false)\n\n const renderResizer = propRenderResizer || contextRenderResizer\n\n const containerRef = useRef<HTMLDivElement>(null)\n const { direction, first, second, splitPercentage } = currentNode\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold: snapThreshold ?? 8,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n })\n\n return (\n <div\n ref={containerRef}\n style={{\n display: 'flex',\n flexDirection: isRow ? 'row' : 'column',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <div style={{ flex: `${splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={first}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n {renderResizer ? (\n renderResizer({\n direction,\n splitPercentage,\n resizerSize,\n isResizing,\n onPointerDown: handlePointerDown,\n })\n ) : (\n <div\n className={classNames.resizer}\n data-direction={direction}\n style={{\n width: isRow ? `${resizerSize}px` : '100%',\n height: isRow ? '100%' : `${resizerSize}px`,\n cursor: isRow ? 'col-resize' : 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )}\n <div style={{ flex: `${100 - splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree\n tree={second}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={propRenderResizer}\n />\n </div>\n </div>\n )\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n renderResizer,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n classNames,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n } = useDashboardState()\n\n const snapThreshold = propSnapThreshold !== undefined ? propSnapThreshold : contextSnapThreshold\n\n const hasOtherPanes = useMemo(() => {\n if (tree !== undefined || !activeId) return false\n return removePane(layout, activeId) !== null\n }, [tree, layout, activeId])\n\n // Fullscreen bypass\n if (fullscreenPaneId && !tree) {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(fullscreenPaneId)}\n </div>\n )\n }\n\n const currentNode = tree !== undefined ? tree : layout\n\n if (!currentNode) return null\n\n const renderContent = () => {\n if (currentNode.type === 'pane') {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(currentNode.paneId)}\n </div>\n )\n }\n\n return (\n <PaneSplit\n currentNode={currentNode}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n renderResizer={renderResizer}\n />\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n return (\n <div\n ref={setContainerRef}\n className={`zeugma-dashboard-root ${isDismissActive ? 'zeugma-dashboard-dismiss-active' : ''}`.trim()}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n <RootDropZones\n activeId={activeId}\n hasOtherPanes={hasOtherPanes}\n dropPreviewClassName={classNames.dropPreview}\n />\n </div>\n )\n }\n\n return renderContent()\n}\n","import { createContext } from 'react'\n\nexport const DragListenersCtx = createContext<Record<string, unknown> | null>(null)\n","import React, { useMemo } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useDashboardState, useDashboardActions } from '../../dashboard'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPane } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'center'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n center: {\n position: 'absolute',\n top: '25%',\n left: '25%',\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n center: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\ninterface PaneProps {\n id: string\n children: (props: PaneRenderProps) => React.ReactNode\n style?: React.CSSProperties\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style }) => {\n const { layout, activeId, classNames, fullscreenPaneId, onRemove, onFullscreenChange } =\n useDashboardState()\n const { removePane, updatePaneMetadata } = useDashboardActions()\n const showDropZones = activeId !== null && activeId !== id\n\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id })\n const dragging = activeId === id || isDragging\n const isFullscreen = fullscreenPaneId === id\n\n const paneNode = useMemo(() => findPane(layout, id), [layout, id])\n const metadata = paneNode?.metadata\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n if (onRemove) {\n onRemove(id)\n } else {\n removePane(id)\n }\n },\n metadata,\n updateMetadata: (updater) => {\n updatePaneMetadata(id, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n onRemove,\n removePane,\n metadata,\n updatePaneMetadata,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(\n () => ({\n ...listeners,\n ...attributes,\n }),\n [listeners, attributes],\n )\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={classNames.pane}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={classNames.swapPreview}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\ninterface DragHandleProps {\n children: React.ReactNode\n className?: string\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n return (\n <div\n className={className}\n style={{ cursor: 'grab', userSelect: 'none', touchAction: 'none', ...style }}\n {...dragProps}\n >\n {children}\n </div>\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-zeugma",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Recursive drag-and-drop dashboard layout engine for React — combining the tree-based splitting of react-mosaic with the declarative API of react-grid-layout.",
5
5
  "type": "module",
6
6
  "sideEffects": false,