react-zeugma 6.0.0 → 6.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.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/hooks.ts","../src/shared/config/constants.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/lib/json.ts","../src/entities/zeugma/model/useZeugma.ts","../src/shared/lib/drag-session.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../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","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx"],"names":["useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","isMountedRef","registerPortalTarget","useCallback","tabId","el","prev","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","addPane","metadata","insert","node","parentDirection","updateSplitPercentage","target","newPercentage","findPaneById","findPaneContainingTab","findTabById","pane","index","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","addTab","targetPaneId","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","calculateTabDropIndex","tabs","activeType","overTabId","overTabPosition","safeJsonStringify","val","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","dragActivationDistance","snapThreshold","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","onDismissIntentChange","layout","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","layoutBeforeDrag","setLayoutBeforeDrag","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","next","setLayout","nextLayoutOrUpdater","handleRemovePane","handleAddPane","handleAddTab","targetPane","sourcePane","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","ZeugmaDragContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaDrag","drag","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","useZeugmaDnd","props","setOverTabId","setOverTabPosition","containerRectRef","setIsOverLocked","sensors","useSensors","useSensor","customCollisionDetection","isTabDrag","pointerCollisions","pointerWithin","filteredCollisions","collision","tabDroppables","container","closestCenter","rawId","draggingId","ae","layoutAfterSelect","parentPane","newLayout","over","overIdStr","isOverLockedPane","tabDropMatch","overRect","px","coords","center","containerRect","py","distance","dx","dy","activeRect","cx","cy","active","wasDismissIntent","originalLayout","match","dropZone","isParentTarget","isOnlyTab","CursorOverlay","render","className","ref","handleMove","jsx","PortalHostItem","React","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","Zeugma","internalProps","renderPane","renderDragOverlay","classNames","children","dnd","stableRenderPane","stableClassNames","useMemo","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","ids","traverse","portalRegistryValue","jsxs","DndContext","id","useResizer","isRow","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","Fragment","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","isFullscreen","isDismissActive","handleRef","dashboardClass","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","activeClassName","setNodeRef","isOver","useDroppable","Pane","propLocked","targetRef","globalLocked","portalRegistry","paneNode","paneContainerId","activeTabId","tabsMetadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","useDraggable","dragging","renderActiveTab","renderProps","contextValue","paneClass","DragHandle","dragProps","disabled","TabContext","useTabContext","context","Tab","tabsContext","TabsContext","setDragRef","isDragging","setDropRef","isTargetOver","separator","isActive","selectThisTab","removeThisTab","tabContextValue","resolveDynamicProp","Tabs","renderTab","styles","globalClassNames","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useRef, useState, useCallback } from 'react'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const registerPortalTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n return { portalTargets, registerPortalTarget }\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 { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\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: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\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 if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : 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: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(\n tree: TreeNode | null,\n paneToAdd: string,\n metadata?: Record<string, unknown>,\n): TreeNode {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n }\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: {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n },\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 ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Update metadata on a specific tab node using an updater function.\n */\nexport function updateTabMetadata(\n tree: TreeNode | null,\n tabId: 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.tabs.includes(tabId)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[tabId]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[tabId]\n } else {\n newTabsMetadata[tabId] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: updateTabMetadata(tree.first, tabId, updater) ?? tree.first,\n second: updateTabMetadata(tree.second, tabId, updater) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a tab directly to a specific target pane node.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === targetPaneId) {\n const newTabs = [...tree.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = tree.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...tree.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: addTab(tree.first, targetPaneId, tabId, metadata) || tree.first,\n second: addTab(tree.second, targetPaneId, tabId, metadata) || tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabs: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTab = activeType === 'tab'\n const isHoveredTabInThisPane = isDraggingTab && overTabId && tabs.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabs.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n} from '../../../shared'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n removePane,\n addPane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n const [layoutBeforeDrag, setLayoutBeforeDrag] = useState<TreeNode | null>(null)\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Keep layout and callback refs in sync to make actions and queries completely stable\n const layoutRef = useRef<TreeNode | null>(layout)\n layoutRef.current = layout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n onFullscreenChangeRef.current = onFullscreenChange\n\n const setFullscreenPaneId = useCallback((paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChangeRef.current?.(paneId)\n }, [])\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layoutRef.current\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n layoutRef.current = next\n setLocalLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n const setLayout = handleSetLayout\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddPane = useCallback(\n wrapMutation((prev, paneId: string, metadata?: Record<string, unknown>) =>\n addPane(prev, paneId, metadata),\n ),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, targetPaneId: string, tabId: string, metadata?: Record<string, unknown>) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n\n const sourcePane = findPaneContainingTab(prev, tabId)\n const isAlreadyInTarget = sourcePane && sourcePane.id === targetPane.id\n\n const cleanedPrev = isAlreadyInTarget ? prev : (removeTab(prev, tabId) ?? prev)\n return addTab(cleanedPrev, targetPane.id, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateTabMetadata = useCallback(\n wrapMutation(\n (\n prev,\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateTabMetadata(prev, tabId, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback(\n (paneId: string) => findPaneById(layoutRef.current, paneId),\n [],\n )\n\n const handleFindPaneContainingTab = useCallback(\n (tabId: string) => findPaneContainingTab(layoutRef.current, tabId),\n [],\n )\n\n const handleFindTabById = useCallback(\n (tabId: string) => findTabById(layoutRef.current, tabId),\n [],\n )\n\n return {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Config options\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane: handleRemovePane,\n addPane: handleAddPane,\n addTab: handleAddTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n } as ZeugmaController\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 { createContext, useContext } from 'react'\nimport {\n ZeugmaStateValue,\n ZeugmaActionsValue,\n PortalRegistryValue,\n ZeugmaDragStateValue,\n} from '../model/types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\nexport const ZeugmaDragContext = createContext<ZeugmaDragStateValue | undefined>(undefined)\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\nexport const useZeugmaDrag = (): ZeugmaDragStateValue => {\n const drag = useContext(ZeugmaDragContext)\n if (!drag) {\n throw new Error('useZeugmaDrag must be used within a Zeugma provider')\n }\n return drag\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaContextValue } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaContextValue => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return { ...state, ...actions }\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 { useState, useRef, useCallback, Dispatch, SetStateAction } from 'react'\nimport {\n useSensor,\n useSensors,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n pointerWithin,\n closestCenter,\n CollisionDetection,\n DroppableContainer,\n} from '@dnd-kit/core'\nimport { SplitDirection, PaneNode, ZeugmaController } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab as moveTabHelper,\n selectTab as selectTabHelper,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps extends ZeugmaController {\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n activeId,\n setActiveId,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n useBodyCursorOverride(isOverLocked)\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 customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // If we're dragging a pane, filter out any tab-drop colliders\n const filteredCollisions = isTabDrag\n ? pointerCollisions\n : pointerCollisions.filter((collision) => !collision.id.toString().startsWith('tab-drop-'))\n\n if (filteredCollisions.length > 0) return filteredCollisions\n\n if (isTabDrag) {\n const tabDroppables = args.droppableContainers.filter((container: DroppableContainer) =>\n container.id.toString().startsWith('tab-drop-'),\n )\n return closestCenter({ ...args, droppableContainers: tabDroppables })\n }\n return []\n }, [])\n\n const handleDragStart = (event: DragStartEvent) => {\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n setActiveId(draggingId)\n setActiveType(isTabDrag ? 'tab' : 'pane')\n setOverTabId(null)\n setOverTabPosition(null)\n\n const ae = event.activatorEvent\n latestPointerRef.current = getPointerCoordinates(ae)\n\n if (enableDragToDismiss && containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n\n let layoutAfterSelect = layout\n if (isTabDrag) {\n const parentPane = findPaneContainingTab(layout, draggingId)\n if (parentPane) {\n layoutAfterSelect = selectTabHelper(layout, parentPane.id, draggingId) || layout\n }\n }\n\n setLayoutBeforeDrag(layoutAfterSelect)\n\n const newLayout = isTabDrag\n ? removeTabHelper(layoutAfterSelect, draggingId)\n : removePaneHelper(layoutAfterSelect, draggingId)\n setLayout(newLayout)\n\n if (onDragStart) {\n onDragStart(draggingId)\n }\n }\n\n const handleDragMove = (event: DragMoveEvent) => {\n const { over } = event\n const overIdStr = over?.id.toString() || ''\n const isOverLockedPane = overIdStr.startsWith('drop-locked-')\n setIsOverLocked((prev) => (prev === isOverLockedPane ? prev : isOverLockedPane))\n\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n // Handle tab drop hover location\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch && over && isTabDrag) {\n const [, targetTabId] = tabDropMatch\n\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n setOverTabId((prev) => (prev === targetTabId ? prev : targetTabId))\n setOverTabPosition((prev) => (prev === position ? prev : position))\n } else {\n setOverTabId((prev) => (prev === null ? prev : null))\n setOverTabPosition((prev) => (prev === null ? prev : null))\n }\n } else {\n setOverTabId((prev) => (prev === null ? prev : null))\n setOverTabPosition((prev) => (prev === null ? prev : null))\n }\n\n if (!enableDragToDismiss) return\n\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n py = latestPointerRef.current.y\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n py = coords.y + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n onDismissIntentChange?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n const { active, over } = event\n const rawId = active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n // Capture the original layout before drag\n const originalLayout = layoutBeforeDrag || layout\n setLayoutBeforeDrag(null)\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n removeTab(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n if (overIdStr.startsWith('drop-locked-')) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n // Check for tab reorder drop\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch) {\n if (!isTabDrag) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n const [, targetTabId] = tabDropMatch\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n const newLayout = moveTabHelper(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\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 setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n const parentPane = isTabDrag\n ? findPaneContainingTab(originalLayout, draggingId)\n : findPaneById(originalLayout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabs.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n\n let draggedPaneNode: PaneNode\n if (isTabDrag) {\n const originalPane = findPaneContainingTab(originalLayout, draggingId)\n const sourceMetadata = originalPane?.tabsMetadata?.[draggingId]\n draggedPaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(originalLayout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n // Since the item was already removed from layout on drag start, we split the current layout (which has the dragged item removed)\n const newLayout = splitPaneHelper(\n layout,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLayout(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 handleDragCancel = () => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n if (layoutBeforeDrag !== null) {\n setLayout(layoutBeforeDrag)\n setLayoutBeforeDrag(null)\n }\n }\n\n return {\n sensors,\n collisionDetection: customCollisionDetection,\n onDragStart: handleDragStart,\n onDragMove: handleDragMove,\n onDragEnd: handleDragEnd,\n onDragCancel: handleDragCancel,\n }\n}\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 React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface PortalHostItemProps {\n tabId: string\n target: HTMLDivElement | null\n renderWidget?: (tabId: string) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = React.memo(\n ({ tabId, target, renderWidget }) => {\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabId), wrapper)\n },\n)\n","import React, { useState, useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\nimport {\n TreeNode,\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaDragContext,\n ZeugmaDragStateValue,\n ZeugmaProps,\n} from '../../../shared'\nimport { usePortalRegistry, useZeugmaDnd } from '../model'\nimport { CursorOverlay } from './CursorOverlay'\nimport { PortalHostItem } from './PortalHostItem'\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const internalProps = props\n const {\n renderPane,\n renderWidget,\n renderDragOverlay,\n classNames = {},\n children,\n\n // Controller state\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n layoutBeforeDrag,\n\n // Configuration settings\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n\n // Callbacks\n onRemove,\n onResizeStart,\n onResize,\n onResizeEnd,\n\n // Actions\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n } = internalProps\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const dnd = useZeugmaDnd({\n ...internalProps,\n setOverTabId,\n setOverTabPosition,\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.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n setLayout,\n renderPane: stableRenderPane,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n }),\n [\n layout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n stableRenderPane,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n ],\n )\n\n // Collect all tab IDs in the current layout tree\n const allTabIds = useMemo(() => {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabs.forEach((tabId) => {\n ids.add(tabId)\n })\n } else {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n if (layoutBeforeDrag) {\n traverse(layoutBeforeDrag)\n }\n return Array.from(ids).sort()\n }, [layout, activeId, layoutBeforeDrag])\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n }),\n [registerPortalTarget],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <ZeugmaDragContext.Provider value={dragValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => renderDragOverlay(id, activeType!)}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => (\n <PortalHostItem\n key={tabId}\n tabId={tabId}\n target={portalTargets[tabId] || null}\n renderWidget={renderWidget}\n />\n ))}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection, useZeugmaState } from '../../../shared'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode } from '../../../shared'\nimport { ComputedSplitter, computeLayout } from '../../../shared/lib/tree'\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 FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, setLayout, classNames, locked } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange: setLayout,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(var(--splitter-pos-${splitter.id}, ${left}%) - ${resizerSize / 2}px)`,\n top: `calc(${top}% + ${resizerSize / 2}px)`,\n width: `${resizerSize}px`,\n height: `calc(${height}% - ${resizerSize}px)`,\n cursor: locked ? 'default' : 'col-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `calc(${left}% + ${resizerSize / 2}px)`,\n top: `calc(var(--splitter-pos-${splitter.id}, ${top}%) - ${resizerSize / 2}px)`,\n width: `calc(${width}% - ${resizerSize}px)`,\n height: `${resizerSize}px`,\n cursor: locked ? 'default' : 'row-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={classNames.resizer || ''}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nconst MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (id: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\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 locked,\n classNames,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={className}\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={className}\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={resizerClassName}\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 React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React, { useMemo, useCallback, useEffect, useContext, useRef } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaActions, PortalRegistryContext } from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\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 full: {\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 /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const targetRef = useRef<HTMLDivElement | null>(null)\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updateTabMetadata, selectTab, removeTab } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Pane must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const paneNode = useMemo(() => findPaneById(layout, id), [layout, id])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderActiveTab = useCallback(() => {\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className=\"zeugma-tab-content-wrapper\"\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }, [activeTabId])\n\n // Register portal targets using targetRef to avoid race conditions during drag & layout changes\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\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 removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateTabMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateTabMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateTabMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n renderActiveTab,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\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 </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\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 <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || ''}\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 const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { TabsContext } from './Tabs'\n\nexport interface TabContextValue {\n tabId: string\n isActive: boolean\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n locked: boolean\n selectTab: () => void\n removeTab: () => void\n}\n\nexport const TabContext = createContext<TabContextValue | undefined>(undefined)\n\nexport const useTabContext = () => {\n const context = useContext(TabContext)\n if (!context) {\n throw new Error('useTabContext must be used within a Tab component')\n }\n return context\n}\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const { locked: globalLocked, classNames = {}, activeType } = useZeugmaState()\n const { overTabId } = useZeugmaDrag()\n\n const tabsContext = useContext(TabsContext)\n const isLocked = locked || globalLocked || (tabsContext?.locked ?? false)\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked || activeType === 'pane',\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n\n const tabs = tabsContext?.tabs || []\n const index = tabs.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabs[index - 1] !== activeTabId\n\n const separator = showSeparator ? <div className={classNames.tabSeparator} /> : null\n\n const isActive = tabsContext ? tabsContext.activeTabId === id : false\n const metadata = tabsContext?.tabsMetadata?.[id]\n\n const selectThisTab = useCallback(() => {\n tabsContext?.selectTab(id)\n }, [tabsContext, id])\n\n const removeThisTab = useCallback(() => {\n tabsContext?.removeTab(id)\n }, [tabsContext, id])\n\n const tabContextValue = useMemo<TabContextValue>(\n () => ({\n tabId: id,\n isActive,\n isDragging,\n isOver: isTargetOver,\n metadata,\n locked: isLocked,\n selectTab: selectThisTab,\n removeTab: removeThisTab,\n }),\n [id, isActive, isDragging, isTargetOver, metadata, isLocked, selectThisTab, removeThisTab],\n )\n\n return (\n <TabContext.Provider value={tabContextValue}>\n <div\n ref={handleRef}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {separator}\n {children({\n isDragging,\n isOver: isTargetOver,\n })}\n </div>\n </TabContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Tab } from './Tab'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\n\nexport interface TabsContextValue {\n tabs: string[]\n activeTabId: string\n locked: boolean\n tabsMetadata?: Record<string, Record<string, unknown>>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(undefined)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component')\n }\n return context\n}\n\nexport interface TabsProps {\n /** The list of tab IDs in this pane. */\n tabs: string[]\n /** The currently active tab ID. */\n activeTabId: string\n /** Whether dragging is locked on these tabs. */\n locked?: boolean\n /** Metadata for the tabs. */\n tabsMetadata?: Record<string, Record<string, unknown>>\n /** Callback when a tab is selected. */\n selectTab: (id: string) => void\n /** Callback when a tab is closed/removed. */\n removeTab: (id: string) => void\n /** Render function for each individual tab content. */\n renderTab: (props: {\n tabId: string\n activeTabId: string\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n }) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n tabs,\n activeTabId,\n locked = false,\n tabsMetadata,\n selectTab,\n removeTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const { classNames: globalClassNames = {}, activeType } = useZeugmaState()\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabs,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabs, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabs, activeType, overTabId, overTabPosition)\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div\n className={classNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n ...styles?.container,\n }}\n >\n {tabs.map((tabId, index) => {\n const metadata = tabsMetadata?.[tabId]\n const resolvedClassName = resolveDynamicProp(classNames?.tab, tabId)\n const resolvedStyle = resolveDynamicProp(styles?.tab, tabId)\n\n const showPreviewHere = index === targetIndex\n\n return (\n <React.Fragment key={tabId}>\n {showPreviewHere && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: index === 0 ? 'none' : 'translateX(-50%)',\n }}\n />\n </div>\n )}\n <Tab id={tabId} locked={locked} className={resolvedClassName} style={resolvedStyle}>\n {({ isDragging, isOver }) =>\n renderTab({\n tabId,\n activeTabId,\n isDragging,\n isOver,\n metadata,\n selectTab,\n removeTab,\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabs.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/entities/zeugma/model/hooks.ts","../src/shared/config/constants.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/lib/json.ts","../src/entities/zeugma/model/useZeugma.ts","../src/shared/lib/drag-session.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../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","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx"],"names":["useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","isMountedRef","registerPortalTarget","useCallback","tabId","el","prev","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","addPane","metadata","insert","node","parentDirection","updateSplitPercentage","target","newPercentage","findPaneById","findPaneContainingTab","findTabById","pane","index","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","addTab","targetPaneId","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","calculateTabDropIndex","tabs","activeType","overTabId","overTabPosition","safeJsonStringify","val","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","dragActivationDistance","snapThreshold","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","onDismissIntentChange","layout","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","layoutBeforeDrag","setLayoutBeforeDrag","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","next","setLayout","nextLayoutOrUpdater","handleRemovePane","handleAddPane","handleAddTab","targetPane","sourcePane","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","ZeugmaDragContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaDrag","drag","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","useZeugmaDnd","props","setOverTabId","setOverTabPosition","containerRectRef","setIsOverLocked","sensors","useSensors","useSensor","customCollisionDetection","isTabDrag","pointerCollisions","pointerWithin","filteredCollisions","collision","tabDroppables","container","closestCenter","rawId","draggingId","ae","layoutAfterSelect","parentPane","over","overIdStr","isOverLockedPane","tabDropMatch","overRect","px","coords","center","containerRect","py","distance","dx","dy","activeRect","cx","cy","active","wasDismissIntent","originalLayout","newLayout","match","dropZone","isParentTarget","isOnlyTab","cleanLayout","CursorOverlay","render","className","ref","handleMove","jsx","PortalHostItem","React","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","Zeugma","internalProps","renderPane","renderDragOverlay","classNames","children","dnd","stableRenderPane","stableClassNames","useMemo","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","ids","traverse","portalRegistryValue","jsxs","DndContext","id","useResizer","isRow","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","Fragment","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","isFullscreen","isDismissActive","handleRef","dashboardClass","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","activeClassName","setNodeRef","isOver","useDroppable","Pane","propLocked","targetRef","globalLocked","portalRegistry","paneNode","paneContainerId","activeTabId","tabsMetadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","useDraggable","dragging","renderActiveTab","renderProps","contextValue","paneClass","DragHandle","dragProps","disabled","TabContext","useTabContext","context","Tab","tabsContext","TabsContext","setDragRef","isDragging","setDropRef","isTargetOver","separator","isActive","selectThisTab","removeThisTab","tabContextValue","resolveDynamicProp","Tabs","renderTab","styles","globalClassNames","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useRef, useState, useCallback } from 'react'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const registerPortalTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n return { portalTargets, registerPortalTarget }\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 { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\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: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\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 if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : 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: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(\n tree: TreeNode | null,\n paneToAdd: string,\n metadata?: Record<string, unknown>,\n): TreeNode {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n }\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: {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n },\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 ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Update metadata on a specific tab node using an updater function.\n */\nexport function updateTabMetadata(\n tree: TreeNode | null,\n tabId: 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.tabs.includes(tabId)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[tabId]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[tabId]\n } else {\n newTabsMetadata[tabId] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: updateTabMetadata(tree.first, tabId, updater) ?? tree.first,\n second: updateTabMetadata(tree.second, tabId, updater) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a tab directly to a specific target pane node.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === targetPaneId) {\n const newTabs = [...tree.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = tree.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...tree.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: addTab(tree.first, targetPaneId, tabId, metadata) || tree.first,\n second: addTab(tree.second, targetPaneId, tabId, metadata) || tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabs: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTab = activeType === 'tab'\n const isHoveredTabInThisPane = isDraggingTab && overTabId && tabs.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabs.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n} from '../../../shared'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n removePane,\n addPane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n const [layoutBeforeDrag, setLayoutBeforeDrag] = useState<TreeNode | null>(null)\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Keep layout and callback refs in sync to make actions and queries completely stable\n const layoutRef = useRef<TreeNode | null>(layout)\n layoutRef.current = layout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n onFullscreenChangeRef.current = onFullscreenChange\n\n const setFullscreenPaneId = useCallback((paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChangeRef.current?.(paneId)\n }, [])\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layoutRef.current\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n layoutRef.current = next\n setLocalLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n const setLayout = handleSetLayout\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddPane = useCallback(\n wrapMutation((prev, paneId: string, metadata?: Record<string, unknown>) =>\n addPane(prev, paneId, metadata),\n ),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, targetPaneId: string, tabId: string, metadata?: Record<string, unknown>) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n\n const sourcePane = findPaneContainingTab(prev, tabId)\n const isAlreadyInTarget = sourcePane && sourcePane.id === targetPane.id\n\n const cleanedPrev = isAlreadyInTarget ? prev : (removeTab(prev, tabId) ?? prev)\n return addTab(cleanedPrev, targetPane.id, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateTabMetadata = useCallback(\n wrapMutation(\n (\n prev,\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateTabMetadata(prev, tabId, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback(\n (paneId: string) => findPaneById(layoutRef.current, paneId),\n [],\n )\n\n const handleFindPaneContainingTab = useCallback(\n (tabId: string) => findPaneContainingTab(layoutRef.current, tabId),\n [],\n )\n\n const handleFindTabById = useCallback(\n (tabId: string) => findTabById(layoutRef.current, tabId),\n [],\n )\n\n return {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Config options\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane: handleRemovePane,\n addPane: handleAddPane,\n addTab: handleAddTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n } as ZeugmaController\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 { createContext, useContext } from 'react'\nimport {\n ZeugmaStateValue,\n ZeugmaActionsValue,\n PortalRegistryValue,\n ZeugmaDragStateValue,\n} from '../model/types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\nexport const ZeugmaDragContext = createContext<ZeugmaDragStateValue | undefined>(undefined)\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\nexport const useZeugmaDrag = (): ZeugmaDragStateValue => {\n const drag = useContext(ZeugmaDragContext)\n if (!drag) {\n throw new Error('useZeugmaDrag must be used within a Zeugma provider')\n }\n return drag\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaContextValue } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaContextValue => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return { ...state, ...actions }\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 { useState, useRef, useCallback, Dispatch, SetStateAction } from 'react'\nimport {\n useSensor,\n useSensors,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n pointerWithin,\n closestCenter,\n CollisionDetection,\n DroppableContainer,\n} from '@dnd-kit/core'\nimport { SplitDirection, PaneNode, ZeugmaController } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab as moveTabHelper,\n selectTab as selectTabHelper,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps extends ZeugmaController {\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n activeId,\n setActiveId,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n useBodyCursorOverride(isOverLocked)\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 customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // If we're dragging a pane, filter out any tab-drop colliders\n const filteredCollisions = isTabDrag\n ? pointerCollisions\n : pointerCollisions.filter((collision) => !collision.id.toString().startsWith('tab-drop-'))\n\n if (filteredCollisions.length > 0) return filteredCollisions\n\n if (isTabDrag) {\n const tabDroppables = args.droppableContainers.filter((container: DroppableContainer) =>\n container.id.toString().startsWith('tab-drop-'),\n )\n return closestCenter({ ...args, droppableContainers: tabDroppables })\n }\n return []\n }, [])\n\n const handleDragStart = (event: DragStartEvent) => {\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n setActiveId(draggingId)\n setActiveType(isTabDrag ? 'tab' : 'pane')\n setOverTabId(null)\n setOverTabPosition(null)\n\n const ae = event.activatorEvent\n latestPointerRef.current = getPointerCoordinates(ae)\n\n if (enableDragToDismiss && containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n\n let layoutAfterSelect = layout\n if (isTabDrag) {\n const parentPane = findPaneContainingTab(layout, draggingId)\n if (parentPane) {\n layoutAfterSelect = selectTabHelper(layout, parentPane.id, draggingId) || layout\n }\n }\n\n setLayoutBeforeDrag(layoutAfterSelect)\n if (isTabDrag && layoutAfterSelect !== layout) {\n setLayout(layoutAfterSelect)\n }\n\n if (onDragStart) {\n onDragStart(draggingId)\n }\n }\n\n const handleDragMove = (event: DragMoveEvent) => {\n const { over } = event\n const overIdStr = over?.id.toString() || ''\n const isOverLockedPane = overIdStr.startsWith('drop-locked-')\n setIsOverLocked((prev) => (prev === isOverLockedPane ? prev : isOverLockedPane))\n\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n // Handle tab drop hover location\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch && over && isTabDrag) {\n const [, targetTabId] = tabDropMatch\n\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n setOverTabId((prev) => (prev === targetTabId ? prev : targetTabId))\n setOverTabPosition((prev) => (prev === position ? prev : position))\n } else {\n setOverTabId((prev) => (prev === null ? prev : null))\n setOverTabPosition((prev) => (prev === null ? prev : null))\n }\n } else {\n setOverTabId((prev) => (prev === null ? prev : null))\n setOverTabPosition((prev) => (prev === null ? prev : null))\n }\n\n if (!enableDragToDismiss) return\n\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n py = latestPointerRef.current.y\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n py = coords.y + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n onDismissIntentChange?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n const { active, over } = event\n const rawId = active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n // Capture the original layout before drag\n const originalLayout = layoutBeforeDrag || layout\n setLayoutBeforeDrag(null)\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n removeTab(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n if (overIdStr.startsWith('drop-locked-')) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n // Check for tab reorder drop\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch) {\n if (!isTabDrag) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n const [, targetTabId] = tabDropMatch\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n const newLayout = moveTabHelper(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\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 setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n const parentPane = isTabDrag\n ? findPaneContainingTab(originalLayout, draggingId)\n : findPaneById(originalLayout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabs.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n setLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n\n let draggedPaneNode: PaneNode\n if (isTabDrag) {\n const originalPane = findPaneContainingTab(originalLayout, draggingId)\n const sourceMetadata = originalPane?.tabsMetadata?.[draggingId]\n draggedPaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(originalLayout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n // We need to first remove the dragged tab/pane from the original layout tree before splitting.\n const cleanLayout = isTabDrag\n ? removeTabHelper(originalLayout, draggingId)\n : removePaneHelper(originalLayout, draggingId)\n\n const newLayout = splitPaneHelper(\n cleanLayout,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLayout(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 handleDragCancel = () => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n if (layoutBeforeDrag !== null) {\n setLayout(layoutBeforeDrag)\n setLayoutBeforeDrag(null)\n }\n }\n\n return {\n sensors,\n collisionDetection: customCollisionDetection,\n onDragStart: handleDragStart,\n onDragMove: handleDragMove,\n onDragEnd: handleDragEnd,\n onDragCancel: handleDragCancel,\n }\n}\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 React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface PortalHostItemProps {\n tabId: string\n target: HTMLDivElement | null\n renderWidget?: (tabId: string) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = React.memo(\n ({ tabId, target, renderWidget }) => {\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabId), wrapper)\n },\n)\n","import React, { useState, useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\nimport {\n TreeNode,\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaDragContext,\n ZeugmaDragStateValue,\n ZeugmaProps,\n} from '../../../shared'\nimport { usePortalRegistry, useZeugmaDnd } from '../model'\nimport { CursorOverlay } from './CursorOverlay'\nimport { PortalHostItem } from './PortalHostItem'\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const internalProps = props\n const {\n renderPane,\n renderWidget,\n renderDragOverlay,\n classNames = {},\n children,\n\n // Controller state\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n layoutBeforeDrag,\n\n // Configuration settings\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n\n // Callbacks\n onRemove,\n onResizeStart,\n onResize,\n onResizeEnd,\n\n // Actions\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n } = internalProps\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const dnd = useZeugmaDnd({\n ...internalProps,\n setOverTabId,\n setOverTabPosition,\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.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n setLayout,\n renderPane: stableRenderPane,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n }),\n [\n layout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n stableRenderPane,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n ],\n )\n\n // Collect all tab IDs in the current layout tree\n const allTabIds = useMemo(() => {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabs.forEach((tabId) => {\n ids.add(tabId)\n })\n } else {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n if (layoutBeforeDrag) {\n traverse(layoutBeforeDrag)\n }\n return Array.from(ids).sort()\n }, [layout, activeId, layoutBeforeDrag])\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n }),\n [registerPortalTarget],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <ZeugmaDragContext.Provider value={dragValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => renderDragOverlay(id, activeType!)}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => (\n <PortalHostItem\n key={tabId}\n tabId={tabId}\n target={portalTargets[tabId] || null}\n renderWidget={renderWidget}\n />\n ))}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection, useZeugmaState } from '../../../shared'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode } from '../../../shared'\nimport { ComputedSplitter, computeLayout } from '../../../shared/lib/tree'\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 FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, setLayout, classNames, locked } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange: setLayout,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(var(--splitter-pos-${splitter.id}, ${left}%) - ${resizerSize / 2}px)`,\n top: `calc(${top}% + ${resizerSize / 2}px)`,\n width: `${resizerSize}px`,\n height: `calc(${height}% - ${resizerSize}px)`,\n cursor: locked ? 'default' : 'col-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `calc(${left}% + ${resizerSize / 2}px)`,\n top: `calc(var(--splitter-pos-${splitter.id}, ${top}%) - ${resizerSize / 2}px)`,\n width: `calc(${width}% - ${resizerSize}px)`,\n height: `${resizerSize}px`,\n cursor: locked ? 'default' : 'row-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={classNames.resizer || ''}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nconst MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (id: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\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 locked,\n classNames,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={className}\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={className}\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={resizerClassName}\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 React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React, { useMemo, useCallback, useEffect, useContext, useRef } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaActions, PortalRegistryContext } from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\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 full: {\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 /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const targetRef = useRef<HTMLDivElement | null>(null)\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updateTabMetadata, selectTab, removeTab } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Pane must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const paneNode = useMemo(() => findPaneById(layout, id), [layout, id])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderActiveTab = useCallback(() => {\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className=\"zeugma-tab-content-wrapper\"\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }, [activeTabId])\n\n // Register portal targets using targetRef to avoid race conditions during drag & layout changes\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\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 removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateTabMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateTabMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateTabMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n renderActiveTab,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\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 </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\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 <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || ''}\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 const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { TabsContext } from './Tabs'\n\nexport interface TabContextValue {\n tabId: string\n isActive: boolean\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n locked: boolean\n selectTab: () => void\n removeTab: () => void\n}\n\nexport const TabContext = createContext<TabContextValue | undefined>(undefined)\n\nexport const useTabContext = () => {\n const context = useContext(TabContext)\n if (!context) {\n throw new Error('useTabContext must be used within a Tab component')\n }\n return context\n}\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const { locked: globalLocked, classNames = {}, activeType } = useZeugmaState()\n const { overTabId } = useZeugmaDrag()\n\n const tabsContext = useContext(TabsContext)\n const isLocked = locked || globalLocked || (tabsContext?.locked ?? false)\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked || activeType === 'pane',\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n\n const tabs = tabsContext?.tabs || []\n const index = tabs.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabs[index - 1] !== activeTabId\n\n const separator = showSeparator ? <div className={classNames.tabSeparator} /> : null\n\n const isActive = tabsContext ? tabsContext.activeTabId === id : false\n const metadata = tabsContext?.tabsMetadata?.[id]\n\n const selectThisTab = useCallback(() => {\n tabsContext?.selectTab(id)\n }, [tabsContext, id])\n\n const removeThisTab = useCallback(() => {\n tabsContext?.removeTab(id)\n }, [tabsContext, id])\n\n const tabContextValue = useMemo<TabContextValue>(\n () => ({\n tabId: id,\n isActive,\n isDragging,\n isOver: isTargetOver,\n metadata,\n locked: isLocked,\n selectTab: selectThisTab,\n removeTab: removeThisTab,\n }),\n [id, isActive, isDragging, isTargetOver, metadata, isLocked, selectThisTab, removeThisTab],\n )\n\n return (\n <TabContext.Provider value={tabContextValue}>\n <div\n ref={handleRef}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {separator}\n {children({\n isDragging,\n isOver: isTargetOver,\n })}\n </div>\n </TabContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Tab } from './Tab'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\n\nexport interface TabsContextValue {\n tabs: string[]\n activeTabId: string\n locked: boolean\n tabsMetadata?: Record<string, Record<string, unknown>>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(undefined)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component')\n }\n return context\n}\n\nexport interface TabsProps {\n /** The list of tab IDs in this pane. */\n tabs: string[]\n /** The currently active tab ID. */\n activeTabId: string\n /** Whether dragging is locked on these tabs. */\n locked?: boolean\n /** Metadata for the tabs. */\n tabsMetadata?: Record<string, Record<string, unknown>>\n /** Callback when a tab is selected. */\n selectTab: (id: string) => void\n /** Callback when a tab is closed/removed. */\n removeTab: (id: string) => void\n /** Render function for each individual tab content. */\n renderTab: (props: {\n tabId: string\n activeTabId: string\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n }) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n tabs,\n activeTabId,\n locked = false,\n tabsMetadata,\n selectTab,\n removeTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const { classNames: globalClassNames = {}, activeType } = useZeugmaState()\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabs,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabs, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabs, activeType, overTabId, overTabPosition)\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div\n className={classNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n ...styles?.container,\n }}\n >\n {tabs.map((tabId, index) => {\n const metadata = tabsMetadata?.[tabId]\n const resolvedClassName = resolveDynamicProp(classNames?.tab, tabId)\n const resolvedStyle = resolveDynamicProp(styles?.tab, tabId)\n\n const showPreviewHere = index === targetIndex\n\n return (\n <React.Fragment key={tabId}>\n {showPreviewHere && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: index === 0 ? 'none' : 'translateX(-50%)',\n }}\n />\n </div>\n )}\n <Tab id={tabId} locked={locked} className={resolvedClassName} style={resolvedStyle}>\n {({ isDragging, isOver }) =>\n renderTab({\n tabId,\n activeTabId,\n isDragging,\n isOver,\n metadata,\n selectTab,\n removeTab,\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabs.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n"]}
|