react-zeugma 6.1.2 → 6.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/lib/dom.ts","../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/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx"],"names":["copyStyles","srcDoc","destDoc","srcHtml","destHtml","attr","srcBody","destBody","el","cloned","styleEl","rule","err","getOrCreateHiddenContainer","id","container","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","isMountedRef","registerPortalTarget","useCallback","tabId","prev","usePopupWindow","isOpenedInNewWindow","onClose","popupRef","popupContainer","setPopupContainer","intervalId","winName","win","title","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","addPane","metadata","insert","node","parentDirection","updateSplitPercentage","target","newPercentage","findPaneById","findPaneContainingTab","findTabById","pane","index","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","addTab","targetPaneId","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","calculateTabDropIndex","tabs","activeType","overTabId","overTabPosition","safeJsonStringify","val","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","dragActivationDistance","snapThreshold","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","onDismissIntentChange","layout","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","layoutBeforeDrag","setLayoutBeforeDrag","popoutTabs","setPopoutTabs","handleSetTabPopout","popped","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","next","setLayout","nextLayoutOrUpdater","handleRemovePane","handleAddPane","handleAddTab","targetPane","sourcePane","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","createDragSession","cursor","resizerEl","onMove","onEnd","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","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","setTabPopout","handleClose","popupWindow","wrapper","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","globalLocked","portalRegistry","paneNode","paneContainerId","activeTabId","tabsMetadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","useDraggable","dragging","targetEl","setTargetEl","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"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Utility to copy stylesheets from source document to destination document.\n */\nexport function copyStyles(srcDoc: Document, destDoc: Document) {\n // 1. Copy all attributes of <html> (e.g. class=\"dark\", dataset, color-scheme, etc.)\n const srcHtml = srcDoc.documentElement\n const destHtml = destDoc.documentElement\n Array.from(destHtml.attributes).forEach((attr) => {\n destHtml.removeAttribute(attr.name)\n })\n Array.from(srcHtml.attributes).forEach((attr) => {\n destHtml.setAttribute(attr.name, attr.value)\n })\n\n // 2. Copy all attributes of <body> (e.g. background styles, class lists, etc.)\n const srcBody = srcDoc.body\n const destBody = destDoc.body\n Array.from(destBody.attributes).forEach((attr) => {\n destBody.removeAttribute(attr.name)\n })\n Array.from(srcBody.attributes).forEach((attr) => {\n destBody.setAttribute(attr.name, attr.value)\n })\n\n // 3. Copy all style/link elements from head\n Array.from(srcDoc.querySelectorAll('link[rel=\"stylesheet\"], style')).forEach((el) => {\n try {\n const cloned = el.cloneNode(true) as HTMLElement\n\n // If it's a style element, check if rules were inserted dynamically via CSSOM\n if (el.tagName.toLowerCase() === 'style') {\n const styleEl = el as HTMLStyleElement\n if (styleEl.sheet && styleEl.sheet.cssRules && styleEl.sheet.cssRules.length > 0) {\n cloned.textContent = Array.from(styleEl.sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n }\n }\n\n destDoc.head.appendChild(cloned)\n } catch {\n // Fallback: just clone the node as is\n try {\n destDoc.head.appendChild(el.cloneNode(true))\n } catch (err) {\n console.error('Failed to copy style element:', err)\n }\n }\n })\n}\n\n/**\n * Utility to get or create a hidden container element on the document body.\n */\nexport function getOrCreateHiddenContainer(id: string): HTMLElement {\n let container = document.getElementById(id)\n if (!container) {\n container = document.createElement('div')\n container.id = id\n container.style.display = 'none'\n document.body.appendChild(container)\n }\n return container\n}\n","import { useEffect, useRef, useState, useCallback } from 'react'\nimport { copyStyles } from '../../../shared/lib/dom'\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\nexport interface UsePopupWindowOptions {\n tabId: string\n isOpenedInNewWindow: boolean\n onClose: () => void\n}\n\nexport function usePopupWindow({ tabId, isOpenedInNewWindow, onClose }: UsePopupWindowOptions) {\n const popupRef = useRef<Window | null>(null)\n const [popupContainer, setPopupContainer] = useState<HTMLDivElement | null>(null)\n\n useEffect(() => {\n let intervalId: ReturnType<typeof setTimeout> | null = null\n\n if (isOpenedInNewWindow) {\n if (!popupRef.current || popupRef.current.closed) {\n const winName = `zeugma-tab-${tabId.replace(/[^a-zA-Z0-9]/g, '_')}`\n const win = window.open(\n '',\n winName,\n 'width=800,height=600,menubar=no,toolbar=no,location=no,status=no,resizable=yes',\n )\n\n if (win) {\n popupRef.current = win\n\n // Set document title\n const title = tabId.includes('/') ? tabId.split('/').pop()! : tabId\n win.document.title = title\n\n // Copy stylesheets from main window\n copyStyles(document, win.document)\n\n // Create container for React portal\n const container = win.document.createElement('div')\n container.id = 'zeugma-popup-root'\n win.document.body.appendChild(container)\n\n setPopupContainer(container)\n\n win.addEventListener('beforeunload', onClose)\n\n // Polling interval to detect close\n intervalId = setInterval(() => {\n if (win.closed) {\n onClose()\n }\n }, 300)\n } else {\n console.warn('Popup window blocked or failed to open.')\n onClose()\n }\n }\n } else {\n if (popupRef.current && !popupRef.current.closed) {\n popupRef.current.close()\n }\n popupRef.current = null\n setPopupContainer(null)\n }\n\n return () => {\n if (intervalId) clearInterval(intervalId)\n if (popupRef.current) {\n popupRef.current.removeEventListener('beforeunload', onClose)\n }\n }\n }, [isOpenedInNewWindow, tabId, onClose])\n\n // Clean up popup on unmount\n useEffect(() => {\n return () => {\n if (popupRef.current && !popupRef.current.closed) {\n popupRef.current.close()\n }\n }\n }, [])\n\n return { popupWindow: popupRef.current, popupContainer }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(\n tree: TreeNode | null,\n paneToAdd: string,\n metadata?: Record<string, unknown>,\n): TreeNode {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Update metadata on a specific tab node using an updater function.\n */\nexport function updateTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[tabId]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[tabId]\n } else {\n newTabsMetadata[tabId] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: updateTabMetadata(tree.first, tabId, updater) ?? tree.first,\n second: updateTabMetadata(tree.second, tabId, updater) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a tab directly to a specific target pane node.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === targetPaneId) {\n const newTabs = [...tree.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = tree.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...tree.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: addTab(tree.first, targetPaneId, tabId, metadata) || tree.first,\n second: addTab(tree.second, targetPaneId, tabId, metadata) || tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabs: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTab = activeType === 'tab'\n const isHoveredTabInThisPane = isDraggingTab && overTabId && tabs.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabs.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n} from '../../../shared'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n removePane,\n addPane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n const [layoutBeforeDrag, setLayoutBeforeDrag] = useState<TreeNode | null>(null)\n const [popoutTabs, setPopoutTabs] = useState<Record<string, boolean>>({})\n\n const handleSetTabPopout = useCallback((tabId: string, popped: boolean) => {\n setPopoutTabs((prev) => {\n if (prev[tabId] === popped) return prev\n return { ...prev, [tabId]: popped }\n })\n }, [])\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Keep layout and callback refs in sync to make actions and queries completely stable\n const layoutRef = useRef<TreeNode | null>(layout)\n layoutRef.current = layout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n onFullscreenChangeRef.current = onFullscreenChange\n\n const setFullscreenPaneId = useCallback((paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChangeRef.current?.(paneId)\n }, [])\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layoutRef.current\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n layoutRef.current = next\n setLocalLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n const setLayout = handleSetLayout\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddPane = useCallback(\n wrapMutation((prev, paneId: string, metadata?: Record<string, unknown>) =>\n addPane(prev, paneId, metadata),\n ),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, targetPaneId: string, tabId: string, metadata?: Record<string, unknown>) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n\n const sourcePane = findPaneContainingTab(prev, tabId)\n const isAlreadyInTarget = sourcePane && sourcePane.id === targetPane.id\n\n const cleanedPrev = isAlreadyInTarget ? prev : (removeTab(prev, tabId) ?? prev)\n return addTab(cleanedPrev, targetPane.id, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateTabMetadata = useCallback(\n wrapMutation(\n (\n prev,\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateTabMetadata(prev, tabId, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback(\n (paneId: string) => findPaneById(layoutRef.current, paneId),\n [],\n )\n\n const handleFindPaneContainingTab = useCallback(\n (tabId: string) => findPaneContainingTab(layoutRef.current, tabId),\n [],\n )\n\n const handleFindTabById = useCallback(\n (tabId: string) => findTabById(layoutRef.current, tabId),\n [],\n )\n\n return {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n popoutTabs,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Config options\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane: handleRemovePane,\n addPane: handleAddPane,\n addTab: handleAddTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n setTabPopout: handleSetTabPopout,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n } as ZeugmaController\n}\n","/**\n * Shared drag-session lifecycle utility.\n *\n * Handles the common boilerplate for pointer-based resize operations:\n * - Adds `zeugma-resizing` class to `document.body`\n * - Injects a global `cursor` style so the resize cursor stays active\n * even when the pointer leaves the handle element\n * - Sets `data-resizing` on the resizer element\n * - Attaches `pointermove` / `pointerup` listeners to `document`\n * - Cleans everything up on pointer-up\n *\n * Consumers provide domain-specific `onMove` and `onEnd` callbacks.\n */\n\nexport interface DragSessionConfig {\n /** CSS cursor to enforce globally during the drag */\n cursor: 'col-resize' | 'row-resize'\n /** The resizer DOM element (receives `data-resizing` attribute) */\n resizerEl: HTMLElement\n /** Called on every `pointermove` during the drag */\n onMove: (e: PointerEvent) => void\n /** Called once on `pointerup` — after cleanup has already run */\n onEnd: () => void\n}\n\nexport function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void {\n // 1. Body class\n document.body.classList.add('zeugma-resizing')\n\n // 2. Global cursor override\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${cursor} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n // 3. Mark the resizer element\n resizerEl.setAttribute('data-resizing', 'true')\n\n // 4. Document-level listeners\n const handlePointerMove = (e: PointerEvent) => {\n onMove(e)\n }\n\n const handlePointerUp = () => {\n // Cleanup\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Notify consumer\n onEnd()\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n}\n","import { createContext, useContext } from 'react'\nimport {\n ZeugmaStateValue,\n ZeugmaActionsValue,\n PortalRegistryValue,\n ZeugmaDragStateValue,\n} from '../model/types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\nexport const ZeugmaDragContext = createContext<ZeugmaDragStateValue | undefined>(undefined)\n\nexport const useZeugmaState = (): ZeugmaStateValue => {\n const state = useContext(ZeugmaStateContext)\n if (!state) {\n throw new Error('useZeugmaState must be used within a Zeugma provider')\n }\n return state\n}\n\nexport const useZeugmaActions = (): ZeugmaActionsValue => {\n const actions = useContext(ZeugmaActionsContext)\n if (!actions) {\n throw new Error('useZeugmaActions must be used within a Zeugma provider')\n }\n return actions\n}\n\nexport const useZeugmaDrag = (): ZeugmaDragStateValue => {\n const drag = useContext(ZeugmaDragContext)\n if (!drag) {\n throw new Error('useZeugmaDrag must be used within a Zeugma provider')\n }\n return drag\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaContextValue } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaContextValue => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return { ...state, ...actions }\n}\n","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nexport class SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n","import { useState, useRef, useCallback, Dispatch, SetStateAction } from 'react'\nimport {\n useSensor,\n useSensors,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n pointerWithin,\n closestCenter,\n CollisionDetection,\n DroppableContainer,\n} from '@dnd-kit/core'\nimport { SplitDirection, PaneNode, TreeNode, ZeugmaController } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab as moveTabHelper,\n selectTab as selectTabHelper,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps extends ZeugmaController {\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n activeId,\n setActiveId,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n useBodyCursorOverride(isOverLocked)\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // If we're dragging a pane, filter out any tab-drop colliders\n const filteredCollisions = isTabDrag\n ? pointerCollisions\n : pointerCollisions.filter((collision) => !collision.id.toString().startsWith('tab-drop-'))\n\n if (filteredCollisions.length > 0) {\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, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useZeugmaState, useZeugmaActions, getOrCreateHiddenContainer } from '../../../shared'\nimport { usePopupWindow } from '../model/hooks'\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 const { popoutTabs } = useZeugmaState()\n const { setTabPopout } = useZeugmaActions()\n\n const isOpenedInNewWindow = !!popoutTabs[tabId]\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n const handleClose = useCallback(() => {\n // Adopt wrapper back to main window immediately to prevent loss when window is closed\n if (wrapperRef.current) {\n document.adoptNode(wrapperRef.current)\n const hiddenContainer = getOrCreateHiddenContainer('zeugma-hidden-portal-container')\n hiddenContainer.appendChild(wrapperRef.current)\n }\n setTabPopout(tabId, false)\n }, [tabId, setTabPopout])\n\n const { popupWindow, popupContainer } = usePopupWindow({\n tabId,\n isOpenedInNewWindow,\n onClose: handleClose,\n })\n\n // Move the stable wrapper in the DOM when the target pane element or window state changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (isOpenedInNewWindow) {\n if (popupContainer && popupWindow) {\n popupWindow.document.adoptNode(wrapper)\n popupContainer.appendChild(wrapper)\n }\n } else {\n document.adoptNode(wrapper)\n if (target) {\n target.appendChild(wrapper)\n } else {\n const hiddenContainer = getOrCreateHiddenContainer('zeugma-hidden-portal-container')\n hiddenContainer.appendChild(wrapper)\n }\n }\n }, [target, mounted, isOpenedInNewWindow, popupContainer, popupWindow])\n\n // Clean up wrapper 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 popoutTabs,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n layoutBeforeDrag,\n\n // Configuration settings\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n\n // Callbacks\n onRemove,\n onResizeStart,\n onResize,\n onResizeEnd,\n\n // Actions\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n setTabPopout,\n } = internalProps\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const dnd = useZeugmaDnd({\n ...internalProps,\n setOverTabId,\n setOverTabPosition,\n })\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPane(paneId), [renderPane])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n setLayout,\n renderPane: stableRenderPane,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n popoutTabs,\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 popoutTabs,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n setTabPopout,\n }),\n [\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n setTabPopout,\n ],\n )\n\n // Collect all tab IDs in the current layout tree\n const allTabIds = useMemo(() => {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabs.forEach((tabId) => {\n ids.add(tabId)\n })\n } else {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n if (layoutBeforeDrag) {\n traverse(layoutBeforeDrag)\n }\n return Array.from(ids).sort()\n }, [layout, activeId, layoutBeforeDrag])\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n }),\n [registerPortalTarget],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <ZeugmaDragContext.Provider value={dragValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => renderDragOverlay(id, activeType!)}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => (\n <PortalHostItem\n key={tabId}\n tabId={tabId}\n target={portalTargets[tabId] || null}\n renderWidget={renderWidget}\n />\n ))}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","import React 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': { top: 0, left: 0, width: '100%', height: '25%' },\n '1/3': { top: 0, left: 0, width: '100%', height: '33.3333%' },\n },\n bottom: {\n '1/4': { bottom: 0, left: 0, width: '100%', height: '25%' },\n '1/3': { bottom: 0, left: 0, width: '100%', height: '33.3333%' },\n },\n left: {\n '1/4': { left: 0, top: 0, width: '25%', height: '100%' },\n '1/3': { left: 0, top: 0, width: '33.3333%', height: '100%' },\n },\n right: {\n '1/4': { right: 0, top: 0, width: '25%', height: '100%' },\n '1/3': { right: 0, top: 0, width: '33.3333%', height: '100%' },\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/3-top', fraction: '1/3', edge: 'top' },\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 && <RootDropZones activeClassName={classNames.dropPreview} />}\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, { useMemo, useCallback, useContext, useState, useEffect } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaActions, PortalRegistryContext } from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updateTabMetadata, selectTab, removeTab } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Pane must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const paneNode = useMemo(() => findPaneById(layout, id), [layout, id])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const [targetEl, setTargetEl] = useState<HTMLDivElement | null>(null)\n\n useEffect(() => {\n registerPortalTarget(activeTabId, targetEl)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, targetEl, registerPortalTarget])\n\n const renderActiveTab = useCallback(() => {\n return (\n <div\n ref={setTargetEl}\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 const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateTabMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateTabMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateTabMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n renderActiveTab,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { TabsContext } from './Tabs'\n\nexport interface TabContextValue {\n tabId: string\n isActive: boolean\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n locked: boolean\n selectTab: () => void\n removeTab: () => void\n}\n\nexport const TabContext = createContext<TabContextValue | undefined>(undefined)\n\nexport const useTabContext = () => {\n const context = useContext(TabContext)\n if (!context) {\n throw new Error('useTabContext must be used within a Tab component')\n }\n return context\n}\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const { locked: globalLocked, classNames = {}, activeType } = useZeugmaState()\n const { overTabId } = useZeugmaDrag()\n\n const tabsContext = useContext(TabsContext)\n const isLocked = locked || globalLocked || (tabsContext?.locked ?? false)\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked || activeType === 'pane',\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n\n const tabs = tabsContext?.tabs || []\n const index = tabs.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabs[index - 1] !== activeTabId\n\n const separator = showSeparator ? <div className={classNames.tabSeparator} /> : null\n\n const isActive = tabsContext ? tabsContext.activeTabId === id : false\n const metadata = tabsContext?.tabsMetadata?.[id]\n\n const selectThisTab = useCallback(() => {\n tabsContext?.selectTab(id)\n }, [tabsContext, id])\n\n const removeThisTab = useCallback(() => {\n tabsContext?.removeTab(id)\n }, [tabsContext, id])\n\n const tabContextValue = useMemo<TabContextValue>(\n () => ({\n tabId: id,\n isActive,\n isDragging,\n isOver: isTargetOver,\n metadata,\n locked: isLocked,\n selectTab: selectThisTab,\n removeTab: removeThisTab,\n }),\n [id, isActive, isDragging, isTargetOver, metadata, isLocked, selectThisTab, removeThisTab],\n )\n\n return (\n <TabContext.Provider value={tabContextValue}>\n <div\n ref={handleRef}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {separator}\n {children({\n isDragging,\n isOver: isTargetOver,\n })}\n </div>\n </TabContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Tab } from './Tab'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\n\nexport interface TabsContextValue {\n tabs: string[]\n activeTabId: string\n locked: boolean\n tabsMetadata?: Record<string, Record<string, unknown>>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(undefined)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component')\n }\n return context\n}\n\nexport interface TabsProps {\n /** The list of tab IDs in this pane. */\n tabs: string[]\n /** The currently active tab ID. */\n activeTabId: string\n /** Whether dragging is locked on these tabs. */\n locked?: boolean\n /** Metadata for the tabs. */\n tabsMetadata?: Record<string, Record<string, unknown>>\n /** Callback when a tab is selected. */\n selectTab: (id: string) => void\n /** Callback when a tab is closed/removed. */\n removeTab: (id: string) => void\n /** Render function for each individual tab content. */\n renderTab: (props: {\n tabId: string\n activeTabId: string\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n }) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n tabs,\n activeTabId,\n locked = false,\n tabsMetadata,\n selectTab,\n removeTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const { classNames: globalClassNames = {}, activeType } = useZeugmaState()\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabs,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabs, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabs, activeType, overTabId, overTabPosition)\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div\n className={classNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n ...styles?.container,\n }}\n >\n {tabs.map((tabId, index) => {\n const metadata = tabsMetadata?.[tabId]\n const resolvedClassName = resolveDynamicProp(classNames?.tab, tabId)\n const resolvedStyle = resolveDynamicProp(styles?.tab, tabId)\n\n const showPreviewHere = index === targetIndex\n\n return (\n <React.Fragment key={tabId}>\n {showPreviewHere && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: index === 0 ? 'none' : 'translateX(-50%)',\n }}\n />\n </div>\n )}\n <Tab id={tabId} locked={locked} className={resolvedClassName} style={resolvedStyle}>\n {({ isDragging, isOver }) =>\n renderTab({\n tabId,\n activeTabId,\n isDragging,\n isOver,\n metadata,\n selectTab,\n removeTab,\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabs.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/lib/dom.ts","../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/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx"],"names":["copyStyles","srcDoc","destDoc","srcHtml","destHtml","attr","srcBody","destBody","el","cloned","styleEl","rule","err","getOrCreateHiddenContainer","id","container","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","isMountedRef","registerPortalTarget","useCallback","tabId","prev","usePopupWindow","isOpenedInNewWindow","onClose","popupRef","popupContainer","setPopupContainer","intervalId","timeoutId","winName","win","title","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","addPane","metadata","insert","node","parentDirection","updateSplitPercentage","target","newPercentage","findPaneById","findPaneContainingTab","findTabById","pane","index","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","addTab","targetPaneId","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","calculateTabDropIndex","tabs","activeType","overTabId","overTabPosition","safeJsonStringify","val","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","dragActivationDistance","snapThreshold","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","onDismissIntentChange","layout","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","layoutBeforeDrag","setLayoutBeforeDrag","popoutTabs","setPopoutTabs","handleSetTabPopout","popped","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","next","setLayout","nextLayoutOrUpdater","handleRemovePane","handleAddPane","handleAddTab","targetPane","sourcePane","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","createDragSession","cursor","resizerEl","onMove","onEnd","handlePointerUp","globalStyle","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","ZeugmaDragContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaDrag","drag","TabWindowContext","useTabWindow","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","useZeugmaDnd","props","setOverTabId","setOverTabPosition","containerRectRef","setIsOverLocked","sensors","useSensors","useSensor","customCollisionDetection","isTabDrag","pointerCollisions","pointerWithin","filteredCollisions","collision","a","aId","bId","aIsTab","bIsTab","aIsRoot","bIsRoot","tabDroppables","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","g","DocumentProto","NodeProto","getActiveDocument","activeEvent","targetDoc","bodyDesc","originalBodyGetter","newBodyGetter","activeDoc","docElemDesc","originalDocElemGetter","newDocElemGetter","originalCreateElement","newCreateElement","tagName","originalAppendChild","newAppendChild","newChild","originalInsertBefore","newInsertBefore","refChild","TabDocumentOverride","doc","children","Fragment","PortalHostItem","React","renderWidget","mounted","setMounted","wrapperRef","setTabPopout","handleClose","popupWindow","windowValue","useMemo","wrapper","createPortal","Zeugma","internalProps","renderPane","renderDragOverlay","classNames","dnd","stableRenderPane","stableClassNames","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","ids","traverse","portalRegistryValue","jsxs","DndContext","activationPositions","previewPositions","RootDropZone","activeClassName","setNodeRef","isOver","useDroppable","previewStyle","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","globalLocked","portalRegistry","paneNode","paneContainerId","activeTabId","tabsMetadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","useDraggable","dragging","targetEl","setTargetEl","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"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Utility to copy stylesheets from source document to destination document.\n */\nexport function copyStyles(srcDoc: Document, destDoc: Document) {\n // 1. Copy all attributes of <html> (e.g. class=\"dark\", dataset, color-scheme, etc.)\n const srcHtml = srcDoc.documentElement\n const destHtml = destDoc.documentElement\n Array.from(destHtml.attributes).forEach((attr) => {\n destHtml.removeAttribute(attr.name)\n })\n Array.from(srcHtml.attributes).forEach((attr) => {\n destHtml.setAttribute(attr.name, attr.value)\n })\n\n // 2. Copy all attributes of <body> (e.g. background styles, class lists, etc.)\n const srcBody = srcDoc.body\n const destBody = destDoc.body\n Array.from(destBody.attributes).forEach((attr) => {\n destBody.removeAttribute(attr.name)\n })\n Array.from(srcBody.attributes).forEach((attr) => {\n destBody.setAttribute(attr.name, attr.value)\n })\n\n // 3. Copy all style/link elements from head\n Array.from(srcDoc.querySelectorAll('link[rel=\"stylesheet\"], style')).forEach((el) => {\n try {\n const cloned = el.cloneNode(true) as HTMLElement\n\n // If it's a style element, check if rules were inserted dynamically via CSSOM\n if (el.tagName.toLowerCase() === 'style') {\n const styleEl = el as HTMLStyleElement\n if (styleEl.sheet && styleEl.sheet.cssRules && styleEl.sheet.cssRules.length > 0) {\n cloned.textContent = Array.from(styleEl.sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n }\n }\n\n destDoc.head.appendChild(cloned)\n } catch {\n // Fallback: just clone the node as is\n try {\n destDoc.head.appendChild(el.cloneNode(true))\n } catch (err) {\n console.error('Failed to copy style element:', err)\n }\n }\n })\n}\n\n/**\n * Utility to get or create a hidden container element on the document body.\n */\nexport function getOrCreateHiddenContainer(id: string): HTMLElement {\n let container = document.getElementById(id)\n if (!container) {\n container = document.createElement('div')\n container.id = id\n container.style.display = 'none'\n document.body.appendChild(container)\n }\n return container\n}\n","import { useEffect, useRef, useState, useCallback } from 'react'\nimport { copyStyles } from '../../../shared/lib/dom'\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\nexport interface UsePopupWindowOptions {\n tabId: string\n isOpenedInNewWindow: boolean\n onClose: () => void\n}\n\nexport function usePopupWindow({ tabId, isOpenedInNewWindow, onClose }: UsePopupWindowOptions) {\n const popupRef = useRef<Window | null>(null)\n const [popupContainer, setPopupContainer] = useState<HTMLDivElement | null>(null)\n\n useEffect(() => {\n let intervalId: ReturnType<typeof setTimeout> | null = null\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n if (isOpenedInNewWindow) {\n if (!popupRef.current || popupRef.current.closed) {\n const winName = `zeugma-tab-${tabId.replace(/[^a-zA-Z0-9]/g, '_')}`\n const win = window.open(\n '',\n winName,\n 'width=800,height=600,menubar=no,toolbar=no,location=no,status=no,resizable=yes',\n )\n\n if (win) {\n popupRef.current = win\n\n // Set document title\n const title = tabId.includes('/') ? tabId.split('/').pop()! : tabId\n win.document.title = title\n\n win.addEventListener('beforeunload', onClose)\n\n // 300ms delay to let the document paint and stabilize\n timeoutId = setTimeout(() => {\n // Copy stylesheets and document attributes from main window\n copyStyles(document, win.document)\n\n // Setup body layout\n win.document.body.style.margin = '0'\n win.document.body.style.padding = '0'\n\n let container = win.document.getElementById(\n 'zeugma-popup-root',\n ) as HTMLDivElement | null\n if (!container) {\n container = win.document.createElement('div')\n container.id = 'zeugma-popup-root'\n container.style.width = '100%'\n container.style.height = '100vh'\n win.document.body.appendChild(container)\n }\n\n setPopupContainer(container)\n }, 300)\n\n // Polling interval to detect close\n intervalId = setInterval(() => {\n if (win.closed) {\n onClose()\n }\n }, 300)\n } else {\n console.warn('Popup window blocked or failed to open.')\n onClose()\n }\n }\n } else {\n if (popupRef.current && !popupRef.current.closed) {\n popupRef.current.close()\n }\n popupRef.current = null\n setPopupContainer(null)\n }\n\n return () => {\n if (intervalId) clearInterval(intervalId)\n if (timeoutId) clearTimeout(timeoutId)\n if (popupRef.current) {\n popupRef.current.removeEventListener('beforeunload', onClose)\n }\n }\n }, [isOpenedInNewWindow, tabId, onClose])\n\n // Clean up popup on unmount\n useEffect(() => {\n return () => {\n if (popupRef.current && !popupRef.current.closed) {\n popupRef.current.close()\n }\n }\n }, [])\n\n return { popupWindow: popupRef.current, popupContainer }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(\n tree: TreeNode | null,\n paneToAdd: string,\n metadata?: Record<string, unknown>,\n): TreeNode {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Update metadata on a specific tab node using an updater function.\n */\nexport function updateTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[tabId]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[tabId]\n } else {\n newTabsMetadata[tabId] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: updateTabMetadata(tree.first, tabId, updater) ?? tree.first,\n second: updateTabMetadata(tree.second, tabId, updater) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a tab directly to a specific target pane node.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === targetPaneId) {\n const newTabs = [...tree.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = tree.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...tree.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: addTab(tree.first, targetPaneId, tabId, metadata) || tree.first,\n second: addTab(tree.second, targetPaneId, tabId, metadata) || tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabs: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTab = activeType === 'tab'\n const isHoveredTabInThisPane = isDraggingTab && overTabId && tabs.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabs.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n} from '../../../shared'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n removePane,\n addPane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n const [layoutBeforeDrag, setLayoutBeforeDrag] = useState<TreeNode | null>(null)\n const [popoutTabs, setPopoutTabs] = useState<Record<string, boolean>>({})\n\n const handleSetTabPopout = useCallback((tabId: string, popped: boolean) => {\n setPopoutTabs((prev) => {\n if (prev[tabId] === popped) return prev\n return { ...prev, [tabId]: popped }\n })\n }, [])\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Keep layout and callback refs in sync to make actions and queries completely stable\n const layoutRef = useRef<TreeNode | null>(layout)\n layoutRef.current = layout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n onFullscreenChangeRef.current = onFullscreenChange\n\n const setFullscreenPaneId = useCallback((paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChangeRef.current?.(paneId)\n }, [])\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layoutRef.current\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n layoutRef.current = next\n setLocalLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n const setLayout = handleSetLayout\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddPane = useCallback(\n wrapMutation((prev, paneId: string, metadata?: Record<string, unknown>) =>\n addPane(prev, paneId, metadata),\n ),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, targetPaneId: string, tabId: string, metadata?: Record<string, unknown>) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n\n const sourcePane = findPaneContainingTab(prev, tabId)\n const isAlreadyInTarget = sourcePane && sourcePane.id === targetPane.id\n\n const cleanedPrev = isAlreadyInTarget ? prev : (removeTab(prev, tabId) ?? prev)\n return addTab(cleanedPrev, targetPane.id, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateTabMetadata = useCallback(\n wrapMutation(\n (\n prev,\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateTabMetadata(prev, tabId, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback(\n (paneId: string) => findPaneById(layoutRef.current, paneId),\n [],\n )\n\n const handleFindPaneContainingTab = useCallback(\n (tabId: string) => findPaneContainingTab(layoutRef.current, tabId),\n [],\n )\n\n const handleFindTabById = useCallback(\n (tabId: string) => findTabById(layoutRef.current, tabId),\n [],\n )\n\n return {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n popoutTabs,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Config options\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane: handleRemovePane,\n addPane: handleAddPane,\n addTab: handleAddTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n setTabPopout: handleSetTabPopout,\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 TabWindowValue,\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\nexport const TabWindowContext = createContext<TabWindowValue>({\n window: typeof window !== 'undefined' ? window : null,\n document: typeof document !== 'undefined' ? document : null,\n})\n\nexport const useTabWindow = (): TabWindowValue => {\n return useContext(TabWindowContext)\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaContextValue } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaContextValue => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return { ...state, ...actions }\n}\n","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nexport class SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n","import { useState, useRef, useCallback, Dispatch, SetStateAction } from 'react'\nimport {\n useSensor,\n useSensors,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n pointerWithin,\n closestCenter,\n CollisionDetection,\n DroppableContainer,\n} from '@dnd-kit/core'\nimport { SplitDirection, PaneNode, TreeNode, ZeugmaController } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab as moveTabHelper,\n selectTab as selectTabHelper,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps extends ZeugmaController {\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n activeId,\n setActiveId,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n useBodyCursorOverride(isOverLocked)\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // If we're dragging a pane, filter out any tab-drop colliders\n const filteredCollisions = isTabDrag\n ? pointerCollisions\n : pointerCollisions.filter((collision) => !collision.id.toString().startsWith('tab-drop-'))\n\n if (filteredCollisions.length > 0) {\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, useCallback, useMemo } from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n useZeugmaState,\n useZeugmaActions,\n getOrCreateHiddenContainer,\n TabWindowContext,\n} from '../../../shared'\nimport { usePopupWindow } from '../model/hooks'\n\ninterface Globals {\n __currentTabDocument?: Document | null\n}\n\nconst g = globalThis as unknown as Globals\n\nif (typeof window !== 'undefined' && typeof Document !== 'undefined') {\n const DocumentProto = Document.prototype\n const NodeProto = Node.prototype\n\n // Helper to get active document context (either from render-phase flag or active event target)\n const getActiveDocument = (): Document | null => {\n if (g.__currentTabDocument) return g.__currentTabDocument\n\n // Check active event target to handle event-driven popovers/dropdowns automatically\n const activeEvent = window.event || (typeof event !== 'undefined' ? event : null)\n if (activeEvent && activeEvent.target) {\n const target = activeEvent.target as unknown as {\n ownerDocument?: Document\n document?: Document\n }\n const targetDoc = target.ownerDocument || target.document\n if (targetDoc && targetDoc !== document) {\n return targetDoc\n }\n }\n return null\n }\n\n // 1. Override document.body\n const bodyDesc = Object.getOwnPropertyDescriptor(DocumentProto, 'body')\n if (\n bodyDesc &&\n bodyDesc.get &&\n !(bodyDesc.get as unknown as { __isZeugmaOverridden?: boolean }).__isZeugmaOverridden\n ) {\n const originalBodyGetter = bodyDesc.get\n const newBodyGetter = function (this: Document) {\n const activeDoc = getActiveDocument()\n if (activeDoc && this === document) {\n return activeDoc.body\n }\n return originalBodyGetter.call(this)\n }\n ;(newBodyGetter as unknown as { __isZeugmaOverridden: boolean }).__isZeugmaOverridden = true\n Object.defineProperty(DocumentProto, 'body', {\n ...bodyDesc,\n get: newBodyGetter,\n })\n }\n\n // 2. Override document.documentElement\n const docElemDesc = Object.getOwnPropertyDescriptor(DocumentProto, 'documentElement')\n if (\n docElemDesc &&\n docElemDesc.get &&\n !(docElemDesc.get as unknown as { __isZeugmaOverridden?: boolean }).__isZeugmaOverridden\n ) {\n const originalDocElemGetter = docElemDesc.get\n const newDocElemGetter = function (this: Document) {\n const activeDoc = getActiveDocument()\n if (activeDoc && this === document) {\n return activeDoc.documentElement\n }\n return originalDocElemGetter.call(this)\n }\n ;(newDocElemGetter as unknown as { __isZeugmaOverridden: boolean }).__isZeugmaOverridden = true\n Object.defineProperty(DocumentProto, 'documentElement', {\n ...docElemDesc,\n get: newDocElemGetter,\n })\n }\n\n // 3. Override document.createElement\n const originalCreateElement = DocumentProto.createElement\n if (\n originalCreateElement &&\n !(originalCreateElement as unknown as { __isZeugmaOverridden?: boolean }).__isZeugmaOverridden\n ) {\n const newCreateElement = function (\n this: Document,\n tagName: string,\n options?: ElementCreationOptions,\n ) {\n const activeDoc = getActiveDocument()\n if (activeDoc && this === document) {\n return originalCreateElement.call(activeDoc, tagName, options)\n }\n return originalCreateElement.call(this, tagName, options)\n }\n ;(newCreateElement as unknown as { __isZeugmaOverridden: boolean }).__isZeugmaOverridden = true\n DocumentProto.createElement = newCreateElement as unknown as typeof DocumentProto.createElement\n }\n\n // 4. Override Node.prototype.appendChild to redirect insertions based on ownerDocument\n const originalAppendChild = NodeProto.appendChild\n if (\n originalAppendChild &&\n !(originalAppendChild as unknown as { __isZeugmaOverridden?: boolean }).__isZeugmaOverridden\n ) {\n const newAppendChild = function <T extends Node>(this: Node, newChild: T): T {\n if (\n newChild &&\n newChild.ownerDocument &&\n newChild.ownerDocument !== document &&\n (this === document.body || this === document.documentElement)\n ) {\n return newChild.ownerDocument.body.appendChild(newChild) as unknown as T\n }\n return originalAppendChild.call(this, newChild) as T\n }\n ;(newAppendChild as unknown as { __isZeugmaOverridden: boolean }).__isZeugmaOverridden = true\n NodeProto.appendChild = newAppendChild as unknown as typeof NodeProto.appendChild\n }\n\n // 5. Override Node.prototype.insertBefore to redirect insertions based on ownerDocument\n const originalInsertBefore = NodeProto.insertBefore\n if (\n originalInsertBefore &&\n !(originalInsertBefore as unknown as { __isZeugmaOverridden?: boolean }).__isZeugmaOverridden\n ) {\n const newInsertBefore = function <T extends Node>(\n this: Node,\n newChild: T,\n refChild: Node | null,\n ): T {\n if (\n newChild &&\n newChild.ownerDocument &&\n newChild.ownerDocument !== document &&\n (this === document.body || this === document.documentElement)\n ) {\n return newChild.ownerDocument.body.insertBefore(newChild, null) as unknown as T\n }\n return originalInsertBefore.call(this, newChild, refChild) as T\n }\n ;(newInsertBefore as unknown as { __isZeugmaOverridden: boolean }).__isZeugmaOverridden = true\n NodeProto.insertBefore = newInsertBefore as unknown as typeof NodeProto.insertBefore\n }\n}\n\nconst TabDocumentOverride: React.FC<{\n doc: Document | null\n children: React.ReactNode\n}> = ({ doc, children }) => {\n if (doc) {\n g.__currentTabDocument = doc\n }\n try {\n return <>{children}</>\n } finally {\n g.__currentTabDocument = null\n }\n}\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 const { popoutTabs } = useZeugmaState()\n const { setTabPopout } = useZeugmaActions()\n\n const isOpenedInNewWindow = !!popoutTabs[tabId]\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n const handleClose = useCallback(() => {\n // Adopt wrapper back to main window immediately to prevent loss when window is closed\n if (wrapperRef.current) {\n document.adoptNode(wrapperRef.current)\n const hiddenContainer = getOrCreateHiddenContainer('zeugma-hidden-portal-container')\n hiddenContainer.appendChild(wrapperRef.current)\n }\n setTabPopout(tabId, false)\n }, [tabId, setTabPopout])\n\n const { popupWindow, popupContainer } = usePopupWindow({\n tabId,\n isOpenedInNewWindow,\n onClose: handleClose,\n })\n\n const windowValue = useMemo(() => {\n if (isOpenedInNewWindow && popupWindow) {\n return {\n window: popupWindow,\n document: popupWindow.document,\n }\n }\n return {\n window: typeof window !== 'undefined' ? window : null,\n document: typeof document !== 'undefined' ? document : null,\n }\n }, [isOpenedInNewWindow, popupWindow])\n\n // Move the stable wrapper in the DOM when the target pane element or window state changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (isOpenedInNewWindow) {\n if (popupContainer && popupWindow) {\n popupWindow.document.adoptNode(wrapper)\n popupContainer.appendChild(wrapper)\n }\n } else {\n document.adoptNode(wrapper)\n if (target) {\n target.appendChild(wrapper)\n } else {\n const hiddenContainer = getOrCreateHiddenContainer('zeugma-hidden-portal-container')\n hiddenContainer.appendChild(wrapper)\n }\n }\n }, [target, mounted, isOpenedInNewWindow, popupContainer, popupWindow])\n\n // Clean up wrapper 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(\n <TabWindowContext.Provider value={windowValue}>\n <TabDocumentOverride doc={windowValue.document}>{renderWidget(tabId)}</TabDocumentOverride>\n </TabWindowContext.Provider>,\n wrapper,\n )\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 popoutTabs,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n layoutBeforeDrag,\n\n // Configuration settings\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n\n // Callbacks\n onRemove,\n onResizeStart,\n onResize,\n onResizeEnd,\n\n // Actions\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n setTabPopout,\n } = internalProps\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const dnd = useZeugmaDnd({\n ...internalProps,\n setOverTabId,\n setOverTabPosition,\n })\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPane(paneId), [renderPane])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n setLayout,\n renderPane: stableRenderPane,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n popoutTabs,\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 popoutTabs,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n setTabPopout,\n }),\n [\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n setTabPopout,\n ],\n )\n\n // Collect all tab IDs in the current layout tree\n const allTabIds = useMemo(() => {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabs.forEach((tabId) => {\n ids.add(tabId)\n })\n } else {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n if (layoutBeforeDrag) {\n traverse(layoutBeforeDrag)\n }\n return Array.from(ids).sort()\n }, [layout, activeId, layoutBeforeDrag])\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n }),\n [registerPortalTarget],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <ZeugmaDragContext.Provider value={dragValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => renderDragOverlay(id, activeType!)}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => (\n <PortalHostItem\n key={tabId}\n tabId={tabId}\n target={portalTargets[tabId] || null}\n renderWidget={renderWidget}\n />\n ))}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","import React 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': { top: 0, left: 0, width: '100%', height: '25%' },\n '1/3': { top: 0, left: 0, width: '100%', height: '33.3333%' },\n },\n bottom: {\n '1/4': { bottom: 0, left: 0, width: '100%', height: '25%' },\n '1/3': { bottom: 0, left: 0, width: '100%', height: '33.3333%' },\n },\n left: {\n '1/4': { left: 0, top: 0, width: '25%', height: '100%' },\n '1/3': { left: 0, top: 0, width: '33.3333%', height: '100%' },\n },\n right: {\n '1/4': { right: 0, top: 0, width: '25%', height: '100%' },\n '1/3': { right: 0, top: 0, width: '33.3333%', height: '100%' },\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/3-top', fraction: '1/3', edge: 'top' },\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 && <RootDropZones activeClassName={classNames.dropPreview} />}\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, { useMemo, useCallback, useContext, useState, useEffect } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaActions, PortalRegistryContext } from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updateTabMetadata, selectTab, removeTab } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Pane must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const paneNode = useMemo(() => findPaneById(layout, id), [layout, id])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const [targetEl, setTargetEl] = useState<HTMLDivElement | null>(null)\n\n useEffect(() => {\n registerPortalTarget(activeTabId, targetEl)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, targetEl, registerPortalTarget])\n\n const renderActiveTab = useCallback(() => {\n return (\n <div\n ref={setTargetEl}\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 const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateTabMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateTabMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateTabMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n renderActiveTab,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { TabsContext } from './Tabs'\n\nexport interface TabContextValue {\n tabId: string\n isActive: boolean\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n locked: boolean\n selectTab: () => void\n removeTab: () => void\n}\n\nexport const TabContext = createContext<TabContextValue | undefined>(undefined)\n\nexport const useTabContext = () => {\n const context = useContext(TabContext)\n if (!context) {\n throw new Error('useTabContext must be used within a Tab component')\n }\n return context\n}\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const { locked: globalLocked, classNames = {}, activeType } = useZeugmaState()\n const { overTabId } = useZeugmaDrag()\n\n const tabsContext = useContext(TabsContext)\n const isLocked = locked || globalLocked || (tabsContext?.locked ?? false)\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked || activeType === 'pane',\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n\n const tabs = tabsContext?.tabs || []\n const index = tabs.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabs[index - 1] !== activeTabId\n\n const separator = showSeparator ? <div className={classNames.tabSeparator} /> : null\n\n const isActive = tabsContext ? tabsContext.activeTabId === id : false\n const metadata = tabsContext?.tabsMetadata?.[id]\n\n const selectThisTab = useCallback(() => {\n tabsContext?.selectTab(id)\n }, [tabsContext, id])\n\n const removeThisTab = useCallback(() => {\n tabsContext?.removeTab(id)\n }, [tabsContext, id])\n\n const tabContextValue = useMemo<TabContextValue>(\n () => ({\n tabId: id,\n isActive,\n isDragging,\n isOver: isTargetOver,\n metadata,\n locked: isLocked,\n selectTab: selectThisTab,\n removeTab: removeThisTab,\n }),\n [id, isActive, isDragging, isTargetOver, metadata, isLocked, selectThisTab, removeThisTab],\n )\n\n return (\n <TabContext.Provider value={tabContextValue}>\n <div\n ref={handleRef}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {separator}\n {children({\n isDragging,\n isOver: isTargetOver,\n })}\n </div>\n </TabContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Tab } from './Tab'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\n\nexport interface TabsContextValue {\n tabs: string[]\n activeTabId: string\n locked: boolean\n tabsMetadata?: Record<string, Record<string, unknown>>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(undefined)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component')\n }\n return context\n}\n\nexport interface TabsProps {\n /** The list of tab IDs in this pane. */\n tabs: string[]\n /** The currently active tab ID. */\n activeTabId: string\n /** Whether dragging is locked on these tabs. */\n locked?: boolean\n /** Metadata for the tabs. */\n tabsMetadata?: Record<string, Record<string, unknown>>\n /** Callback when a tab is selected. */\n selectTab: (id: string) => void\n /** Callback when a tab is closed/removed. */\n removeTab: (id: string) => void\n /** Render function for each individual tab content. */\n renderTab: (props: {\n tabId: string\n activeTabId: string\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n }) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n tabs,\n activeTabId,\n locked = false,\n tabsMetadata,\n selectTab,\n removeTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const { classNames: globalClassNames = {}, activeType } = useZeugmaState()\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabs,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabs, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabs, activeType, overTabId, overTabPosition)\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div\n className={classNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n ...styles?.container,\n }}\n >\n {tabs.map((tabId, index) => {\n const metadata = tabsMetadata?.[tabId]\n const resolvedClassName = resolveDynamicProp(classNames?.tab, tabId)\n const resolvedStyle = resolveDynamicProp(styles?.tab, tabId)\n\n const showPreviewHere = index === targetIndex\n\n return (\n <React.Fragment key={tabId}>\n {showPreviewHere && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: index === 0 ? 'none' : 'translateX(-50%)',\n }}\n />\n </div>\n )}\n <Tab id={tabId} locked={locked} className={resolvedClassName} style={resolvedStyle}>\n {({ isDragging, isOver }) =>\n renderTab({\n tabId,\n activeTabId,\n isDragging,\n isOver,\n metadata,\n selectTab,\n removeTab,\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabs.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n"]}