react-zeugma 2.2.1 → 2.2.2
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/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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),pe=react.createContext(void 0);var W=()=>{let e=react.useContext(de);if(!e)throw new Error("useZeugmaState must be used within a Zeugma provider");return e},we=()=>{let e=react.useContext(pe);if(!e)throw new Error("useZeugmaActions must be used within a Zeugma provider");return e};function He(e){let t=react.useRef(null);return react.useEffect(()=>{if(!e){t.current=null;return}let o=n=>{t.current={x:n.clientX,y:n.clientY};},r=n=>{let i=n.touches[0]||n.changedTouches[0];i&&(t.current={x:i.clientX,y:i.clientY});};return window.addEventListener("pointermove",o,{passive:true}),window.addEventListener("touchmove",r,{passive:true}),()=>{window.removeEventListener("pointermove",o),window.removeEventListener("touchmove",r);}},[e]),t}function ne(e,t){if(e===null)return null;if(e.type==="pane")return e.paneId===t?null:e;let o=ne(e.first,t),r=ne(e.second,t);return o===null?r:r===null?o:{...e,first:o,second:r}}function ie(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 i=typeof n=="string"?{type:"pane",paneId:n}:n,
|
|
1
|
+
'use strict';var react=require('react'),core=require('@dnd-kit/core'),jsxRuntime=require('react/jsx-runtime');var de=react.createContext(void 0),pe=react.createContext(void 0);var W=()=>{let e=react.useContext(de);if(!e)throw new Error("useZeugmaState must be used within a Zeugma provider");return e},we=()=>{let e=react.useContext(pe);if(!e)throw new Error("useZeugmaActions must be used within a Zeugma provider");return e};function He(e){let t=react.useRef(null);return react.useEffect(()=>{if(!e){t.current=null;return}let o=n=>{t.current={x:n.clientX,y:n.clientY};},r=n=>{let i=n.touches[0]||n.changedTouches[0];i&&(t.current={x:i.clientX,y:i.clientY});};return window.addEventListener("pointermove",o,{passive:true}),window.addEventListener("touchmove",r,{passive:true}),()=>{window.removeEventListener("pointermove",o),window.removeEventListener("touchmove",r);}},[e]),t}function ne(e,t){if(e===null)return null;if(e.type==="pane")return e.paneId===t?null:e;let o=ne(e.first,t),r=ne(e.second,t);return o===null?r:r===null?o:{...e,first:o,second:r}}function ie(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 i=typeof n=="string"?{type:"pane",paneId:n}:n,a=r==="left"||r==="top";return {type:"split",direction:o,first:a?i:e,second:a?e:i,splitPercentage:50}}return e}return {...e,first:ie(e.first,t,o,r,n)||e.first,second:ie(e.second,t,o,r,n)||e.second}}function Ee(e,t,o){if(e===null)return null;let r=O(e,t),n=O(e,o);if(!r||!n)return e;function i(a){return a.type==="pane"?a.paneId===t?{...n}:a.paneId===o?{...r}:a:{...a,first:i(a.first),second:i(a.second)}}return i(e)}function Fe(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 O(e,t){return e===null?null:e.type==="pane"?e.paneId===t?e:null:O(e.first,t)??O(e.second,t)}function me(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,...i}=e;return i}return {...e,metadata:r}}return e}return {...e,first:me(e.first,t,o)??e.first,second:me(e.second,t,o)??e.second}}var et=8,tt=8,Yt=4;var _e=({activeId:e,render:t,className:o})=>{let r=react.useRef(null);return react.useEffect(()=>{let n=i=>{r.current&&(r.current.style.transform=`translate(${i.clientX+12}px, ${i.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)})};var fe=class extends core.PointerSensor{static activators=[{eventName:"onPointerDown",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},ge=class extends core.TouchSensor{static activators=[{eventName:"onTouchStart",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]};function ke(e){if(e instanceof MouseEvent||e instanceof PointerEvent)return {x:e.clientX,y:e.clientY};if(typeof TouchEvent<"u"&&e instanceof TouchEvent){let t=e.touches[0]||e.changedTouches[0];if(t)return {x:t.clientX,y:t.clientY}}return null}var ut=({layout:e,onChange:t,renderPane:o,renderDragOverlay:r,classNames:n={},fullscreenPaneId:i=null,onFullscreenChange:a,onRemove:c,dragActivationDistance:b=8,snapThreshold:P=8,onDragStart:T,onDragEnd:s,onResizeStart:h,onResize:y,onResizeEnd:v,minSplitPercentage:R=5,maxSplitPercentage:d=95,enableDragToDismiss:m=false,dismissThreshold:I=60,onDismissIntentChange:L,children:E})=>{let[p,f]=react.useState(e),[K,oe]=react.useState(e);e!==K&&(oe(e),f(e));let[w,X]=react.useState(null),[D,Z]=react.useState(null),V=react.useRef(null),H=react.useRef(null),x=He(w),C=react.useCallback(u=>{V.current=u;},[]),F=react.useCallback(u=>o(u),[o]),z=react.useMemo(()=>n,[n.pane,n.dropPreview,n.swapPreview,n.dragOverlay,n.resizer,n.dismissPreview]),A=core.useSensors(core.useSensor(fe,{activationConstraint:{distance:b}}),core.useSensor(ge,{activationConstraint:{delay:250,tolerance:5}})),U=u=>{let g=u.active.id.toString();X(g);let l=u.activatorEvent;x.current=ke(l),m&&V.current?H.current=V.current.getBoundingClientRect():H.current=null,T&&T(g);},Se=u=>{if(!m)return;let g=u.active.id.toString(),l=H.current;if(!l){D!==null&&(Z(null),L?.(null));return}let S=u.activatorEvent,_=null,$=null;if(x.current)_=x.current.x,$=x.current.y;else {let N=ke(S);N&&(_=N.x+u.delta.x,$=N.y+u.delta.y);}let k=0;if(_!==null&&$!==null){let N=0,M=0;_<l.left?N=l.left-_:_>l.right&&(N=_-l.right),$<l.top?M=l.top-$:$>l.bottom&&(M=$-l.bottom),k=Math.sqrt(N*N+M*M);}else {let N=u.active.rect.current.translated;if(N){let M=N.left+N.width/2,q=N.top+N.height/2,ee=0,te=0;M<l.left?ee=l.left-M:M>l.right&&(ee=M-l.right),q<l.top?te=l.top-q:q>l.bottom&&(te=q-l.bottom),k=Math.sqrt(ee*ee+te*te);}}k>I?D!==g&&(Z(g),L?.(g)):D!==null&&(Z(null),L?.(null));},ce=u=>{X(null);let{active:g,over:l}=u,S=g.id.toString(),_=m&&D===S;if(Z(null),L?.(null),H.current=null,_){c?c(S):J(S),s&&s(S,null,null);return}if(!l){s&&s(S,null,null);return}let $=l.id.toString(),k=$.match(/^drop-center-(.+)$/);if(k){let[,Re]=k;if(S!==Re){let Ze=Ee(p,S,Re);f(Ze),t(Ze);}s&&s(S,Re,{type:"swap",position:"center"});return}let ye=$.match(/^drop-(left|right|top|bottom)-(.+)$/);if(!ye){s&&s(S,null,null);return}let[,N,M]=ye;if(S===M){s&&s(S,null,null);return}let q=N==="left"||N==="right"?"row":"column",ee=O(p,S)??{type:"pane",paneId:S},te=ne(p,S),Me=ie(te,M,q,N,ee);f(Me),t(Me),s&&s(S,M,{type:"split",direction:q,position:N});},B=react.useCallback((u,g=false)=>{f(u),g||t(u);},[t]),J=react.useCallback(u=>{let g=ne(p,u);f(g),t(g);},[p,t]),Q=react.useCallback(u=>{let g=Fe(p,u);f(g),t(g);},[p,t]),ue=react.useCallback((u,g)=>{let l=Ee(p,u,g);f(l),t(l);},[p,t]),re=react.useCallback((u,g,l,S)=>{let _=O(p,S)??{type:"pane",paneId:S},$=ne(p,S),k=ie($,u,g,l,_);f(k),t(k);},[p,t]),j=react.useCallback((u,g)=>{let l=G(p,u,g);f(l),t(l);},[p,t]),Ie=react.useCallback((u,g)=>{let l=me(p,u,g);f(l),t(l);},[p,t]),Ce=react.useCallback((u,g)=>{v&&v(u,g);},[v]),Ke=react.useMemo(()=>({layout:p,onLayoutChange:B,renderPane:F,activeId:w,dismissIntentId:D,setContainerRef:C,fullscreenPaneId:i,classNames:z,onRemove:c,onFullscreenChange:a,snapThreshold:P,onResizeStart:h,onResize:y,onResizeEnd:Ce,minSplitPercentage:R,maxSplitPercentage:d}),[p,w,D,C,i,z,c,a,P,h,y,R,d,B,F,Ce]),Je=react.useMemo(()=>({removePane:J,addPane:Q,swapPanes:ue,splitPane:re,updateSplitPercentage:j,updatePaneMetadata:Ie}),[J,Q,ue,re,j,Ie]);return jsxRuntime.jsx(pe.Provider,{value:Je,children:jsxRuntime.jsxs(de.Provider,{value:Ke,children:[jsxRuntime.jsx(core.DndContext,{id:"zeugma-dnd-context",sensors:A,collisionDetection:core.pointerWithin,onDragStart:U,onDragMove:Se,onDragEnd:ce,children:E}),w&&r&&jsxRuntime.jsx(_e,{activeId:w,render:r,className:`${n.dragOverlay||""} ${w===D?n.dismissPreview||"zeugma-dismiss-preview":""}`.trim()})]})})};function be({cursor:e,resizerEl:t,onMove:o,onEnd:r}){document.body.classList.add("zeugma-resizing");let n=document.createElement("style");n.id="zeugma-global-cursor-style",n.textContent=`
|
|
2
2
|
* {
|
|
3
3
|
cursor: ${e} !important;
|
|
4
4
|
user-select: none !important;
|
|
5
5
|
}
|
|
6
|
-
`,document.head.appendChild(n),t.setAttribute("data-resizing","true");let i=c=>{o(c);},l=()=>{document.body.classList.remove("zeugma-resizing"),t.removeAttribute("data-resizing");let c=document.getElementById("zeugma-global-cursor-style");c&&c.remove(),document.removeEventListener("pointermove",i),document.removeEventListener("pointerup",l),r();};document.addEventListener("pointermove",i),document.addEventListener("pointerup",l);}function De({containerRef:e,isRow:t,direction:o,splitPercentage:r,resizerSize:n,snapThreshold:i,layout:l,currentNode:c,onLayoutChange:h,onResizeStart:P,onResizeEnd:T,parentLeft:s,parentTop:b,parentWidth:y,parentHeight:v}){let{onResizeStart:R,onResize:p,onResizeEnd:f,minSplitPercentage:I=5,maxSplitPercentage:L=95}=W();return react.useCallback(E=>{E.preventDefault();let d=e.current;if(!d)return;P&&P(),R&&R(c);let m=d.getBoundingClientRect(),K=E.clientX,oe=E.clientY,w=r,X=E.currentTarget,D=m.left+m.width*(s/100),Z=m.top+m.height*(b/100),_=m.width*(y/100),H=m.height*(v/100),C=Array.from(document.querySelectorAll('div[role="separator"][data-direction]')).filter(z=>z!==X&&z.getAttribute("data-direction")===o).map(z=>{let A=z.getBoundingClientRect();return t?A.left+A.width/2:A.top+A.height/2}),V=w;be({cursor:t?"col-resize":"row-resize",resizerEl:X,onMove:z=>{let A=t?(z.clientX-K)/_*100:(z.clientY-oe)/H*100,U=w+A,Se=t?D+(_-n)*(U/100)+n/2:Z+(H-n)*(U/100)+n/2,ue=1/0,B=null;for(let re of C){let j=Math.abs(Se-re);j<i&&j<ue&&(ue=j,B=re);}let J=U;B!==null&&(J=t?(B-n/2-D)/(_-n)*100:(B-n/2-Z)/(H-n)*100);let Q=Math.max(I,Math.min(L,J));V=Q;let ce=G(l,c,Q);h(ce),p&&p(c,Q);},onEnd:()=>{T&&T(),f&&f(c,V);}});},[e,t,o,r,n,i,l,c,h,P,T,R,p,f,I,L,s,b,y,v])}function se(e,t=0,o=0,r=100,n=100,i="root"){if(e.type==="pane")return {panes:[{paneId:e.paneId,left:t,top:o,width:r,height:n,node:e}],splitters:[]};let{direction:l,splitPercentage:c,first:h,second:P}=e,s={id:`splitter-${i}-${l}`,currentNode:e,direction:l,left:l==="row"?t+r*(c/100):t,top:l==="column"?o+n*(c/100):o,width:l==="row"?0:r,height:l==="column"?0:n,parentLeft:t,parentTop:o,parentWidth:r,parentHeight:n},b={panes:[],splitters:[]},y={panes:[],splitters:[]};if(l==="row"){let v=r*(c/100);b=se(h,t,o,v,n,`${i}-L`),y=se(P,t+v,o,r-v,n,`${i}-R`);}else {let v=n*(c/100);b=se(h,t,o,r,v,`${i}-T`),y=se(P,t,o+v,r,n-v,`${i}-B`);}return {panes:[...b.panes,...y.panes],splitters:[s,...b.splitters,...y.splitters]}}var vt=({splitter:e,resizerSize:t,snapThreshold:o,containerRef:r})=>{let{layout:n,onLayoutChange:i,classNames:l}=W(),[c,h]=react.useState(false),{currentNode:P,direction:T,left:s,top:b,width:y,height:v,parentLeft:R,parentTop:p,parentWidth:f,parentHeight:I}=e,L=T==="row",E=De({containerRef:r,isRow:L,direction:T,splitPercentage:P.splitPercentage,resizerSize:t,snapThreshold:o,layout:n,currentNode:P,onLayoutChange:i,onResizeStart:()=>h(true),onResizeEnd:()=>h(false),parentLeft:R,parentTop:p,parentWidth:f,parentHeight:I}),d=L?{position:"absolute",left:`calc(${s}% - ${t/2}px)`,top:`${b}%`,width:`${t}px`,height:`${v}%`,cursor:"col-resize",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box"}:{position:"absolute",left:`${s}%`,top:`calc(${b}% - ${t/2}px)`,width:`${y}%`,height:`${t}px`,cursor:"row-resize",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box"};return jsxRuntime.jsx("div",{className:`zeugma-resizer ${l.resizer||""}`.trim(),"data-direction":T,"data-resizing":c||void 0,style:d,onPointerDown:E,role:"separator","aria-valuenow":P.splitPercentage,"aria-valuemin":5,"aria-valuemax":95})},bt=({tree:e,resizerSize:t=4,snapThreshold:o})=>{let{layout:r,renderPane:n,activeId:i,dismissIntentId:l,setContainerRef:c,fullscreenPaneId:h,snapThreshold:P}=W(),T=o!==void 0?o:P??8,s=e!==void 0?e:r,b=react.useRef(null),{panes:y,splitters:v}=react.useMemo(()=>s?se(s):{panes:[],splitters:[]},[s]);if(!s)return null;let R=()=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[y.map(p=>{let f=h===p.paneId;return jsxRuntime.jsx("div",{style:{position:"absolute",left:f?"0%":`${p.left}%`,top:f?"0%":`${p.top}%`,width:f?"100%":`${p.width}%`,height:f?"100%":`${p.height}%`,overflow:"hidden",zIndex:f?20:1,display:h&&!f?"none":"block",padding:f?"0px":`${t/2}px`,boxSizing:"border-box"},children:n(p.paneId)},p.paneId)}),!h&&v.map(p=>jsxRuntime.jsx(vt,{splitter:p,resizerSize:t,snapThreshold:T,containerRef:b},p.id))]});return e===void 0?jsxRuntime.jsx("div",{ref:I=>{c(I),b.current=I;},className:`zeugma-dashboard-root ${i!==null&&i===l?"zeugma-dashboard-dismiss-active":""}`.trim(),style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:R()}):jsxRuntime.jsx("div",{ref:b,style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:R()})};var Xe="zeugma-height:",yt="default-pane";function Rt(e){try{let t=localStorage.getItem(Xe+e);if(t!==null){let o=Number(t);if(Number.isFinite(o)&&o>0)return o}}catch{}return null}function We(e,t){try{localStorage.setItem(Xe+e,String(Math.round(t)));}catch{}}var Be=({children:e,active:t=true,height:o,onHeightChange:r,minHeight:n=100,maxHeight:i=1/0,persist:l,localStorageKey:c,resizerHeight:h=6,className:P,resizerClassName:T})=>{let s=l?c||yt:null,b=()=>{let E=(s?Rt(s):null)??o??400;return he(E,n,i)},[y,v]=react.useState(b),R=react.useRef(null),p=s?y:o??y,f=react.useRef(o);react.useEffect(()=>{if(o!==void 0&&o!==f.current){let E=he(o,n,i);v(E),s&&We(s,E);}f.current=o;},[o,n,i,s]);let I=react.useCallback(()=>i,[i]),L=react.useCallback(E=>{E.preventDefault();let d=E.clientY,m=p,K=I(),oe=E.currentTarget,w=qe(R.current),X=w?w.scrollTop:0,D=d,Z=null,_=(x,C)=>{let V=C-X,A=x-d+V,U=he(m+A,n,K);return R.current&&(R.current.style.height=`${U}px`),U},H=()=>{if(!w)return;let x=w===document.documentElement||w===document.body?{top:0,bottom:window.innerHeight}:w.getBoundingClientRect(),C=40,V=10,z=0;D>x.bottom-C?z=Math.min(1,(D-(x.bottom-C))/C)*V:D<x.top+C&&(z=-Math.min(1,(x.top+C-D)/C)*V),z!==0&&(w.scrollTop+=z,_(D,w.scrollTop)),Z=requestAnimationFrame(H);};Z=requestAnimationFrame(H),be({cursor:"row-resize",resizerEl:oe,onMove:x=>{D=x.clientY,w&&_(D,w.scrollTop);},onEnd:()=>{Z!==null&&cancelAnimationFrame(Z);let x=m;R.current&&(x=R.current.getBoundingClientRect().height),x=he(x,n,K),v(x),r&&r(x),s&&We(s,x);}});},[p,n,I,r,s]);return t?jsxRuntime.jsxs("div",{ref:R,className:`zeugma-resizable-container ${P||""}`.trim(),style:{height:`${p}px`,position:"relative",overflow:"hidden",boxSizing:"border-box"},children:[jsxRuntime.jsx("div",{style:{height:`calc(100% - ${h}px)`,overflow:"hidden"},children:e}),jsxRuntime.jsx("div",{className:`zeugma-resizable-handle ${T||""}`.trim(),style:{height:`${h}px`,cursor:"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:L,role:"separator","aria-orientation":"horizontal","aria-valuenow":Math.round(p),"aria-valuemin":n,"aria-valuemax":i===1/0?void 0:i})]}):jsxRuntime.jsx("div",{className:`zeugma-resizable-container disabled ${P||""}`.trim(),style:{height:"100%",position:"relative",overflow:"hidden",boxSizing:"border-box"},children:jsxRuntime.jsx("div",{style:{height:"100%",overflow:"hidden"},children:e})})};function he(e,t,o){return Math.max(t,Math.min(o,e))}function qe(e){if(typeof window>"u"||!e)return null;let t=e.parentElement;if(!t)return document.documentElement;let r=window.getComputedStyle(t).overflowY;return r==="auto"||r==="scroll"?t:qe(t)}var xe=react.createContext(null);var Dt={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"}},zt={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"}},Ge=({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:Dt[t]}),n&&jsxRuntime.jsx("div",{className:o,style:zt[t]})]})},Lt=({id:e,children:t,style:o})=>{let{layout:r,activeId:n,classNames:i,fullscreenPaneId:l,onRemove:c,onFullscreenChange:h}=W(),{removePane:P,updatePaneMetadata:T}=we(),s=n!==null&&n!==e,{attributes:b,listeners:y,setNodeRef:v,isDragging:R}=core.useDraggable({id:e}),p=n===e||R,f=l===e,L=react.useMemo(()=>O(r,e),[r,e])?.metadata,E=react.useMemo(()=>({isDragging:p,isFullscreen:f,toggleFullscreen:()=>h?.(f?null:e),remove:()=>{f&&h?.(null),c?c(e):P(e);},metadata:L,updateMetadata:m=>{T(e,m);}}),[p,f,h,e,c,P,L,T]),d=react.useMemo(()=>({...y,...b}),[y,b]);return jsxRuntime.jsx(xe.Provider,{value:d,children:jsxRuntime.jsxs("div",{ref:v,className:i.pane,style:{position:"relative",width:"100%",height:"100%",...o},children:[t(E),s&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:15,pointerEvents:"none"},children:[["top","bottom","left","right"].map(m=>jsxRuntime.jsx(Ge,{id:`drop-${m}-${e}`,position:m,activeClassName:i.dropPreview},m)),jsxRuntime.jsx(Ge,{id:`drop-center-${e}`,position:"center",activeClassName:i.swapPreview})]})]})})};var Mt=({children:e,className:t,style:o})=>{let r=react.useContext(xe);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=tt;exports.DEFAULT_RESIZER_SIZE=Yt;exports.DEFAULT_SNAP_THRESHOLD=et;exports.DragHandle=Mt;exports.Pane=Lt;exports.PaneTree=bt;exports.ResizableContainer=Be;exports.Zeugma=ct;exports.addPane=Fe;exports.createDragSession=be;exports.findPane=O;exports.removePane=ne;exports.splitPane=ie;exports.swapPanes=Ee;exports.updatePaneMetadata=me;exports.updateSplitPercentage=G;exports.useResizer=De;exports.useZeugmaActions=we;exports.useZeugmaState=W;//# sourceMappingURL=index.cjs.map
|
|
6
|
+
`,document.head.appendChild(n),t.setAttribute("data-resizing","true");let i=c=>{o(c);},a=()=>{document.body.classList.remove("zeugma-resizing"),t.removeAttribute("data-resizing");let c=document.getElementById("zeugma-global-cursor-style");c&&c.remove(),document.removeEventListener("pointermove",i),document.removeEventListener("pointerup",a),r();};document.addEventListener("pointermove",i),document.addEventListener("pointerup",a);}function De({containerRef:e,isRow:t,direction:o,splitPercentage:r,resizerSize:n,snapThreshold:i,layout:a,currentNode:c,onLayoutChange:b,onResizeStart:P,onResizeEnd:T,parentLeft:s,parentTop:h,parentWidth:y,parentHeight:v}){let{onResizeStart:R,onResize:d,onResizeEnd:m,minSplitPercentage:I=5,maxSplitPercentage:L=95}=W();return react.useCallback(E=>{E.preventDefault();let p=e.current;if(!p)return;P&&P(),R&&R(c);let f=p.getBoundingClientRect(),K=E.clientX,oe=E.clientY,w=r,X=E.currentTarget,D=f.left+f.width*(s/100),Z=f.top+f.height*(h/100),V=f.width*(y/100),H=f.height*(v/100),C=Array.from(document.querySelectorAll('div[role="separator"][data-direction]')).filter(z=>z!==X&&z.getAttribute("data-direction")===o).map(z=>{let A=z.getBoundingClientRect();return t?A.left+A.width/2:A.top+A.height/2}),F=w;be({cursor:t?"col-resize":"row-resize",resizerEl:X,onMove:z=>{let A=t?(z.clientX-K)/V*100:(z.clientY-oe)/H*100,U=w+A,Se=t?D+(V-n)*(U/100)+n/2:Z+(H-n)*(U/100)+n/2,ce=1/0,B=null;for(let re of C){let j=Math.abs(Se-re);j<i&&j<ce&&(ce=j,B=re);}let J=U;B!==null&&(J=t?(B-n/2-D)/(V-n)*100:(B-n/2-Z)/(H-n)*100);let Q=Math.max(I,Math.min(L,J));F=Q;let ue=G(a,c,Q);b(ue,true),d&&d(c,Q);},onEnd:()=>{let z=G(a,c,F);b(z),T&&T(),m&&m(c,F);}});},[e,t,o,r,n,i,a,c,b,P,T,R,d,m,I,L,s,h,y,v])}function se(e,t=0,o=0,r=100,n=100,i="root"){if(e.type==="pane")return {panes:[{paneId:e.paneId,left:t,top:o,width:r,height:n,node:e}],splitters:[]};let{direction:a,splitPercentage:c,first:b,second:P}=e,s={id:`splitter-${i}-${a}`,currentNode:e,direction:a,left:a==="row"?t+r*(c/100):t,top:a==="column"?o+n*(c/100):o,width:a==="row"?0:r,height:a==="column"?0:n,parentLeft:t,parentTop:o,parentWidth:r,parentHeight:n},h={panes:[],splitters:[]},y={panes:[],splitters:[]};if(a==="row"){let v=r*(c/100);h=se(b,t,o,v,n,`${i}-L`),y=se(P,t+v,o,r-v,n,`${i}-R`);}else {let v=n*(c/100);h=se(b,t,o,r,v,`${i}-T`),y=se(P,t,o+v,r,n-v,`${i}-B`);}return {panes:[...h.panes,...y.panes],splitters:[s,...h.splitters,...y.splitters]}}var vt=({splitter:e,resizerSize:t,snapThreshold:o,containerRef:r})=>{let{layout:n,onLayoutChange:i,classNames:a}=W(),[c,b]=react.useState(false),{currentNode:P,direction:T,left:s,top:h,width:y,height:v,parentLeft:R,parentTop:d,parentWidth:m,parentHeight:I}=e,L=T==="row",E=De({containerRef:r,isRow:L,direction:T,splitPercentage:P.splitPercentage,resizerSize:t,snapThreshold:o,layout:n,currentNode:P,onLayoutChange:i,onResizeStart:()=>b(true),onResizeEnd:()=>b(false),parentLeft:R,parentTop:d,parentWidth:m,parentHeight:I}),p=L?{position:"absolute",left:`calc(${s}% - ${t/2}px)`,top:`${h}%`,width:`${t}px`,height:`${v}%`,cursor:"col-resize",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box"}:{position:"absolute",left:`${s}%`,top:`calc(${h}% - ${t/2}px)`,width:`${y}%`,height:`${t}px`,cursor:"row-resize",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box"};return jsxRuntime.jsx("div",{className:`zeugma-resizer ${a.resizer||""}`.trim(),"data-direction":T,"data-resizing":c||void 0,style:p,onPointerDown:E,role:"separator","aria-valuenow":P.splitPercentage,"aria-valuemin":5,"aria-valuemax":95})},bt=({tree:e,resizerSize:t=4,snapThreshold:o})=>{let{layout:r,renderPane:n,activeId:i,dismissIntentId:a,setContainerRef:c,fullscreenPaneId:b,snapThreshold:P}=W(),T=o!==void 0?o:P??8,s=e!==void 0?e:r,h=react.useRef(null),{panes:y,splitters:v}=react.useMemo(()=>s?se(s):{panes:[],splitters:[]},[s]);if(!s)return null;let R=()=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[y.map(d=>{let m=b===d.paneId;return jsxRuntime.jsx("div",{style:{position:"absolute",left:m?"0%":`${d.left}%`,top:m?"0%":`${d.top}%`,width:m?"100%":`${d.width}%`,height:m?"100%":`${d.height}%`,overflow:"hidden",zIndex:m?20:1,display:b&&!m?"none":"block",padding:m?"0px":`${t/2}px`,boxSizing:"border-box"},children:n(d.paneId)},d.paneId)}),!b&&v.map(d=>jsxRuntime.jsx(vt,{splitter:d,resizerSize:t,snapThreshold:T,containerRef:h},d.id))]});return e===void 0?jsxRuntime.jsx("div",{ref:I=>{c(I),h.current=I;},className:`zeugma-dashboard-root ${i!==null&&i===a?"zeugma-dashboard-dismiss-active":""}`.trim(),style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:R()}):jsxRuntime.jsx("div",{ref:h,style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:R()})};var Xe="zeugma-height:",yt="default-pane";function Rt(e){try{let t=localStorage.getItem(Xe+e);if(t!==null){let o=Number(t);if(Number.isFinite(o)&&o>0)return o}}catch{}return null}function We(e,t){try{localStorage.setItem(Xe+e,String(Math.round(t)));}catch{}}var Be=({children:e,active:t=true,height:o,onHeightChange:r,minHeight:n=100,maxHeight:i=1/0,persist:a,localStorageKey:c,resizerHeight:b=6,className:P,resizerClassName:T})=>{let s=a?c||yt:null,h=()=>{let E=(s?Rt(s):null)??o??400;return he(E,n,i)},[y,v]=react.useState(h),R=react.useRef(null),d=s?y:o??y,m=react.useRef(o);react.useEffect(()=>{if(o!==void 0&&o!==m.current){let E=he(o,n,i);v(E),s&&We(s,E);}m.current=o;},[o,n,i,s]);let I=react.useCallback(()=>i,[i]),L=react.useCallback(E=>{E.preventDefault();let p=E.clientY,f=d,K=I(),oe=E.currentTarget,w=qe(R.current),X=w?w.scrollTop:0,D=p,Z=null,V=(x,C)=>{let F=C-X,A=x-p+F,U=he(f+A,n,K);return R.current&&(R.current.style.height=`${U}px`),U},H=()=>{if(!w)return;let x=w===document.documentElement||w===document.body?{top:0,bottom:window.innerHeight}:w.getBoundingClientRect(),C=40,F=10,z=0;D>x.bottom-C?z=Math.min(1,(D-(x.bottom-C))/C)*F:D<x.top+C&&(z=-Math.min(1,(x.top+C-D)/C)*F),z!==0&&(w.scrollTop+=z,V(D,w.scrollTop)),Z=requestAnimationFrame(H);};Z=requestAnimationFrame(H),be({cursor:"row-resize",resizerEl:oe,onMove:x=>{D=x.clientY,w&&V(D,w.scrollTop);},onEnd:()=>{Z!==null&&cancelAnimationFrame(Z);let x=f;R.current&&(x=R.current.getBoundingClientRect().height),x=he(x,n,K),v(x),r&&r(x),s&&We(s,x);}});},[d,n,I,r,s]);return t?jsxRuntime.jsxs("div",{ref:R,className:`zeugma-resizable-container ${P||""}`.trim(),style:{height:`${d}px`,position:"relative",overflow:"hidden",boxSizing:"border-box"},children:[jsxRuntime.jsx("div",{style:{height:`calc(100% - ${b}px)`,overflow:"hidden"},children:e}),jsxRuntime.jsx("div",{className:`zeugma-resizable-handle ${T||""}`.trim(),style:{height:`${b}px`,cursor:"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:L,role:"separator","aria-orientation":"horizontal","aria-valuenow":Math.round(d),"aria-valuemin":n,"aria-valuemax":i===1/0?void 0:i})]}):jsxRuntime.jsx("div",{className:`zeugma-resizable-container disabled ${P||""}`.trim(),style:{height:"100%",position:"relative",overflow:"hidden",boxSizing:"border-box"},children:jsxRuntime.jsx("div",{style:{height:"100%",overflow:"hidden"},children:e})})};function he(e,t,o){return Math.max(t,Math.min(o,e))}function qe(e){if(typeof window>"u"||!e)return null;let t=e.parentElement;if(!t)return document.documentElement;let r=window.getComputedStyle(t).overflowY;return r==="auto"||r==="scroll"?t:qe(t)}var xe=react.createContext(null);var Dt={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"}},zt={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"}},Ge=({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:Dt[t]}),n&&jsxRuntime.jsx("div",{className:o,style:zt[t]})]})},Lt=({id:e,children:t,style:o})=>{let{layout:r,activeId:n,classNames:i,fullscreenPaneId:a,onRemove:c,onFullscreenChange:b}=W(),{removePane:P,updatePaneMetadata:T}=we(),s=n!==null&&n!==e,{attributes:h,listeners:y,setNodeRef:v,isDragging:R}=core.useDraggable({id:e}),d=n===e||R,m=a===e,L=react.useMemo(()=>O(r,e),[r,e])?.metadata,E=react.useMemo(()=>({isDragging:d,isFullscreen:m,toggleFullscreen:()=>b?.(m?null:e),remove:()=>{m&&b?.(null),c?c(e):P(e);},metadata:L,updateMetadata:f=>{T(e,f);}}),[d,m,b,e,c,P,L,T]),p=react.useMemo(()=>({...y,...h}),[y,h]);return jsxRuntime.jsx(xe.Provider,{value:p,children:jsxRuntime.jsxs("div",{ref:v,className:i.pane,style:{position:"relative",width:"100%",height:"100%",...o},children:[t(E),s&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:15,pointerEvents:"none"},children:[["top","bottom","left","right"].map(f=>jsxRuntime.jsx(Ge,{id:`drop-${f}-${e}`,position:f,activeClassName:i.dropPreview},f)),jsxRuntime.jsx(Ge,{id:`drop-center-${e}`,position:"center",activeClassName:i.swapPreview})]})]})})};var Mt=({children:e,className:t,style:o})=>{let r=react.useContext(xe);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=tt;exports.DEFAULT_RESIZER_SIZE=Yt;exports.DEFAULT_SNAP_THRESHOLD=et;exports.DragHandle=Mt;exports.Pane=Lt;exports.PaneTree=bt;exports.ResizableContainer=Be;exports.Zeugma=ut;exports.addPane=Fe;exports.createDragSession=be;exports.findPane=O;exports.removePane=ne;exports.splitPane=ie;exports.swapPanes=Ee;exports.updatePaneMetadata=me;exports.updateSplitPercentage=G;exports.useResizer=De;exports.useZeugmaActions=we;exports.useZeugmaState=W;//# sourceMappingURL=index.cjs.map
|
|
7
7
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entities/zeugma/model/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/ui/Zeugma.tsx","../src/shared/lib/drag-session.ts","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/widgets/resizable-container/ui/ResizableContainer.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx"],"names":["ZeugmaStateContext","createContext","ZeugmaActionsContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","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","paneId","updatePaneMetadata","updater","newMetadata","_","rest","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","render","className","ref","handleMove","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","Zeugma","layout","onChange","renderPane","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onDismissIntentChange","children","localLayout","setLocalLayout","useState","prevLayout","setPrevLayout","setActiveId","dismissIntentId","setDismissIntentId","containerRef","containerRectRef","setContainerRef","useCallback","element","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","draggingId","ae","handleDragMove","containerRect","px","py","coords","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDismissIntent","handleRemovePane","overIdStr","swapMatch","newLayout","match","dropZone","draggedPaneNode","treeWithoutDragging","handleLocalLayoutChange","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleResizeEnd","finalLayout","stateValue","actionsValue","jsxs","DndContext","pointerWithin","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","el","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","computeLayout","left","top","width","height","path","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","Fragment","pane","isFullscreen","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Pane","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext } from 'react'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\n","import { useContext, useEffect, useRef } from 'react'\nimport { ZeugmaStateContext, ZeugmaActionsContext } from './context'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const useZeugmaState = (): ZeugmaStateValue => {\n const state = useContext(ZeugmaStateContext)\n if (!state) {\n throw new Error('useZeugmaState must be used within a Zeugma provider')\n }\n return state\n}\n\nexport const useZeugmaActions = (): ZeugmaActionsValue => {\n const actions = useContext(ZeugmaActionsContext)\n if (!actions) {\n throw new Error('useZeugmaActions must be used within a Zeugma provider')\n }\n return actions\n}\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\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 * 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, { useEffect, useRef, ReactNode } from 'react'\n\nexport const 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","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class 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\nexport class 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","import React, { useState, useRef, useMemo, useCallback } from 'react'\nimport {\n DndContext,\n useSensor,\n useSensors,\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 updatePaneMetadata,\n findPane,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport { ZeugmaStateContext, ZeugmaActionsContext, useLatestPointer } from '../model'\nimport { ZeugmaProps } from '../model/types'\nimport { CursorOverlay } from './CursorOverlay'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\nexport const Zeugma: React.FC<ZeugmaProps> = ({\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 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 [prevLayout, setPrevLayout] = useState<TreeNode | null>(layout)\n\n if (layout !== prevLayout) {\n setPrevLayout(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 const latestPointerRef = useLatestPointer(activeId)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPane(paneId), [renderPane])\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\n const ae = event.activatorEvent\n latestPointerRef.current = getPointerCoordinates(ae)\n\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 onDismissIntentChange?.(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 (latestPointerRef.current) {\n px = latestPointerRef.current.x\n py = latestPointerRef.current.y\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n py = coords.y + 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 onDismissIntentChange?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(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 onDismissIntentChange?.(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 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(\n (newLayout: TreeNode | null) => {\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [onChange],\n )\n\n const handleRemovePane = useCallback(\n (paneId: string) => {\n const newLayout = removePane(localLayout, paneId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleAddPane = useCallback(\n (paneId: string) => {\n const newLayout = addPane(localLayout, paneId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleSwapPanes = useCallback(\n (paneIdA: string, paneIdB: string) => {\n const newLayout = swapPanes(localLayout, paneIdA, paneIdB)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\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(localLayout, paneToAdd) ?? {\n type: 'pane',\n paneId: paneToAdd,\n }\n const treeWithoutDragging = removePane(localLayout, paneToAdd)\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n splitType,\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n const newLayout = updateSplitPercentage(localLayout, currentNode, percentage)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\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(localLayout, paneId, updater)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n const finalLayout = updateSplitPercentage(localLayout, currentNode, percentage)\n setLocalLayout(finalLayout)\n onChange(finalLayout)\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [localLayout, onChange, onResizeEnd],\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 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 minSplitPercentage,\n maxSplitPercentage,\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 <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.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 </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","/**\n * Shared drag-session lifecycle utility.\n *\n * Handles the common boilerplate for pointer-based resize operations:\n * - Adds `zeugma-resizing` class to `document.body`\n * - Injects a global `cursor` style so the resize cursor stays active\n * even when the pointer leaves the handle element\n * - Sets `data-resizing` on the resizer element\n * - Attaches `pointermove` / `pointerup` listeners to `document`\n * - Cleans everything up on pointer-up\n *\n * Consumers provide domain-specific `onMove` and `onEnd` callbacks.\n */\n\nexport interface DragSessionConfig {\n /** CSS cursor to enforce globally during the drag */\n cursor: 'col-resize' | 'row-resize'\n /** The resizer DOM element (receives `data-resizing` attribute) */\n resizerEl: HTMLElement\n /** Called on every `pointermove` during the drag */\n onMove: (e: PointerEvent) => void\n /** Called once on `pointerup` — after cleanup has already run */\n onEnd: () => void\n}\n\nexport function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void {\n // 1. Body class\n document.body.classList.add('zeugma-resizing')\n\n // 2. Global cursor override\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${cursor} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n // 3. Mark the resizer element\n resizerEl.setAttribute('data-resizing', 'true')\n\n // 4. Document-level listeners\n const handlePointerMove = (e: PointerEvent) => {\n onMove(e)\n }\n\n const handlePointerUp = () => {\n // Cleanup\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 // Notify consumer\n onEnd()\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\nimport { useZeugmaState } from '../../../entities/zeugma'\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 parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\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 parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\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 const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\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 createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n 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 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update React layout state live on every move event\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n onLayoutChange(newLayout)\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\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 parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState } from '../../../entities/zeugma'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../../shared/model'\n\nexport interface PaneTreeProps {\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\ninterface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\ninterface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nfunction computeLayout(\n node: TreeNode,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.paneId, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, onLayoutChange, classNames } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(${left}% - ${resizerSize / 2}px)`,\n top: `${top}%`,\n width: `${resizerSize}px`,\n height: `${height}%`,\n cursor: 'col-resize',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `${left}%`,\n top: `calc(${top}% - ${resizerSize / 2}px)`,\n width: `${width}%`,\n height: `${resizerSize}px`,\n cursor: 'row-resize',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={`zeugma-resizer ${classNames.resizer || ''}`.trim()}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `${pane.left}%`,\n top: isFullscreen ? '0%' : `${pane.top}%`,\n width: isFullscreen ? '100%' : `${pane.width}%`,\n height: isFullscreen ? '100%' : `${pane.height}%`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n {renderPane(pane.paneId)}\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\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\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n return (\n <div\n ref={handleRef}\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 </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={`zeugma-resizable-container disabled ${className || ''}`.trim()}\n style={{\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ height: '100%', overflow: 'hidden' }}>{children}</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={`zeugma-resizable-container ${className || ''}`.trim()}\n style={{\n height: `${effectiveHeight}px`,\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n {/* Content area fills entire container minus the resizer */}\n <div\n style={{\n height: `calc(100% - ${resizerHeight}px)`,\n overflow: 'hidden',\n }}\n >\n {children}\n </div>\n\n {/* Resizer handle */}\n <div\n className={`zeugma-resizable-handle ${resizerClassName || ''}`.trim()}\n style={{\n height: `${resizerHeight}px`,\n cursor: '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-orientation=\"horizontal\"\n aria-valuenow={Math.round(effectiveHeight)}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight === Infinity ? undefined : maxHeight}\n />\n </div>\n )\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n if (typeof window === 'undefined' || !node) {\n return null\n }\n\n const parent = node.parentElement\n if (!parent) {\n return document.documentElement\n }\n\n const style = window.getComputedStyle(parent)\n const overflowY = style.overflowY\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll'\n\n if (isScrollable) {\n return parent\n }\n\n return getScrollParent(parent)\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 { useZeugmaState, useZeugmaActions } from '../../zeugma'\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\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style }) => {\n const { layout, activeId, classNames, fullscreenPaneId, onRemove, onFullscreenChange } =\n useZeugmaState()\n const { removePane, updatePaneMetadata } = useZeugmaActions()\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\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\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/zeugma/model/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/ui/Zeugma.tsx","../src/shared/lib/drag-session.ts","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/widgets/resizable-container/ui/ResizableContainer.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx"],"names":["ZeugmaStateContext","createContext","ZeugmaActionsContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","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","paneId","updatePaneMetadata","updater","newMetadata","_","rest","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","render","className","ref","handleMove","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","Zeugma","layout","onChange","renderPane","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onDismissIntentChange","children","localLayout","setLocalLayout","useState","prevLayout","setPrevLayout","setActiveId","dismissIntentId","setDismissIntentId","containerRef","containerRectRef","setContainerRef","useCallback","element","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","draggingId","ae","handleDragMove","containerRect","px","py","coords","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDismissIntent","handleRemovePane","overIdStr","swapMatch","newLayout","match","dropZone","draggedPaneNode","treeWithoutDragging","handleLocalLayoutChange","localOnly","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleResizeEnd","stateValue","actionsValue","jsxs","DndContext","pointerWithin","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","el","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","finalLayout","computeLayout","left","top","width","height","path","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","Fragment","pane","isFullscreen","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Pane","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext } from 'react'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\n","import { useContext, useEffect, useRef } from 'react'\nimport { ZeugmaStateContext, ZeugmaActionsContext } from './context'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const useZeugmaState = (): ZeugmaStateValue => {\n const state = useContext(ZeugmaStateContext)\n if (!state) {\n throw new Error('useZeugmaState must be used within a Zeugma provider')\n }\n return state\n}\n\nexport const useZeugmaActions = (): ZeugmaActionsValue => {\n const actions = useContext(ZeugmaActionsContext)\n if (!actions) {\n throw new Error('useZeugmaActions must be used within a Zeugma provider')\n }\n return actions\n}\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\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 * 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, { useEffect, useRef, ReactNode } from 'react'\n\nexport const 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","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class 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\nexport class 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","import React, { useState, useRef, useMemo, useCallback } from 'react'\nimport {\n DndContext,\n useSensor,\n useSensors,\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 updatePaneMetadata,\n findPane,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport { ZeugmaStateContext, ZeugmaActionsContext, useLatestPointer } from '../model'\nimport { ZeugmaProps } from '../model/types'\nimport { CursorOverlay } from './CursorOverlay'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\nexport const Zeugma: React.FC<ZeugmaProps> = ({\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 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 [prevLayout, setPrevLayout] = useState<TreeNode | null>(layout)\n\n if (layout !== prevLayout) {\n setPrevLayout(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 const latestPointerRef = useLatestPointer(activeId)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPane(paneId), [renderPane])\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\n const ae = event.activatorEvent\n latestPointerRef.current = getPointerCoordinates(ae)\n\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 onDismissIntentChange?.(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 (latestPointerRef.current) {\n px = latestPointerRef.current.x\n py = latestPointerRef.current.y\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n py = coords.y + 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 onDismissIntentChange?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(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 onDismissIntentChange?.(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 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(\n (newLayout: TreeNode | null, localOnly = false) => {\n setLocalLayout(newLayout)\n if (!localOnly) {\n onChange(newLayout)\n }\n },\n [onChange],\n )\n\n const handleRemovePane = useCallback(\n (paneId: string) => {\n const newLayout = removePane(localLayout, paneId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleAddPane = useCallback(\n (paneId: string) => {\n const newLayout = addPane(localLayout, paneId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleSwapPanes = useCallback(\n (paneIdA: string, paneIdB: string) => {\n const newLayout = swapPanes(localLayout, paneIdA, paneIdB)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\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(localLayout, paneToAdd) ?? {\n type: 'pane',\n paneId: paneToAdd,\n }\n const treeWithoutDragging = removePane(localLayout, paneToAdd)\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n splitType,\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n const newLayout = updateSplitPercentage(localLayout, currentNode, percentage)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\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(localLayout, paneId, updater)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\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 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 minSplitPercentage,\n maxSplitPercentage,\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 <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.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 </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","/**\n * Shared drag-session lifecycle utility.\n *\n * Handles the common boilerplate for pointer-based resize operations:\n * - Adds `zeugma-resizing` class to `document.body`\n * - Injects a global `cursor` style so the resize cursor stays active\n * even when the pointer leaves the handle element\n * - Sets `data-resizing` on the resizer element\n * - Attaches `pointermove` / `pointerup` listeners to `document`\n * - Cleans everything up on pointer-up\n *\n * Consumers provide domain-specific `onMove` and `onEnd` callbacks.\n */\n\nexport interface DragSessionConfig {\n /** CSS cursor to enforce globally during the drag */\n cursor: 'col-resize' | 'row-resize'\n /** The resizer DOM element (receives `data-resizing` attribute) */\n resizerEl: HTMLElement\n /** Called on every `pointermove` during the drag */\n onMove: (e: PointerEvent) => void\n /** Called once on `pointerup` — after cleanup has already run */\n onEnd: () => void\n}\n\nexport function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void {\n // 1. Body class\n document.body.classList.add('zeugma-resizing')\n\n // 2. Global cursor override\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${cursor} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n // 3. Mark the resizer element\n resizerEl.setAttribute('data-resizing', 'true')\n\n // 4. Document-level listeners\n const handlePointerMove = (e: PointerEvent) => {\n onMove(e)\n }\n\n const handlePointerUp = () => {\n // Cleanup\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 // Notify consumer\n onEnd()\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\nimport { useZeugmaState } from '../../../entities/zeugma'\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, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\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 parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\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 const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\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 createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n 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 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update React layout state live on every move event\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n onLayoutChange(newLayout, true)\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\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 parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState } from '../../../entities/zeugma'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../../shared/model'\n\nexport interface PaneTreeProps {\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\ninterface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\ninterface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nfunction computeLayout(\n node: TreeNode,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.paneId, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, onLayoutChange, classNames } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(${left}% - ${resizerSize / 2}px)`,\n top: `${top}%`,\n width: `${resizerSize}px`,\n height: `${height}%`,\n cursor: 'col-resize',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `${left}%`,\n top: `calc(${top}% - ${resizerSize / 2}px)`,\n width: `${width}%`,\n height: `${resizerSize}px`,\n cursor: 'row-resize',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={`zeugma-resizer ${classNames.resizer || ''}`.trim()}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `${pane.left}%`,\n top: isFullscreen ? '0%' : `${pane.top}%`,\n width: isFullscreen ? '100%' : `${pane.width}%`,\n height: isFullscreen ? '100%' : `${pane.height}%`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n {renderPane(pane.paneId)}\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\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\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n return (\n <div\n ref={handleRef}\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 </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={`zeugma-resizable-container disabled ${className || ''}`.trim()}\n style={{\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ height: '100%', overflow: 'hidden' }}>{children}</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={`zeugma-resizable-container ${className || ''}`.trim()}\n style={{\n height: `${effectiveHeight}px`,\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n {/* Content area fills entire container minus the resizer */}\n <div\n style={{\n height: `calc(100% - ${resizerHeight}px)`,\n overflow: 'hidden',\n }}\n >\n {children}\n </div>\n\n {/* Resizer handle */}\n <div\n className={`zeugma-resizable-handle ${resizerClassName || ''}`.trim()}\n style={{\n height: `${resizerHeight}px`,\n cursor: '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-orientation=\"horizontal\"\n aria-valuenow={Math.round(effectiveHeight)}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight === Infinity ? undefined : maxHeight}\n />\n </div>\n )\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n if (typeof window === 'undefined' || !node) {\n return null\n }\n\n const parent = node.parentElement\n if (!parent) {\n return document.documentElement\n }\n\n const style = window.getComputedStyle(parent)\n const overflowY = style.overflowY\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll'\n\n if (isScrollable) {\n return parent\n }\n\n return getScrollParent(parent)\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 { useZeugmaState, useZeugmaActions } from '../../zeugma'\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\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style }) => {\n const { layout, activeId, classNames, fullscreenPaneId, onRemove, onFullscreenChange } =\n useZeugmaState()\n const { removePane, updatePaneMetadata } = useZeugmaActions()\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\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\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"]}
|