react-zeugma 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -28
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -5
- package/dist/index.d.ts +1 -5
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {createContext,useContext,useState,useRef,useCallback,useMemo,useEffect}from'react';import {useSensors,useSensor,DndContext,pointerWithin,useDraggable,PointerSensor,TouchSensor,useDroppable}from'@dnd-kit/core';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var
|
|
1
|
+
import {createContext,useContext,useState,useRef,useCallback,useMemo,useEffect}from'react';import {useSensors,useSensor,DndContext,pointerWithin,useDraggable,PointerSensor,TouchSensor,useDroppable}from'@dnd-kit/core';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var re=createContext(void 0),ie=createContext(void 0);var B=()=>{let e=useContext(re);if(!e)throw new Error("useZeugmaState must be used within a Zeugma provider");return e},he=()=>{let e=useContext(ie);if(!e)throw new Error("useZeugmaActions must be used within a Zeugma provider");return e};function Q(e,t){if(e===null)return null;if(e.type==="pane")return e.paneId===t?null:e;let n=Q(e.first,t),r=Q(e.second,t);return n===null?r:r===null?n:{...e,first:n,second:r}}function ne(e,t,n,r,o){if(e===null)return typeof o=="string"?{type:"pane",paneId:o}:o;if(e.type==="pane"){if(e.paneId===t){let i=typeof o=="string"?{type:"pane",paneId:o}:o,u=r==="left"||r==="top";return {type:"split",direction:n,first:u?i:e,second:u?e:i,splitPercentage:50}}return e}return {...e,first:ne(e.first,t,n,r,o)||e.first,second:ne(e.second,t,n,r,o)||e.second}}function be(e,t,n){if(e===null)return null;let r=k(e,t),o=k(e,n);if(!r||!o)return e;function i(u){return u.type==="pane"?u.paneId===t?{...o}:u.paneId===n?{...r}:u:{...u,first:i(u.first),second:i(u.second)}}return i(e)}function He(e,t){if(e===null)return {type:"pane",paneId:t};function n(r,o){return r.type==="pane"?{type:"split",direction:o==="row"?"column":"row",splitPercentage:50,first:r,second:{type:"pane",paneId:t}}:{...r,second:n(r.second,r.direction)}}return n(e,null)}function G(e,t,n){return e===null?null:e===t?{...e,splitPercentage:n}:e.type==="split"?{...e,first:G(e.first,t,n)||e.first,second:G(e.second,t,n)||e.second}:e}function k(e,t){return e===null?null:e.type==="pane"?e.paneId===t?e:null:k(e.first,t)??k(e.second,t)}function se(e,t,n){if(e===null)return null;if(e.type==="pane"){if(e.paneId===t){let r=n(e.metadata);if(r===void 0){let{metadata:o,...i}=e;return i}return {...e,metadata:r}}return e}return {...e,first:se(e.first,t,n)??e.first,second:se(e.second,t,n)??e.second}}var Ge=8,Ke=8,Mt=4;var $e=({activeId:e,render:t,className:n})=>{let r=useRef(null);return useEffect(()=>{let o=i=>{r.current&&(r.current.style.transform=`translate(${i.clientX+12}px, ${i.clientY+12}px)`);};return document.addEventListener("pointermove",o),()=>document.removeEventListener("pointermove",o)},[]),jsx("div",{ref:r,className:n,style:{position:"fixed",top:0,left:0,zIndex:9999,pointerEvents:"none"},children:t(e)})};var ae=class extends PointerSensor{static activators=[{eventName:"onPointerDown",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]},le=class extends TouchSensor{static activators=[{eventName:"onTouchStart",handler:({nativeEvent:t})=>!t.target?.closest(".drag-cancel")}]};var it=({layout:e,onChange:t,renderPane:n,renderDragOverlay:r,classNames:o={},fullscreenPaneId:i=null,onFullscreenChange:u,onRemove:p,dragActivationDistance:y=8,snapThreshold:S=8,onDragStart:E,onDragEnd:s,onResizeStart:b,onResize:P,onResizeEnd:L,minSplitPercentage:z=5,maxSplitPercentage:N=95,enableDragToDismiss:w=false,dismissThreshold:R=60,onDismissIntentChange:H,children:D})=>{let[c,m]=useState(e),[j,ee]=useState(e);e!==j&&(ee(e),m(e));let[h,T]=useState(null),[v,C]=useState(null),O=useRef(null),F=useRef(null),g=useCallback(l=>{O.current=l;},[]),I=useCallback(l=>n(l),[n]),Z=useMemo(()=>o,[o.pane,o.dropPreview,o.swapPreview,o.dragOverlay,o.resizer,o.dismissPreview]),_=useSensors(useSensor(ae,{activationConstraint:{distance:y}}),useSensor(le,{activationConstraint:{delay:250,tolerance:5}})),X=l=>{let f=l.active.id.toString();T(f),w&&O.current?F.current=O.current.getBoundingClientRect():F.current=null,E&&E(f);},q=l=>{if(!w)return;let f=l.active.id.toString(),a=F.current;if(!a){v!==null&&(C(null),H?.(null));return}let d=l.activatorEvent,$=null,A=null;if(d instanceof MouseEvent||d instanceof PointerEvent)$=d.clientX+l.delta.x,A=d.clientY+l.delta.y;else if(typeof TouchEvent<"u"&&d instanceof TouchEvent){let x=d.touches[0]||d.changedTouches[0];x&&($=x.clientX+l.delta.x,A=x.clientY+l.delta.y);}let Y=0;if($!==null&&A!==null){let x=0,M=0;$<a.left?x=a.left-$:$>a.right&&(x=$-a.right),A<a.top?M=a.top-A:A>a.bottom&&(M=A-a.bottom),Y=Math.sqrt(x*x+M*M);}else {let x=l.active.rect.current.translated;if(x){let M=x.left+x.width/2,W=x.top+x.height/2,K=0,J=0;M<a.left?K=a.left-M:M>a.right&&(K=M-a.right),W<a.top?J=a.top-W:W>a.bottom&&(J=W-a.bottom),Y=Math.sqrt(K*K+J*J);}}Y>R?v!==f&&(C(f),H?.(f)):v!==null&&(C(null),H?.(null));},te=l=>{T(null);let{active:f,over:a}=l,d=f.id.toString(),$=w&&v===d;if(C(null),H?.(null),F.current=null,$){p?p(d):me(d),s&&s(d,null,null);return}if(!a){s&&s(d,null,null);return}let A=a.id.toString(),Y=A.match(/^drop-center-(.+)$/);if(Y){let[,ve]=Y;if(d!==ve){let Me=be(c,d,ve);m(Me),t(Me);}s&&s(d,ve,{type:"swap",position:"center"});return}let ge=A.match(/^drop-(left|right|top|bottom)-(.+)$/);if(!ge){s&&s(d,null,null);return}let[,x,M]=ge;if(d===M){s&&s(d,null,null);return}let W=x==="left"||x==="right"?"row":"column",K=k(c,d)??{type:"pane",paneId:d},J=Q(c,d),Ce=ne(J,M,W,x,K);m(Ce),t(Ce),s&&s(d,M,{type:"split",direction:W,position:x});},Ee=useCallback(l=>{m(l),t(l);},[t]),me=useCallback(l=>{let f=Q(c,l);m(f),t(f);},[c,t]),Ne=useCallback(l=>{let f=He(c,l);m(f),t(f);},[c,t]),ze=useCallback((l,f)=>{let a=be(c,l,f);m(a),t(a);},[c,t]),De=useCallback((l,f,a,d)=>{let $=k(c,d)??{type:"pane",paneId:d},A=Q(c,d),Y=ne(A,l,f,a,$);m(Y),t(Y);},[c,t]),Te=useCallback((l,f)=>{let a=G(c,l,f);m(a),t(a);},[c,t]),Ie=useCallback((l,f)=>{let a=se(c,l,f);m(a),t(a);},[c,t]),Le=useCallback((l,f)=>{let a=G(c,l,f);m(a),t(a),L&&L(l,f);},[c,t,L]),qe=useMemo(()=>({layout:c,onLayoutChange:Ee,renderPane:I,activeId:h,dismissIntentId:v,setContainerRef:g,fullscreenPaneId:i,classNames:Z,onRemove:p,onFullscreenChange:u,snapThreshold:S,onResizeStart:b,onResize:P,onResizeEnd:Le,minSplitPercentage:z,maxSplitPercentage:N}),[c,h,v,g,i,Z,p,u,S,b,P,z,N,Ee,I,Le]),We=useMemo(()=>({removePane:me,addPane:Ne,swapPanes:ze,splitPane:De,updateSplitPercentage:Te,updatePaneMetadata:Ie}),[me,Ne,ze,De,Te,Ie]);return jsx(ie.Provider,{value:We,children:jsxs(re.Provider,{value:qe,children:[jsx(DndContext,{id:"zeugma-dnd-context",sensors:_,collisionDetection:pointerWithin,onDragStart:X,onDragMove:q,onDragEnd:te,children:D}),h&&r&&jsx($e,{activeId:h,render:r,className:`${o.dragOverlay||""} ${h===v?o.dismissPreview||"zeugma-dismiss-preview":""}`.trim()})]})})};function ue({cursor:e,resizerEl:t,onMove:n,onEnd:r}){document.body.classList.add("zeugma-resizing");let o=document.createElement("style");o.id="zeugma-global-cursor-style",o.textContent=`
|
|
2
2
|
* {
|
|
3
3
|
cursor: ${e} !important;
|
|
4
4
|
user-select: none !important;
|
|
5
5
|
}
|
|
6
|
-
`,document.head.appendChild(o),t.setAttribute("data-resizing","true");let i=
|
|
6
|
+
`,document.head.appendChild(o),t.setAttribute("data-resizing","true");let i=p=>{n(p);},u=()=>{document.body.classList.remove("zeugma-resizing"),t.removeAttribute("data-resizing");let p=document.getElementById("zeugma-global-cursor-style");p&&p.remove(),document.removeEventListener("pointermove",i),document.removeEventListener("pointerup",u),r();};document.addEventListener("pointermove",i),document.addEventListener("pointerup",u);}function Se({containerRef:e,isRow:t,direction:n,splitPercentage:r,resizerSize:o,snapThreshold:i,layout:u,currentNode:p,onLayoutChange:y,onResizeStart:S,onResizeEnd:E}){let{onResizeStart:s,onResize:b,onResizeEnd:P,minSplitPercentage:L=5,maxSplitPercentage:z=95}=B();return useCallback(N=>{N.preventDefault();let w=e.current;if(!w)return;S&&S(),s&&s(p);let R=w.getBoundingClientRect(),H=N.clientX,D=N.clientY,c=r,m=N.currentTarget,ee=Array.from(document.querySelectorAll('div[role="separator"][data-direction]')).filter(T=>T!==m&&T.getAttribute("data-direction")===n).map(T=>{let v=T.getBoundingClientRect();return t?v.left+v.width/2:v.top+v.height/2}),h=c;ue({cursor:t?"col-resize":"row-resize",resizerEl:m,onMove:T=>{let v=t?(T.clientX-H)/R.width*100:(T.clientY-D)/R.height*100,C=c+v,O=t?R.left+(R.width-o)*(C/100)+o/2:R.top+(R.height-o)*(C/100)+o/2,F=1/0,g=null;for(let q of ee){let te=Math.abs(O-q);te<i&&te<F&&(F=te,g=q);}let I=C;g!==null&&(I=t?(g-o/2-R.left)/(R.width-o)*100:(g-o/2-R.top)/(R.height-o)*100);let Z=Math.max(L,Math.min(z,I));h=Z;let _=w.children[0],X=w.children[w.children.length-1];_&&X&&(_.style.flex=`${Z} 1 0%`,X.style.flex=`${100-Z} 1 0%`),b&&b(p,Z);},onEnd:()=>{let T=G(u,p,h);y(T),E&&E(),P&&P(p,h);}});},[e,t,n,r,o,i,u,p,y,S,E,s,b,P,L,z])}var ut=({currentNode:e,resizerSize:t,snapThreshold:n})=>{let{layout:r,onLayoutChange:o,classNames:i}=B(),[u,p]=useState(false),y=useRef(null),{direction:S,first:E,second:s,splitPercentage:b}=e,P=S==="row",L=Se({containerRef:y,isRow:P,direction:S,splitPercentage:b,resizerSize:t,snapThreshold:n??8,layout:r,currentNode:e,onLayoutChange:o,onResizeStart:()=>p(true),onResizeEnd:()=>p(false)});return jsxs("div",{ref:y,style:{display:"flex",flexDirection:P?"row":"column",width:"100%",height:"100%",overflow:"hidden"},children:[jsx("div",{style:{flex:`${b} 1 0%`,overflow:"hidden"},children:jsx(ye,{tree:E,resizerSize:t,snapThreshold:n})}),jsx("div",{className:`zeugma-resizer ${i.resizer||""}`.trim(),"data-direction":S,"data-resizing":u||void 0,style:{width:P?`${t}px`:"100%",height:P?"100%":`${t}px`,cursor:P?"col-resize":"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:L,role:"separator","aria-valuenow":b,"aria-valuemin":5,"aria-valuemax":95}),jsx("div",{style:{flex:`${100-b} 1 0%`,overflow:"hidden"},children:jsx(ye,{tree:s,resizerSize:t,snapThreshold:n})})]})},ye=({tree:e,resizerSize:t=4,snapThreshold:n})=>{let{layout:r,renderPane:o,activeId:i,dismissIntentId:u,setContainerRef:p,fullscreenPaneId:y,snapThreshold:S}=B(),E=n!==void 0?n:S;if(y&&!e)return jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:o(y)});let s=e!==void 0?e:r;if(!s)return null;let b=()=>s.type==="pane"?jsx("div",{style:{width:"100%",height:"100%",position:"relative"},children:o(s.paneId)}):jsx(ut,{currentNode:s,resizerSize:t,snapThreshold:E});return e===void 0?jsx("div",{ref:p,className:`zeugma-dashboard-root ${i!==null&&i===u?"zeugma-dashboard-dismiss-active":""}`.trim(),style:{position:"relative",width:"100%",height:"100%",overflow:"hidden"},children:b()}):b()};var Ue="zeugma-height:",mt="default-pane";function gt(e){try{let t=localStorage.getItem(Ue+e);if(t!==null){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}}catch{}return null}function ke(e,t){try{localStorage.setItem(Ue+e,String(Math.round(t)));}catch{}}var Oe=({children:e,active:t=true,height:n,onHeightChange:r,minHeight:o=100,maxHeight:i=1/0,persist:u,localStorageKey:p,resizerHeight:y=6,className:S,resizerClassName:E})=>{let s=u?p||mt:null,b=()=>{let D=(s?gt(s):null)??n??400;return de(D,o,i)},[P,L]=useState(b),z=useRef(null),N=s?P:n??P,w=useRef(n);useEffect(()=>{if(n!==void 0&&n!==w.current){let D=de(n,o,i);L(D),s&&ke(s,D);}w.current=n;},[n,o,i,s]);let R=useCallback(()=>i,[i]),H=useCallback(D=>{D.preventDefault();let c=D.clientY,m=N,j=R(),ee=D.currentTarget,h=Xe(z.current),T=h?h.scrollTop:0,v=c,C=null,O=(g,I)=>{let Z=I-T,X=g-c+Z,q=de(m+X,o,j);return z.current&&(z.current.style.height=`${q}px`),q},F=()=>{if(!h)return;let g=h===document.documentElement||h===document.body?{top:0,bottom:window.innerHeight}:h.getBoundingClientRect(),I=40,Z=10,_=0;v>g.bottom-I?_=Math.min(1,(v-(g.bottom-I))/I)*Z:v<g.top+I&&(_=-Math.min(1,(g.top+I-v)/I)*Z),_!==0&&(h.scrollTop+=_,O(v,h.scrollTop)),C=requestAnimationFrame(F);};C=requestAnimationFrame(F),ue({cursor:"row-resize",resizerEl:ee,onMove:g=>{v=g.clientY,h&&O(v,h.scrollTop);},onEnd:()=>{C!==null&&cancelAnimationFrame(C);let g=m;z.current&&(g=z.current.getBoundingClientRect().height),g=de(g,o,j),L(g),r&&r(g),s&&ke(s,g);}});},[N,o,R,r,s]);return t?jsxs("div",{ref:z,className:`zeugma-resizable-container ${S||""}`.trim(),style:{height:`${N}px`,position:"relative",overflow:"hidden",boxSizing:"border-box"},children:[jsx("div",{style:{height:`calc(100% - ${y}px)`,overflow:"hidden"},children:e}),jsx("div",{className:`zeugma-resizable-handle ${E||""}`.trim(),style:{height:`${y}px`,cursor:"row-resize",position:"relative",zIndex:10,userSelect:"none",touchAction:"none",boxSizing:"border-box",flexShrink:0},onPointerDown:H,role:"separator","aria-orientation":"horizontal","aria-valuenow":Math.round(N),"aria-valuemin":o,"aria-valuemax":i===1/0?void 0:i})]}):jsx("div",{className:`zeugma-resizable-container disabled ${S||""}`.trim(),style:{height:"100%",position:"relative",overflow:"hidden",boxSizing:"border-box"},children:jsx("div",{style:{height:"100%",overflow:"hidden"},children:e})})};function de(e,t,n){return Math.max(t,Math.min(n,e))}function Xe(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:Xe(t)}var fe=createContext(null);var xt={top:{position:"absolute",top:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},bottom:{position:"absolute",bottom:0,left:"25%",width:"50%",height:"25%",zIndex:20,pointerEvents:"auto"},left:{position:"absolute",top:"25%",left:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},right:{position:"absolute",top:"25%",right:0,width:"25%",height:"50%",zIndex:20,pointerEvents:"auto"},center:{position:"absolute",top:"25%",left:"25%",width:"50%",height:"50%",zIndex:20,pointerEvents:"auto"}},St={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"}},Be=({id:e,position:t,activeClassName:n})=>{let{setNodeRef:r,isOver:o}=useDroppable({id:e});return jsxs(Fragment,{children:[jsx("div",{ref:r,style:xt[t]}),o&&jsx("div",{className:n,style:St[t]})]})},yt=({id:e,children:t,style:n})=>{let{layout:r,activeId:o,classNames:i,fullscreenPaneId:u,onRemove:p,onFullscreenChange:y}=B(),{removePane:S,updatePaneMetadata:E}=he(),s=o!==null&&o!==e,{attributes:b,listeners:P,setNodeRef:L,isDragging:z}=useDraggable({id:e}),N=o===e||z,w=u===e,H=useMemo(()=>k(r,e),[r,e])?.metadata,D=useMemo(()=>({isDragging:N,isFullscreen:w,toggleFullscreen:()=>y?.(w?null:e),remove:()=>{w&&y?.(null),p?p(e):S(e);},metadata:H,updateMetadata:m=>{E(e,m);}}),[N,w,y,e,p,S,H,E]),c=useMemo(()=>({...P,...b}),[P,b]);return jsx(fe.Provider,{value:c,children:jsxs("div",{ref:L,className:i.pane,style:{position:"relative",width:"100%",height:"100%",...n},children:[t(D),s&&jsxs("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:15,pointerEvents:"none"},children:[["top","bottom","left","right"].map(m=>jsx(Be,{id:`drop-${m}-${e}`,position:m,activeClassName:i.dropPreview},m)),jsx(Be,{id:`drop-center-${e}`,position:"center",activeClassName:i.swapPreview})]})]})})};var Et=({children:e,className:t,style:n})=>{let r=useContext(fe);if(!r)throw new Error("<DragHandle> must be used inside a <Pane>");return jsx("div",{className:t,style:{cursor:"grab",userSelect:"none",touchAction:"none",...n},...r,children:e})};export{Ke as DEFAULT_DRAG_ACTIVATION_DISTANCE,Mt as DEFAULT_RESIZER_SIZE,Ge as DEFAULT_SNAP_THRESHOLD,Et as DragHandle,yt as Pane,ye as PaneTree,Oe as ResizableContainer,it as Zeugma,He as addPane,ue as createDragSession,k as findPane,Q as removePane,ne as splitPane,be as swapPanes,se as updatePaneMetadata,G as updateSplitPercentage,Se as useResizer,he as useZeugmaActions,B as useZeugmaState};//# sourceMappingURL=index.js.map
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.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/entities/zeugma/ui/RootDropZone.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","removePane","tree","idToRemove","newFirst","newSecond","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","swapPanes","idA","idB","nodeA","findPane","nodeB","swap","node","addPane","insert","parentDirection","updateSplitPercentage","target","newPercentage","splitRoot","draggingId","draggedPaneNode","treeWithoutDragging","draggedNode","paneId","updatePaneMetadata","updater","newMetadata","_","rest","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","activeId","render","className","ref","useRef","useEffect","handleMove","e","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","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","handleDragMove","containerRect","ae","px","py","touch","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDismissIntent","handleRemovePane","overIdStr","rootMatch","dropZone","newLayout","swapMatch","match","handleLocalLayoutChange","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleResizeEnd","finalLayout","stateValue","actionsValue","jsxs","DndContext","pointerWithin","rootActivationPositions","rootPreviewPositions","RootDropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Fragment","RootDropZones","hasOtherPanes","dropPreviewClassName","pos","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerMove","handlePointerUp","globalStyle","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","rect","startX","startY","startPercentage","otherPositions","el","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","dist","snappedPercentage","finalPercentage","firstChild","secondChild","PaneSplit","isResizing","setIsResizing","first","second","handlePointerDown","PaneTree","propSnapThreshold","contextSnapThreshold","renderContent","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","height","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","Pane","style","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","isFullscreen","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext } 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 } 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","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\n\n/**\n * Tree Helper: Remove a pane and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, idToRemove: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === idToRemove ? null : tree\n }\n const newFirst = removePane(tree.first, idToRemove)\n const newSecond = removePane(tree.second, idToRemove)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n return typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.paneId === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Swap the position of two panes in the tree structure.\n */\nexport function swapPanes(tree: TreeNode | null, idA: string, idB: string): TreeNode | null {\n if (tree === null) return null\n\n // First pass: collect the full PaneNode references\n const nodeA = findPane(tree, idA)\n const nodeB = findPane(tree, idB)\n if (!nodeA || !nodeB) return tree\n\n // Second pass: replace each location with the other node\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.paneId === idA) return { ...nodeB! }\n if (node.paneId === idB) return { ...nodeA! }\n return node\n }\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', paneId: paneToAdd }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: { type: 'pane', paneId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Split the entire tree at the root using a dragged pane.\n */\nexport function splitRoot(\n tree: TreeNode | null,\n draggingId: string,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n): TreeNode | null {\n // Preserve dragged pane's metadata\n const draggedPaneNode: PaneNode = findPane(tree, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(tree, draggingId)\n if (treeWithoutDragging === null) {\n return { ...draggedPaneNode }\n }\n\n const direction: SplitDirection = splitType === 'left' || splitType === 'right' ? 'row' : 'column'\n const isFirst = splitType === 'left' || splitType === 'top'\n const draggedNode: TreeNode = { ...draggedPaneNode }\n\n return {\n type: 'split',\n direction,\n first: isFirst ? draggedNode : treeWithoutDragging,\n second: isFirst ? treeWithoutDragging : draggedNode,\n splitPercentage: 50,\n }\n}\n\n/**\n * Find a PaneNode by its paneId.\n */\nexport function findPane(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === paneId ? tree : null\n }\n return findPane(tree.first, paneId) ?? findPane(tree.second, paneId)\n}\n\n/**\n * Update metadata on a specific pane node using an updater function.\n */\nexport function updatePaneMetadata(\n tree: TreeNode | null,\n paneId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.paneId === paneId) {\n const newMetadata = updater(tree.metadata)\n if (newMetadata === undefined) {\n // Remove metadata key\n const { metadata: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, metadata: newMetadata }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneMetadata(tree.first, paneId, updater) ?? tree.first,\n second: updatePaneMetadata(tree.second, paneId, updater) ?? tree.second,\n }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import React, { 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 splitRoot,\n updatePaneMetadata,\n findPane,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport { ZeugmaStateContext, ZeugmaActionsContext } from '../model/context'\nimport { ZeugmaProps } from '../model/types'\nimport { CursorOverlay } from './CursorOverlay'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\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\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 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 (ae instanceof MouseEvent || ae instanceof PointerEvent) {\n px = ae.clientX + event.delta.x\n py = ae.clientY + event.delta.y\n } else if (typeof TouchEvent !== 'undefined' && ae instanceof TouchEvent) {\n const touch = ae.touches[0] || ae.changedTouches[0]\n if (touch) {\n px = touch.clientX + event.delta.x\n py = touch.clientY + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n 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 root drop (places pane like half of the root)\n const rootMatch = overIdStr.match(/^drop-root-(left|right|top|bottom)$/)\n if (rootMatch) {\n const [, dropZone] = rootMatch\n const newLayout = splitRoot(\n localLayout,\n draggingId,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n\n if (onDragEnd) {\n const direction: SplitDirection =\n dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n return\n }\n\n // Check for center (swap) drop\n const swapMatch = overIdStr.match(/^drop-center-(.+)$/)\n if (swapMatch) {\n const [, targetId] = swapMatch\n if (draggingId !== targetId) {\n const newLayout = swapPanes(localLayout, draggingId, targetId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, { type: 'swap', position: 'center' })\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n if (draggingId === targetId) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n const draggedPaneNode = findPane(localLayout, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(localLayout, draggingId)\n\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleLocalLayoutChange = useCallback(\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","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nconst rootActivationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '32px',\n zIndex: 30,\n pointerEvents: 'auto',\n },\n}\n\nconst rootPreviewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 31,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport interface RootDropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nexport const RootDropZone: React.FC<RootDropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={rootActivationPositions[position]} />\n {isOver && <div className={activeClassName} style={rootPreviewPositions[position]} />}\n </>\n )\n}\n\nexport interface RootDropZonesProps {\n activeId: string | null\n hasOtherPanes: boolean\n dropPreviewClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({\n activeId,\n hasOtherPanes,\n dropPreviewClassName,\n}) => {\n if (!activeId || !hasOtherPanes) return null\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 30,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <RootDropZone\n key={pos}\n id={`drop-root-${pos}`}\n position={pos}\n activeClassName={dropPreviewClassName}\n />\n ))}\n </div>\n )\n}\n","/**\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}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = 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 // 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) / rect.width) * 100\n : ((moveEvent.clientY - startY) / rect.height) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? rect.left + (rect.width - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n : rect.top + (rect.height - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - rect.left) / (rect.width - resizerSize)) * 100\n : ((bestTarget - resizerSize / 2 - rect.top) / (rect.height - resizerSize)) * 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Imperatively update the sibling pane container flex sizes during drag\n const firstChild = container.children[0] as HTMLElement\n const secondChild = container.children[container.children.length - 1] as HTMLElement\n if (firstChild && secondChild) {\n firstChild.style.flex = `${finalPercentage} 1 0%`\n secondChild.style.flex = `${100 - finalPercentage} 1 0%`\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n // Write to React state once resizing completes\n const newLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n onLayoutChange(newLayout)\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 ],\n )\n}\n","import React, { useRef, useState, useMemo } from 'react'\nimport { useZeugmaState, RootDropZones } from '../../../entities/zeugma'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode } from '../../../shared/model'\nimport { removePane } from '../../../shared'\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 PaneSplitProps {\n currentNode: SplitNode\n resizerSize: number\n snapThreshold?: number\n}\n\nconst PaneSplit: React.FC<PaneSplitProps> = ({ currentNode, resizerSize, snapThreshold }) => {\n const { layout, onLayoutChange, classNames } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const containerRef = useRef<HTMLDivElement>(null)\n const { direction, first, second, splitPercentage } = currentNode\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold: snapThreshold ?? 8,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n })\n\n return (\n <div\n ref={containerRef}\n style={{\n display: 'flex',\n flexDirection: isRow ? 'row' : 'column',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <div style={{ flex: `${splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree tree={first} resizerSize={resizerSize} snapThreshold={snapThreshold} />\n </div>\n <div\n className={`zeugma-resizer ${classNames.resizer || ''}`.trim()}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={{\n width: isRow ? `${resizerSize}px` : '100%',\n height: isRow ? '100%' : `${resizerSize}px`,\n cursor: isRow ? 'col-resize' : 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n <div style={{ flex: `${100 - splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree tree={second} resizerSize={resizerSize} snapThreshold={snapThreshold} />\n </div>\n </div>\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 classNames,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n } = useZeugmaState()\n\n const snapThreshold = propSnapThreshold !== undefined ? propSnapThreshold : contextSnapThreshold\n\n const hasOtherPanes = useMemo(() => {\n if (tree !== undefined || !activeId) return false\n return removePane(layout, activeId) !== null\n }, [tree, layout, activeId])\n\n // Fullscreen bypass\n if (fullscreenPaneId && !tree) {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(fullscreenPaneId)}\n </div>\n )\n }\n\n const currentNode = tree !== undefined ? tree : layout\n\n if (!currentNode) return null\n\n const renderContent = () => {\n if (currentNode.type === 'pane') {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(currentNode.paneId)}\n </div>\n )\n }\n\n return (\n <PaneSplit\n currentNode={currentNode}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n />\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n return (\n <div\n ref={setContainerRef}\n className={`zeugma-dashboard-root ${isDismissActive ? 'zeugma-dashboard-dismiss-active' : ''}`.trim()}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n <RootDropZones\n activeId={activeId}\n hasOtherPanes={hasOtherPanes}\n dropPreviewClassName={classNames.dropPreview}\n />\n </div>\n )\n }\n\n return renderContent()\n}\n","import 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","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","activeId","render","className","ref","useRef","useEffect","handleMove","e","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","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","handleDragMove","containerRect","ae","px","py","touch","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","handlePointerMove","handlePointerUp","globalStyle","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","rect","startX","startY","startPercentage","otherPositions","el","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","firstChild","secondChild","PaneSplit","isResizing","setIsResizing","first","second","handlePointerDown","PaneTree","propSnapThreshold","contextSnapThreshold","renderContent","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","height","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","Fragment","Pane","style","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","isFullscreen","metadata","renderProps","contextValue","DragHandle","dragProps"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext } 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 } 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","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 } from '../model/context'\nimport { ZeugmaProps } from '../model/types'\nimport { CursorOverlay } from './CursorOverlay'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\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\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 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 (ae instanceof MouseEvent || ae instanceof PointerEvent) {\n px = ae.clientX + event.delta.x\n py = ae.clientY + event.delta.y\n } else if (typeof TouchEvent !== 'undefined' && ae instanceof TouchEvent) {\n const touch = ae.touches[0] || ae.changedTouches[0]\n if (touch) {\n px = touch.clientX + event.delta.x\n py = touch.clientY + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n 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}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n } = 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 // 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) / rect.width) * 100\n : ((moveEvent.clientY - startY) / rect.height) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? rect.left + (rect.width - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n : rect.top + (rect.height - resizerSize) * (proposedPercentage / 100) + resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - rect.left) / (rect.width - resizerSize)) * 100\n : ((bestTarget - resizerSize / 2 - rect.top) / (rect.height - resizerSize)) * 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Imperatively update the sibling pane container flex sizes during drag\n const firstChild = container.children[0] as HTMLElement\n const secondChild = container.children[container.children.length - 1] as HTMLElement\n if (firstChild && secondChild) {\n firstChild.style.flex = `${finalPercentage} 1 0%`\n secondChild.style.flex = `${100 - finalPercentage} 1 0%`\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n // Write to React state once resizing completes\n const newLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n onLayoutChange(newLayout)\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 ],\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { useZeugmaState } from '../../../entities/zeugma'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode } 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 PaneSplitProps {\n currentNode: SplitNode\n resizerSize: number\n snapThreshold?: number\n}\n\nconst PaneSplit: React.FC<PaneSplitProps> = ({ currentNode, resizerSize, snapThreshold }) => {\n const { layout, onLayoutChange, classNames } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const containerRef = useRef<HTMLDivElement>(null)\n const { direction, first, second, splitPercentage } = currentNode\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold: snapThreshold ?? 8,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n })\n\n return (\n <div\n ref={containerRef}\n style={{\n display: 'flex',\n flexDirection: isRow ? 'row' : 'column',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n <div style={{ flex: `${splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree tree={first} resizerSize={resizerSize} snapThreshold={snapThreshold} />\n </div>\n <div\n className={`zeugma-resizer ${classNames.resizer || ''}`.trim()}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={{\n width: isRow ? `${resizerSize}px` : '100%',\n height: isRow ? '100%' : `${resizerSize}px`,\n cursor: isRow ? 'col-resize' : 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n <div style={{ flex: `${100 - splitPercentage} 1 0%`, overflow: 'hidden' }}>\n <PaneTree tree={second} resizerSize={resizerSize} snapThreshold={snapThreshold} />\n </div>\n </div>\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 = propSnapThreshold !== undefined ? propSnapThreshold : contextSnapThreshold\n\n // Fullscreen bypass\n if (fullscreenPaneId && !tree) {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(fullscreenPaneId)}\n </div>\n )\n }\n\n const currentNode = tree !== undefined ? tree : layout\n\n if (!currentNode) return null\n\n const renderContent = () => {\n if (currentNode.type === 'pane') {\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative' }}>\n {renderPane(currentNode.paneId)}\n </div>\n )\n }\n\n return (\n <PaneSplit\n currentNode={currentNode}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n />\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n return (\n <div\n ref={setContainerRef}\n className={`zeugma-dashboard-root ${isDismissActive ? 'zeugma-dashboard-dismiss-active' : ''}`.trim()}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n }\n\n return renderContent()\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"]}
|