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.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entities/zeugma/model/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/ui/Zeugma.tsx","../src/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":"8GAGO,IAAMA,EAAAA,CAAqBC,mBAAAA,CAA4C,MAAS,CAAA,CAC1EC,EAAAA,CAAuBD,mBAAAA,CAA8C,MAAS,CAAA,CCApF,IAAME,CAAAA,CAAiB,IAAwB,CACpD,IAAMC,CAAAA,CAAQC,gBAAAA,CAAWL,EAAkB,CAAA,CAC3C,GAAI,CAACI,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA,CAExE,OAAOA,CACT,CAAA,CAEaE,EAAAA,CAAmB,IAA0B,CACxD,IAAMC,CAAAA,CAAUF,gBAAAA,CAAWH,EAAoB,CAAA,CAC/C,GAAI,CAACK,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wDAAwD,CAAA,CAE1E,OAAOA,CACT,ECbO,SAASC,CAAAA,CAAWC,CAAAA,CAAuBC,CAAAA,CAAqC,CACrF,GAAID,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAChB,OAAOA,CAAAA,CAAK,MAAA,GAAWC,CAAAA,CAAa,IAAA,CAAOD,CAAAA,CAE7C,IAAME,CAAAA,CAAWH,CAAAA,CAAWC,CAAAA,CAAK,KAAA,CAAOC,CAAU,CAAA,CAC5CE,CAAAA,CAAYJ,CAAAA,CAAWC,CAAAA,CAAK,MAAA,CAAQC,CAAU,CAAA,CACpD,OAAIC,CAAAA,GAAa,IAAA,CAAaC,CAAAA,CAC1BA,CAAAA,GAAc,IAAA,CAAaD,CAAAA,CACxB,CAAE,GAAGF,CAAAA,CAAM,KAAA,CAAOE,CAAAA,CAAU,MAAA,CAAQC,CAAU,CACvD,CAKO,SAASC,EAAAA,CACdJ,CAAAA,CACAK,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACiB,CACjB,GAAIR,CAAAA,GAAS,IAAA,CACX,OAAO,OAAOQ,CAAAA,EAAc,QAAA,CAAW,CAAE,IAAA,CAAM,MAAA,CAAQ,MAAA,CAAQA,CAAU,CAAA,CAAIA,CAAAA,CAE/E,GAAIR,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,MAAA,GAAWK,CAAAA,CAAU,CAC5B,IAAMI,CAAAA,CACJ,OAAOD,CAAAA,EAAc,QAAA,CAAW,CAAE,IAAA,CAAM,MAAA,CAAQ,MAAA,CAAQA,CAAU,CAAA,CAAIA,CAAAA,CAClEE,CAAAA,CAAUH,CAAAA,GAAc,MAAA,EAAUA,CAAAA,GAAc,KAAA,CACtD,OAAO,CACL,IAAA,CAAM,OAAA,CACN,SAAA,CAAAD,CAAAA,CACA,KAAA,CAAOI,CAAAA,CAAUD,CAAAA,CAAYT,CAAAA,CAC7B,MAAA,CAAQU,CAAAA,CAAUV,CAAAA,CAAOS,CAAAA,CACzB,eAAA,CAAiB,EACnB,CACF,CACA,OAAOT,CACT,CACA,OAAO,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOI,EAAAA,CAAUJ,CAAAA,CAAK,KAAA,CAAOK,CAAAA,CAAUC,CAAAA,CAAWC,CAAAA,CAAWC,CAAS,CAAA,EAAKR,CAAAA,CAAK,KAAA,CAChF,MAAA,CAAQI,EAAAA,CAAUJ,CAAAA,CAAK,MAAA,CAAQK,CAAAA,CAAUC,CAAAA,CAAWC,CAAAA,CAAWC,CAAS,CAAA,EAAKR,CAAAA,CAAK,MACpF,CACF,CAKO,SAASW,EAAAA,CAAUX,CAAAA,CAAuBY,CAAAA,CAAaC,CAAAA,CAA8B,CAC1F,GAAIb,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAG1B,IAAMc,CAAAA,CAAQC,CAAAA,CAASf,CAAAA,CAAMY,CAAG,CAAA,CAC1BI,CAAAA,CAAQD,CAAAA,CAASf,CAAAA,CAAMa,CAAG,CAAA,CAChC,GAAI,CAACC,CAAAA,EAAS,CAACE,CAAAA,CAAO,OAAOhB,CAAAA,CAG7B,SAASiB,EAAKC,CAAAA,CAA0B,CACtC,OAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CACZA,CAAAA,CAAK,MAAA,GAAWN,CAAAA,CAAY,CAAE,GAAGI,CAAO,CAAA,CACxCE,CAAAA,CAAK,MAAA,GAAWL,CAAAA,CAAY,CAAE,GAAGC,CAAO,CAAA,CACrCI,CAAAA,CAEF,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOD,CAAAA,CAAKC,CAAAA,CAAK,KAAK,CAAA,CACtB,MAAA,CAAQD,CAAAA,CAAKC,CAAAA,CAAK,MAAM,CAC1B,CACF,CAEA,OAAOD,CAAAA,CAAKjB,CAAI,CAClB,CAKO,SAASmB,EAAAA,CAAQnB,CAAAA,CAAuBQ,CAAAA,CAA6B,CAC1E,GAAIR,CAAAA,GAAS,IAAA,CACX,OAAO,CAAE,IAAA,CAAM,MAAA,CAAQ,MAAA,CAAQQ,CAAU,CAAA,CAG3C,SAASY,CAAAA,CAAOF,CAAAA,CAAgBG,CAAAA,CAAkD,CAChF,OAAIH,CAAAA,CAAK,IAAA,GAAS,MAAA,CAET,CACL,IAAA,CAAM,OAAA,CACN,SAAA,CAHgCG,CAAAA,GAAoB,KAAA,CAAQ,QAAA,CAAW,KAAA,CAIvE,eAAA,CAAiB,EAAA,CACjB,KAAA,CAAOH,CAAAA,CACP,MAAA,CAAQ,CAAE,IAAA,CAAM,MAAA,CAAQ,MAAA,CAAQV,CAAU,CAC5C,CAAA,CAGK,CACL,GAAGU,CAAAA,CACH,MAAA,CAAQE,CAAAA,CAAOF,CAAAA,CAAK,MAAA,CAAQA,CAAAA,CAAK,SAAS,CAC5C,CACF,CAEA,OAAOE,CAAAA,CAAOpB,CAAAA,CAAM,IAAI,CAC1B,CAKO,SAASsB,CAAAA,CACdtB,CAAAA,CACAuB,CAAAA,CACAC,CAAAA,CACiB,CACjB,OAAIxB,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,GAASuB,CAAAA,CACJ,CAAE,GAAGvB,CAAAA,CAAM,eAAA,CAAiBwB,CAAc,CAAA,CAE/CxB,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOsB,EAAsBtB,CAAAA,CAAK,KAAA,CAAOuB,CAAAA,CAAQC,CAAa,CAAA,EAAKxB,CAAAA,CAAK,KAAA,CACxE,MAAA,CAAQsB,CAAAA,CAAsBtB,CAAAA,CAAK,MAAA,CAAQuB,CAAAA,CAAQC,CAAa,CAAA,EAAKxB,CAAAA,CAAK,MAC5E,CAAA,CAEKA,CACT,CAKO,SAASyB,EAAAA,CACdzB,CAAAA,CACA0B,CAAAA,CACAnB,CAAAA,CACiB,CAEjB,IAAMoB,CAAAA,CAA4BZ,CAAAA,CAASf,CAAAA,CAAM0B,CAAU,CAAA,EAAK,CAC9D,IAAA,CAAM,MAAA,CACN,MAAA,CAAQA,CACV,CAAA,CACME,CAAAA,CAAsB7B,CAAAA,CAAWC,CAAAA,CAAM0B,CAAU,CAAA,CACvD,GAAIE,CAAAA,GAAwB,IAAA,CAC1B,OAAO,CAAE,GAAGD,CAAgB,CAAA,CAG9B,IAAMrB,CAAAA,CAA4BC,CAAAA,GAAc,MAAA,EAAUA,CAAAA,GAAc,OAAA,CAAU,KAAA,CAAQ,QAAA,CACpFG,CAAAA,CAAUH,CAAAA,GAAc,MAAA,EAAUA,CAAAA,GAAc,KAAA,CAChDsB,CAAAA,CAAwB,CAAE,GAAGF,CAAgB,CAAA,CAEnD,OAAO,CACL,IAAA,CAAM,OAAA,CACN,SAAA,CAAArB,CAAAA,CACA,KAAA,CAAOI,CAAAA,CAAUmB,CAAAA,CAAcD,CAAAA,CAC/B,MAAA,CAAQlB,CAAAA,CAAUkB,CAAAA,CAAsBC,CAAAA,CACxC,eAAA,CAAiB,EACnB,CACF,CAKO,SAASd,CAAAA,CAASf,CAAAA,CAAuB8B,CAAAA,CAAiC,CAC/E,OAAI9B,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,CAAK,IAAA,GAAS,MAAA,CACTA,CAAAA,CAAK,MAAA,GAAW8B,CAAAA,CAAS9B,CAAAA,CAAO,IAAA,CAElCe,CAAAA,CAASf,CAAAA,CAAK,KAAA,CAAO8B,CAAM,CAAA,EAAKf,CAAAA,CAASf,CAAAA,CAAK,MAAA,CAAQ8B,CAAM,CACrE,CAKO,SAASC,EAAAA,CACd/B,CAAAA,CACA8B,CAAAA,CACAE,CAAAA,CACiB,CACjB,GAAIhC,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,OAAQ,CACxB,GAAIA,CAAAA,CAAK,MAAA,GAAW8B,CAAAA,CAAQ,CAC1B,IAAMG,CAAAA,CAAcD,CAAAA,CAAQhC,CAAAA,CAAK,QAAQ,CAAA,CACzC,GAAIiC,CAAAA,GAAgB,MAAA,CAAW,CAE7B,GAAM,CAAE,QAAA,CAAUC,CAAAA,CAAG,GAAGC,CAAK,CAAA,CAAInC,CAAAA,CACjC,OAAOmC,CACT,CACA,OAAO,CAAE,GAAGnC,CAAAA,CAAM,QAAA,CAAUiC,CAAY,CAC1C,CACA,OAAOjC,CACT,CACA,OAAO,CACL,GAAGA,CAAAA,CACH,KAAA,CAAO+B,EAAAA,CAAmB/B,CAAAA,CAAK,KAAA,CAAO8B,CAAAA,CAAQE,CAAO,CAAA,EAAKhC,CAAAA,CAAK,KAAA,CAC/D,MAAA,CAAQ+B,EAAAA,CAAmB/B,CAAAA,CAAK,MAAA,CAAQ8B,CAAAA,CAAQE,CAAO,CAAA,EAAKhC,CAAAA,CAAK,MACnE,CACF,CCvMO,IAAMoC,EAAAA,CAAyB,CAAA,CACzBC,EAAAA,CAAmC,CAAA,CACnCC,EAAAA,CAAuB,ECA7B,IAAMC,EAAAA,CAIR,CAAC,CAAE,QAAA,CAAAC,CAAAA,CAAU,MAAA,CAAAC,CAAAA,CAAQ,SAAA,CAAAC,CAAU,CAAA,GAAM,CACxC,IAAMC,CAAAA,CAAMC,YAAAA,CAAuB,IAAI,CAAA,CAEvC,OAAAC,eAAAA,CAAU,IAAM,CACd,IAAMC,CAAAA,CAAcC,CAAAA,EAAoB,CAClCJ,CAAAA,CAAI,OAAA,GACNA,CAAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAY,CAAA,UAAA,EAAaI,CAAAA,CAAE,OAAA,CAAU,EAAE,CAAA,IAAA,EAAOA,CAAAA,CAAE,OAAA,CAAU,EAAE,CAAA,GAAA,CAAA,EAElF,CAAA,CACA,OAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,CAAeD,CAAU,CAAA,CAC5C,IAAM,QAAA,CAAS,mBAAA,CAAoB,aAAA,CAAeA,CAAU,CACrE,CAAA,CAAG,EAAE,CAAA,CAGHE,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKL,CAAAA,CACL,SAAA,CAAWD,CAAAA,CACX,KAAA,CAAO,CACL,QAAA,CAAU,OAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,MAAA,CAAQ,IAAA,CACR,aAAA,CAAe,MACjB,CAAA,CAEC,QAAA,CAAAD,CAAAA,CAAOD,CAAQ,CAAA,CAClB,CAEJ,CAAA,CChCO,IAAMS,EAAAA,CAAN,cAAiCC,kBAAc,CACpD,OAAO,UAAA,CAAa,CAClB,CACE,SAAA,CAAW,eAAA,CACX,OAAA,CAAS,CAAC,CAAE,WAAA,CAAaC,CAAM,CAAA,GAEzB,CADYA,CAAAA,CAAM,MAAA,EACT,OAAA,CAAQ,cAAc,CAKvC,CACF,CACF,CAAA,CAEaC,EAAAA,CAAN,cAA+BC,gBAAY,CAChD,OAAO,UAAA,CAAa,CAClB,CACE,SAAA,CAAW,cAAA,CACX,OAAA,CAAS,CAAC,CAAE,WAAA,CAAaF,CAAM,CAAA,GAEzB,CADYA,CAAAA,CAAM,MAAA,EACT,OAAA,CAAQ,cAAc,CAKvC,CACF,CACF,CAAA,CCHO,IAAMG,EAAAA,CAAgC,CAAC,CAC5C,MAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,iBAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,EAAC,CACd,gBAAA,CAAAC,CAAAA,CAAmB,IAAA,CACnB,kBAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,sBAAA,CAAAC,CAAAA,CAAyB,CAAA,CACzB,aAAA,CAAAC,CAAAA,CAAgB,CAAA,CAChB,WAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CAAqB,CAAA,CACrB,kBAAA,CAAAC,CAAAA,CAAqB,EAAA,CACrB,mBAAA,CAAAC,CAAAA,CAAsB,KAAA,CACtB,gBAAA,CAAAC,CAAAA,CAAmB,EAAA,CACnB,qBAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CACF,CAAA,GAAM,CACJ,GAAM,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIC,cAAAA,CAA0BvB,CAAM,CAAA,CAChE,CAACwB,EAAAA,CAAYC,EAAa,CAAA,CAAIF,cAAAA,CAA0BvB,CAAM,CAAA,CAEhEA,CAAAA,GAAWwB,EAAAA,GACbC,EAAAA,CAAczB,CAAM,CAAA,CACpBsB,CAAAA,CAAetB,CAAM,CAAA,CAAA,CAGvB,GAAM,CAACf,CAAAA,CAAUyC,CAAW,CAAA,CAAIH,cAAAA,CAAwB,IAAI,CAAA,CACtD,CAACI,CAAAA,CAAiBC,CAAkB,CAAA,CAAIL,cAAAA,CAAwB,IAAI,CAAA,CACpEM,CAAAA,CAAexC,YAAAA,CAA2B,IAAI,CAAA,CAC9CyC,CAAAA,CAAmBzC,YAAAA,CAAuB,IAAI,CAAA,CAE9C0C,CAAAA,CAAkBC,iBAAAA,CAAaC,CAAAA,EAAgC,CACnEJ,CAAAA,CAAa,OAAA,CAAUI,EACzB,CAAA,CAAG,EAAE,CAAA,CAGCC,CAAAA,CAAmBF,iBAAAA,CAAazD,CAAAA,EAAmB2B,CAAAA,CAAW3B,CAAM,CAAA,CAAG,CAAC2B,CAAU,CAAC,CAAA,CAGnFiC,CAAAA,CAAmBC,aAAAA,CACvB,IAAMhC,CAAAA,CACN,CACEA,CAAAA,CAAW,IAAA,CACXA,CAAAA,CAAW,WAAA,CACXA,CAAAA,CAAW,WAAA,CACXA,CAAAA,CAAW,WAAA,CACXA,CAAAA,CAAW,OAAA,CACXA,CAAAA,CAAW,cACb,CACF,CAAA,CAEMiC,CAAAA,CAAUC,eAAAA,CACdC,cAAAA,CAAU7C,EAAAA,CAAoB,CAC5B,oBAAA,CAAsB,CAAE,QAAA,CAAUc,CAAuB,CAC3D,CAAC,CAAA,CACD+B,cAAAA,CAAU1C,EAAAA,CAAkB,CAC1B,oBAAA,CAAsB,CAAE,KAAA,CAAO,GAAA,CAAK,SAAA,CAAW,CAAE,CACnD,CAAC,CACH,CAAA,CAEM2C,CAAAA,CAAmB5C,CAAAA,EAA0B,CACjD,IAAMzB,CAAAA,CAAayB,CAAAA,CAAM,MAAA,CAAO,EAAA,CAAG,QAAA,EAAS,CAC5C8B,CAAAA,CAAYvD,CAAU,CAAA,CAClB8C,CAAAA,EAAuBY,CAAAA,CAAa,OAAA,CACtCC,CAAAA,CAAiB,OAAA,CAAUD,CAAAA,CAAa,OAAA,CAAQ,qBAAA,EAAsB,CAEtEC,CAAAA,CAAiB,OAAA,CAAU,IAAA,CAEzBpB,CAAAA,EACFA,CAAAA,CAAYvC,CAAU,EAE1B,CAAA,CAEMsE,CAAAA,CAAkB7C,CAAAA,EAAyB,CAC/C,GAAI,CAACqB,CAAAA,CAAqB,OAE1B,IAAM9C,CAAAA,CAAayB,CAAAA,CAAM,MAAA,CAAO,EAAA,CAAG,QAAA,EAAS,CACtC8C,CAAAA,CAAgBZ,CAAAA,CAAiB,OAAA,CAEvC,GAAI,CAACY,CAAAA,CAAe,CACdf,CAAAA,GAAoB,IAAA,GACtBC,CAAAA,CAAmB,IAAI,CAAA,CACvBT,CAAAA,GAAwB,IAAI,CAAA,CAAA,CAE9B,MACF,CAEA,IAAMwB,CAAAA,CAAK/C,CAAAA,CAAM,cAAA,CACbgD,CAAAA,CAAoB,IAAA,CACpBC,CAAAA,CAAoB,IAAA,CAExB,GAAIF,CAAAA,YAAc,UAAA,EAAcA,CAAAA,YAAc,YAAA,CAC5CC,CAAAA,CAAKD,CAAAA,CAAG,OAAA,CAAU/C,CAAAA,CAAM,KAAA,CAAM,CAAA,CAC9BiD,CAAAA,CAAKF,CAAAA,CAAG,OAAA,CAAU/C,CAAAA,CAAM,KAAA,CAAM,CAAA,CAAA,KAAA,GACrB,OAAO,UAAA,CAAe,GAAA,EAAe+C,CAAAA,YAAc,UAAA,CAAY,CACxE,IAAMG,CAAAA,CAAQH,CAAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAKA,CAAAA,CAAG,cAAA,CAAe,CAAC,CAAA,CAC9CG,CAAAA,GACFF,CAAAA,CAAKE,CAAAA,CAAM,OAAA,CAAUlD,CAAAA,CAAM,KAAA,CAAM,CAAA,CACjCiD,CAAAA,CAAKC,CAAAA,CAAM,OAAA,CAAUlD,CAAAA,CAAM,KAAA,CAAM,CAAA,EAErC,CAEA,IAAImD,CAAAA,CAAW,CAAA,CACf,GAAIH,CAAAA,GAAO,IAAA,EAAQC,CAAAA,GAAO,IAAA,CAAM,CAC9B,IAAIG,CAAAA,CAAK,CAAA,CACLC,CAAAA,CAAK,CAAA,CAELL,CAAAA,CAAKF,CAAAA,CAAc,IAAA,CACrBM,CAAAA,CAAKN,CAAAA,CAAc,IAAA,CAAOE,CAAAA,CACjBA,CAAAA,CAAKF,CAAAA,CAAc,KAAA,GAC5BM,CAAAA,CAAKJ,CAAAA,CAAKF,CAAAA,CAAc,KAAA,CAAA,CAGtBG,CAAAA,CAAKH,CAAAA,CAAc,GAAA,CACrBO,CAAAA,CAAKP,CAAAA,CAAc,GAAA,CAAMG,CAAAA,CAChBA,CAAAA,CAAKH,CAAAA,CAAc,MAAA,GAC5BO,CAAAA,CAAKJ,CAAAA,CAAKH,CAAAA,CAAc,MAAA,CAAA,CAG1BK,CAAAA,CAAW,IAAA,CAAK,IAAA,CAAKC,CAAAA,CAAKA,CAAAA,CAAKC,CAAAA,CAAKA,CAAE,EACxC,CAAA,KAAO,CACL,IAAMC,CAAAA,CAAatD,CAAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAC7C,GAAIsD,CAAAA,CAAY,CACd,IAAMC,CAAAA,CAAKD,CAAAA,CAAW,IAAA,CAAOA,CAAAA,CAAW,KAAA,CAAQ,CAAA,CAC1CE,CAAAA,CAAKF,CAAAA,CAAW,GAAA,CAAMA,CAAAA,CAAW,MAAA,CAAS,CAAA,CAC5CF,CAAAA,CAAK,CAAA,CACLC,CAAAA,CAAK,CAAA,CAELE,CAAAA,CAAKT,CAAAA,CAAc,IAAA,CACrBM,CAAAA,CAAKN,CAAAA,CAAc,IAAA,CAAOS,CAAAA,CACjBA,CAAAA,CAAKT,CAAAA,CAAc,KAAA,GAC5BM,CAAAA,CAAKG,CAAAA,CAAKT,CAAAA,CAAc,KAAA,CAAA,CAGtBU,CAAAA,CAAKV,CAAAA,CAAc,GAAA,CACrBO,CAAAA,CAAKP,CAAAA,CAAc,GAAA,CAAMU,CAAAA,CAChBA,CAAAA,CAAKV,CAAAA,CAAc,MAAA,GAC5BO,CAAAA,CAAKG,CAAAA,CAAKV,CAAAA,CAAc,MAAA,CAAA,CAG1BK,CAAAA,CAAW,IAAA,CAAK,IAAA,CAAKC,CAAAA,CAAKA,CAAAA,CAAKC,CAAAA,CAAKA,CAAE,EACxC,CACF,CAEwBF,CAAAA,CAAW7B,CAAAA,CAE7BS,CAAAA,GAAoBxD,CAAAA,GACtByD,CAAAA,CAAmBzD,CAAU,CAAA,CAC7BgD,CAAAA,GAAwBhD,CAAU,CAAA,CAAA,CAGhCwD,CAAAA,GAAoB,IAAA,GACtBC,CAAAA,CAAmB,IAAI,CAAA,CACvBT,CAAAA,GAAwB,IAAI,CAAA,EAGlC,CAAA,CAEMkC,EAAAA,CAAiBzD,CAAAA,EAAwB,CAC7C8B,CAAAA,CAAY,IAAI,CAAA,CAChB,GAAM,CAAE,MAAA,CAAA4B,CAAAA,CAAQ,IAAA,CAAAC,CAAK,CAAA,CAAI3D,CAAAA,CACnBzB,CAAAA,CAAamF,CAAAA,CAAO,EAAA,CAAG,QAAA,EAAS,CAEhCE,CAAAA,CAAmBvC,CAAAA,EAAuBU,CAAAA,GAAoBxD,CAAAA,CAMpE,GAJAyD,CAAAA,CAAmB,IAAI,CAAA,CACvBT,CAAAA,GAAwB,IAAI,CAAA,CAC5BW,CAAAA,CAAiB,OAAA,CAAU,IAAA,CAEvB0B,CAAAA,CAAkB,CAChBjD,CAAAA,CACFA,CAAAA,CAASpC,CAAU,CAAA,CAEnBsF,EAAAA,CAAiBtF,CAAU,CAAA,CAGzBwC,CAAAA,EACFA,CAAAA,CAAUxC,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,GAAI,CAACoF,CAAAA,CAAM,CACL5C,CAAAA,EACFA,CAAAA,CAAUxC,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,IAAMuF,CAAAA,CAAYH,CAAAA,CAAK,EAAA,CAAG,QAAA,EAAS,CAG7BI,CAAAA,CAAYD,CAAAA,CAAU,KAAA,CAAM,qCAAqC,CAAA,CACvE,GAAIC,CAAAA,CAAW,CACb,GAAM,EAAGC,CAAQ,CAAA,CAAID,CAAAA,CACfE,EAAAA,CAAY3F,EAAAA,CAChBmD,CAAAA,CACAlD,CAAAA,CACAyF,CACF,CAAA,CACAtC,CAAAA,CAAeuC,EAAS,CAAA,CACxB5D,CAAAA,CAAS4D,EAAS,CAAA,CAEdlD,CAAAA,EAGFA,CAAAA,CAAUxC,CAAAA,CAAY,MAAA,CAAQ,CAC5B,IAAA,CAAM,OAAA,CACN,SAAA,CAHAyF,CAAAA,GAAa,MAAA,EAAUA,CAAAA,GAAa,OAAA,CAAU,KAAA,CAAQ,QAAA,CAItD,QAAA,CAAUA,CACZ,CAAC,CAAA,CAEH,MACF,CAGA,IAAME,EAAAA,CAAYJ,CAAAA,CAAU,KAAA,CAAM,oBAAoB,CAAA,CACtD,GAAII,EAAAA,CAAW,CACb,GAAM,EAAGhH,CAAQ,CAAA,CAAIgH,EAAAA,CACrB,GAAI3F,CAAAA,GAAerB,CAAAA,CAAU,CAC3B,IAAM+G,EAAAA,CAAYzG,EAAAA,CAAUiE,CAAAA,CAAalD,CAAAA,CAAYrB,CAAQ,CAAA,CAC7DwE,CAAAA,CAAeuC,EAAS,CAAA,CACxB5D,CAAAA,CAAS4D,EAAS,EACpB,CACIlD,CAAAA,EACFA,CAAAA,CAAUxC,CAAAA,CAAYrB,CAAAA,CAAU,CAAE,IAAA,CAAM,MAAA,CAAQ,QAAA,CAAU,QAAS,CAAC,CAAA,CAEtE,MACF,CAGA,IAAMiH,CAAAA,CAAQL,CAAAA,CAAU,KAAA,CAAM,qCAAqC,CAAA,CACnE,GAAI,CAACK,CAAAA,CAAO,CACNpD,CAAAA,EACFA,CAAAA,CAAUxC,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,GAAM,EAAGyF,CAAAA,CAAU9G,CAAQ,CAAA,CAAIiH,CAAAA,CAC/B,GAAI5F,CAAAA,GAAerB,CAAAA,CAAU,CACvB6D,CAAAA,EACFA,CAAAA,CAAUxC,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,IAAMpB,CAAAA,CAA4B6G,CAAAA,GAAa,MAAA,EAAUA,CAAAA,GAAa,OAAA,CAAU,KAAA,CAAQ,QAAA,CAClFxF,CAAAA,CAAkBZ,CAAAA,CAAS6D,CAAAA,CAAalD,CAAU,CAAA,EAAK,CAC3D,IAAA,CAAM,MAAA,CACN,MAAA,CAAQA,CACV,CAAA,CACME,EAAAA,CAAsB7B,CAAAA,CAAW6E,CAAAA,CAAalD,CAAU,CAAA,CAExD0F,EAAAA,CAAYhH,EAAAA,CAChBwB,EAAAA,CACAvB,CAAAA,CACAC,CAAAA,CACA6G,CAAAA,CACAxF,CACF,CAAA,CACAkD,CAAAA,CAAeuC,EAAS,CAAA,CACxB5D,CAAAA,CAAS4D,EAAS,CAAA,CACdlD,CAAAA,EACFA,CAAAA,CAAUxC,CAAAA,CAAYrB,CAAAA,CAAU,CAC9B,IAAA,CAAM,OAAA,CACN,SAAA,CAAAC,CAAAA,CACA,QAAA,CAAU6G,CACZ,CAAC,EAEL,CAAA,CAEMI,EAAAA,CAA0BhC,iBAAAA,CAC7B6B,CAAAA,EAA+B,CAC9BvC,CAAAA,CAAeuC,CAAS,CAAA,CACxB5D,CAAAA,CAAS4D,CAAS,EACpB,CAAA,CACA,CAAC5D,CAAQ,CACX,CAAA,CAEMwD,EAAAA,CAAmBzB,iBAAAA,CACtBzD,CAAAA,EAAmB,CAClB,IAAMsF,CAAAA,CAAYrH,CAAAA,CAAW6E,CAAAA,CAAa9C,CAAM,CAAA,CAChD+C,CAAAA,CAAeuC,CAAS,CAAA,CACxB5D,CAAAA,CAAS4D,CAAS,EACpB,CAAA,CACA,CAACxC,CAAAA,CAAapB,CAAQ,CACxB,CAAA,CAEMgE,EAAAA,CAAgBjC,iBAAAA,CACnBzD,CAAAA,EAAmB,CAClB,IAAMsF,CAAAA,CAAYjG,EAAAA,CAAQyD,CAAAA,CAAa9C,CAAM,CAAA,CAC7C+C,CAAAA,CAAeuC,CAAS,CAAA,CACxB5D,CAAAA,CAAS4D,CAAS,EACpB,CAAA,CACA,CAACxC,CAAAA,CAAapB,CAAQ,CACxB,CAAA,CAEMiE,EAAAA,CAAkBlC,iBAAAA,CACtB,CAACmC,CAAAA,CAAiBC,CAAAA,GAAoB,CACpC,IAAMP,CAAAA,CAAYzG,EAAAA,CAAUiE,CAAAA,CAAa8C,CAAAA,CAASC,CAAO,CAAA,CACzD9C,CAAAA,CAAeuC,CAAS,CAAA,CACxB5D,CAAAA,CAAS4D,CAAS,EACpB,CAAA,CACA,CAACxC,CAAAA,CAAapB,CAAQ,CACxB,CAAA,CAEMoE,EAAAA,CAAkBrC,iBAAAA,CACtB,CACElF,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GACG,CACH,IAAMmB,CAAAA,CAAkBZ,CAAAA,CAAS6D,CAAAA,CAAapE,CAAS,CAAA,EAAK,CAC1D,IAAA,CAAM,MAAA,CACN,MAAA,CAAQA,CACV,CAAA,CACMoB,CAAAA,CAAsB7B,CAAAA,CAAW6E,CAAAA,CAAapE,CAAS,CAAA,CACvD4G,CAAAA,CAAYhH,EAAAA,CAChBwB,CAAAA,CACAvB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAoB,CACF,CAAA,CACAkD,CAAAA,CAAeuC,CAAS,CAAA,CACxB5D,CAAAA,CAAS4D,CAAS,EACpB,CAAA,CACA,CAACxC,CAAAA,CAAapB,CAAQ,CACxB,CAAA,CAEMqE,EAAAA,CAA8BtC,iBAAAA,CAClC,CAACuC,CAAAA,CAAwBC,CAAAA,GAAuB,CAC9C,IAAMX,CAAAA,CAAY9F,CAAAA,CAAsBsD,EAAakD,CAAAA,CAAaC,CAAU,CAAA,CAC5ElD,CAAAA,CAAeuC,CAAS,CAAA,CACxB5D,CAAAA,CAAS4D,CAAS,EACpB,CAAA,CACA,CAACxC,CAAAA,CAAapB,CAAQ,CACxB,CAAA,CAEMwE,EAAAA,CAA2BzC,iBAAAA,CAC/B,CACEzD,CAAAA,CACAE,CAAAA,GAGG,CACH,IAAMoF,CAAAA,CAAYrF,EAAAA,CAAmB6C,CAAAA,CAAa9C,CAAAA,CAAQE,CAAO,CAAA,CACjE6C,CAAAA,CAAeuC,CAAS,CAAA,CACxB5D,CAAAA,CAAS4D,CAAS,EACpB,CAAA,CACA,CAACxC,CAAAA,CAAapB,CAAQ,CACxB,CAAA,CAEMyE,EAAAA,CAAkB1C,iBAAAA,CACtB,CAACuC,CAAAA,CAAwBC,CAAAA,GAAuB,CAC9C,IAAMG,CAAAA,CAAc5G,CAAAA,CAAsBsD,CAAAA,CAAakD,CAAAA,CAAaC,CAAU,CAAA,CAC9ElD,CAAAA,CAAeqD,CAAW,CAAA,CAC1B1E,CAAAA,CAAS0E,CAAW,CAAA,CAChB7D,CAAAA,EACFA,CAAAA,CAAYyD,CAAAA,CAAaC,CAAU,EAEvC,CAAA,CACA,CAACnD,CAAAA,CAAapB,CAAAA,CAAUa,CAAW,CACrC,CAAA,CAGM8D,EAAAA,CAAaxC,aAAAA,CACjB,KAAO,CACL,MAAA,CAAQf,CAAAA,CACR,cAAA,CAAgB2C,EAAAA,CAChB,UAAA,CAAY9B,CAAAA,CACZ,QAAA,CAAAjD,CAAAA,CACA,eAAA,CAAA0C,CAAAA,CACA,eAAA,CAAAI,CAAAA,CACA,gBAAA,CAAA1B,CAAAA,CACA,UAAA,CAAY8B,CAAAA,CACZ,QAAA,CAAA5B,CAAAA,CACA,kBAAA,CAAAD,CAAAA,CACA,aAAA,CAAAG,CAAAA,CACA,aAAA,CAAAG,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAa6D,EAAAA,CACb,kBAAA,CAAA3D,CAAAA,CACA,kBAAA,CAAAC,CACF,CAAA,CAAA,CACA,CACEK,CAAAA,CACApC,CAAAA,CACA0C,CAAAA,CACAI,CAAAA,CACA1B,CAAAA,CACA8B,CAAAA,CACA5B,CAAAA,CACAD,CAAAA,CACAG,CAAAA,CACAG,CAAAA,CACAC,CAAAA,CACAE,CAAAA,CACAC,CAAAA,CACAgD,EAAAA,CACA9B,CAAAA,CACAwC,EACF,CACF,CAAA,CAGMG,EAAAA,CAAezC,cACnB,KAAO,CACL,UAAA,CAAYqB,EAAAA,CACZ,OAAA,CAASQ,EAAAA,CACT,SAAA,CAAWC,EAAAA,CACX,SAAA,CAAWG,EAAAA,CACX,qBAAA,CAAuBC,EAAAA,CACvB,kBAAA,CAAoBG,EACtB,CAAA,CAAA,CACA,CACEhB,EAAAA,CACAQ,EAAAA,CACAC,EAAAA,CACAG,EAAAA,CACAC,EAAAA,CACAG,EACF,CACF,CAAA,CAEA,OACEhF,cAAAA,CAACvD,EAAAA,CAAqB,QAAA,CAArB,CAA8B,KAAA,CAAO2I,EAAAA,CACpC,QAAA,CAAAC,eAAAA,CAAC9I,EAAAA,CAAmB,QAAA,CAAnB,CAA4B,KAAA,CAAO4I,EAAAA,CAClC,QAAA,CAAA,CAAAnF,cAAAA,CAACsF,eAAAA,CAAA,CACC,EAAA,CAAG,oBAAA,CACH,OAAA,CAAS1C,CAAAA,CACT,kBAAA,CAAoB2C,kBAAAA,CACpB,WAAA,CAAaxC,CAAAA,CACb,UAAA,CAAYC,CAAAA,CACZ,SAAA,CAAWY,EAAAA,CAEV,QAAA,CAAAjC,CAAAA,CACH,CAAA,CACCnC,CAAAA,EAAYkB,CAAAA,EACXV,cAAAA,CAACT,EAAAA,CAAA,CACC,QAAA,CAAUC,CAAAA,CACV,MAAA,CAAQkB,CAAAA,CACR,SAAA,CAAW,CAAA,EAAGC,CAAAA,CAAW,WAAA,EAAe,EAAE,CAAA,CAAA,EACxCnB,CAAAA,GAAa0C,CAAAA,CACTvB,CAAAA,CAAW,cAAA,EAAkB,wBAAA,CAC7B,EACN,CAAA,CAAA,CAAG,IAAA,EAAK,CACV,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,ECneA,IAAM6E,EAAAA,CAA+D,CACnE,GAAA,CAAK,CACH,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,MAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,MAAA,CACR,OAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CACF,CAAA,CAEMC,EAAAA,CAA4D,CAChE,GAAA,CAAK,CACH,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CACF,CAAA,CAQaC,EAAAA,CAA4C,CAAC,CAAE,EAAA,CAAAC,CAAAA,CAAI,QAAA,CAAAC,CAAAA,CAAU,eAAA,CAAAC,CAAgB,CAAA,GAAM,CAC9F,GAAM,CAAE,UAAA,CAAAC,CAAAA,CAAY,MAAA,CAAAC,CAAO,CAAA,CAAIC,iBAAAA,CAAa,CAAE,EAAA,CAAAL,CAAG,CAAC,CAAA,CAClD,OACEN,eAAAA,CAAAY,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAjG,cAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAK8F,CAAAA,CAAY,KAAA,CAAON,EAAAA,CAAwBI,CAAQ,CAAA,CAAG,CAAA,CAC/DG,CAAAA,EAAU/F,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW6F,CAAAA,CAAiB,KAAA,CAAOJ,EAAAA,CAAqBG,CAAQ,CAAA,CAAG,CAAA,CAAA,CACrF,CAEJ,CAAA,CAQaM,EAAAA,CAA8C,CAAC,CAC1D,QAAA,CAAA1G,CAAAA,CACA,aAAA,CAAA2G,CAAAA,CACA,oBAAA,CAAAC,CACF,CAAA,GACM,CAAC5G,CAAAA,EAAY,CAAC2G,CAAAA,CAAsB,IAAA,CAGtCnG,cAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CAEE,QAAA,CAAA,CAAC,KAAA,CAAO,QAAA,CAAU,MAAA,CAAQ,OAAO,CAAA,CAAY,GAAA,CAAKqG,CAAAA,EAClDrG,cAAAA,CAAC0F,EAAAA,CAAA,CAEC,EAAA,CAAI,CAAA,UAAA,EAAaW,CAAG,CAAA,CAAA,CACpB,QAAA,CAAUA,CAAAA,CACV,eAAA,CAAiBD,CAAAA,CAAAA,CAHZC,CAIP,CACD,CAAA,CACH,CAAA,CC7GG,SAASC,EAAAA,CAAkB,CAAE,MAAA,CAAAC,CAAAA,CAAQ,SAAA,CAAAC,CAAAA,CAAW,MAAA,CAAAC,CAAAA,CAAQ,KAAA,CAAAC,CAAM,CAAA,CAA4B,CAE/F,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,iBAAiB,CAAA,CAG7C,IAAMC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAC9CA,CAAAA,CAAQ,EAAA,CAAK,4BAAA,CACbA,EAAQ,WAAA,CAAc;AAAA;AAAA,cAAA,EAERJ,CAAM,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAIpB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYI,CAAO,CAAA,CAGjCH,CAAAA,CAAU,YAAA,CAAa,eAAA,CAAiB,MAAM,CAAA,CAG9C,IAAMI,CAAAA,CAAqB7G,CAAAA,EAAoB,CAC7C0G,CAAAA,CAAO1G,CAAC,EACV,CAAA,CAEM8G,CAAAA,CAAkB,IAAM,CAE5B,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,iBAAiB,CAAA,CAChDL,CAAAA,CAAU,gBAAgB,eAAe,CAAA,CAEzC,IAAMM,CAAAA,CAAc,QAAA,CAAS,cAAA,CAAe,4BAA4B,CAAA,CACpEA,CAAAA,EACFA,CAAAA,CAAY,MAAA,EAAO,CAGrB,QAAA,CAAS,mBAAA,CAAoB,cAAeF,CAAiB,CAAA,CAC7D,QAAA,CAAS,mBAAA,CAAoB,WAAA,CAAaC,CAAe,CAAA,CAGzDH,CAAAA,GACF,CAAA,CAEA,QAAA,CAAS,gBAAA,CAAiB,aAAA,CAAeE,CAAiB,EAC1D,QAAA,CAAS,gBAAA,CAAiB,WAAA,CAAaC,CAAe,EACxD,CC/CO,SAASE,EAAAA,CAAW,CACzB,YAAA,CAAA3E,CAAAA,CACA,KAAA,CAAA4E,CAAAA,CACA,SAAA,CAAA1J,EACA,eAAA,CAAA2J,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,aAAA,CAAAlG,CAAAA,CACA,MAAA,CAAAT,CAAAA,CACA,WAAA,CAAAuE,CAAAA,CACA,cAAA,CAAAqC,CAAAA,CACA,aAAA,CAAeC,CAAAA,CACf,YAAaC,CACf,CAAA,CAAoB,CAClB,GAAM,CACJ,aAAA,CAAeC,CAAAA,CACf,QAAA,CAAUC,CAAAA,CACV,WAAA,CAAaC,CAAAA,CACb,kBAAA,CAAAlG,CAAAA,CAAqB,CAAA,CACrB,mBAAAC,CAAAA,CAAqB,EACvB,CAAA,CAAI7E,CAAAA,EAAe,CAEnB,OAAO6F,iBAAAA,CACJxC,CAAAA,EAA0C,CACzCA,CAAAA,CAAE,cAAA,EAAe,CACjB,IAAM0H,CAAAA,CAAYrF,EAAa,OAAA,CAC/B,GAAI,CAACqF,CAAAA,CAAW,OAEZL,CAAAA,EACFA,CAAAA,EAAmB,CAEjBE,CAAAA,EACFA,CAAAA,CAAoBxC,CAAW,CAAA,CAGjC,IAAM4C,CAAAA,CAAOD,EAAU,qBAAA,EAAsB,CACvCE,CAAAA,CAAS5H,CAAAA,CAAE,OAAA,CACX6H,CAAAA,CAAS7H,CAAAA,CAAE,OAAA,CACX8H,CAAAA,CAAkBZ,CAAAA,CAClBT,CAAAA,CAAYzG,CAAAA,CAAE,aAAA,CAOd+H,EAAAA,CAJgB,MAAM,IAAA,CAC1B,QAAA,CAAS,gBAAA,CAAiB,uCAAuC,CACnE,CAAA,CAAE,MAAA,CAAQC,CAAAA,EAAOA,CAAAA,GAAOvB,CAAAA,EAAauB,CAAAA,CAAG,YAAA,CAAa,gBAAgB,CAAA,GAAMzK,CAAS,CAAA,CAE/C,GAAA,CAAKyK,CAAAA,EAAO,CAC/C,IAAMC,CAAAA,CAAID,CAAAA,CAAG,qBAAA,EAAsB,CACnC,OAAOf,CAAAA,CAAQgB,CAAAA,CAAE,IAAA,CAAOA,CAAAA,CAAE,MAAQ,CAAA,CAAIA,CAAAA,CAAE,GAAA,CAAMA,CAAAA,CAAE,MAAA,CAAS,CAC3D,CAAC,CAAA,CAEGC,CAAAA,CAAoBJ,CAAAA,CAExBvB,EAAAA,CAAkB,CAChB,MAAA,CAAQU,CAAAA,CAAQ,aAAe,YAAA,CAC/B,SAAA,CAAAR,CAAAA,CACA,MAAA,CAAS0B,CAAAA,EAA4B,CACnC,IAAMC,CAAAA,CAAQnB,CAAAA,CAAAA,CACRkB,CAAAA,CAAU,OAAA,CAAUP,CAAAA,EAAUD,CAAAA,CAAK,KAAA,CAAS,KAC5CQ,CAAAA,CAAU,OAAA,CAAUN,CAAAA,EAAUF,CAAAA,CAAK,MAAA,CAAU,GAAA,CAC7CU,CAAAA,CAAqBP,CAAAA,CAAkBM,CAAAA,CAGvCE,CAAAA,CAAcrB,CAAAA,CAChBU,CAAAA,CAAK,IAAA,CAAA,CAAQA,CAAAA,CAAK,KAAA,CAAQR,CAAAA,GAAgBkB,CAAAA,CAAqB,GAAA,CAAA,CAAOlB,CAAAA,CAAc,CAAA,CACpFQ,CAAAA,CAAK,GAAA,CAAA,CAAOA,CAAAA,CAAK,MAAA,CAASR,CAAAA,GAAgBkB,CAAAA,CAAqB,GAAA,CAAA,CAAOlB,CAAAA,CAAc,CAAA,CAEpFoB,CAAAA,CAAkB,IAClBC,CAAAA,CAA4B,IAAA,CAEhC,IAAA,IAAWlC,CAAAA,IAAOyB,EAAAA,CAAgB,CAChC,IAAMU,EAAAA,CAAO,IAAA,CAAK,GAAA,CAAIH,CAAAA,CAAchC,CAAG,CAAA,CACnCmC,EAAAA,CAAOxH,GAAiBwH,EAAAA,CAAOF,CAAAA,GACjCA,CAAAA,CAAkBE,EAAAA,CAClBD,CAAAA,CAAalC,CAAAA,EAEjB,CAEA,IAAIoC,CAAAA,CAAoBL,CAAAA,CACpBG,CAAAA,GAAe,IAAA,GACjBE,CAAAA,CAAoBzB,CAAAA,CAAAA,CACduB,EAAarB,CAAAA,CAAc,CAAA,CAAIQ,CAAAA,CAAK,IAAA,GAASA,CAAAA,CAAK,KAAA,CAAQR,CAAAA,CAAAA,CAAgB,GAAA,CAAA,CAC1EqB,CAAAA,CAAarB,CAAAA,CAAc,CAAA,CAAIQ,CAAAA,CAAK,GAAA,GAAQA,CAAAA,CAAK,OAASR,CAAAA,CAAAA,CAAgB,GAAA,CAAA,CAGlF,IAAMwB,CAAAA,CAAkB,IAAA,CAAK,GAAA,CAC3BpH,CAAAA,CACA,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAoBkH,CAAiB,CAChD,CAAA,CACAR,CAAAA,CAAoBS,EAGpB,IAAMC,CAAAA,CAAalB,CAAAA,CAAU,QAAA,CAAS,CAAC,CAAA,CACjCmB,CAAAA,CAAcnB,CAAAA,CAAU,QAAA,CAASA,CAAAA,CAAU,QAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAChEkB,GAAcC,CAAAA,GAChBD,CAAAA,CAAW,KAAA,CAAM,IAAA,CAAO,CAAA,EAAGD,CAAe,CAAA,KAAA,CAAA,CAC1CE,CAAAA,CAAY,KAAA,CAAM,IAAA,CAAO,CAAA,EAAG,GAAA,CAAMF,CAAe,CAAA,KAAA,CAAA,CAAA,CAG/CnB,GACFA,CAAAA,CAAezC,CAAAA,CAAa4D,CAAe,EAE/C,CAAA,CACA,KAAA,CAAO,IAAM,CAEX,IAAMtE,CAAAA,CAAY9F,CAAAA,CAAsBiC,CAAAA,CAAQuE,CAAAA,CAAamD,CAAiB,EAC9Ed,CAAAA,CAAe/C,CAAS,CAAA,CAEpBiD,CAAAA,EACFA,CAAAA,EAAiB,CAEfG,CAAAA,EACFA,CAAAA,CAAkB1C,CAAAA,CAAamD,CAAiB,EAEpD,CACF,CAAC,EACH,EACA,CACE7F,CAAAA,CACA4E,CAAAA,CACA1J,CAAAA,CACA2J,CAAAA,CACAC,CAAAA,CACAlG,CAAAA,CACAT,CAAAA,CACAuE,CAAAA,CACAqC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,EACAlG,CAAAA,CACAC,CACF,CACF,CACF,CCtIA,IAAMsH,EAAAA,CAAsC,CAAC,CAAE,WAAA,CAAA/D,CAAAA,CAAa,WAAA,CAAAoC,CAAAA,CAAa,aAAA,CAAAlG,CAAc,IAAM,CAC3F,GAAM,CAAE,MAAA,CAAAT,CAAAA,CAAQ,cAAA,CAAA4G,CAAAA,CAAgB,UAAA,CAAAxG,CAAW,CAAA,CAAIjE,CAAAA,EAAe,CACxD,CAACoM,CAAAA,CAAYC,CAAa,CAAA,CAAIjH,cAAAA,CAAS,KAAK,CAAA,CAE5CM,CAAAA,CAAexC,YAAAA,CAAuB,IAAI,CAAA,CAC1C,CAAE,SAAA,CAAAtC,CAAAA,CAAW,KAAA,CAAA0L,CAAAA,CAAO,MAAA,CAAAC,EAAQ,eAAA,CAAAhC,CAAgB,CAAA,CAAInC,CAAAA,CAChDkC,CAAAA,CAAQ1J,CAAAA,GAAc,KAAA,CAEtB4L,CAAAA,CAAoBnC,EAAAA,CAAW,CACnC,YAAA,CAAA3E,CAAAA,CACA,KAAA,CAAA4E,CAAAA,CACA,UAAA1J,CAAAA,CACA,eAAA,CAAA2J,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,aAAA,CAAelG,CAAAA,EAAiB,CAAA,CAChC,MAAA,CAAAT,CAAAA,CACA,WAAA,CAAAuE,CAAAA,CACA,cAAA,CAAAqC,CAAAA,CACA,aAAA,CAAe,IAAM4B,CAAAA,CAAc,IAAI,CAAA,CACvC,WAAA,CAAa,IAAMA,CAAAA,CAAc,KAAK,CACxC,CAAC,CAAA,CAED,OACE1D,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKjD,EACL,KAAA,CAAO,CACL,OAAA,CAAS,MAAA,CACT,aAAA,CAAe4E,CAAAA,CAAQ,KAAA,CAAQ,QAAA,CAC/B,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,QACZ,EAEA,QAAA,CAAA,CAAAhH,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,IAAA,CAAM,CAAA,EAAGiH,CAAe,CAAA,KAAA,CAAA,CAAS,QAAA,CAAU,QAAS,CAAA,CAChE,QAAA,CAAAjH,cAAAA,CAACmJ,GAAA,CAAS,IAAA,CAAMH,CAAAA,CAAO,WAAA,CAAa9B,CAAAA,CAAa,aAAA,CAAelG,CAAAA,CAAe,CAAA,CACjF,CAAA,CACAhB,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,eAAA,EAAkBW,CAAAA,CAAW,SAAW,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK,CAC7D,gBAAA,CAAgBrD,CAAAA,CAChB,eAAA,CAAewL,CAAAA,EAAc,MAAA,CAC7B,KAAA,CAAO,CACL,KAAA,CAAO9B,CAAAA,CAAQ,CAAA,EAAGE,CAAW,CAAA,EAAA,CAAA,CAAO,MAAA,CACpC,MAAA,CAAQF,CAAAA,CAAQ,MAAA,CAAS,CAAA,EAAGE,CAAW,CAAA,EAAA,CAAA,CACvC,MAAA,CAAQF,CAAAA,CAAQ,YAAA,CAAe,YAAA,CAC/B,QAAA,CAAU,UAAA,CACV,OAAQ,EAAA,CACR,UAAA,CAAY,MAAA,CACZ,WAAA,CAAa,MAAA,CACb,SAAA,CAAW,YAAA,CACX,UAAA,CAAY,CACd,CAAA,CACA,aAAA,CAAekC,CAAAA,CACf,IAAA,CAAK,WAAA,CACL,gBAAejC,CAAAA,CACf,eAAA,CAAe,CAAA,CACf,eAAA,CAAe,EAAA,CACjB,CAAA,CACAjH,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,IAAA,CAAM,CAAA,EAAG,GAAA,CAAMiH,CAAe,QAAS,QAAA,CAAU,QAAS,CAAA,CACtE,QAAA,CAAAjH,cAAAA,CAACmJ,EAAAA,CAAA,CAAS,IAAA,CAAMF,CAAAA,CAAQ,WAAA,CAAa/B,CAAAA,CAAa,aAAA,CAAelG,CAAAA,CAAe,CAAA,CAClF,GACF,CAEJ,CAAA,CAEamI,EAAAA,CAAoC,CAAC,CAChD,IAAA,CAAAnM,CAAAA,CACA,WAAA,CAAAkK,CAAAA,CAAc,CAAA,CACd,aAAA,CAAekC,CACjB,CAAA,GAAM,CACJ,GAAM,CACJ,MAAA,CAAA7I,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,QAAA,CAAAjB,CAAAA,CACA,eAAA,CAAA0C,CAAAA,CACA,eAAA,CAAAI,CAAAA,CACA,UAAA,CAAA3B,CAAAA,CACA,gBAAA,CAAAC,EACA,aAAA,CAAeyI,CACjB,CAAA,CAAI3M,CAAAA,EAAe,CAEbsE,CAAAA,CAAgBoI,CAAAA,GAAsB,MAAA,CAAYA,CAAAA,CAAoBC,CAAAA,CAEtElD,CAAAA,CAAgBxD,aAAAA,CAAQ,IACxB3F,CAAAA,GAAS,QAAa,CAACwC,CAAAA,CAAiB,KAAA,CACrCzC,CAAAA,CAAWwD,CAAAA,CAAQf,CAAQ,CAAA,GAAM,IAAA,CACvC,CAACxC,CAAAA,CAAMuD,CAAAA,CAAQf,CAAQ,CAAC,CAAA,CAG3B,GAAIoB,CAAAA,EAAoB,CAAC5D,CAAAA,CACvB,OACEgD,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,KAAA,CAAO,MAAA,CAAQ,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,UAAW,EAC/D,QAAA,CAAAS,CAAAA,CAAWG,CAAgB,CAAA,CAC9B,CAAA,CAIJ,IAAMkE,CAAAA,CAAc9H,CAAAA,GAAS,MAAA,CAAYA,CAAAA,CAAOuD,CAAAA,CAEhD,GAAI,CAACuE,CAAAA,CAAa,OAAO,IAAA,CAEzB,IAAMwE,CAAAA,CAAgB,IAChBxE,CAAAA,CAAY,IAAA,GAAS,MAAA,CAErB9E,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,KAAA,CAAO,MAAA,CAAQ,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,UAAW,CAAA,CAC/D,QAAA,CAAAS,CAAAA,CAAWqE,CAAAA,CAAY,MAAM,CAAA,CAChC,CAAA,CAKF9E,cAAAA,CAAC6I,EAAAA,CAAA,CACC,WAAA,CAAa/D,CAAAA,CACb,WAAA,CAAaoC,EACb,aAAA,CAAelG,CAAAA,CACjB,CAAA,CAKJ,OAAIhE,CAAAA,GAAS,MAAA,CAGTqI,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK/C,CAAAA,CACL,SAAA,CAAW,CAAA,sBAAA,EAJS9C,CAAAA,GAAa,IAAA,EAAQA,IAAa0C,CAAAA,CAIA,iCAAA,CAAoC,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK,CACpG,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,MAAA,CACR,SAAU,QACZ,CAAA,CAEC,QAAA,CAAA,CAAAoH,CAAAA,EAAc,CACftJ,cAAAA,CAACkG,EAAAA,CAAA,CACC,QAAA,CAAU1G,CAAAA,CACV,aAAA,CAAe2G,CAAAA,CACf,oBAAA,CAAsBxF,CAAAA,CAAW,YACnC,CAAA,CAAA,CACF,CAAA,CAIG2I,CAAAA,EACT,ECjKA,IAAMC,EAAAA,CAAiB,gBAAA,CACjBC,EAAAA,CAAsB,cAAA,CA0B5B,SAASC,EAAAA,CAAoBC,CAAAA,CAA4B,CACvD,GAAI,CACF,IAAMC,CAAAA,CAAM,YAAA,CAAa,OAAA,CAAQJ,EAAAA,CAAiBG,CAAG,CAAA,CACrD,GAAIC,CAAAA,GAAQ,IAAA,CAAM,CAChB,IAAMC,CAAAA,CAAS,OAAOD,CAAG,CAAA,CACzB,GAAI,MAAA,CAAO,QAAA,CAASC,CAAM,CAAA,EAAKA,CAAAA,CAAS,CAAA,CAAG,OAAOA,CACpD,CACF,CAAA,KAAQ,CAER,CACA,OAAO,IACT,CAEA,SAASC,EAAAA,CAAqBH,CAAAA,CAAaI,CAAAA,CAAsB,CAC/D,GAAI,CACF,YAAA,CAAa,OAAA,CAAQP,EAAAA,CAAiBG,CAAAA,CAAK,MAAA,CAAO,KAAK,KAAA,CAAMI,CAAM,CAAC,CAAC,EACvE,CAAA,KAAQ,CAER,CACF,CAEO,IAAMC,EAAAA,CAAwD,CAAC,CACpE,QAAA,CAAApI,EACA,MAAA,CAAAkC,CAAAA,CAAS,IAAA,CACT,MAAA,CAAQmG,CAAAA,CACR,cAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,GAAA,CACZ,SAAA,CAAAC,CAAAA,CAAY,CAAA,CAAA,CAAA,CACZ,OAAA,CAAAC,EACA,eAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CAAgB,CAAA,CAChB,SAAA,CAAA5K,CAAAA,CACA,gBAAA,CAAA6K,CACF,CAAA,GAAM,CACJ,IAAMC,CAAAA,CAAaJ,CAAAA,CAAUC,GAAmBb,EAAAA,CAAsB,IAAA,CAEhEiB,CAAAA,CAAmB,IAAc,CACrC,IAAMC,CAAAA,CAAAA,CAAcF,CAAAA,CAAaf,EAAAA,CAAoBe,CAAU,CAAA,CAAI,IAAA,GAASR,CAAAA,EAAc,GAAA,CAC1F,OAAOW,EAAAA,CAAMD,CAAAA,CAAYR,CAAAA,CAAWC,CAAS,CAC/C,CAAA,CAEM,CAACS,CAAAA,CAAgBC,CAAiB,CAAA,CAAI/I,cAAAA,CAAiB2I,CAAgB,CAAA,CACvErI,CAAAA,CAAexC,aAAuB,IAAI,CAAA,CAG1CkL,CAAAA,CAAkBN,CAAAA,CAAaI,CAAAA,CAAkBZ,CAAAA,EAAcY,CAAAA,CAE/DG,CAAAA,CAAoBnL,YAAAA,CAA2BoK,CAAU,CAAA,CAG/DnK,eAAAA,CAAU,IAAM,CACd,GAAImK,CAAAA,GAAe,MAAA,EAAaA,CAAAA,GAAee,CAAAA,CAAkB,OAAA,CAAS,CACxE,IAAMC,CAAAA,CAAUL,EAAAA,CAAMX,CAAAA,CAAYE,CAAAA,CAAWC,CAAS,CAAA,CACtDU,CAAAA,CAAkBG,CAAO,CAAA,CACrBR,CAAAA,EACFX,EAAAA,CAAqBW,CAAAA,CAAYQ,CAAO,EAE5C,CACAD,CAAAA,CAAkB,OAAA,CAAUf,EAC9B,CAAA,CAAG,CAACA,CAAAA,CAAYE,CAAAA,CAAWC,CAAAA,CAAWK,CAAU,CAAC,CAAA,CAGjD,IAAMS,CAAAA,CAAmB1I,iBAAAA,CAAY,IAC5B4H,CAAAA,CACN,CAACA,CAAS,CAAC,CAAA,CAERjB,CAAAA,CAAoB3G,iBAAAA,CACvBxC,CAAAA,EAA0C,CACzCA,CAAAA,CAAE,cAAA,EAAe,CAEjB,IAAM6H,CAAAA,CAAS7H,CAAAA,CAAE,OAAA,CACXmL,CAAAA,CAAcJ,CAAAA,CACdK,EAAAA,CAAoBF,CAAAA,EAAiB,CACrCzE,EAAAA,CAAYzG,CAAAA,CAAE,cAEdqL,CAAAA,CAAeC,EAAAA,CAAgBjJ,CAAAA,CAAa,OAAO,CAAA,CACnDkJ,CAAAA,CAAiBF,CAAAA,CAAeA,CAAAA,CAAa,SAAA,CAAY,CAAA,CAE3DG,CAAAA,CAAc3D,CAAAA,CACd4D,CAAAA,CAAkC,IAAA,CAEhCC,EAAe,CAACC,CAAAA,CAAiBC,CAAAA,GAA6B,CAClE,IAAMC,CAAAA,CAAcD,CAAAA,CAAmBL,CAAAA,CAEjCO,CAAAA,CADaH,CAAAA,CAAU9D,CAAAA,CACGgE,CAAAA,CAC1BE,CAAAA,CAAYnB,EAAAA,CAAMO,EAAcW,CAAAA,CAAY3B,CAAAA,CAAWiB,EAAiB,CAAA,CAE9E,OAAI/I,CAAAA,CAAa,OAAA,GACfA,CAAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAS,CAAA,EAAG0J,CAAS,CAAA,EAAA,CAAA,CAAA,CAE3CA,CACT,CAAA,CAEMC,CAAAA,CAAa,IAAM,CACvB,GAAI,CAACX,CAAAA,CAAc,OAEnB,IAAMY,CAAAA,CACJZ,CAAAA,GAAiB,QAAA,CAAS,eAAA,EAAmBA,CAAAA,GAAiB,SAAS,IAAA,CACnE,CAAE,GAAA,CAAK,CAAA,CAAG,MAAA,CAAQ,MAAA,CAAO,WAA+C,CAAA,CACxEA,CAAAA,CAAa,uBAAsB,CAEnCa,CAAAA,CAAY,EAAA,CACZC,CAAAA,CAAW,EAAA,CAEbN,CAAAA,CAAc,CAAA,CACdL,CAAAA,CAAcS,CAAAA,CAAW,MAAA,CAASC,CAAAA,CAEpCL,CAAAA,CADkB,IAAA,CAAK,GAAA,CAAI,GAAIL,CAAAA,EAAeS,CAAAA,CAAW,MAAA,CAASC,CAAAA,CAAAA,EAAcA,CAAS,CAAA,CAC/DC,CAAAA,CACjBX,CAAAA,CAAcS,CAAAA,CAAW,GAAA,CAAMC,CAAAA,GAExCL,CAAAA,CAAc,CADI,IAAA,CAAK,IAAI,CAAA,CAAA,CAAII,CAAAA,CAAW,GAAA,CAAMC,CAAAA,CAAYV,CAAAA,EAAeU,CAAS,CAAA,CACzDC,CAAAA,CAAAA,CAGzBN,CAAAA,GAAgB,CAAA,GAClBR,CAAAA,CAAa,SAAA,EAAaQ,CAAAA,CAC1BH,CAAAA,CAAaF,EAAaH,CAAAA,CAAa,SAAS,CAAA,CAAA,CAGlDI,CAAAA,CAAmB,qBAAA,CAAsBO,CAAU,EACrD,CAAA,CAGAP,CAAAA,CAAmB,qBAAA,CAAsBO,CAAU,CAAA,CAEnDzF,EAAAA,CAAkB,CAChB,OAAQ,YAAA,CACR,SAAA,CAAAE,EAAAA,CACA,MAAA,CAAS0B,CAAAA,EAA4B,CACnCqD,CAAAA,CAAcrD,CAAAA,CAAU,OAAA,CACpBkD,CAAAA,EACFK,CAAAA,CAAaF,CAAAA,CAAaH,CAAAA,CAAa,SAAS,EAEpD,CAAA,CACA,KAAA,CAAO,IAAM,CACPI,CAAAA,GAAqB,IAAA,EACvB,oBAAA,CAAqBA,CAAgB,CAAA,CAIvC,IAAIW,CAAAA,CAAcjB,CAAAA,CACd9I,CAAAA,CAAa,OAAA,GACf+J,EAAc/J,CAAAA,CAAa,OAAA,CAAQ,qBAAA,EAAsB,CAAE,MAAA,CAAA,CAE7D+J,CAAAA,CAAcxB,EAAAA,CAAMwB,CAAAA,CAAajC,CAAAA,CAAWiB,EAAiB,CAAA,CAG7DN,CAAAA,CAAkBsB,CAAW,CAAA,CAEzBlC,GACFA,CAAAA,CAAekC,CAAW,CAAA,CAExB3B,CAAAA,EACFX,EAAAA,CAAqBW,CAAAA,CAAY2B,CAAW,EAEhD,CACF,CAAC,EACH,CAAA,CACA,CAACrB,CAAAA,CAAiBZ,CAAAA,CAAWe,CAAAA,CAAkBhB,CAAAA,CAAgBO,CAAU,CAC3E,CAAA,CAEA,OAAK3G,CAAAA,CAiBHwB,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKjD,CAAAA,CACL,SAAA,CAAW,CAAA,2BAAA,EAA8B1C,CAAAA,EAAa,EAAE,GAAG,IAAA,EAAK,CAChE,KAAA,CAAO,CACL,MAAA,CAAQ,CAAA,EAAGoL,CAAe,CAAA,EAAA,CAAA,CAC1B,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,QAAA,CACV,SAAA,CAAW,YACb,EAGA,QAAA,CAAA,CAAA9K,cAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,MAAA,CAAQ,CAAA,YAAA,EAAesK,CAAa,CAAA,GAAA,CAAA,CACpC,QAAA,CAAU,QACZ,CAAA,CAEC,QAAA,CAAA3I,CAAAA,CACH,EAGA3B,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,wBAAA,EAA2BuK,CAAAA,EAAoB,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK,CACpE,KAAA,CAAO,CACL,MAAA,CAAQ,CAAA,EAAGD,CAAa,KACxB,MAAA,CAAQ,YAAA,CACR,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,MAAA,CACZ,WAAA,CAAa,MAAA,CACb,SAAA,CAAW,YAAA,CACX,UAAA,CAAY,CACd,EACA,aAAA,CAAepB,CAAAA,CACf,IAAA,CAAK,WAAA,CACL,kBAAA,CAAiB,YAAA,CACjB,eAAA,CAAe,IAAA,CAAK,KAAA,CAAM4B,CAAe,CAAA,CACzC,eAAA,CAAeZ,CAAAA,CACf,eAAA,CAAeC,IAAc,CAAA,CAAA,CAAA,CAAW,MAAA,CAAYA,CAAAA,CACtD,CAAA,CAAA,CACF,CAAA,CAvDEnK,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,oCAAA,EAAuCN,CAAAA,EAAa,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK,CACzE,MAAO,CACL,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,QAAA,CACV,SAAA,CAAW,YACb,CAAA,CAEA,QAAA,CAAAM,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,MAAA,CAAQ,MAAA,CAAQ,QAAA,CAAU,QAAS,CAAA,CAAI,QAAA,CAAA2B,CAAAA,CAAS,CAAA,CAChE,CA+CN,EAEA,SAASgJ,EAAAA,CAAMyB,CAAAA,CAAeC,CAAAA,CAAaC,EAAqB,CAC9D,OAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAKF,CAAK,CAAC,CAC3C,CAEA,SAASf,EAAAA,CAAgBnN,EAA8C,CACrE,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,CAACA,CAAAA,CACpC,OAAO,IAAA,CAGT,IAAMqO,CAAAA,CAASrO,CAAAA,CAAK,aAAA,CACpB,GAAI,CAACqO,CAAAA,CACH,OAAO,QAAA,CAAS,eAAA,CAIlB,IAAMC,CAAAA,CADQ,MAAA,CAAO,gBAAA,CAAiBD,CAAM,CAAA,CACpB,SAAA,CAGxB,OAFqBC,CAAAA,GAAc,MAAA,EAAUA,IAAc,QAAA,CAGlDD,CAAAA,CAGFlB,EAAAA,CAAgBkB,CAAM,CAC/B,CChRO,IAAME,EAAAA,CAAmBjQ,mBAAAA,CAA8C,IAAI,ECWlF,IAAMkQ,EAAAA,CAA2D,CAC/D,GAAA,CAAK,CACH,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,KAAA,CACN,KAAA,CAAO,MACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,KAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,KAAA,CACL,KAAM,CAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,IAAK,KAAA,CACL,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,MAAA,CAAQ,CACN,SAAU,UAAA,CACV,GAAA,CAAK,KAAA,CACL,IAAA,CAAM,KAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CACF,EAEMC,EAAAA,CAAwD,CAC5D,GAAA,CAAK,CACH,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,KAAA,CACR,OAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,MAAO,CAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,IAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,MAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,OACf,SAAA,CAAW,YACb,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,EACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CACF,CAAA,CAEMC,EAAAA,CAAoC,CAAC,CAAE,EAAA,CAAAjH,CAAAA,CAAI,QAAA,CAAAC,EAAU,eAAA,CAAAC,CAAgB,CAAA,GAAM,CAC/E,GAAM,CAAE,UAAA,CAAAC,CAAAA,CAAY,MAAA,CAAAC,CAAO,CAAA,CAAIC,iBAAAA,CAAa,CAAE,EAAA,CAAAL,CAAG,CAAC,CAAA,CAClD,OACEN,eAAAA,CAAAY,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAjG,cAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAK8F,CAAAA,CAAY,KAAA,CAAO4G,EAAAA,CAAoB9G,CAAQ,EAAG,CAAA,CAC3DG,CAAAA,EAAU/F,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW6F,CAAAA,CAAiB,KAAA,CAAO8G,EAAAA,CAAiB/G,CAAQ,CAAA,CAAG,CAAA,CAAA,CACjF,CAEJ,CAAA,CAWaiH,EAAAA,CAA4B,CAAC,CAAE,EAAA,CAAAlH,CAAAA,CAAI,QAAA,CAAAhE,CAAAA,CAAU,KAAA,CAAAmL,CAAM,CAAA,GAAM,CACpE,GAAM,CAAE,MAAA,CAAAvM,CAAAA,CAAQ,QAAA,CAAAf,EAAU,UAAA,CAAAmB,CAAAA,CAAY,gBAAA,CAAAC,CAAAA,CAAkB,QAAA,CAAAE,CAAAA,CAAU,kBAAA,CAAAD,CAAmB,CAAA,CACnFnE,CAAAA,EAAe,CACX,CAAE,UAAA,CAAAK,CAAAA,CAAY,kBAAA,CAAAgC,CAAmB,CAAA,CAAIlC,EAAAA,EAAiB,CACtDkQ,CAAAA,CAAgBvN,CAAAA,GAAa,IAAA,EAAQA,CAAAA,GAAamG,CAAAA,CAElD,CAAE,UAAA,CAAAqH,CAAAA,CAAY,SAAA,CAAAC,CAAAA,CAAW,UAAA,CAAAnH,EAAY,UAAA,CAAAoH,CAAW,CAAA,CAAIC,iBAAAA,CAAa,CAAE,EAAA,CAAAxH,CAAG,CAAC,CAAA,CACvEyH,CAAAA,CAAW5N,CAAAA,GAAamG,CAAAA,EAAMuH,CAAAA,CAC9BG,CAAAA,CAAezM,IAAqB+E,CAAAA,CAGpC2H,CAAAA,CADW3K,aAAAA,CAAQ,IAAM5E,CAAAA,CAASwC,CAAAA,CAAQoF,CAAE,CAAA,CAAG,CAACpF,CAAAA,CAAQoF,CAAE,CAAC,CAAA,EACtC,QAAA,CAErB4H,EAA+B5K,aAAAA,CACnC,KAAO,CACL,UAAA,CAAYyK,CAAAA,CACZ,YAAA,CAAAC,CAAAA,CACA,gBAAA,CAAkB,IAAMxM,CAAAA,GAAqBwM,CAAAA,CAAe,IAAA,CAAO1H,CAAE,CAAA,CACrE,OAAQ,IAAM,CACR0H,CAAAA,EACFxM,CAAAA,GAAqB,IAAI,CAAA,CAEvBC,CAAAA,CACFA,CAAAA,CAAS6E,CAAE,CAAA,CAEX5I,CAAAA,CAAW4I,CAAE,EAEjB,CAAA,CACA,SAAA2H,CAAAA,CACA,cAAA,CAAiBtO,CAAAA,EAAY,CAC3BD,CAAAA,CAAmB4G,CAAAA,CAAI3G,CAAO,EAChC,CACF,CAAA,CAAA,CACA,CACEoO,CAAAA,CACAC,CAAAA,CACAxM,CAAAA,CACA8E,EACA7E,CAAAA,CACA/D,CAAAA,CACAuQ,CAAAA,CACAvO,CACF,CACF,CAAA,CAGMyO,CAAAA,CAAe7K,aAAAA,CACnB,KAAO,CACL,GAAGsK,CAAAA,CACH,GAAGD,CACL,GACA,CAACC,CAAAA,CAAWD,CAAU,CACxB,CAAA,CAEA,OACEhN,cAAAA,CAACyM,EAAAA,CAAiB,QAAA,CAAjB,CAA0B,KAAA,CAAOe,CAAAA,CAChC,QAAA,CAAAnI,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKS,CAAAA,CACL,SAAA,CAAWnF,CAAAA,CAAW,IAAA,CACtB,KAAA,CAAO,CAAE,QAAA,CAAU,UAAA,CAAY,KAAA,CAAO,MAAA,CAAQ,MAAA,CAAQ,MAAA,CAAQ,GAAGmM,CAAM,EAEtE,QAAA,CAAA,CAAAnL,CAAAA,CAAS4L,CAAW,CAAA,CAEpBR,CAAAA,EACC1H,eAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,EACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CAEE,QAAA,CAAA,CAAA,CAAC,KAAA,CAAO,QAAA,CAAU,MAAA,CAAQ,OAAO,EAAY,GAAA,CAAKgB,CAAAA,EAClDrG,cAAAA,CAAC4M,EAAAA,CAAA,CAEC,EAAA,CAAI,CAAA,KAAA,EAAQvG,CAAG,CAAA,CAAA,EAAIV,CAAE,CAAA,CAAA,CACrB,QAAA,CAAUU,CAAAA,CACV,eAAA,CAAiB1F,EAAW,WAAA,CAAA,CAHvB0F,CAIP,CACD,CAAA,CACDrG,cAAAA,CAAC4M,EAAAA,CAAA,CACC,EAAA,CAAI,CAAA,YAAA,EAAejH,CAAE,CAAA,CAAA,CACrB,QAAA,CAAS,QAAA,CACT,eAAA,CAAiBhF,EAAW,WAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,ECtNO,IAAM8M,GAAwC,CAAC,CAAE,QAAA,CAAA9L,CAAAA,CAAU,SAAA,CAAAjC,CAAAA,CAAW,KAAA,CAAAoN,CAAM,CAAA,GAAM,CACvF,IAAMY,CAAAA,CAAY9Q,gBAAAA,CAAW6P,EAAgB,EAC7C,GAAI,CAACiB,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAAA,CAE7D,OACE1N,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWN,CAAAA,CACX,KAAA,CAAO,CAAE,MAAA,CAAQ,MAAA,CAAQ,UAAA,CAAY,MAAA,CAAQ,WAAA,CAAa,MAAA,CAAQ,GAAGoN,CAAM,CAAA,CAC1E,GAAGY,CAAAA,CAEH,QAAA,CAAA/L,CAAAA,CACH,CAEJ","file":"index.cjs","sourcesContent":["import { createContext } from 'react'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\n","import { useContext } 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.cjs","sourcesContent":["import { createContext } from 'react'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\n","import { useContext } 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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -248,10 +248,6 @@ declare function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode;
|
|
|
248
248
|
* Tree Helper: Update split percentage recursively.
|
|
249
249
|
*/
|
|
250
250
|
declare function updateSplitPercentage(tree: TreeNode | null, target: SplitNode, newPercentage: number): TreeNode | null;
|
|
251
|
-
/**
|
|
252
|
-
* Tree Helper: Split the entire tree at the root using a dragged pane.
|
|
253
|
-
*/
|
|
254
|
-
declare function splitRoot(tree: TreeNode | null, draggingId: string, splitType: 'left' | 'right' | 'top' | 'bottom'): TreeNode | null;
|
|
255
251
|
/**
|
|
256
252
|
* Find a PaneNode by its paneId.
|
|
257
253
|
*/
|
|
@@ -286,4 +282,4 @@ interface DragSessionConfig {
|
|
|
286
282
|
}
|
|
287
283
|
declare function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void;
|
|
288
284
|
|
|
289
|
-
export { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_RESIZER_SIZE, DEFAULT_SNAP_THRESHOLD, DragHandle, type DragHandleProps, type DragSessionConfig, Pane, type PaneNode, type PaneProps, type PaneRenderProps, PaneTree, ResizableContainer, type ResizableContainerProps, type SplitDirection, type SplitNode, type TreeNode, Zeugma, type ZeugmaActionsValue, type ZeugmaClassNames, type ZeugmaProps, type ZeugmaStateValue, addPane, createDragSession, findPane, removePane, splitPane,
|
|
285
|
+
export { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_RESIZER_SIZE, DEFAULT_SNAP_THRESHOLD, DragHandle, type DragHandleProps, type DragSessionConfig, Pane, type PaneNode, type PaneProps, type PaneRenderProps, PaneTree, ResizableContainer, type ResizableContainerProps, type SplitDirection, type SplitNode, type TreeNode, Zeugma, type ZeugmaActionsValue, type ZeugmaClassNames, type ZeugmaProps, type ZeugmaStateValue, addPane, createDragSession, findPane, removePane, splitPane, swapPanes, updatePaneMetadata, updateSplitPercentage, useResizer, useZeugmaActions, useZeugmaState };
|
package/dist/index.d.ts
CHANGED
|
@@ -248,10 +248,6 @@ declare function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode;
|
|
|
248
248
|
* Tree Helper: Update split percentage recursively.
|
|
249
249
|
*/
|
|
250
250
|
declare function updateSplitPercentage(tree: TreeNode | null, target: SplitNode, newPercentage: number): TreeNode | null;
|
|
251
|
-
/**
|
|
252
|
-
* Tree Helper: Split the entire tree at the root using a dragged pane.
|
|
253
|
-
*/
|
|
254
|
-
declare function splitRoot(tree: TreeNode | null, draggingId: string, splitType: 'left' | 'right' | 'top' | 'bottom'): TreeNode | null;
|
|
255
251
|
/**
|
|
256
252
|
* Find a PaneNode by its paneId.
|
|
257
253
|
*/
|
|
@@ -286,4 +282,4 @@ interface DragSessionConfig {
|
|
|
286
282
|
}
|
|
287
283
|
declare function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void;
|
|
288
284
|
|
|
289
|
-
export { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_RESIZER_SIZE, DEFAULT_SNAP_THRESHOLD, DragHandle, type DragHandleProps, type DragSessionConfig, Pane, type PaneNode, type PaneProps, type PaneRenderProps, PaneTree, ResizableContainer, type ResizableContainerProps, type SplitDirection, type SplitNode, type TreeNode, Zeugma, type ZeugmaActionsValue, type ZeugmaClassNames, type ZeugmaProps, type ZeugmaStateValue, addPane, createDragSession, findPane, removePane, splitPane,
|
|
285
|
+
export { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_RESIZER_SIZE, DEFAULT_SNAP_THRESHOLD, DragHandle, type DragHandleProps, type DragSessionConfig, Pane, type PaneNode, type PaneProps, type PaneRenderProps, PaneTree, ResizableContainer, type ResizableContainerProps, type SplitDirection, type SplitNode, type TreeNode, Zeugma, type ZeugmaActionsValue, type ZeugmaClassNames, type ZeugmaProps, type ZeugmaStateValue, addPane, createDragSession, findPane, removePane, splitPane, swapPanes, updatePaneMetadata, updateSplitPercentage, useResizer, useZeugmaActions, useZeugmaState };
|