react-zeugma 6.3.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -157
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +69 -52
- package/dist/index.d.ts +69 -52
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/{types-Diujkc-H.d.cts → types-B9LrYapR.d.cts} +109 -131
- package/dist/{types-Diujkc-H.d.ts → types-B9LrYapR.d.ts} +109 -131
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +17 -10
- package/dist/utils.d.ts +17 -10
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.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/entities/zeugma/ui/RootDropZones.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/DropZone.tsx","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx","../src/entities/pane/ui/Widget.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","insertLeaf","leafNode","insert","node","parentDirection","addWidget","widgetId","metadata","addTab","targetPaneId","targetPane","findPaneById","appendTabToTarget","newPane","updateSplitPercentage","target","newPercentage","findPaneContainingTab","findTabById","pane","index","updateMetadata","id","updater","currentTabsMetadata","currentTabMeta","newTabMeta","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","handleSetLayout","nextLayoutOrUpdater","_internalSetLayout","setLayout","handleRemovePane","handleAddWidget","handleAddTab","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateMetadata","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","a","b","aId","bId","aIsTab","bIsTab","aIsRoot","bIsRoot","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","rootMatch","fraction","rawEdge","edge","cleanLayout","isRow","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","activationPositions","previewPositions","RootDropZone","activeClassName","setNodeRef","isOver","useDroppable","previewStyle","Fragment","RootDropZones","zone","useResizer","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","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","isFullscreen","isDismissActive","handleRef","dashboardClass","DragListenersCtx","DropZone","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","value","Tabs","renderTab","styles","globalClassNames","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere","Widget","widgetNode","find","n","isWidgetLocked","renderActiveWidget","widgetClass"],"mappings":"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","file":"index.js","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, LeafNode } 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' || tree.type === 'widget') {\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 === 'widget') {\n return tree\n }\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 or widget 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 | LeafNode,\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' || tree.type === 'widget') {\n if (tree.id === targetId) {\n const addedNode: LeafNode =\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 * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: LeafNode): TreeNode {\n if (tree === null) {\n return leafNode\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane' || node.type === 'widget') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: leafNode,\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: Add a widget by splitting the rightmost/bottommost pane/widget.\n */\nexport function addWidget(\n tree: TreeNode | null,\n widgetId: string,\n metadata?: Record<string, unknown>,\n): TreeNode {\n return insertLeaf(tree, {\n type: 'widget',\n id: widgetId,\n metadata,\n })\n}\n\n/**\n * Tree Helper: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\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 }\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 or WidgetNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): LeafNode | null {\n if (tree === null) return null\n if (tree.type === 'pane' || tree.type === 'widget') {\n return tree.id === paneId ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\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 if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\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 or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: 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(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'widget') {\n if (tree.id === id) {\n return {\n ...tree,\n metadata: updater(tree.metadata),\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget 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' || tree.type === 'widget') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as LeafNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n if (tree.type === 'split') {\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 return tree\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 if (tree.type === 'split') {\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 return tree\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 if (node.type === 'widget') {\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\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 if (node.type === 'widget') {\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\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: LeafNode\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' || node.type === 'widget') {\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 addTab,\n addWidget,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\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 // Internal setter used by DnD — does NOT reset transient states\n const _internalSetLayout = handleSetLayout\n\n // Public setter — resets transient states when layout is replaced programmatically\n const setLayout = useCallback(\n (nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setLocalFullscreenPaneId(null)\n onFullscreenChangeRef.current?.(null)\n setLayoutBeforeDrag(null)\n setActiveId(null)\n setActiveType(null)\n setDismissIntentId(null)\n handleSetLayout(nextLayoutOrUpdater)\n },\n [handleSetLayout],\n )\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 handleAddWidget = useCallback(\n wrapMutation((prev, widgetId: string, metadata?: Record<string, unknown>) =>\n addWidget(prev, widgetId, metadata),\n ),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n const cleanedPrev = removeTab(prev, tabId) ?? prev\n return addTab(cleanedPrev, targetPaneId, 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 handleUpdateMetadata = useCallback(\n wrapMutation(\n (\n prev,\n id: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateMetadata(prev, id, 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 _internalSetLayout,\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 addWidget: handleAddWidget,\n addTab: handleAddTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateMetadata: handleUpdateMetadata,\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, TreeNode, ZeugmaController, LeafNode } 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 _internalSetLayout: 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) {\n const sortedCollisions = [...filteredCollisions].sort((a, b) => {\n const aId = a.id.toString()\n const bId = b.id.toString()\n\n if (isTabDrag) {\n const aIsTab = aId.startsWith('tab-drop-')\n const bIsTab = bId.startsWith('tab-drop-')\n if (aIsTab && !bIsTab) return -1\n if (!aIsTab && bIsTab) return 1\n }\n\n const aIsRoot = aId.startsWith('drop-root-')\n const bIsRoot = bId.startsWith('drop-root-')\n if (aIsRoot && !bIsRoot) return -1\n if (!aIsRoot && bIsRoot) return 1\n\n return 0\n })\n return sortedCollisions\n }\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 root split drop\n const rootMatch = overIdStr.match(/^drop-root-(1\\/4|1\\/3)-(top|bottom|left|right|start|end)$/)\n if (rootMatch) {\n const [, fraction, rawEdge] = rootMatch\n let edge = rawEdge\n if (edge === 'start') edge = 'left'\n if (edge === 'end') edge = 'right'\n\n const cleanLayout = isTabDrag\n ? removeTabHelper(originalLayout, draggingId)\n : removePaneHelper(originalLayout, draggingId)\n\n let draggedPaneNode: LeafNode\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 if (cleanLayout === null) {\n setLayout(draggedPaneNode)\n } else {\n const isRow = edge === 'left' || edge === 'right'\n const isFirst = edge === 'left' || edge === 'top'\n let splitPercentage = 50\n if (fraction === '1/4') {\n splitPercentage = isFirst ? 25 : 75\n } else if (fraction === '1/3') {\n splitPercentage = isFirst ? 100 / 3 : 200 / 3\n }\n\n const newLayout: TreeNode = {\n type: 'split',\n direction: isRow ? 'row' : 'column',\n first: isFirst ? draggedPaneNode : cleanLayout,\n second: isFirst ? cleanLayout : draggedPaneNode,\n splitPercentage,\n }\n setLayout(newLayout)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction: edge === 'left' || edge === 'right' ? 'row' : 'column',\n position: edge as 'left' | 'right' | 'top' | 'bottom',\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.type === 'widget' || 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: LeafNode\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 addWidget,\n addTab,\n updateMetadata,\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.rootDropPreview,\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 addWidget,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addWidget,\n addTab,\n updateMetadata,\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 and widget 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 if (node.type === 'widget') {\n ids.add(node.id)\n } else if (node.type === 'split') {\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 from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\ninterface RootDropZoneProps {\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nconst activationPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n top: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n bottom: {\n '1/4': {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n bottom: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n left: {\n '1/4': {\n position: 'absolute',\n left: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n left: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n right: {\n '1/4': {\n position: 'absolute',\n right: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n right: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n}\n\nconst previewPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n top: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n '1/3': {\n top: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n },\n bottom: {\n '1/4': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n left: {\n '1/4': {\n left: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n '1/3': {\n left: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n },\n right: {\n '1/4': {\n right: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n right: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n}\n\nconst RootDropZone: React.FC<RootDropZoneProps> = ({ id, fraction, edge, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n\n const previewStyle: React.CSSProperties = {\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 101,\n boxSizing: 'border-box',\n ...previewPositions[edge][fraction],\n }\n\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[edge][fraction]} />\n {isOver && <div className={activeClassName} style={previewStyle} />}\n </>\n )\n}\n\ninterface RootDropZonesProps {\n activeClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({ activeClassName }) => {\n const zones: Array<{\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n }> = [\n { id: 'drop-root-1/4-top', fraction: '1/4', edge: 'top' },\n { id: 'drop-root-1/3-top', fraction: '1/3', edge: 'top' },\n { id: 'drop-root-1/4-bottom', fraction: '1/4', edge: 'bottom' },\n { id: 'drop-root-1/3-bottom', fraction: '1/3', edge: 'bottom' },\n { id: 'drop-root-1/4-left', fraction: '1/4', edge: 'left' },\n { id: 'drop-root-1/3-left', fraction: '1/3', edge: 'left' },\n { id: 'drop-root-1/4-right', fraction: '1/4', edge: 'right' },\n { id: 'drop-root-1/3-right', fraction: '1/3', edge: 'right' },\n ]\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99,\n pointerEvents: 'none',\n }}\n >\n {zones.map((zone) => (\n <RootDropZone\n key={zone.id}\n id={zone.id}\n fraction={zone.fraction}\n edge={zone.edge}\n activeClassName={activeClassName}\n />\n ))}\n </div>\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'\nimport { RootDropZones } from '../../../entities/zeugma/ui'\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 {activeId !== null && !locked && (\n <RootDropZones activeClassName={classNames.rootDropPreview ?? classNames.dropPreview} />\n )}\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, { 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 from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nexport interface 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\nexport const 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","import React, { useMemo, useCallback, useEffect, useContext, useRef } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaActions, PortalRegistryContext, PaneNode } from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\nimport { DropZone } from './DropZone'\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, updateMetadata, 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) as PaneNode | null, [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 updateMetadata(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 updateMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateMetadata,\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","import React, { useMemo, useCallback, useEffect, useContext, useRef } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n LeafNode,\n TreeNode,\n} from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { WidgetRenderProps } from '../model/types'\nimport { DropZone } from './DropZone'\n\nexport interface WidgetProps {\n /** The unique ID of the widget, matching a `id` in the layout tree schema. */\n id: string\n /** Render prop function providing widget state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: WidgetRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the widget outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific widget. */\n locked?: boolean\n}\n\nexport const Widget: React.FC<WidgetProps> = ({\n id,\n children,\n style,\n locked: propLocked = false,\n}) => {\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, updateMetadata } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Widget must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const widgetNode = useMemo(() => {\n if (!layout) return null\n if (layout.type !== 'split' && layout.id === id) return layout\n function find(n: TreeNode | null): LeafNode | null {\n if (!n) return null\n if (n.type !== 'split' && n.id === id) return n\n if (n.type === 'split') {\n return find(n.first) ?? find(n.second)\n }\n return null\n }\n return find(layout)\n }, [layout, id])\n\n const localLocked = widgetNode?.locked ?? false\n const isWidgetLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isWidgetLocked\n const isDroppableDisabled = globalLocked || isWidgetLocked\n\n const showDropZones = activeId !== null && activeId !== id && !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId === id\n const isFullscreen = fullscreenPaneId === id\n\n const renderActiveWidget = useCallback(() => {\n return (\n <div\n ref={targetRef}\n id={`zeugma-widget-target-${id}`}\n className=\"zeugma-widget-content-wrapper\"\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }, [id])\n\n // Register portal targets using targetRef to avoid race conditions during drag & layout changes\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(id, el)\n return () => {\n registerPortalTarget(id, null)\n }\n }, [id, registerPortalTarget])\n\n const metadata = widgetNode && 'metadata' in widgetNode ? widgetNode.metadata : undefined\n\n const renderProps: WidgetRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(id)\n },\n metadata,\n updateMetadata: (updater) => {\n updateMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n renderActiveWidget,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removePane,\n metadata,\n updateMetadata,\n isDraggableDisabled,\n renderActiveWidget,\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 widgetClass = `${classNames.pane || ''} ${\n isWidgetLocked ? classNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={widgetClass}\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/lib/json.ts","../src/entities/zeugma/model/useZeugma.ts","../src/shared/config/constants.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/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../src/entities/zeugma/ui/RootDropZones.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/DropZone.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx","../src/entities/pane/ui/PaneControls.tsx","../src/entities/pane/ui/Pane.tsx"],"names":["useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","renderCallbacksRef","isMountedRef","registerPortalTarget","useCallback","tabId","el","prev","next","registerRenderCallback","render","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","insertLeaf","leafNode","insert","node","parentDirection","addTab","targetPaneId","metadata","targetPane","findPaneById","appendTabToTarget","newPane","updateSplitPercentage","target","newPercentage","findPaneContainingTab","findTabById","pane","index","getTabMetadata","getActiveTabMetadata","updateMetadata","id","updater","currentTabsMetadata","currentTabMeta","newTabMeta","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","layout","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","layoutBeforeDrag","setLayoutBeforeDrag","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","layoutBeforeDragRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","handleSetLayout","nextLayoutOrUpdater","_internalSetLayout","setLayout","handleRemovePane","handleAddTab","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","tab","handleGetTabMetadata","handleGetActiveTabMetadata","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","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","dragActivationDistance","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onDismissIntentChange","containerRectRef","setIsOverLocked","sensors","useSensors","useSensor","customCollisionDetection","isTabDrag","pointerCollisions","pointerWithin","filteredCollisions","collision","a","b","aId","bId","aIsTab","bIsTab","aIsRoot","bIsRoot","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","rootMatch","fraction","rawEdge","edge","cleanLayout","isRow","match","dropZone","isParentTarget","isOnlyTab","CursorOverlay","className","ref","handleMove","jsx","PortalHostItem","React","tabDetails","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","useResizer","resizerSize","snapThreshold","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","minSplitPercentage","maxSplitPercentage","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","classNames","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","renderPane","Fragment","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","useMemo","renderContent","jsxs","isFullscreen","isDismissActive","handleRef","dashboardClass","RootDropZones","Zeugma","controller","renderDragOverlay","onResizeStart","onResize","onResizeEnd","internalController","dnd","stableClassNames","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","ids","traverse","portalRegistryValue","DndContext","activationPositions","previewPositions","RootDropZone","activeClassName","setNodeRef","isOver","useDroppable","previewStyle","zone","DragListenersCtx","DropZone","DragHandle","children","dragProps","disabled","TabContext","Tab","globalLocked","tabsContext","TabsContext","attributes","listeners","setDragRef","isDragging","useDraggable","setDropRef","isTargetOver","activeTabId","separator","isActive","selectThisTab","removeThisTab","tabContextValue","resolveDynamicProp","value","Tabs","propTabs","propActiveTabId","propLocked","propTabsMetadata","propSelectTab","propRemoveTab","renderTab","styles","paneContext","PaneContext","tabsMetadata","globalClassNames","contextValue","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere","PaneControls","usePaneContext","context","PaneContent","targetRef","portalRegistry","renderCallback","Pane","paneNode","paneContainerId","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","dragging","renderProps","paneClass"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useRef, useState, useCallback } from 'react'\nimport { TabDetails } from '../../../shared'\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 renderCallbacksRef = useRef<Record<string, (tab: TabDetails) => React.ReactNode>>({})\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 (!el) {\n if (!prev[tabId]) return prev\n const next = { ...prev }\n delete next[tabId]\n return next\n }\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n const registerRenderCallback = useCallback(\n (tabId: string, render: (tab: TabDetails) => React.ReactNode) => {\n renderCallbacksRef.current[tabId] = render\n },\n [],\n )\n\n return { portalTargets, registerPortalTarget, registerRenderCallback, renderCallbacksRef }\n}\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 or widget 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 * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: PaneNode): TreeNode {\n if (tree === null) {\n return leafNode\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: leafNode,\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: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\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 }\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 or WidgetNode 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 if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\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 if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\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 * Get the metadata for a specific tab by its ID.\n */\nexport function getTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneContainingTab(tree, tabId)\n return pane?.tabsMetadata?.[tabId]\n}\n\n/**\n * Get the metadata of the active item (either tab or pane).\n */\n/**\n * Get the metadata of the active tab in a specific pane.\n */\nexport function getActiveTabMetadata(\n tree: TreeNode | null,\n paneId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneById(tree, paneId)\n return pane?.tabsMetadata?.[pane.activeTabId]\n}\n\n/**\n * Update metadata on a specific tab or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: 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(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget 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 if (tree.type === 'split') {\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 return tree\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 if (tree.type === 'split') {\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 return tree\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 if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\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 if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\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 ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n removePane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\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 } = 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 layoutBeforeDragRef = useRef<TreeNode | null>(layoutBeforeDrag)\n layoutBeforeDragRef.current = layoutBeforeDrag\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 // Internal setter used by DnD — does NOT reset transient states\n const _internalSetLayout = handleSetLayout\n\n // Public setter — resets transient states when layout is replaced programmatically\n const setLayout = useCallback(\n (nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setLocalFullscreenPaneId(null)\n onFullscreenChangeRef.current?.(null)\n setLayoutBeforeDrag(null)\n setActiveId(null)\n setActiveType(null)\n setDismissIntentId(null)\n handleSetLayout(nextLayoutOrUpdater)\n },\n [handleSetLayout],\n )\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 handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n const cleanedPrev = removeTab(prev, tabId) ?? prev\n return addTab(cleanedPrev, targetPaneId, 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 handleUpdateMetadata = useCallback(\n wrapMutation(\n (\n prev,\n id: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateMetadata(prev, id, 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((paneId: string) => {\n let pane = findPaneById(layoutRef.current, paneId)\n if (!pane && layoutBeforeDragRef.current) {\n pane = findPaneById(layoutBeforeDragRef.current, paneId)\n }\n return pane\n }, [])\n\n const handleFindPaneContainingTab = useCallback((tabId: string) => {\n let pane = findPaneContainingTab(layoutRef.current, tabId)\n if (!pane && layoutBeforeDragRef.current) {\n pane = findPaneContainingTab(layoutBeforeDragRef.current, tabId)\n }\n return pane\n }, [])\n\n const handleFindTabById = useCallback((tabId: string) => {\n let tab = findTabById(layoutRef.current, tabId)\n if (!tab && layoutBeforeDragRef.current) {\n tab = findTabById(layoutBeforeDragRef.current, tabId)\n }\n return tab\n }, [])\n\n const handleGetTabMetadata = useCallback((tabId: string) => {\n let metadata = getTabMetadata(layoutRef.current, tabId)\n if (!metadata && layoutBeforeDragRef.current) {\n metadata = getTabMetadata(layoutBeforeDragRef.current, tabId)\n }\n return metadata\n }, [])\n\n const handleGetActiveTabMetadata = useCallback((paneId: string) => {\n let metadata = getActiveTabMetadata(layoutRef.current, paneId)\n if (!metadata && layoutBeforeDragRef.current) {\n metadata = getActiveTabMetadata(layoutBeforeDragRef.current, paneId)\n }\n return metadata\n }, [])\n\n const controller: ZeugmaControllerInternal = {\n layout,\n setLayout,\n _internalSetLayout,\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 // Actions\n removePane: handleRemovePane,\n addTab: handleAddTab,\n updateMetadata: handleUpdateMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n getTabMetadata: handleGetTabMetadata,\n getActiveTabMetadata: handleGetActiveTabMetadata,\n }\n\n return controller\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","/**\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, ZeugmaController } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaController => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return {\n layout: state.layout,\n setLayout: state.setLayout,\n fullscreenPaneId: state.fullscreenPaneId,\n setFullscreenPaneId: actions.setFullscreenPaneId,\n locked: state.locked,\n setLocked: actions.setLocked,\n removePane: actions.removePane,\n addTab: actions.addTab,\n updateMetadata: actions.updateMetadata,\n updatePaneLock: actions.updatePaneLock,\n selectTab: actions.selectTab,\n mergeTab: actions.mergeTab,\n removeTab: actions.removeTab,\n splitPane: actions.splitPane,\n updateSplitPercentage: actions.updateSplitPercentage,\n moveTab: actions.moveTab,\n findPaneById: state.findPaneById,\n findPaneContainingTab: state.findPaneContainingTab,\n findTabById: state.findTabById,\n getTabMetadata: state.getTabMetadata,\n getActiveTabMetadata: state.getActiveTabMetadata,\n }\n}\n","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nexport class SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n","import { 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, TreeNode, PaneNode } 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 {\n layout: TreeNode | null\n _internalSetLayout: Dispatch<SetStateAction<TreeNode | null>>\n layoutBeforeDrag: TreeNode | null\n setLayoutBeforeDrag: Dispatch<SetStateAction<TreeNode | null>>\n activeId: string | null\n setActiveId: Dispatch<SetStateAction<string | null>>\n activeType: 'pane' | 'tab' | null\n setActiveType: Dispatch<SetStateAction<'pane' | 'tab' | null>>\n dismissIntentId: string | null\n setDismissIntentId: Dispatch<SetStateAction<string | null>>\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n containerRef: React.RefObject<HTMLElement | null>\n\n // Config\n dragActivationDistance: number\n enableDragToDismiss: boolean\n dismissThreshold: number\n\n // Callbacks\n onRemove?: (paneId: string) => void\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onDismissIntentChange?: (paneId: string | null) => void\n\n // Actions\n removeTab: (tabId: string) => void\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n _internalSetLayout: 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) {\n const sortedCollisions = [...filteredCollisions].sort((a, b) => {\n const aId = a.id.toString()\n const bId = b.id.toString()\n\n if (isTabDrag) {\n const aIsTab = aId.startsWith('tab-drop-')\n const bIsTab = bId.startsWith('tab-drop-')\n if (aIsTab && !bIsTab) return -1\n if (!aIsTab && bIsTab) return 1\n }\n\n const aIsRoot = aId.startsWith('drop-root-')\n const bIsRoot = bId.startsWith('drop-root-')\n if (aIsRoot && !bIsRoot) return -1\n if (!aIsRoot && bIsRoot) return 1\n\n return 0\n })\n return sortedCollisions\n }\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 root split drop\n const rootMatch = overIdStr.match(/^drop-root-(1\\/4|1\\/3)-(top|bottom|left|right|start|end)$/)\n if (rootMatch) {\n const [, fraction, rawEdge] = rootMatch\n let edge = rawEdge\n if (edge === 'start') edge = 'left'\n if (edge === 'end') edge = 'right'\n\n const cleanLayout = isTabDrag\n ? removeTabHelper(originalLayout, draggingId)\n : removePaneHelper(originalLayout, draggingId)\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 if (cleanLayout === null) {\n setLayout(draggedPaneNode)\n } else {\n const isRow = edge === 'left' || edge === 'right'\n const isFirst = edge === 'left' || edge === 'top'\n let splitPercentage = 50\n if (fraction === '1/4') {\n splitPercentage = isFirst ? 25 : 75\n } else if (fraction === '1/3') {\n splitPercentage = isFirst ? 100 / 3 : 200 / 3\n }\n\n const newLayout: TreeNode = {\n type: 'split',\n direction: isRow ? 'row' : 'column',\n first: isFirst ? draggedPaneNode : cleanLayout,\n second: isFirst ? cleanLayout : draggedPaneNode,\n splitPercentage,\n }\n setLayout(newLayout)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction: edge === 'left' || edge === 'right' ? 'row' : 'column',\n position: edge as 'left' | 'right' | 'top' | 'bottom',\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'\nimport { TabDetails } from '../../../shared'\n\nexport interface PortalHostItemProps {\n tabDetails: TabDetails\n target: HTMLDivElement | null\n renderWidget?: (tab: TabDetails) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = React.memo(\n ({ tabDetails, target, renderWidget }) => {\n const { id: tabId } = tabDetails\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(tabDetails), wrapper)\n },\n (prev, next) => {\n return (\n prev.target === next.target &&\n prev.renderWidget === next.renderWidget &&\n prev.tabDetails.id === next.tabDetails.id &&\n prev.tabDetails.paneId === next.tabDetails.paneId &&\n prev.tabDetails.isActive === next.tabDetails.isActive &&\n prev.tabDetails.index === next.tabDetails.index &&\n prev.tabDetails.metadata === next.tabDetails.metadata\n )\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'\nimport { RootDropZones } from '../../../entities/zeugma/ui'\n\nexport interface PaneTreeProps {\n /** Render function mapping unique pane nodes to React elements. Usually renders a <Pane> wrapper. */\n renderPane: (paneId: string) => React.ReactNode\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: (paneId: 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 renderPane,\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n}) => {\n const {\n layout,\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 {activeId !== null && !locked && (\n <RootDropZones activeClassName={classNames.rootDropPreview ?? classNames.dropPreview} />\n )}\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, 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 ZeugmaControllerInternal,\n} from '../../../shared'\nimport { usePortalRegistry, useZeugmaDnd } from '../model'\nimport { CursorOverlay } from './CursorOverlay'\nimport { PortalHostItem } from './PortalHostItem'\nimport { PaneTree } from '../../../widgets/pane-tree'\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const {\n controller,\n renderDragOverlay,\n classNames = {},\n renderPane,\n resizerSize,\n\n // Configuration settings\n dragActivationDistance = 8,\n snapThreshold = 8,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = props\n\n const internalController = controller as ZeugmaControllerInternal\n const {\n layout,\n setLayout,\n _internalSetLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n } = internalController\n\n const { portalTargets, registerPortalTarget, registerRenderCallback, renderCallbacksRef } =\n 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 layout,\n _internalSetLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n activeId,\n setActiveId,\n activeType,\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 })\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.rootDropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n classNames.tabsContainer,\n classNames.tab,\n classNames.paneContainer,\n classNames.paneHeader,\n classNames.paneControls,\n classNames.paneButton,\n classNames.tabCloseButton,\n classNames.dragHandle,\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 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 getTabMetadata,\n getActiveTabMetadata,\n renderPane,\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 handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\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 addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addTab,\n updateMetadata,\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 and widget 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 if (node.type === 'split') {\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 registerRenderCallback,\n renderCallbacksRef,\n }),\n [registerPortalTarget, registerRenderCallback, renderCallbacksRef],\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 <PaneTree\n renderPane={renderPane}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n />\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => {\n return renderDragOverlay({\n type: activeType,\n id,\n isDismissing: activeId === dismissIntentId,\n })\n }}\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 const target = portalTargets[tabId]\n const tabDetails = findTabById(tabId)\n if (!tabDetails) return null\n return (\n <PortalHostItem\n key={tabId}\n tabDetails={tabDetails}\n target={target || null}\n renderWidget={renderCallbacksRef.current[tabId]}\n />\n )\n })}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\ninterface RootDropZoneProps {\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nconst activationPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n top: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n bottom: {\n '1/4': {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n bottom: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n left: {\n '1/4': {\n position: 'absolute',\n left: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n left: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n right: {\n '1/4': {\n position: 'absolute',\n right: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n right: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n}\n\nconst previewPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n top: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n '1/3': {\n top: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n },\n bottom: {\n '1/4': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n left: {\n '1/4': {\n left: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n '1/3': {\n left: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n },\n right: {\n '1/4': {\n right: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n right: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n}\n\nconst RootDropZone: React.FC<RootDropZoneProps> = ({ id, fraction, edge, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n\n const previewStyle: React.CSSProperties = {\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 101,\n boxSizing: 'border-box',\n ...previewPositions[edge][fraction],\n }\n\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[edge][fraction]} />\n {isOver && <div className={activeClassName} style={previewStyle} />}\n </>\n )\n}\n\ninterface RootDropZonesProps {\n activeClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({ activeClassName }) => {\n const zones: Array<{\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n }> = [\n { id: 'drop-root-1/4-top', fraction: '1/4', edge: 'top' },\n { id: 'drop-root-1/3-top', fraction: '1/3', edge: 'top' },\n { id: 'drop-root-1/4-bottom', fraction: '1/4', edge: 'bottom' },\n { id: 'drop-root-1/3-bottom', fraction: '1/3', edge: 'bottom' },\n { id: 'drop-root-1/4-left', fraction: '1/4', edge: 'left' },\n { id: 'drop-root-1/3-left', fraction: '1/3', edge: 'left' },\n { id: 'drop-root-1/4-right', fraction: '1/4', edge: 'right' },\n { id: 'drop-root-1/3-right', fraction: '1/3', edge: 'right' },\n ]\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99,\n pointerEvents: 'none',\n }}\n >\n {zones.map((zone) => (\n <RootDropZone\n key={zone.id}\n id={zone.id}\n fraction={zone.fraction}\n edge={zone.edge}\n activeClassName={activeClassName}\n />\n ))}\n </div>\n )\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 from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nexport interface 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\nexport const 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","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'\nimport { PaneContext } from './Pane'\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 onSelect: () => void\n onRemove: () => 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 Tab: typeof Tab\n} = ({\n tabs: propTabs,\n activeTabId: propActiveTabId,\n locked: propLocked,\n tabsMetadata: propTabsMetadata,\n selectTab: propSelectTab,\n removeTab: propRemoveTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const paneContext = useContext(PaneContext)\n\n const tabs = propTabs ?? paneContext?.tabs ?? []\n const activeTabId = propActiveTabId ?? paneContext?.activeTabId ?? ''\n const locked = propLocked ?? paneContext?.locked ?? false\n const tabsMetadata = propTabsMetadata ?? paneContext?.tabsMetadata\n const selectTab = propSelectTab ?? paneContext?.selectTab ?? (() => {})\n const removeTab = propRemoveTab ?? paneContext?.removeTab ?? (() => {})\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 onSelect: () => selectTab(tabId),\n onRemove: () => removeTab(tabId),\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\nTabs.Tab = Tab\n","import React from 'react'\n\nexport interface PaneControlsProps {\n /** Custom CSS class applied to the controls container. */\n className?: string\n /** Custom inline CSS style applied to the controls container. */\n style?: React.CSSProperties\n /** The children elements (e.g. close and fullscreen buttons) to render inside the controls container. */\n children?: React.ReactNode\n}\n\nexport const PaneControls: React.FC<PaneControlsProps> = ({ className, style, children }) => {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n}\n","import React, { useMemo, useEffect, useContext, useRef, createContext } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n PaneNode,\n TabDetails,\n} from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\nimport { DropZone } from './DropZone'\nimport { DragHandle } from './DragHandle'\nimport { Tabs } from './Tabs'\nimport { Tab } from './Tab'\nimport { PaneControls } from './PaneControls'\n\nexport interface PaneContextValue extends PaneRenderProps {\n id: string\n}\n\nexport const PaneContext = createContext<PaneContextValue | undefined>(undefined)\n\nexport const usePaneContext = () => {\n const context = useContext(PaneContext)\n if (!context) {\n throw new Error('usePaneContext must be used within a Pane component')\n }\n return context\n}\n\nexport interface PaneContentProps {\n /** A render callback (tab) => ReactNode or static ReactNode content to render for the active tab. */\n children?: React.ReactNode | ((tab: TabDetails) => React.ReactNode)\n /** Custom CSS class applied to the tab content wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab content wrapper. */\n style?: React.CSSProperties\n}\n\nexport const PaneContent: React.FC<PaneContentProps> = ({ children, className, style }) => {\n const { activeTabId } = usePaneContext()\n const { classNames } = useZeugmaState()\n const targetRef = useRef<HTMLDivElement | null>(null)\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('PaneContent must be used within a Zeugma provider')\n }\n const { registerPortalTarget, registerRenderCallback } = portalRegistry\n\n const renderCallback = useMemo(() => {\n if (typeof children === 'function') {\n return children as (tab: TabDetails) => React.ReactNode\n }\n return () => children\n }, [children])\n\n // Register render callback synchronously during the render phase\n registerRenderCallback(activeTabId, renderCallback)\n\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\n\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className={`${classNames.tabContentWrapper || ''} ${className || ''}`.trim()}\n style={{\n height: '100%',\n width: '100%',\n ...style,\n }}\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 /** The children elements inside the pane (e.g. headers, tabs, content). */\n children: 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> & {\n Content: typeof PaneContent\n DragHandle: typeof DragHandle\n Tabs: typeof Tabs\n Tab: typeof Tab\n Controls: typeof PaneControls\n} = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n activeId,\n classNames: globalClassNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updateMetadata, selectTab, removeTab } = useZeugmaActions()\n\n const paneNode = useMemo(() => findPaneById(layout, id) as PaneNode | null, [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 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 updateMetadata(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 updateMetadata(tabId, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n ],\n )\n\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 = `${globalClassNames.pane || ''} ${\n isPaneLocked ? globalClassNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <PaneContext.Provider value={{ id, ...renderProps }}>\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}\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={globalClassNames.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={globalClassNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n </PaneContext.Provider>\n )\n}\n\nPane.Content = PaneContent\nPane.DragHandle = DragHandle\nPane.Tabs = Tabs\nPane.Tab = Tab\nPane.Controls = PaneControls\n"]}
|