react-zeugma 6.8.0 → 6.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -49
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/{types-DeeEm3Ls.d.cts → types-V7PXu-Mo.d.cts} +29 -0
- package/dist/{types-DeeEm3Ls.d.ts → types-V7PXu-Mo.d.ts} +29 -0
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/lib/drag-session.ts","../src/shared/lib/json.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/entities/zeugma/model/useZeugma.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/lib/collisions.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/model/useZeugmaPersistence.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/DragOverlayPreview.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/FlatSplitter.tsx","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../src/entities/zeugma/ui/RootDropZones.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/DropZone.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx","../src/entities/pane/ui/PaneControls.tsx","../src/entities/pane/ui/Pane.tsx"],"names":["createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerMove","e","handlePointerUp","globalStyle","safeJsonStringify","val","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","ZeugmaDragContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaDrag","drag","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","renderCallbacksRef","renderPaneRef","tabHeadersRef","activeIdRef","isMountedRef","registerPortalTarget","useCallback","tabId","el","expectedEl","prev","next","registerRenderCallback","render","registerRenderPane","registerTabHeader","collectAllTabIds","layout","ids","traverse","node","useAllTabIds","useMemo","useZeugmaDragMeasurement","props","onDragStart","onDragEnd","overTabId","setOverTabId","overTabPosition","setOverTabPosition","handleDragStartInternal","draggingId","handleDragEndInternal","actId","ovId","dropAction","useRegisterRenderPane","renderPane","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","insertLeaf","leafNode","insert","parentDirection","addTab","targetPaneId","metadata","targetPane","findPaneById","appendTabToTarget","newPane","updateSplitPercentage","target","newPercentage","findPaneContainingTab","findPaneOrContainingTab","id","findTabById","pane","index","getTabMetadata","getActiveTabMetadata","updateMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","swapTabs","targetTabId","sourcePane","sourcePaneId","targetMetadata","swap","changed","newTabIds","newActiveTabId","dragIdx","targetIdx","moveTab","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","movePaneTabs","draggedPaneId","draggedTabIds","draggedActiveTabId","draggedTabsMetadata","tid","calculateTabDropIndex","tabIds","activeType","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","setLocalLayout","renderingLayout","setRenderingLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","handleSetLayout","nextLayoutOrUpdater","_internalSetLayout","setLayout","handleRemovePane","handleAddTab","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","handleGetTabMetadata","handleGetActiveTabMetadata","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","customCollisionDetection","isTabDrag","filteredCollisions","pointerWithin","b","aId","bId","aIsTab","bIsTab","aIsRoot","bIsRoot","tabDroppables","container","closestCenter","getPointerCoordinates","useZeugmaDnd","dragActivationDistance","enableDragToDismiss","dismissThreshold","onRemove","onDismissIntentChange","containerRectRef","initialLayoutForDragRef","setIsOverLocked","useSensors","useSensor","rawId","ae","layoutAfterSelect","parentPane","layoutAfterRemove","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","useZeugmaPersistence","persist","isEnabled","persistKey","isLoaded","setIsLoaded","saved","parsed","CursorOverlay","className","ref","handleMove","jsx","PortalHostItem","React","tabDetails","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","DragOverlayPreview","renderDragOverlay","classNames","Fragment","paneRender","tabHeaderRender","tabClass","useResizer","resizerSize","snapThreshold","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","minSplitPercentage","maxSplitPercentage","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","PaneTree","propResizerSize","propSnapThreshold","contextSnapThreshold","contextResizerSize","panes","splitters","renderContent","jsxs","isFullscreen","isDismissActive","handleRef","dashboardClass","RootDropZones","ZeugmaProviderInternal","controller","children","onResizeStart","onResize","onResizeEnd","internalController","dnd","stableClassNames","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","portalRegistryValue","DndContext","ZeugmaRenderer","Zeugma","restProps","activationPositions","previewPositions","RootDropZone","activeClassName","setNodeRef","isOver","useDroppable","previewStyle","zone","DragListenersCtx","DropZone","DragHandle","dragProps","disabled","TabContext","Tab","globalLocked","portalRegistry","tabsContext","TabsContext","attributes","listeners","setDragRef","isDragging","useDraggable","setDropRef","isTargetOver","activeTabId","separator","isActive","selectThisTab","removeThisTab","tabContextValue","resolveDynamicProp","value","Tabs","propTabs","propActiveTabId","propLocked","propTabsMetadata","propSelectTab","propRemoveTab","renderTab","styles","paneContext","PaneContext","tabsMetadata","globalClassNames","contextValue","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere","PaneControls","usePaneContext","context","PaneContent","targetRef","renderCallback","Pane","paneNode","paneContainerId","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","dragging","renderProps","paneClass"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 .zeugma-resizing *:not([role=\"separator\"]) {\n pointer-events: 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","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\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 { useEffect, useRef, useState, useCallback, useMemo, useContext } from 'react'\nimport { TabDetails, TreeNode, PortalRegistryContext } from '../../../shared'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const renderCallbacksRef = useRef<Record<string, (tab: TabDetails) => React.ReactNode>>({})\n const renderPaneRef = useRef<((paneId: string) => React.ReactNode) | null>(null)\n const tabHeadersRef = useRef<\n Record<string, (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode>\n >({})\n const activeIdRef = useRef<string | null>(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(\n (tabId: string, el: HTMLDivElement | null, expectedEl?: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (!el) {\n if (expectedEl && prev[tabId] !== expectedEl) {\n return prev\n }\n if (!prev[tabId]) return prev\n const next = { ...prev }\n delete next[tabId]\n return next\n }\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n },\n [],\n )\n\n const registerRenderCallback = useCallback(\n (tabId: string, render: (tab: TabDetails) => React.ReactNode) => {\n renderCallbacksRef.current[tabId] = render\n },\n [],\n )\n\n const registerRenderPane = useCallback((render: (paneId: string) => React.ReactNode) => {\n renderPaneRef.current = render\n }, [])\n\n const registerTabHeader = useCallback(\n (\n tabId: string,\n render: (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode,\n ) => {\n tabHeadersRef.current[tabId] = render\n },\n [],\n )\n\n return {\n portalTargets,\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n }\n}\n\nexport function collectAllTabIds(layout: TreeNode | null): string[] {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabIds.forEach((tabId) => {\n ids.add(tabId)\n })\n } else if (node.type === 'split') {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n return Array.from(ids).sort()\n}\n\nexport function useAllTabIds(layout: TreeNode | null): string[] {\n return useMemo(() => collectAllTabIds(layout), [layout])\n}\n\ninterface UseZeugmaDragMeasurementProps {\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: 'row' | 'column'\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n}\n\nexport function useZeugmaDragMeasurement(props: UseZeugmaDragMeasurementProps) {\n const { onDragStart, onDragEnd } = props\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const handleDragStartInternal = useCallback(\n (draggingId: string) => {\n if (onDragStart) {\n onDragStart(draggingId)\n }\n },\n [onDragStart],\n )\n\n const handleDragEndInternal = useCallback(\n (\n actId: string,\n ovId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: 'row' | 'column'\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => {\n if (onDragEnd) {\n onDragEnd(actId, ovId, dropAction)\n }\n },\n [onDragEnd],\n )\n\n return {\n overTabId,\n setOverTabId,\n overTabPosition,\n setOverTabPosition,\n handleDragStartInternal,\n handleDragEndInternal,\n }\n}\n\nexport function useRegisterRenderPane(\n renderPane: ((paneId: string) => React.ReactNode) | undefined,\n) {\n const portalRegistry = useContext(PortalRegistryContext)\n const registerRenderPane = portalRegistry?.registerRenderPane\n\n useEffect(() => {\n if (registerRenderPane && renderPane) {\n registerRenderPane(renderPane)\n }\n }, [registerRenderPane, renderPane])\n}\n","import { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(tabId)) {\n const newTabs = tree.tabIds.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 tabIds: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane or widget by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabIds: [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(), tabIds: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: PaneNode): TreeNode {\n if (tree === null) {\n return leafNode\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: leafNode,\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabIds]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabIds: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage }\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode or WidgetNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabIds.includes(tabId) ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\n}\n\n/**\n * Find a PaneNode by its own ID, or by a tab ID it contains.\n */\nexport function findPaneOrContainingTab(tree: TreeNode | null, id: string): PaneNode | null {\n return findPaneById(tree, id) ?? findPaneContainingTab(tree, id)\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.tabIds.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Get the metadata for a specific tab by its ID.\n */\nexport function getTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneContainingTab(tree, tabId)\n return pane?.tabsMetadata?.[tabId]\n}\n\n/**\n * Get the metadata of the active item (either tab or pane).\n */\n/**\n * Get the metadata of the active tab in a specific pane.\n */\nexport function getActiveTabMetadata(\n tree: TreeNode | null,\n paneId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneById(tree, paneId)\n return pane?.tabsMetadata?.[pane.activeTabId]\n}\n\n/**\n * Update metadata on a specific tab or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [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.tabIds]\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 tabIds: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport function swapTabs(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const targetPane = findPaneContainingTab(tree, targetTabId)\n\n if (!sourcePane || !targetPane) return tree\n\n const sourcePaneId = sourcePane.id\n const targetPaneId = targetPane.id\n const sourceMetadata = sourcePane.tabsMetadata?.[draggedTabId]\n const targetMetadata = targetPane.tabsMetadata?.[targetTabId]\n\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n let changed = false\n let newTabIds = [...node.tabIds]\n let newActiveTabId = node.activeTabId\n const newTabsMetadata = node.tabsMetadata ? { ...node.tabsMetadata } : {}\n\n if (sourcePaneId === targetPaneId) {\n if (node.id === sourcePaneId) {\n const dragIdx = newTabIds.indexOf(draggedTabId)\n const targetIdx = newTabIds.indexOf(targetTabId)\n if (dragIdx !== -1 && targetIdx !== -1) {\n newTabIds[dragIdx] = targetTabId\n newTabIds[targetIdx] = draggedTabId\n }\n newActiveTabId = draggedTabId\n changed = true\n }\n } else {\n if (node.id === sourcePaneId) {\n newTabIds = newTabIds.map((id) => (id === draggedTabId ? targetTabId : id))\n if (newActiveTabId === draggedTabId) {\n newActiveTabId = targetTabId\n }\n delete newTabsMetadata[draggedTabId]\n if (targetMetadata) {\n newTabsMetadata[targetTabId] = targetMetadata\n }\n changed = true\n }\n if (node.id === targetPaneId) {\n newTabIds = newTabIds.map((id) => (id === targetTabId ? draggedTabId : id))\n if (newActiveTabId === targetTabId) {\n newActiveTabId = draggedTabId\n }\n delete newTabsMetadata[targetTabId]\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n changed = true\n }\n }\n\n if (changed) {\n return {\n ...node,\n tabIds: newTabIds,\n activeTabId: newActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n return node\n }\n\n return swap(tree)\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' | 'center' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n if (position === 'center') {\n return swapTabs(tree, draggedTabId, targetTabId)\n }\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 tabIds: [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.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\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 tabIds: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Tree Helper: Move/insert all tabs of a dragged pane next to a target tab in another pane.\n */\nexport function movePaneTabs(\n tree: TreeNode | null,\n draggedPaneId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n // 1. Find the dragged pane to get its tabs, activeTabId, and tabsMetadata\n const sourcePane = findPaneById(tree, draggedPaneId)\n if (!sourcePane) return tree\n\n const draggedTabIds = sourcePane.tabIds\n const draggedActiveTabId = sourcePane.activeTabId\n const draggedTabsMetadata = sourcePane.tabsMetadata || {}\n\n // 2. Remove the dragged pane from the layout tree\n const cleanTree = removePane(tree, draggedPaneId)\n if (cleanTree === null) {\n return sourcePane\n }\n\n // 3. Insert the dragged pane's tabs into the target pane next to targetTabId\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\n // Filter out any of the dragged tabs if they somehow already existed\n const filteredTabs = newTabs.filter((t) => !draggedTabIds.includes(t))\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, ...draggedTabIds)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n for (const tid of draggedTabIds) {\n if (draggedTabsMetadata[tid]) {\n newTabsMetadata[tid] = draggedTabsMetadata[tid]\n }\n }\n return {\n ...node,\n tabIds: filteredTabs,\n activeTabId: draggedActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\n/**\n * 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 tabIds: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTabOrPane = activeType === 'tab' || activeType === 'pane'\n const isHoveredTabInThisPane = isDraggingTabOrPane && overTabId && tabIds.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabIds.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n removePane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [renderingLayout, setRenderingLayout] = 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\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 setRenderingLayout(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 setRenderingLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n // Internal setter used by DnD — does NOT trigger onChange or reset transient states\n const _internalSetLayout = useCallback((nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setRenderingLayout((prev) => {\n const next =\n typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n return next\n })\n }, [])\n\n // Public setter — resets transient states when layout is replaced programmatically\n const setLayout = useCallback(\n (nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setLocalFullscreenPaneId(null)\n onFullscreenChangeRef.current?.(null)\n setActiveId(null)\n setActiveType(null)\n setDismissIntentId(null)\n handleSetLayout(nextLayoutOrUpdater)\n // Force sync renderingLayout to clear any transient drag removals\n setRenderingLayout(() => {\n const next =\n typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(layoutRef.current)\n : nextLayoutOrUpdater\n return next\n })\n },\n [handleSetLayout],\n )\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n const cleanedPrev = removeTab(prev, tabId) ?? prev\n return addTab(cleanedPrev, targetPaneId, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabIds: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, draggedPaneNode.id)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateMetadata = useCallback(\n wrapMutation(\n (\n prev,\n id: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateMetadata(prev, id, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation(\n (prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after' | 'center') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback((paneId: string) => {\n return findPaneById(layoutRef.current, paneId)\n }, [])\n\n const handleFindPaneContainingTab = useCallback((tabId: string) => {\n return findPaneContainingTab(layoutRef.current, tabId)\n }, [])\n\n const handleFindTabById = useCallback((tabId: string) => {\n return findTabById(layoutRef.current, tabId)\n }, [])\n\n const handleGetTabMetadata = useCallback((tabId: string) => {\n return getTabMetadata(layoutRef.current, tabId)\n }, [])\n\n const handleGetActiveTabMetadata = useCallback((paneId: string) => {\n return getActiveTabMetadata(layoutRef.current, paneId)\n }, [])\n\n const controller: ZeugmaControllerInternal = {\n layout,\n setLayout,\n _internalSetLayout,\n renderingLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Actions\n removePane: handleRemovePane,\n addTab: handleAddTab,\n updateMetadata: handleUpdateMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n getTabMetadata: handleGetTabMetadata,\n getActiveTabMetadata: handleGetActiveTabMetadata,\n }\n\n return controller\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaController } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaController => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return {\n layout: state.layout,\n setLayout: state.setLayout,\n fullscreenPaneId: state.fullscreenPaneId,\n setFullscreenPaneId: actions.setFullscreenPaneId,\n locked: state.locked,\n setLocked: actions.setLocked,\n removePane: actions.removePane,\n addTab: actions.addTab,\n updateMetadata: actions.updateMetadata,\n updatePaneLock: actions.updatePaneLock,\n selectTab: actions.selectTab,\n mergeTab: actions.mergeTab,\n removeTab: actions.removeTab,\n splitPane: actions.splitPane,\n updateSplitPercentage: actions.updateSplitPercentage,\n moveTab: actions.moveTab,\n findPaneById: state.findPaneById,\n findPaneContainingTab: state.findPaneContainingTab,\n findTabById: state.findTabById,\n getTabMetadata: state.getTabMetadata,\n getActiveTabMetadata: state.getActiveTabMetadata,\n }\n}\n","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nexport class SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n","import { CollisionDetection, DroppableContainer, pointerWithin, closestCenter } from '@dnd-kit/core'\n\nexport const customCollisionDetection: CollisionDetection = (args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // We allow tab-drop colliders for both tab drags and pane drags.\n const filteredCollisions = pointerCollisions\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 // Prioritize tab drop zones over root/pane drop zones for both tab and pane drags\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 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","import { useState, useRef, Dispatch, SetStateAction } from 'react'\nimport { useSensor, useSensors, DragStartEvent, DragMoveEvent, DragEndEvent } from '@dnd-kit/core'\nimport { SplitDirection, TreeNode, PaneNode } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab,\n selectTab,\n movePaneTabs,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\nimport { customCollisionDetection } from '../lib/collisions'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps {\n layout: TreeNode | null\n _internalSetLayout: Dispatch<SetStateAction<TreeNode | null>>\n setLayout: (nextLayout: SetStateAction<TreeNode | null>) => void\n activeId: string | null\n setActiveId: Dispatch<SetStateAction<string | null>>\n activeType: 'pane' | 'tab' | null\n setActiveType: Dispatch<SetStateAction<'pane' | 'tab' | null>>\n dismissIntentId: string | null\n setDismissIntentId: Dispatch<SetStateAction<string | null>>\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n containerRef: React.RefObject<HTMLElement | null>\n\n // Config\n dragActivationDistance: number\n enableDragToDismiss: boolean\n dismissThreshold: number\n\n // Callbacks\n onRemove?: (paneId: string) => void\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onDismissIntentChange?: (paneId: string | null) => void\n\n // Actions\n removeTab: (tabId: string) => void\n removePane: (paneId: string) => void\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n _internalSetLayout,\n setLayout,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n removePane,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n const initialLayoutForDragRef = useRef<TreeNode | null>(null)\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 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 = selectTab(layout, parentPane.id, draggingId) || layout\n }\n }\n initialLayoutForDragRef.current = layoutAfterSelect\n\n const layoutAfterRemove = isTabDrag\n ? removeTabHelper(layoutAfterSelect, draggingId)\n : removePaneHelper(layoutAfterSelect, draggingId)\n _internalSetLayout(layoutAfterRemove)\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 || activeType === 'pane')) {\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 = initialLayoutForDragRef.current || layout\n initialLayoutForDragRef.current = null\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n if (isTabDrag) {\n removeTab(draggingId)\n } else {\n removePane(draggingId)\n }\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n _internalSetLayout(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 _internalSetLayout(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 const [, targetTabId] = tabDropMatch\n if (isTabDrag) {\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 = moveTab(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n } else {\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 = movePaneTabs(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\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 tabIds: [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 tabIds: [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) or center (swap) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom|center)-(.+)$/)\n if (!match) {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n\n if (dropZone === 'center') {\n if (isTabDrag) {\n const targetPane = findPaneById(originalLayout, targetId)\n if (targetPane && targetPane.activeTabId) {\n const targetTabId = targetPane.activeTabId\n const newLayout = moveTab(originalLayout, draggingId, targetTabId, 'center')\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'move',\n position: 'center',\n })\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n return\n }\n\n const parentPane = isTabDrag\n ? findPaneContainingTab(originalLayout, draggingId)\n : findPaneById(originalLayout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabIds.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n _internalSetLayout(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 tabIds: [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 tabIds: [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 = splitPane(\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 const originalLayout = initialLayoutForDragRef.current || layout\n initialLayoutForDragRef.current = null\n _internalSetLayout(originalLayout)\n if (originalLayout !== layout) {\n setLayout(originalLayout)\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 { useEffect, useState, SetStateAction } from 'react'\nimport { TreeNode, ZeugmaPersistOptions } from '../../../shared'\n\nexport interface UseZeugmaPersistenceProps {\n persist?: boolean | ZeugmaPersistOptions\n layout: TreeNode | null\n setLayout: (nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => void\n}\n\nexport function useZeugmaPersistence({ persist, layout, setLayout }: UseZeugmaPersistenceProps) {\n const isEnabled = typeof persist === 'object' ? persist.enabled !== false : !!persist\n const persistKey = (typeof persist === 'object' && persist.key) || 'zeugma-layout'\n\n const [isLoaded, setIsLoaded] = useState(false)\n\n // Load layout from localStorage on mount if persist is enabled\n useEffect(() => {\n if (isEnabled) {\n const saved = localStorage.getItem(persistKey)\n if (saved) {\n try {\n const parsed = JSON.parse(saved)\n if (parsed) {\n setLayout(parsed)\n }\n } catch (e) {\n console.error('Failed to parse persisted zeugma layout', e)\n }\n }\n }\n setIsLoaded(true)\n }, [isEnabled, persistKey, setLayout])\n\n // Save layout to localStorage when layout changes if persist is enabled\n useEffect(() => {\n if (isEnabled && isLoaded) {\n if (layout) {\n localStorage.setItem(persistKey, JSON.stringify(layout))\n } else {\n localStorage.removeItem(persistKey)\n }\n }\n }, [isEnabled, persistKey, layout, isLoaded])\n}\n","import React, { useEffect, useRef, ReactNode } from 'react'\n\nexport const CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { TabDetails } from '../../../shared'\n\nexport interface PortalHostItemProps {\n tabDetails: TabDetails\n target: HTMLDivElement | null\n renderWidget?: (tab: TabDetails) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = React.memo(\n ({ tabDetails, target, renderWidget }) => {\n const { id: tabId } = tabDetails\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabDetails), wrapper)\n },\n (prev, next) => {\n return (\n prev.target === next.target &&\n prev.renderWidget === next.renderWidget &&\n prev.tabDetails.id === next.tabDetails.id &&\n prev.tabDetails.paneId === next.tabDetails.paneId &&\n prev.tabDetails.isActive === next.tabDetails.isActive &&\n prev.tabDetails.index === next.tabDetails.index &&\n prev.tabDetails.metadata === next.tabDetails.metadata\n )\n },\n)\n","import React from 'react'\nimport { ZeugmaClassNames } from '../../../shared'\n\ninterface DragOverlayPreviewProps {\n activeId: string\n activeType: 'pane' | 'tab'\n dismissIntentId: string | null\n renderDragOverlay?: (active: {\n type: 'tab' | 'pane'\n id: string\n isDismissing: boolean\n }) => React.ReactNode\n renderPaneRef: React.RefObject<((paneId: string) => React.ReactNode) | null>\n renderPane?: (paneId: string) => React.ReactNode\n tabHeadersRef: React.RefObject<\n Record<string, (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode>\n >\n classNames: ZeugmaClassNames\n}\n\nexport const DragOverlayPreview: React.FC<DragOverlayPreviewProps> = ({\n activeId,\n activeType,\n dismissIntentId,\n renderDragOverlay,\n renderPaneRef,\n renderPane,\n tabHeadersRef,\n classNames,\n}) => {\n if (renderDragOverlay) {\n return (\n <>\n {renderDragOverlay({\n type: activeType,\n id: activeId,\n isDismissing: activeId === dismissIntentId,\n })}\n </>\n )\n }\n\n if (activeType === 'pane') {\n const paneRender = renderPaneRef.current || renderPane\n if (paneRender) {\n return (\n <div\n className={classNames.paneDragPreview || ''}\n style={{\n pointerEvents: 'none',\n width: '420px',\n height: '260px',\n overflow: 'hidden',\n }}\n >\n {paneRender(activeId)}\n </div>\n )\n }\n } else if (activeType === 'tab') {\n const paneRender = renderPaneRef.current || renderPane\n if (paneRender) {\n return (\n <div\n className={classNames.tabDragPreview || ''}\n style={{\n pointerEvents: 'none',\n width: '420px',\n height: '260px',\n overflow: 'hidden',\n }}\n >\n {paneRender(activeId)}\n </div>\n )\n }\n const tabHeaderRender = tabHeadersRef.current[activeId]\n if (tabHeaderRender) {\n const tabClass = classNames.tab\n ? typeof classNames.tab === 'function'\n ? classNames.tab(activeId)\n : classNames.tab\n : ''\n return (\n <div\n className={`${classNames.tabDragPreview || ''} ${tabClass}`.trim()}\n style={{\n display: 'inline-flex',\n position: 'relative',\n pointerEvents: 'none',\n overflow: 'hidden',\n }}\n >\n {tabHeaderRender({ isDragging: true, isOver: false })}\n </div>\n )\n }\n }\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n overflow: 'hidden',\n width: '100%',\n height: '100%',\n }}\n />\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection, useZeugmaState } from '../../../shared'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useState } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { useResizer } from '../../../features/resize-pane'\nimport { ComputedSplitter } from '../../../shared/lib/tree'\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nexport const FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { renderingLayout, 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: renderingLayout,\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\nexport const MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (paneId: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\n)\n","import React, { useRef, useMemo } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { TreeNode } from '../../../shared'\nimport { computeLayout } from '../../../shared/lib/tree'\nimport { RootDropZones } from '../../../entities/zeugma/ui'\nimport { FlatSplitter, MemoizedPaneContent } from './FlatSplitter'\nimport { useRegisterRenderPane } from '../../../entities/zeugma/model'\n\nexport interface PaneTreeProps {\n /** Render function mapping unique pane nodes to React elements. Usually renders a <Pane> wrapper. */\n renderPane: (paneId: string) => React.ReactNode\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n renderPane,\n tree,\n resizerSize: propResizerSize,\n snapThreshold: propSnapThreshold,\n}) => {\n useRegisterRenderPane(renderPane)\n const {\n renderingLayout,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n locked,\n classNames,\n resizerSize: contextResizerSize,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const resizerSize = propResizerSize !== undefined ? propResizerSize : (contextResizerSize ?? 4)\n\n const currentNode = tree !== undefined ? tree : renderingLayout\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 && tree !== undefined) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n {activeId !== null && !locked && (\n <RootDropZones activeClassName={classNames.rootDropPreview ?? classNames.dropPreview} />\n )}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\nimport {\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaDragContext,\n ZeugmaDragStateValue,\n ZeugmaProps,\n BaseZeugmaProps,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n usePortalRegistry,\n useZeugmaDnd,\n useAllTabIds,\n useZeugmaDragMeasurement,\n useZeugmaPersistence,\n} from '../model'\nimport { CursorOverlay } from './CursorOverlay'\nimport { PortalHostItem } from './PortalHostItem'\nimport { DragOverlayPreview } from './DragOverlayPreview'\nimport { PaneTree } from '../../../widgets/pane-tree'\n\nconst ZeugmaProviderInternal: React.FC<\n BaseZeugmaProps & { children?: React.ReactNode; renderPane?: (paneId: string) => React.ReactNode }\n> = (props) => {\n const {\n controller,\n children,\n renderDragOverlay,\n classNames = {},\n renderPane,\n resizerSize,\n\n // Configuration settings\n dragActivationDistance = 8,\n snapThreshold = 8,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Persistence\n persist = false,\n } = props\n\n const internalController = controller as ZeugmaControllerInternal\n const {\n layout,\n setLayout,\n _internalSetLayout,\n renderingLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n } = internalController\n\n // Synchronize layout persistence\n useZeugmaPersistence({ persist, layout, setLayout })\n\n const {\n portalTargets,\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n } = usePortalRegistry()\n\n const {\n overTabId,\n setOverTabId,\n overTabPosition,\n setOverTabPosition,\n handleDragStartInternal,\n handleDragEndInternal,\n } = useZeugmaDragMeasurement({\n onDragStart,\n onDragEnd,\n })\n\n const dnd = useZeugmaDnd({\n layout,\n _internalSetLayout,\n setLayout,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart: handleDragStartInternal,\n onDragEnd: handleDragEndInternal,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n removePane,\n })\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.rootDropPreview,\n classNames.dragOverlay,\n classNames.paneDragPreview,\n classNames.tabDragPreview,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n classNames.tabsContainer,\n classNames.tab,\n classNames.paneContainer,\n classNames.paneHeader,\n classNames.paneControls,\n classNames.paneButton,\n classNames.tabCloseButton,\n classNames.dragHandle,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n renderingLayout,\n setLayout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n }),\n [\n layout,\n renderingLayout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n ],\n )\n\n // Collect all tab IDs and widget IDs in the current layout tree\n const allTabIds = useAllTabIds(layout)\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n }),\n [\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n ],\n )\n\n if (activeIdRef) {\n activeIdRef.current = activeId\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 && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => {\n const isDismissing = id === dismissIntentId\n return (\n <div\n style={{\n transition: 'transform 150ms cubic-bezier(0.2, 0, 0, 1)',\n transform: isDismissing ? 'scale(0.8)' : 'scale(1)',\n transformOrigin: 'top left',\n }}\n >\n <DragOverlayPreview\n activeId={id}\n activeType={activeType}\n dismissIntentId={dismissIntentId}\n renderDragOverlay={renderDragOverlay}\n renderPaneRef={renderPaneRef}\n renderPane={renderPane}\n tabHeadersRef={tabHeadersRef}\n classNames={stableClassNames}\n />\n </div>\n )\n }}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => {\n const target = portalTargets[tabId]\n const tabDetails = findTabById(tabId)\n if (!tabDetails) return null\n return (\n <PortalHostItem\n key={tabId}\n tabDetails={tabDetails}\n target={target || null}\n renderWidget={renderCallbacksRef.current[tabId]}\n />\n )\n })}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n\nconst ZeugmaRenderer: React.FC<{\n renderPane?: (paneId: string) => React.ReactNode\n resizerSize?: number\n snapThreshold?: number\n}> = ({ renderPane, resizerSize, snapThreshold }) => {\n if (!renderPane) {\n throw new Error(\n 'Zeugma component requires a renderPane prop when used as a standalone renderer.',\n )\n }\n return (\n <PaneTree renderPane={renderPane} resizerSize={resizerSize} snapThreshold={snapThreshold} />\n )\n}\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const { children, ...restProps } = props as unknown as {\n children?: React.ReactNode\n renderPane?: (paneId: string) => React.ReactNode\n }\n\n const { controller } = props as unknown as { controller?: ZeugmaControllerInternal }\n if (!controller) {\n throw new Error('Zeugma component requires a controller.')\n }\n\n return (\n <ZeugmaProviderInternal\n {...(props as unknown as BaseZeugmaProps & {\n children?: React.ReactNode\n renderPane?: (paneId: string) => React.ReactNode\n })}\n >\n {children !== undefined ? children : <ZeugmaRenderer {...restProps} />}\n </ZeugmaProviderInternal>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\ninterface RootDropZoneProps {\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nconst activationPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n top: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n bottom: {\n '1/4': {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n bottom: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n left: {\n '1/4': {\n position: 'absolute',\n left: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n left: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n right: {\n '1/4': {\n position: 'absolute',\n right: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n right: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n}\n\nconst previewPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n top: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n '1/3': {\n top: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n },\n bottom: {\n '1/4': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n left: {\n '1/4': {\n left: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n '1/3': {\n left: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n },\n right: {\n '1/4': {\n right: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n right: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n}\n\nconst RootDropZone: React.FC<RootDropZoneProps> = ({ id, fraction, edge, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n\n const previewStyle: React.CSSProperties = {\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 101,\n boxSizing: 'border-box',\n ...previewPositions[edge][fraction],\n }\n\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[edge][fraction]} />\n {isOver && <div className={activeClassName} style={previewStyle} />}\n </>\n )\n}\n\ninterface RootDropZonesProps {\n activeClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({ activeClassName }) => {\n const zones: Array<{\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n }> = [\n { id: 'drop-root-1/4-top', fraction: '1/4', edge: 'top' },\n { id: 'drop-root-1/3-top', fraction: '1/3', edge: 'top' },\n { id: 'drop-root-1/4-bottom', fraction: '1/4', edge: 'bottom' },\n { id: 'drop-root-1/3-bottom', fraction: '1/3', edge: 'bottom' },\n { id: 'drop-root-1/4-left', fraction: '1/4', edge: 'left' },\n { id: 'drop-root-1/3-left', fraction: '1/3', edge: 'left' },\n { id: 'drop-root-1/4-right', fraction: '1/4', edge: 'right' },\n { id: 'drop-root-1/3-right', fraction: '1/3', edge: 'right' },\n ]\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99,\n pointerEvents: 'none',\n }}\n >\n {zones.map((zone) => (\n <RootDropZone\n key={zone.id}\n id={zone.id}\n fraction={zone.fraction}\n edge={zone.edge}\n activeClassName={activeClassName}\n />\n ))}\n </div>\n )\n}\n","import React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nexport interface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header' | 'center'\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 center: {\n position: 'absolute',\n top: '25%',\n left: '25%',\n width: '50%',\n height: '50%',\n zIndex: 22,\n pointerEvents: 'auto',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n 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 center: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport const DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback, useEffect } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaDrag, PortalRegistryContext } 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 = {}, fullscreenPaneId } = useZeugmaState()\n const { overTabId } = useZeugmaDrag()\n const portalRegistry = useContext(PortalRegistryContext)\n\n useEffect(() => {\n if (portalRegistry?.registerTabHeader) {\n portalRegistry.registerTabHeader(id, children)\n }\n return () => {\n if (portalRegistry?.registerTabHeader) {\n if (portalRegistry.activeIdRef?.current !== id) {\n portalRegistry.registerTabHeader(id, () => null)\n }\n }\n }\n }, [id, children, portalRegistry])\n\n const tabsContext = useContext(TabsContext)\n const isLocked =\n locked || globalLocked || (tabsContext?.locked ?? false) || fullscreenPaneId !== null\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,\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 tabIds = tabsContext?.tabIds || []\n const index = tabIds.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabIds[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 id={`tab-header-${id}`}\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 type { RenderTabProps } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\nimport { PaneContext } from './Pane'\n\nexport interface TabsContextValue {\n tabIds: 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 tabIds?: 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: RenderTabProps) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> & {\n Tab: typeof Tab\n} = ({\n tabIds: propTabs,\n activeTabId: propActiveTabId,\n locked: propLocked,\n tabsMetadata: propTabsMetadata,\n selectTab: propSelectTab,\n removeTab: propRemoveTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const paneContext = useContext(PaneContext)\n\n const tabIds = propTabs ?? paneContext?.tabIds ?? []\n const activeTabId = propActiveTabId ?? paneContext?.activeTabId ?? ''\n const locked = propLocked ?? paneContext?.locked ?? false\n const tabsMetadata = propTabsMetadata ?? paneContext?.tabsMetadata\n const selectTab = propSelectTab ?? paneContext?.selectTab ?? (() => {})\n const removeTab = propRemoveTab ?? paneContext?.removeTab ?? (() => {})\n\n const { classNames: globalClassNames = {}, activeType } = useZeugmaState()\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabIds,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabIds, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabIds, 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 {tabIds.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 id: tabId,\n paneId: paneContext?.id ?? '',\n isActive: tabId === activeTabId,\n index,\n isDragging,\n isOver,\n metadata,\n onSelect: () => selectTab(tabId),\n onRemove: () => removeTab(tabId),\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabIds.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n\nTabs.Tab = Tab\n","import React from 'react'\n\nexport interface PaneControlsProps {\n /** Custom CSS class applied to the controls container. */\n className?: string\n /** Custom inline CSS style applied to the controls container. */\n style?: React.CSSProperties\n /** The children elements (e.g. close and fullscreen buttons) to render inside the controls container. */\n children?: React.ReactNode\n}\n\nexport const PaneControls: React.FC<PaneControlsProps> = ({ className, style, children }) => {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n}\n","import React, { useMemo, useEffect, useContext, useRef, createContext } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n TabDetails,\n} from '../../../shared'\nimport { findPaneOrContainingTab, findPaneContainingTab } from '../../../shared/lib/tree'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { DropZone } from './DropZone'\nimport { DragHandle } from './DragHandle'\nimport { Tabs } from './Tabs'\nimport { Tab } from './Tab'\nimport { PaneControls } from './PaneControls'\n\nexport interface PaneContextValue extends PaneRenderProps {\n id: string\n}\n\nexport const PaneContext = createContext<PaneContextValue | undefined>(undefined)\n\nexport const usePaneContext = () => {\n const context = useContext(PaneContext)\n if (!context) {\n throw new Error('usePaneContext must be used within a Pane component')\n }\n return context\n}\n\nexport interface PaneContentProps {\n /** A render callback (tab) => ReactNode or static ReactNode content to render for the active tab. */\n children?: React.ReactNode | ((tab: TabDetails) => React.ReactNode)\n /** Custom CSS class applied to the tab content wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab content wrapper. */\n style?: React.CSSProperties\n}\n\nexport const PaneContent: React.FC<PaneContentProps> = ({ children, className, style }) => {\n const { activeTabId } = usePaneContext()\n const { classNames } = useZeugmaState()\n const targetRef = useRef<HTMLDivElement | null>(null)\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('PaneContent must be used within a Zeugma provider')\n }\n const { registerPortalTarget, registerRenderCallback } = portalRegistry\n\n const renderCallback = useMemo(() => {\n if (typeof children === 'function') {\n return children as (tab: TabDetails) => React.ReactNode\n }\n return () => children\n }, [children])\n\n // Register render callback synchronously during the render phase\n registerRenderCallback(activeTabId, renderCallback)\n\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null, el)\n }\n }, [activeTabId, registerPortalTarget])\n\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className={`${classNames.tabContentWrapper || ''} ${className || ''}`.trim()}\n style={{\n height: '100%',\n width: '100%',\n ...style,\n }}\n />\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** The children elements inside the pane (e.g. headers, tabs, content). */\n children: React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> & {\n Content: typeof PaneContent\n DragHandle: typeof DragHandle\n Tabs: typeof Tabs\n Tab: typeof Tab\n Controls: typeof PaneControls\n} = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n renderingLayout,\n activeId,\n activeType,\n classNames: globalClassNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updateMetadata, selectTab, removeTab } = useZeugmaActions()\n\n const paneNode = useMemo(() => {\n if (activeType === 'tab' && id === activeId) {\n const originalPane = findPaneContainingTab(layout, id)\n const sourceMetadata = originalPane?.tabsMetadata?.[id]\n return {\n type: 'pane' as const,\n id,\n tabIds: [id],\n activeTabId: id,\n tabsMetadata: sourceMetadata ? { [id]: sourceMetadata } : undefined,\n }\n }\n const targetTree = id === activeId ? layout : renderingLayout\n return findPaneOrContainingTab(targetTree, id)\n }, [layout, renderingLayout, id, activeId, activeType])\n const paneContainerId = paneNode?.id ?? id\n const tabIds = paneNode?.tabIds ?? [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 || fullscreenPaneId !== null\n const isDroppableDisabled = globalLocked || isPaneLocked || fullscreenPaneId !== null\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabIds.includes(activeId) || tabIds.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabIds.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabIds,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateMetadata(tabId, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateMetadata,\n isDraggableDisabled,\n tabIds,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n ],\n )\n\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${globalClassNames.pane || ''} ${\n isPaneLocked ? globalClassNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <PaneContext.Provider value={{ id, ...renderProps }}>\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n id={id}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={globalClassNames.dropPreview}\n />\n ))}\n {activeType === 'tab' && (\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={globalClassNames.swapPreview ?? globalClassNames.dropPreview}\n />\n )}\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={globalClassNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n </PaneContext.Provider>\n )\n}\n\nPane.Content = PaneContent\nPane.DragHandle = DragHandle\nPane.Tabs = Tabs\nPane.Tab = Tab\nPane.Controls = PaneControls\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/lib/drag-session.ts","../src/shared/lib/json.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/entities/zeugma/model/useZeugma.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/lib/collisions.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/model/useZeugmaPersistence.ts","../src/entities/zeugma/model/useZeugmaPopouts.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/DragOverlayPreview.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/FlatSplitter.tsx","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../src/entities/zeugma/ui/RootDropZones.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/DropZone.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx","../src/entities/pane/ui/PaneControls.tsx","../src/entities/pane/ui/Pane.tsx"],"names":["createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerMove","e","handlePointerUp","globalStyle","safeJsonStringify","val","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","ZeugmaDragContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaDrag","drag","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","popoutTargets","setPopoutTargets","renderCallbacksRef","renderPaneRef","tabHeadersRef","activeIdRef","isMountedRef","registerPortalTarget","useCallback","tabId","el","expectedEl","prev","next","registerPopoutTarget","registerRenderCallback","render","registerRenderPane","registerTabHeader","useMemo","collectAllTabIds","layout","ids","traverse","node","useAllTabIds","useZeugmaDragMeasurement","props","onDragStart","onDragEnd","overTabId","setOverTabId","overTabPosition","setOverTabPosition","handleDragStartInternal","draggingId","handleDragEndInternal","actId","ovId","dropAction","useRegisterRenderPane","renderPane","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","insertLeaf","leafNode","insert","parentDirection","addTab","targetPaneId","metadata","targetPane","findPaneById","appendTabToTarget","newPane","updateSplitPercentage","target","newPercentage","findPaneContainingTab","findPaneOrContainingTab","id","findTabById","pane","index","getTabMetadata","getActiveTabMetadata","updateMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","swapTabs","targetTabId","sourcePane","sourcePaneId","targetMetadata","swap","changed","newTabIds","newActiveTabId","dragIdx","targetIdx","moveTab","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","movePaneTabs","draggedPaneId","draggedTabIds","draggedActiveTabId","draggedTabsMetadata","tid","calculateTabDropIndex","tabIds","activeType","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","setLocalLayout","renderingLayout","setRenderingLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","poppedOutTabIds","setPoppedOutTabIds","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","handleSetLayout","nextLayoutOrUpdater","_internalSetLayout","setLayout","handleRemovePane","handleAddTab","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","handleGetTabMetadata","handleGetActiveTabMetadata","handlePopoutTab","handleDockTab","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","customCollisionDetection","isTabDrag","filteredCollisions","pointerWithin","a","b","aId","bId","aIsTab","bIsTab","aIsRoot","bIsRoot","tabDroppables","container","closestCenter","getPointerCoordinates","useZeugmaDnd","dragActivationDistance","enableDragToDismiss","dismissThreshold","onRemove","onDismissIntentChange","containerRectRef","initialLayoutForDragRef","setIsOverLocked","useSensors","useSensor","rawId","ae","layoutAfterSelect","parentPane","layoutAfterRemove","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","useZeugmaPersistence","persist","isEnabled","persistKey","isLoaded","setIsLoaded","saved","parsed","lastActiveEvent","interceptionInitialized","activePopoutDocuments","headObserver","startHeadObserver","mutations","mutation","doc","cloned","href","stopHeadObserver","delayClose","closeFn","getActiveDocument","currentEvent","setupPopoutInterception","resetActive","evtName","originalCreateElement","tagName","activeDoc","originalAppendChild","originalRemoveChild","child","originalInsertBefore","originalReplaceChild","originalDocAddEventListener","type","listener","originalDocRemoveEventListener","originalWinAddEventListener","originalWinRemoveEventListener","originalGetElementById","mainEl","originalQuerySelector","selector","originalQuerySelectorAll","mainResults","results","useZeugmaPopouts","dockTab","popoutWindowsRef","activeWindows","title","popup","clonedNode","rules","cssText","rule","originalTarget","targetBg","docComputedStyle","bodyComputedStyle","bodyBg","activeBgColor","finalBgColor","eventsToTrack","trackEvent","handleUnload","popupObj","CursorOverlay","className","ref","handleMove","jsx","PopoutRenderWrapper","popoutDoc","children","Fragment","originalUseEffect","React","originalUseLayoutEffect","originalUseInsertionEffect","effect","deps","cleanup","PortalHostItem","tabDetails","renderWidget","renderPopoutWrapper","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","isPopped","keySuffix","widget","createPortal","DragOverlayPreview","renderDragOverlay","classNames","paneRender","tabHeaderRender","tabClass","useResizer","resizerSize","snapThreshold","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","minSplitPercentage","maxSplitPercentage","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","PaneTree","propResizerSize","propSnapThreshold","contextSnapThreshold","contextResizerSize","panes","splitters","renderContent","jsxs","isFullscreen","isDismissActive","handleRef","dashboardClass","RootDropZones","ZeugmaProviderInternal","controller","onResizeStart","onResize","onResizeEnd","internalController","popoutTab","isTabPoppedOut","dnd","stableClassNames","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","portalRegistryValue","DndContext","ZeugmaRenderer","Zeugma","restProps","activationPositions","previewPositions","RootDropZone","activeClassName","setNodeRef","isOver","useDroppable","previewStyle","zone","DragListenersCtx","DropZone","DragHandle","dragProps","disabled","TabContext","Tab","globalLocked","portalRegistry","isPoppedOut","tabsContext","TabsContext","attributes","listeners","setDragRef","isDragging","useDraggable","setDropRef","isTargetOver","activeTabId","separator","isActive","selectThisTab","removeThisTab","tabContextValue","resolveDynamicProp","value","Tabs","propTabs","propActiveTabId","propLocked","propTabsMetadata","propSelectTab","propRemoveTab","renderTab","styles","paneContext","PaneContext","tabsMetadata","globalClassNames","contextValue","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere","PaneControls","usePaneContext","context","PaneContent","targetRef","renderCallback","poppedOut","Pane","paneNode","paneContainerId","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","dragging","renderProps","paneClass"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 .zeugma-resizing *:not([role=\"separator\"]) {\n pointer-events: 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","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\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 { useEffect, useRef, useState, useCallback, useMemo, useContext } from 'react'\nimport { TabDetails, TreeNode, PortalRegistryContext } from '../../../shared'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const [popoutTargets, setPopoutTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const renderCallbacksRef = useRef<Record<string, (tab: TabDetails) => React.ReactNode>>({})\n const renderPaneRef = useRef<((paneId: string) => React.ReactNode) | null>(null)\n const tabHeadersRef = useRef<\n Record<string, (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode>\n >({})\n const activeIdRef = useRef<string | null>(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(\n (tabId: string, el: HTMLDivElement | null, expectedEl?: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (!el) {\n if (expectedEl && prev[tabId] !== expectedEl) {\n return prev\n }\n if (!prev[tabId]) return prev\n const next = { ...prev }\n delete next[tabId]\n return next\n }\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n },\n [],\n )\n\n const registerPopoutTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPopoutTargets((prev) => {\n if (!el) {\n if (!prev[tabId]) return prev\n const next = { ...prev }\n delete next[tabId]\n return next\n }\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n const registerRenderCallback = useCallback(\n (tabId: string, render: (tab: TabDetails) => React.ReactNode) => {\n renderCallbacksRef.current[tabId] = render\n },\n [],\n )\n\n const registerRenderPane = useCallback((render: (paneId: string) => React.ReactNode) => {\n renderPaneRef.current = render\n }, [])\n\n const registerTabHeader = useCallback(\n (\n tabId: string,\n render: (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode,\n ) => {\n tabHeadersRef.current[tabId] = render\n },\n [],\n )\n\n const mergedTargets = useMemo(() => {\n return { ...portalTargets, ...popoutTargets }\n }, [portalTargets, popoutTargets])\n\n return {\n portalTargets: mergedTargets,\n registerPortalTarget,\n registerPopoutTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n }\n}\n\nexport function collectAllTabIds(layout: TreeNode | null): string[] {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabIds.forEach((tabId) => {\n ids.add(tabId)\n })\n } else if (node.type === 'split') {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n return Array.from(ids).sort()\n}\n\nexport function useAllTabIds(layout: TreeNode | null): string[] {\n return useMemo(() => collectAllTabIds(layout), [layout])\n}\n\ninterface UseZeugmaDragMeasurementProps {\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: 'row' | 'column'\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n}\n\nexport function useZeugmaDragMeasurement(props: UseZeugmaDragMeasurementProps) {\n const { onDragStart, onDragEnd } = props\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const handleDragStartInternal = useCallback(\n (draggingId: string) => {\n if (onDragStart) {\n onDragStart(draggingId)\n }\n },\n [onDragStart],\n )\n\n const handleDragEndInternal = useCallback(\n (\n actId: string,\n ovId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: 'row' | 'column'\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => {\n if (onDragEnd) {\n onDragEnd(actId, ovId, dropAction)\n }\n },\n [onDragEnd],\n )\n\n return {\n overTabId,\n setOverTabId,\n overTabPosition,\n setOverTabPosition,\n handleDragStartInternal,\n handleDragEndInternal,\n }\n}\n\nexport function useRegisterRenderPane(\n renderPane: ((paneId: string) => React.ReactNode) | undefined,\n) {\n const portalRegistry = useContext(PortalRegistryContext)\n const registerRenderPane = portalRegistry?.registerRenderPane\n\n useEffect(() => {\n if (registerRenderPane && renderPane) {\n registerRenderPane(renderPane)\n }\n }, [registerRenderPane, renderPane])\n}\n","import { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(tabId)) {\n const newTabs = tree.tabIds.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 tabIds: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane or widget by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabIds: [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(), tabIds: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: PaneNode): TreeNode {\n if (tree === null) {\n return leafNode\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: leafNode,\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabIds]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabIds: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage }\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode or WidgetNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabIds.includes(tabId) ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\n}\n\n/**\n * Find a PaneNode by its own ID, or by a tab ID it contains.\n */\nexport function findPaneOrContainingTab(tree: TreeNode | null, id: string): PaneNode | null {\n return findPaneById(tree, id) ?? findPaneContainingTab(tree, id)\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.tabIds.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n remountOnPopout: pane.tabsMetadata?.[tabId]?.remountOnPopout as boolean | undefined,\n }\n}\n\n/**\n * Get the metadata for a specific tab by its ID.\n */\nexport function getTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneContainingTab(tree, tabId)\n return pane?.tabsMetadata?.[tabId]\n}\n\n/**\n * Get the metadata of the active item (either tab or pane).\n */\n/**\n * Get the metadata of the active tab in a specific pane.\n */\nexport function getActiveTabMetadata(\n tree: TreeNode | null,\n paneId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneById(tree, paneId)\n return pane?.tabsMetadata?.[pane.activeTabId]\n}\n\n/**\n * Update metadata on a specific tab or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [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.tabIds]\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 tabIds: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport function swapTabs(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const targetPane = findPaneContainingTab(tree, targetTabId)\n\n if (!sourcePane || !targetPane) return tree\n\n const sourcePaneId = sourcePane.id\n const targetPaneId = targetPane.id\n const sourceMetadata = sourcePane.tabsMetadata?.[draggedTabId]\n const targetMetadata = targetPane.tabsMetadata?.[targetTabId]\n\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n let changed = false\n let newTabIds = [...node.tabIds]\n let newActiveTabId = node.activeTabId\n const newTabsMetadata = node.tabsMetadata ? { ...node.tabsMetadata } : {}\n\n if (sourcePaneId === targetPaneId) {\n if (node.id === sourcePaneId) {\n const dragIdx = newTabIds.indexOf(draggedTabId)\n const targetIdx = newTabIds.indexOf(targetTabId)\n if (dragIdx !== -1 && targetIdx !== -1) {\n newTabIds[dragIdx] = targetTabId\n newTabIds[targetIdx] = draggedTabId\n }\n newActiveTabId = draggedTabId\n changed = true\n }\n } else {\n if (node.id === sourcePaneId) {\n newTabIds = newTabIds.map((id) => (id === draggedTabId ? targetTabId : id))\n if (newActiveTabId === draggedTabId) {\n newActiveTabId = targetTabId\n }\n delete newTabsMetadata[draggedTabId]\n if (targetMetadata) {\n newTabsMetadata[targetTabId] = targetMetadata\n }\n changed = true\n }\n if (node.id === targetPaneId) {\n newTabIds = newTabIds.map((id) => (id === targetTabId ? draggedTabId : id))\n if (newActiveTabId === targetTabId) {\n newActiveTabId = draggedTabId\n }\n delete newTabsMetadata[targetTabId]\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n changed = true\n }\n }\n\n if (changed) {\n return {\n ...node,\n tabIds: newTabIds,\n activeTabId: newActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n return node\n }\n\n return swap(tree)\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' | 'center' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n if (position === 'center') {\n return swapTabs(tree, draggedTabId, targetTabId)\n }\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 tabIds: [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.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\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 tabIds: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Tree Helper: Move/insert all tabs of a dragged pane next to a target tab in another pane.\n */\nexport function movePaneTabs(\n tree: TreeNode | null,\n draggedPaneId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n // 1. Find the dragged pane to get its tabs, activeTabId, and tabsMetadata\n const sourcePane = findPaneById(tree, draggedPaneId)\n if (!sourcePane) return tree\n\n const draggedTabIds = sourcePane.tabIds\n const draggedActiveTabId = sourcePane.activeTabId\n const draggedTabsMetadata = sourcePane.tabsMetadata || {}\n\n // 2. Remove the dragged pane from the layout tree\n const cleanTree = removePane(tree, draggedPaneId)\n if (cleanTree === null) {\n return sourcePane\n }\n\n // 3. Insert the dragged pane's tabs into the target pane next to targetTabId\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\n // Filter out any of the dragged tabs if they somehow already existed\n const filteredTabs = newTabs.filter((t) => !draggedTabIds.includes(t))\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, ...draggedTabIds)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n for (const tid of draggedTabIds) {\n if (draggedTabsMetadata[tid]) {\n newTabsMetadata[tid] = draggedTabsMetadata[tid]\n }\n }\n return {\n ...node,\n tabIds: filteredTabs,\n activeTabId: draggedActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\n/**\n * 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 tabIds: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTabOrPane = activeType === 'tab' || activeType === 'pane'\n const isHoveredTabInThisPane = isDraggingTabOrPane && overTabId && tabIds.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabIds.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n removePane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [renderingLayout, setRenderingLayout] = 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 [poppedOutTabIds, setPoppedOutTabIds] = useState<string[]>([])\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 setRenderingLayout(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 setRenderingLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n // Internal setter used by DnD — does NOT trigger onChange or reset transient states\n const _internalSetLayout = useCallback((nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setRenderingLayout((prev) => {\n const next =\n typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n return next\n })\n }, [])\n\n // Public setter — resets transient states when layout is replaced programmatically\n const setLayout = useCallback(\n (nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setLocalFullscreenPaneId(null)\n onFullscreenChangeRef.current?.(null)\n setActiveId(null)\n setActiveType(null)\n setDismissIntentId(null)\n handleSetLayout(nextLayoutOrUpdater)\n // Force sync renderingLayout to clear any transient drag removals\n setRenderingLayout(() => {\n const next =\n typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(layoutRef.current)\n : nextLayoutOrUpdater\n return next\n })\n },\n [handleSetLayout],\n )\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n const cleanedPrev = removeTab(prev, tabId) ?? prev\n return addTab(cleanedPrev, targetPaneId, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabIds: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, draggedPaneNode.id)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateMetadata = useCallback(\n wrapMutation(\n (\n prev,\n id: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateMetadata(prev, id, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation(\n (prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after' | 'center') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback((paneId: string) => {\n return findPaneById(layoutRef.current, paneId)\n }, [])\n\n const handleFindPaneContainingTab = useCallback((tabId: string) => {\n return findPaneContainingTab(layoutRef.current, tabId)\n }, [])\n\n const handleFindTabById = useCallback((tabId: string) => {\n return findTabById(layoutRef.current, tabId)\n }, [])\n\n const handleGetTabMetadata = useCallback((tabId: string) => {\n return getTabMetadata(layoutRef.current, tabId)\n }, [])\n\n const handleGetActiveTabMetadata = useCallback((paneId: string) => {\n return getActiveTabMetadata(layoutRef.current, paneId)\n }, [])\n\n const handlePopoutTab = useCallback((tabId: string) => {\n setPoppedOutTabIds((prev) => {\n if (prev.includes(tabId)) return prev\n return [...prev, tabId]\n })\n }, [])\n\n const handleDockTab = useCallback((tabId: string) => {\n setPoppedOutTabIds((prev) => {\n if (!prev.includes(tabId)) return prev\n return prev.filter((id) => id !== tabId)\n })\n }, [])\n\n const controller: ZeugmaControllerInternal = {\n layout,\n setLayout,\n _internalSetLayout,\n renderingLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n poppedOutTabIds,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Actions\n removePane: handleRemovePane,\n addTab: handleAddTab,\n updateMetadata: handleUpdateMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n popoutTab: handlePopoutTab,\n dockTab: handleDockTab,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n getTabMetadata: handleGetTabMetadata,\n getActiveTabMetadata: handleGetActiveTabMetadata,\n }\n\n return controller\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaController } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaController => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return {\n layout: state.layout,\n setLayout: state.setLayout,\n fullscreenPaneId: state.fullscreenPaneId,\n setFullscreenPaneId: actions.setFullscreenPaneId,\n locked: state.locked,\n setLocked: actions.setLocked,\n removePane: actions.removePane,\n addTab: actions.addTab,\n updateMetadata: actions.updateMetadata,\n updatePaneLock: actions.updatePaneLock,\n selectTab: actions.selectTab,\n mergeTab: actions.mergeTab,\n removeTab: actions.removeTab,\n splitPane: actions.splitPane,\n updateSplitPercentage: actions.updateSplitPercentage,\n moveTab: actions.moveTab,\n findPaneById: state.findPaneById,\n findPaneContainingTab: state.findPaneContainingTab,\n findTabById: state.findTabById,\n getTabMetadata: state.getTabMetadata,\n getActiveTabMetadata: state.getActiveTabMetadata,\n poppedOutTabIds: state.poppedOutTabIds,\n popoutTab: actions.popoutTab,\n dockTab: actions.dockTab,\n }\n}\n","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nexport class SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n","import { CollisionDetection, DroppableContainer, pointerWithin, closestCenter } from '@dnd-kit/core'\n\nexport const customCollisionDetection: CollisionDetection = (args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // We allow tab-drop colliders for both tab drags and pane drags.\n const filteredCollisions = pointerCollisions\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 // Prioritize tab drop zones over root/pane drop zones for both tab and pane drags\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 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","import { useState, useRef, Dispatch, SetStateAction } from 'react'\nimport { useSensor, useSensors, DragStartEvent, DragMoveEvent, DragEndEvent } from '@dnd-kit/core'\nimport { SplitDirection, TreeNode, PaneNode } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab,\n selectTab,\n movePaneTabs,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\nimport { customCollisionDetection } from '../lib/collisions'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps {\n layout: TreeNode | null\n _internalSetLayout: Dispatch<SetStateAction<TreeNode | null>>\n setLayout: (nextLayout: SetStateAction<TreeNode | null>) => void\n activeId: string | null\n setActiveId: Dispatch<SetStateAction<string | null>>\n activeType: 'pane' | 'tab' | null\n setActiveType: Dispatch<SetStateAction<'pane' | 'tab' | null>>\n dismissIntentId: string | null\n setDismissIntentId: Dispatch<SetStateAction<string | null>>\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n containerRef: React.RefObject<HTMLElement | null>\n\n // Config\n dragActivationDistance: number\n enableDragToDismiss: boolean\n dismissThreshold: number\n\n // Callbacks\n onRemove?: (paneId: string) => void\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onDismissIntentChange?: (paneId: string | null) => void\n\n // Actions\n removeTab: (tabId: string) => void\n removePane: (paneId: string) => void\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n _internalSetLayout,\n setLayout,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n removePane,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n const initialLayoutForDragRef = useRef<TreeNode | null>(null)\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 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 = selectTab(layout, parentPane.id, draggingId) || layout\n }\n }\n initialLayoutForDragRef.current = layoutAfterSelect\n\n const layoutAfterRemove = isTabDrag\n ? removeTabHelper(layoutAfterSelect, draggingId)\n : removePaneHelper(layoutAfterSelect, draggingId)\n _internalSetLayout(layoutAfterRemove)\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 || activeType === 'pane')) {\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 = initialLayoutForDragRef.current || layout\n initialLayoutForDragRef.current = null\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n if (isTabDrag) {\n removeTab(draggingId)\n } else {\n removePane(draggingId)\n }\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n _internalSetLayout(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 _internalSetLayout(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 const [, targetTabId] = tabDropMatch\n if (isTabDrag) {\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 = moveTab(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n } else {\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 = movePaneTabs(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\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 tabIds: [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 tabIds: [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) or center (swap) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom|center)-(.+)$/)\n if (!match) {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n\n if (dropZone === 'center') {\n if (isTabDrag) {\n const targetPane = findPaneById(originalLayout, targetId)\n if (targetPane && targetPane.activeTabId) {\n const targetTabId = targetPane.activeTabId\n const newLayout = moveTab(originalLayout, draggingId, targetTabId, 'center')\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'move',\n position: 'center',\n })\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n return\n }\n\n const parentPane = isTabDrag\n ? findPaneContainingTab(originalLayout, draggingId)\n : findPaneById(originalLayout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabIds.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n _internalSetLayout(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 tabIds: [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 tabIds: [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 = splitPane(\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 const originalLayout = initialLayoutForDragRef.current || layout\n initialLayoutForDragRef.current = null\n _internalSetLayout(originalLayout)\n if (originalLayout !== layout) {\n setLayout(originalLayout)\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 { useEffect, useState, SetStateAction } from 'react'\nimport { TreeNode, ZeugmaPersistOptions } from '../../../shared'\n\nexport interface UseZeugmaPersistenceProps {\n persist?: boolean | ZeugmaPersistOptions\n layout: TreeNode | null\n setLayout: (nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => void\n}\n\nexport function useZeugmaPersistence({ persist, layout, setLayout }: UseZeugmaPersistenceProps) {\n const isEnabled = typeof persist === 'object' ? persist.enabled !== false : !!persist\n const persistKey = (typeof persist === 'object' && persist.key) || 'zeugma-layout'\n\n const [isLoaded, setIsLoaded] = useState(false)\n\n // Load layout from localStorage on mount if persist is enabled\n useEffect(() => {\n if (isEnabled) {\n const saved = localStorage.getItem(persistKey)\n if (saved) {\n try {\n const parsed = JSON.parse(saved)\n if (parsed) {\n setLayout(parsed)\n }\n } catch (e) {\n console.error('Failed to parse persisted zeugma layout', e)\n }\n }\n }\n setIsLoaded(true)\n }, [isEnabled, persistKey, setLayout])\n\n // Save layout to localStorage when layout changes if persist is enabled\n useEffect(() => {\n if (isEnabled && isLoaded) {\n if (layout) {\n localStorage.setItem(persistKey, JSON.stringify(layout))\n } else {\n localStorage.removeItem(persistKey)\n }\n }\n }, [isEnabled, persistKey, layout, isLoaded])\n}\n","import { useEffect, useRef } from 'react'\nimport { TabDetails } from '../../../shared'\n\nexport interface UseZeugmaPopoutsProps {\n poppedOutTabIds: string[]\n registerPopoutTarget?: (tabId: string, el: HTMLDivElement | null) => void\n findTabById: (tabId: string) => TabDetails | null\n dockTab: (tabId: string) => void\n}\n\nlet lastActiveEvent: Event | null = null\nlet interceptionInitialized = false\nconst activePopoutDocuments = new Set<Document>()\n\nlet headObserver: MutationObserver | null = null\n\nfunction startHeadObserver() {\n if (typeof window === 'undefined' || headObserver) return\n headObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (\n node instanceof HTMLElement &&\n (node.tagName.toLowerCase() === 'style' || node.tagName.toLowerCase() === 'link')\n ) {\n activePopoutDocuments.forEach((doc) => {\n try {\n const cloned = node.cloneNode(true) as HTMLElement\n if (cloned.tagName.toLowerCase() === 'link') {\n const href = (node as HTMLLinkElement).href\n if (href) {\n cloned.setAttribute('href', href)\n }\n }\n doc.head.appendChild(cloned)\n } catch (e) {\n console.warn('Failed to mirror style node to popout:', e)\n }\n })\n }\n })\n })\n })\n headObserver.observe(document.head, { childList: true })\n}\n\nfunction stopHeadObserver() {\n if (headObserver) {\n headObserver.disconnect()\n headObserver = null\n }\n}\n\nconst delayClose = (closeFn: () => void) => {\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(closeFn)\n } else {\n setTimeout(closeFn, 0)\n }\n}\n\nexport function getActiveDocument(): Document {\n if (typeof window === 'undefined') return document\n\n if (lastActiveEvent && lastActiveEvent.target) {\n const doc = (lastActiveEvent.target as Node).ownerDocument\n if (doc && doc !== document) {\n return doc\n }\n }\n\n const currentEvent = (window as unknown as { event?: Event }).event\n if (currentEvent && currentEvent.target) {\n const target = currentEvent.target as Node\n const doc = target.ownerDocument\n if (doc && doc !== document) {\n return doc\n }\n }\n\n if (\n (window as unknown as { __zeugmaActivePopoutDocument?: Document }).__zeugmaActivePopoutDocument\n ) {\n return (window as unknown as { __zeugmaActivePopoutDocument?: Document })\n .__zeugmaActivePopoutDocument as Document\n }\n\n return document\n}\n\nexport function setupPopoutInterception() {\n if (typeof window === 'undefined' || interceptionInitialized) return\n interceptionInitialized = true\n\n // Reset active document on main window events to be safe\n const resetActive = () => {\n lastActiveEvent = null\n ;(\n globalThis as unknown as { __zeugmaActivePopoutDocument?: Document | null }\n ).__zeugmaActivePopoutDocument = null\n }\n const eventsToTrack = ['pointerdown', 'mousedown', 'click', 'keydown', 'focus', 'touchstart']\n eventsToTrack.forEach((evtName) => {\n window.addEventListener(evtName, resetActive, true)\n })\n\n const originalCreateElement = document.createElement\n document.createElement = function (tagName: string, options?: ElementCreationOptions) {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.createElement(tagName, options)\n }\n return originalCreateElement.call(document, tagName, options)\n }\n\n const originalAppendChild = document.body.appendChild\n document.body.appendChild = function <T extends Node>(node: T): T {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.body.appendChild(node) as unknown as T\n }\n return originalAppendChild.call(document.body, node) as unknown as T\n }\n\n const originalRemoveChild = document.body.removeChild\n document.body.removeChild = function <T extends Node>(child: T): T {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.body.removeChild(child) as unknown as T\n }\n return originalRemoveChild.call(document.body, child) as unknown as T\n }\n\n const originalInsertBefore = document.body.insertBefore\n document.body.insertBefore = function <T extends Node>(node: T, child: Node | null): T {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.body.insertBefore(node, child) as unknown as T\n }\n return originalInsertBefore.call(document.body, node, child) as unknown as T\n }\n\n const originalReplaceChild = document.body.replaceChild\n document.body.replaceChild = function <T extends Node>(node: Node, child: T): T {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.body.replaceChild(node, child) as unknown as T\n }\n return originalReplaceChild.call(document.body, node, child) as unknown as T\n }\n\n const originalDocAddEventListener = document.addEventListener\n document.addEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.addEventListener(type, listener, options)\n }\n return originalDocAddEventListener.call(document, type, listener, options)\n }\n\n const originalDocRemoveEventListener = document.removeEventListener\n document.removeEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) {\n // Call on main document\n originalDocRemoveEventListener.call(document, type, listener, options)\n // Call on all open popout documents as a fallback to prevent leaks\n activePopoutDocuments.forEach((doc) => {\n try {\n doc.removeEventListener(type, listener, options)\n } catch {\n // Safe no-op\n }\n })\n }\n\n const originalWinAddEventListener = window.addEventListener\n window.addEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document && activeDoc.defaultView) {\n return activeDoc.defaultView.addEventListener(type, listener, options)\n }\n return originalWinAddEventListener.call(window, type, listener, options)\n }\n\n const originalWinRemoveEventListener = window.removeEventListener\n window.removeEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) {\n // Call on main window\n originalWinRemoveEventListener.call(window, type, listener, options)\n // Call on all open popout windows as a fallback to prevent leaks\n activePopoutDocuments.forEach((doc) => {\n try {\n if (doc.defaultView) {\n doc.defaultView.removeEventListener(type, listener, options)\n }\n } catch {\n // Safe no-op\n }\n })\n }\n\n const originalGetElementById = document.getElementById\n document.getElementById = function (id: string) {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.getElementById(id)\n }\n const mainEl = originalGetElementById.call(document, id)\n if (mainEl) return mainEl\n\n // Fallback lookups to popout documents\n for (const doc of activePopoutDocuments) {\n try {\n const el = doc.getElementById(id)\n if (el) return el\n } catch {}\n }\n return null\n }\n\n const originalQuerySelector = document.querySelector\n document.querySelector = function (selector: string) {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.querySelector(selector)\n }\n const mainEl = originalQuerySelector.call(document, selector)\n if (mainEl) return mainEl\n\n for (const doc of activePopoutDocuments) {\n try {\n const el = doc.querySelector(selector)\n if (el) return el\n } catch {}\n }\n return null\n }\n\n const originalQuerySelectorAll = document.querySelectorAll\n document.querySelectorAll = function (selector: string) {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.querySelectorAll(selector)\n }\n const mainResults = originalQuerySelectorAll.call(document, selector)\n if (mainResults.length > 0) return mainResults\n\n for (const doc of activePopoutDocuments) {\n try {\n const results = doc.querySelectorAll(selector)\n if (results.length > 0) return results\n } catch {}\n }\n return mainResults\n }\n}\n\nexport function useZeugmaPopouts(props: UseZeugmaPopoutsProps) {\n const { poppedOutTabIds, registerPopoutTarget, findTabById, dockTab } = props\n const popoutWindowsRef = useRef<Record<string, Window>>({})\n\n // Synchronize popout windows with poppedOutTabIds state\n useEffect(() => {\n const activeWindows = popoutWindowsRef.current\n\n poppedOutTabIds.forEach((tabId) => {\n if (activeWindows[tabId]) {\n try {\n activeWindows[tabId].focus()\n } catch {\n // Window might have been closed/blocked\n }\n return\n }\n\n setupPopoutInterception()\n\n const tabDetails = findTabById(tabId)\n const title = (tabDetails?.metadata?.title as string) || `Tab ${tabId}`\n\n const popup = window.open('', `zeugma-popout-${tabId}`, 'width=800,height=600')\n if (!popup) {\n console.warn('Failed to open popout window. Check popup blocker.')\n dockTab(tabId)\n return\n }\n\n activeWindows[tabId] = popup\n activePopoutDocuments.add(popup.document)\n startHeadObserver()\n\n // Copy document title & styles\n popup.document.title = title\n popup.document.head.innerHTML = ''\n Array.from(document.querySelectorAll('style, link[rel=\"stylesheet\"]')).forEach((node) => {\n const clonedNode = node.cloneNode(true) as HTMLElement\n if (node.tagName.toLowerCase() === 'link') {\n const href = (node as HTMLLinkElement).href\n if (href) {\n clonedNode.setAttribute('href', href)\n }\n } else if (node.tagName.toLowerCase() === 'style') {\n try {\n const rules = (node as HTMLStyleElement).sheet?.cssRules\n if (rules && rules.length > 0) {\n const cssText = Array.from(rules)\n .map((rule) => rule.cssText)\n .join('\\n')\n clonedNode.textContent = cssText\n }\n } catch {\n // Ignore cross-origin stylesheet errors\n }\n }\n popup.document.head.appendChild(clonedNode)\n })\n\n // Synchronize classes and background styles\n popup.document.documentElement.className = document.documentElement.className\n popup.document.body.className = document.body.className\n popup.document.body.style.margin = '0'\n popup.document.body.style.padding = '0'\n popup.document.body.style.height = '100vh'\n popup.document.body.style.overflow = 'hidden'\n\n // Detect background color of original pane elements to keep layout seamless\n const originalTarget = document.getElementById(`zeugma-tab-target-${tabId}`)\n let targetBg = ''\n if (originalTarget) {\n targetBg = window.getComputedStyle(originalTarget).backgroundColor\n if (\n (!targetBg || targetBg === 'transparent' || targetBg === 'rgba(0, 0, 0, 0)') &&\n originalTarget.parentElement\n ) {\n targetBg = window.getComputedStyle(originalTarget.parentElement).backgroundColor\n }\n }\n\n const docComputedStyle = window.getComputedStyle(document.documentElement)\n const bodyComputedStyle = window.getComputedStyle(document.body)\n const bodyBg = bodyComputedStyle.backgroundColor\n const isBodyBgTrans = !bodyBg || bodyBg === 'transparent' || bodyBg === 'rgba(0, 0, 0, 0)'\n const activeBgColor = isBodyBgTrans ? docComputedStyle.backgroundColor : bodyBg\n\n const finalBgColor =\n targetBg && targetBg !== 'transparent' && targetBg !== 'rgba(0, 0, 0, 0)'\n ? targetBg\n : activeBgColor && activeBgColor !== 'transparent' && activeBgColor !== 'rgba(0, 0, 0, 0)'\n ? activeBgColor\n : '#181b1f'\n\n popup.document.documentElement.style.backgroundColor = finalBgColor\n popup.document.body.style.backgroundColor = finalBgColor\n popup.document.body.style.color = bodyComputedStyle.color || docComputedStyle.color\n popup.document.body.style.fontFamily =\n bodyComputedStyle.fontFamily || docComputedStyle.fontFamily\n\n // Create container\n const container = popup.document.createElement('div')\n container.id = `zeugma-popout-container-${tabId}`\n container.className = 'grafana-panel h-full w-full overflow-hidden'\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.border = 'none' // Remove double borders in popout mode\n popup.document.body.appendChild(container)\n\n // Register target\n registerPopoutTarget?.(tabId, container)\n\n // Track events on this popout window to redirect portals correctly\n const eventsToTrack = ['pointerdown', 'mousedown', 'click', 'keydown', 'focus', 'touchstart']\n const trackEvent = (e: Event) => {\n lastActiveEvent = e\n ;(\n globalThis as unknown as { __zeugmaActivePopoutDocument?: Document }\n ).__zeugmaActivePopoutDocument = popup.document\n\n // Reset after event cycle finishes\n queueMicrotask(() => {\n if (lastActiveEvent === e) {\n lastActiveEvent = null\n ;(\n globalThis as unknown as { __zeugmaActivePopoutDocument?: Document | null }\n ).__zeugmaActivePopoutDocument = null\n }\n })\n }\n eventsToTrack.forEach((evtName) => {\n popup.addEventListener(evtName, trackEvent, true)\n })\n\n // Listen for window close\n const handleUnload = () => {\n activePopoutDocuments.delete(popup.document)\n if (activePopoutDocuments.size === 0) {\n stopHeadObserver()\n }\n dockTab(tabId)\n }\n popup.addEventListener('beforeunload', handleUnload)\n\n // Store cleanup on the window object\n ;(popup as unknown as { __zeugmaCleanup?: () => void }).__zeugmaCleanup = () => {\n eventsToTrack.forEach((evtName) => {\n popup.removeEventListener(evtName, trackEvent, true)\n })\n popup.removeEventListener('beforeunload', handleUnload)\n }\n })\n\n // Close windows for tabs that are no longer popped out\n Object.keys(activeWindows).forEach((tabId) => {\n if (!poppedOutTabIds.includes(tabId)) {\n const popup = activeWindows[tabId]\n delete activeWindows[tabId]\n registerPopoutTarget?.(tabId, null)\n if (popup) {\n activePopoutDocuments.delete(popup.document)\n if (activePopoutDocuments.size === 0) {\n stopHeadObserver()\n }\n try {\n const popupObj = popup as unknown as { __zeugmaCleanup?: () => void; close: () => void }\n if (popupObj.__zeugmaCleanup) {\n popupObj.__zeugmaCleanup()\n }\n delayClose(() => {\n try {\n popupObj.close()\n } catch {\n // Already closed\n }\n })\n } catch {\n // Already closed\n }\n }\n }\n })\n }, [poppedOutTabIds, registerPopoutTarget, findTabById, dockTab])\n\n // Clean up all popout windows on unmount\n useEffect(() => {\n return () => {\n const activeWindows = popoutWindowsRef.current\n Object.keys(activeWindows).forEach((tabId) => {\n const popup = activeWindows[tabId]\n if (popup) {\n activePopoutDocuments.delete(popup.document)\n try {\n const popupObj = popup as unknown as { __zeugmaCleanup?: () => void; close: () => void }\n if (popupObj.__zeugmaCleanup) {\n popupObj.__zeugmaCleanup()\n }\n delayClose(() => {\n try {\n popupObj.close()\n } catch {\n // Already closed\n }\n })\n } catch {\n // Already closed\n }\n }\n })\n if (activePopoutDocuments.size === 0) {\n stopHeadObserver()\n }\n }\n }, [])\n}\n","import React, { useEffect, useRef, ReactNode } from 'react'\n\nexport const CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { TabDetails, useZeugmaState } from '../../../shared'\n\nexport interface PortalHostItemProps {\n tabDetails: TabDetails\n target: HTMLDivElement | null\n renderWidget?: (tab: TabDetails) => React.ReactNode\n}\n\nexport const PopoutRenderWrapper: React.FC<{ popoutDoc: Document; children: React.ReactNode }> = ({\n popoutDoc,\n children,\n}) => {\n if (popoutDoc === document) {\n return <>{children}</>\n }\n const originalUseEffect = React.useEffect\n const originalUseLayoutEffect = React.useLayoutEffect\n const originalUseInsertionEffect = (\n React as unknown as {\n useInsertionEffect?: (effect: () => void | (() => void), deps?: React.DependencyList) => void\n }\n ).useInsertionEffect\n\n React.useEffect = (effect, deps) => {\n return originalUseEffect(() => {\n window.__zeugmaActivePopoutDocument = popoutDoc\n try {\n const cleanup = effect()\n if (typeof cleanup === 'function') {\n return () => {\n window.__zeugmaActivePopoutDocument = popoutDoc\n try {\n return cleanup()\n } finally {\n window.__zeugmaActivePopoutDocument = null\n }\n }\n }\n return cleanup\n } finally {\n window.__zeugmaActivePopoutDocument = null\n }\n }, deps)\n }\n\n React.useLayoutEffect = (effect, deps) => {\n return originalUseLayoutEffect(() => {\n window.__zeugmaActivePopoutDocument = popoutDoc\n try {\n const cleanup = effect()\n if (typeof cleanup === 'function') {\n return () => {\n window.__zeugmaActivePopoutDocument = popoutDoc\n try {\n return cleanup()\n } finally {\n window.__zeugmaActivePopoutDocument = null\n }\n }\n }\n return cleanup\n } finally {\n window.__zeugmaActivePopoutDocument = null\n }\n }, deps)\n }\n\n if (originalUseInsertionEffect) {\n ;(\n React as unknown as {\n useInsertionEffect?: (\n effect: () => void | (() => void),\n deps?: React.DependencyList,\n ) => void\n }\n ).useInsertionEffect = (effect, deps) => {\n return originalUseInsertionEffect(() => {\n window.__zeugmaActivePopoutDocument = popoutDoc\n try {\n const cleanup = effect()\n if (typeof cleanup === 'function') {\n return () => {\n window.__zeugmaActivePopoutDocument = popoutDoc\n try {\n return cleanup()\n } finally {\n window.__zeugmaActivePopoutDocument = null\n }\n }\n }\n return cleanup\n } finally {\n window.__zeugmaActivePopoutDocument = null\n }\n }, deps)\n }\n }\n\n window.__zeugmaActivePopoutDocument = popoutDoc\n try {\n return <>{children}</>\n } finally {\n window.__zeugmaActivePopoutDocument = null\n React.useEffect = originalUseEffect\n React.useLayoutEffect = originalUseLayoutEffect\n if (originalUseInsertionEffect) {\n ;(\n React as unknown as {\n useInsertionEffect?: (\n effect: () => void | (() => void),\n deps?: React.DependencyList,\n ) => void\n }\n ).useInsertionEffect = originalUseInsertionEffect\n }\n }\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = React.memo(\n ({ tabDetails, target, renderWidget }) => {\n const { id: tabId } = tabDetails\n const { renderPopoutWrapper } = useZeugmaState()\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.ownerDocument.adoptNode(wrapper)\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n document.adoptNode(wrapper)\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n const isPopped = !!(target && target.ownerDocument && target.ownerDocument !== document)\n const keySuffix = tabDetails.remountOnPopout ? (isPopped ? '-popped' : '-docked') : ''\n let widget: React.ReactNode = (\n <React.Fragment key={`${tabId}${keySuffix}`}>{renderWidget(tabDetails)}</React.Fragment>\n )\n\n if (isPopped && target && target.ownerDocument && renderPopoutWrapper) {\n widget = renderPopoutWrapper({\n tabId,\n document: target.ownerDocument,\n window: target.ownerDocument.defaultView || window,\n children: widget,\n })\n }\n\n return createPortal(\n <PopoutRenderWrapper popoutDoc={isPopped && target ? target.ownerDocument : document}>\n {widget}\n </PopoutRenderWrapper>,\n wrapper,\n )\n },\n (prev, next) => {\n return (\n prev.target === next.target &&\n prev.renderWidget === next.renderWidget &&\n prev.tabDetails.id === next.tabDetails.id &&\n prev.tabDetails.paneId === next.tabDetails.paneId &&\n prev.tabDetails.isActive === next.tabDetails.isActive &&\n prev.tabDetails.index === next.tabDetails.index &&\n prev.tabDetails.metadata === next.tabDetails.metadata\n )\n },\n)\n","import React from 'react'\nimport { ZeugmaClassNames } from '../../../shared'\n\ninterface DragOverlayPreviewProps {\n activeId: string\n activeType: 'pane' | 'tab'\n dismissIntentId: string | null\n renderDragOverlay?: (active: {\n type: 'tab' | 'pane'\n id: string\n isDismissing: boolean\n }) => React.ReactNode\n renderPaneRef: React.RefObject<((paneId: string) => React.ReactNode) | null>\n renderPane?: (paneId: string) => React.ReactNode\n tabHeadersRef: React.RefObject<\n Record<string, (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode>\n >\n classNames: ZeugmaClassNames\n}\n\nexport const DragOverlayPreview: React.FC<DragOverlayPreviewProps> = ({\n activeId,\n activeType,\n dismissIntentId,\n renderDragOverlay,\n renderPaneRef,\n renderPane,\n tabHeadersRef,\n classNames,\n}) => {\n if (renderDragOverlay) {\n return (\n <>\n {renderDragOverlay({\n type: activeType,\n id: activeId,\n isDismissing: activeId === dismissIntentId,\n })}\n </>\n )\n }\n\n if (activeType === 'pane') {\n const paneRender = renderPaneRef.current || renderPane\n if (paneRender) {\n return (\n <div\n className={classNames.paneDragPreview || ''}\n style={{\n pointerEvents: 'none',\n width: '420px',\n height: '260px',\n overflow: 'hidden',\n }}\n >\n {paneRender(activeId)}\n </div>\n )\n }\n } else if (activeType === 'tab') {\n const paneRender = renderPaneRef.current || renderPane\n if (paneRender) {\n return (\n <div\n className={classNames.tabDragPreview || ''}\n style={{\n pointerEvents: 'none',\n width: '420px',\n height: '260px',\n overflow: 'hidden',\n }}\n >\n {paneRender(activeId)}\n </div>\n )\n }\n const tabHeaderRender = tabHeadersRef.current[activeId]\n if (tabHeaderRender) {\n const tabClass = classNames.tab\n ? typeof classNames.tab === 'function'\n ? classNames.tab(activeId)\n : classNames.tab\n : ''\n return (\n <div\n className={`${classNames.tabDragPreview || ''} ${tabClass}`.trim()}\n style={{\n display: 'inline-flex',\n position: 'relative',\n pointerEvents: 'none',\n overflow: 'hidden',\n }}\n >\n {tabHeaderRender({ isDragging: true, isOver: false })}\n </div>\n )\n }\n }\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n overflow: 'hidden',\n width: '100%',\n height: '100%',\n }}\n />\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection, useZeugmaState } from '../../../shared'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useState } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { useResizer } from '../../../features/resize-pane'\nimport { ComputedSplitter } from '../../../shared/lib/tree'\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nexport const FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { renderingLayout, 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: renderingLayout,\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\nexport const MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (paneId: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\n)\n","import React, { useRef, useMemo } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { TreeNode } from '../../../shared'\nimport { computeLayout } from '../../../shared/lib/tree'\nimport { RootDropZones } from '../../../entities/zeugma/ui'\nimport { FlatSplitter, MemoizedPaneContent } from './FlatSplitter'\nimport { useRegisterRenderPane } from '../../../entities/zeugma/model'\n\nexport interface PaneTreeProps {\n /** Render function mapping unique pane nodes to React elements. Usually renders a <Pane> wrapper. */\n renderPane: (paneId: string) => React.ReactNode\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n renderPane,\n tree,\n resizerSize: propResizerSize,\n snapThreshold: propSnapThreshold,\n}) => {\n useRegisterRenderPane(renderPane)\n const {\n renderingLayout,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n locked,\n classNames,\n resizerSize: contextResizerSize,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const resizerSize = propResizerSize !== undefined ? propResizerSize : (contextResizerSize ?? 4)\n\n const currentNode = tree !== undefined ? tree : renderingLayout\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 && tree !== undefined) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n {activeId !== null && !locked && (\n <RootDropZones activeClassName={classNames.rootDropPreview ?? classNames.dropPreview} />\n )}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\n\nimport {\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaDragContext,\n ZeugmaDragStateValue,\n ZeugmaProps,\n BaseZeugmaProps,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n usePortalRegistry,\n useZeugmaDnd,\n useAllTabIds,\n useZeugmaDragMeasurement,\n useZeugmaPersistence,\n useZeugmaPopouts,\n} from '../model'\nimport { CursorOverlay } from './CursorOverlay'\nimport { PortalHostItem } from './PortalHostItem'\nimport { DragOverlayPreview } from './DragOverlayPreview'\nimport { PaneTree } from '../../../widgets/pane-tree'\n\nconst ZeugmaProviderInternal: React.FC<\n BaseZeugmaProps & { children?: React.ReactNode; renderPane?: (paneId: string) => React.ReactNode }\n> = (props) => {\n const {\n controller,\n children,\n renderDragOverlay,\n classNames = {},\n renderPane,\n resizerSize,\n\n // Configuration settings\n dragActivationDistance = 8,\n snapThreshold = 8,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Persistence\n persist = false,\n renderPopoutWrapper,\n } = props\n\n const internalController = controller as ZeugmaControllerInternal\n const {\n layout,\n setLayout,\n _internalSetLayout,\n renderingLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n poppedOutTabIds = [],\n popoutTab,\n dockTab,\n } = internalController\n\n // Synchronize layout persistence\n useZeugmaPersistence({ persist, layout, setLayout })\n\n const {\n portalTargets,\n registerPortalTarget,\n registerPopoutTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n } = usePortalRegistry()\n\n useZeugmaPopouts({\n poppedOutTabIds,\n registerPopoutTarget,\n findTabById,\n dockTab,\n })\n\n const isTabPoppedOut = useCallback(\n (tabId: string) => poppedOutTabIds.includes(tabId),\n [poppedOutTabIds],\n )\n\n const {\n overTabId,\n setOverTabId,\n overTabPosition,\n setOverTabPosition,\n handleDragStartInternal,\n handleDragEndInternal,\n } = useZeugmaDragMeasurement({\n onDragStart,\n onDragEnd,\n })\n\n const dnd = useZeugmaDnd({\n layout,\n _internalSetLayout,\n setLayout,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart: handleDragStartInternal,\n onDragEnd: handleDragEndInternal,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n removePane,\n })\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.rootDropPreview,\n classNames.dragOverlay,\n classNames.paneDragPreview,\n classNames.tabDragPreview,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n classNames.tabsContainer,\n classNames.tab,\n classNames.paneContainer,\n classNames.paneHeader,\n classNames.paneControls,\n classNames.paneButton,\n classNames.tabCloseButton,\n classNames.dragHandle,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n renderingLayout,\n setLayout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n poppedOutTabIds,\n isTabPoppedOut,\n renderPopoutWrapper,\n }),\n [\n layout,\n renderingLayout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n poppedOutTabIds,\n isTabPoppedOut,\n renderPopoutWrapper,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n popoutTab,\n dockTab,\n }),\n [\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n popoutTab,\n dockTab,\n ],\n )\n\n // Collect all tab IDs and widget IDs in the current layout tree\n const allTabIds = useAllTabIds(layout)\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n registerPopoutTarget,\n }),\n [\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n registerPopoutTarget,\n ],\n )\n\n if (activeIdRef) {\n activeIdRef.current = activeId\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 && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => {\n const isDismissing = id === dismissIntentId\n return (\n <div\n style={{\n transition: 'transform 150ms cubic-bezier(0.2, 0, 0, 1)',\n transform: isDismissing ? 'scale(0.8)' : 'scale(1)',\n transformOrigin: 'top left',\n }}\n >\n <DragOverlayPreview\n activeId={id}\n activeType={activeType}\n dismissIntentId={dismissIntentId}\n renderDragOverlay={renderDragOverlay}\n renderPaneRef={renderPaneRef}\n renderPane={renderPane}\n tabHeadersRef={tabHeadersRef}\n classNames={stableClassNames}\n />\n </div>\n )\n }}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => {\n const target = portalTargets[tabId]\n const tabDetails = findTabById(tabId)\n if (!tabDetails) return null\n return (\n <PortalHostItem\n key={tabId}\n tabDetails={tabDetails}\n target={target || null}\n renderWidget={renderCallbacksRef.current[tabId]}\n />\n )\n })}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n\nconst ZeugmaRenderer: React.FC<{\n renderPane?: (paneId: string) => React.ReactNode\n resizerSize?: number\n snapThreshold?: number\n}> = ({ renderPane, resizerSize, snapThreshold }) => {\n if (!renderPane) {\n throw new Error(\n 'Zeugma component requires a renderPane prop when used as a standalone renderer.',\n )\n }\n return (\n <PaneTree renderPane={renderPane} resizerSize={resizerSize} snapThreshold={snapThreshold} />\n )\n}\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const { children, ...restProps } = props as unknown as {\n children?: React.ReactNode\n renderPane?: (paneId: string) => React.ReactNode\n }\n\n const { controller } = props as unknown as { controller?: ZeugmaControllerInternal }\n if (!controller) {\n throw new Error('Zeugma component requires a controller.')\n }\n\n return (\n <ZeugmaProviderInternal\n {...(props as unknown as BaseZeugmaProps & {\n children?: React.ReactNode\n renderPane?: (paneId: string) => React.ReactNode\n })}\n >\n {children !== undefined ? children : <ZeugmaRenderer {...restProps} />}\n </ZeugmaProviderInternal>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\ninterface RootDropZoneProps {\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nconst activationPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n top: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n bottom: {\n '1/4': {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n bottom: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n left: {\n '1/4': {\n position: 'absolute',\n left: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n left: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n right: {\n '1/4': {\n position: 'absolute',\n right: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n right: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n}\n\nconst previewPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n top: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n '1/3': {\n top: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n },\n bottom: {\n '1/4': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n left: {\n '1/4': {\n left: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n '1/3': {\n left: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n },\n right: {\n '1/4': {\n right: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n right: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n}\n\nconst RootDropZone: React.FC<RootDropZoneProps> = ({ id, fraction, edge, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n\n const previewStyle: React.CSSProperties = {\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 101,\n boxSizing: 'border-box',\n ...previewPositions[edge][fraction],\n }\n\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[edge][fraction]} />\n {isOver && <div className={activeClassName} style={previewStyle} />}\n </>\n )\n}\n\ninterface RootDropZonesProps {\n activeClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({ activeClassName }) => {\n const zones: Array<{\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n }> = [\n { id: 'drop-root-1/4-top', fraction: '1/4', edge: 'top' },\n { id: 'drop-root-1/3-top', fraction: '1/3', edge: 'top' },\n { id: 'drop-root-1/4-bottom', fraction: '1/4', edge: 'bottom' },\n { id: 'drop-root-1/3-bottom', fraction: '1/3', edge: 'bottom' },\n { id: 'drop-root-1/4-left', fraction: '1/4', edge: 'left' },\n { id: 'drop-root-1/3-left', fraction: '1/3', edge: 'left' },\n { id: 'drop-root-1/4-right', fraction: '1/4', edge: 'right' },\n { id: 'drop-root-1/3-right', fraction: '1/3', edge: 'right' },\n ]\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99,\n pointerEvents: 'none',\n }}\n >\n {zones.map((zone) => (\n <RootDropZone\n key={zone.id}\n id={zone.id}\n fraction={zone.fraction}\n edge={zone.edge}\n activeClassName={activeClassName}\n />\n ))}\n </div>\n )\n}\n","import React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nexport interface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header' | 'center'\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 center: {\n position: 'absolute',\n top: '25%',\n left: '25%',\n width: '50%',\n height: '50%',\n zIndex: 22,\n pointerEvents: 'auto',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n 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 center: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport const DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback, useEffect } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n ZeugmaActionsContext,\n useZeugmaDrag,\n PortalRegistryContext,\n} 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 isPoppedOut: boolean\n popoutTab: () => void\n dockTab: () => 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 {\n locked: globalLocked,\n classNames = {},\n fullscreenPaneId,\n poppedOutTabIds = [],\n } = useZeugmaState()\n const actions = useContext(ZeugmaActionsContext)\n const { overTabId } = useZeugmaDrag()\n const portalRegistry = useContext(PortalRegistryContext)\n\n useEffect(() => {\n if (portalRegistry?.registerTabHeader) {\n portalRegistry.registerTabHeader(id, children)\n }\n return () => {\n if (portalRegistry?.registerTabHeader) {\n if (portalRegistry.activeIdRef?.current !== id) {\n portalRegistry.registerTabHeader(id, () => null)\n }\n }\n }\n }, [id, children, portalRegistry])\n\n const isPoppedOut = poppedOutTabIds.includes(id)\n\n const tabsContext = useContext(TabsContext)\n const isLocked =\n locked || globalLocked || (tabsContext?.locked ?? false) || fullscreenPaneId !== null\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,\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 tabIds = tabsContext?.tabIds || []\n const index = tabIds.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabIds[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 isPoppedOut,\n popoutTab: () => actions?.popoutTab(id),\n dockTab: () => actions?.dockTab(id),\n }),\n [\n id,\n isActive,\n isDragging,\n isTargetOver,\n metadata,\n isLocked,\n selectThisTab,\n removeThisTab,\n isPoppedOut,\n actions,\n ],\n )\n\n return (\n <TabContext.Provider value={tabContextValue}>\n <div\n ref={handleRef}\n id={`tab-header-${id}`}\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, ZeugmaActionsContext, useZeugmaDrag } from '../../../shared'\nimport type { RenderTabProps } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\nimport { PaneContext } from './Pane'\n\nexport interface TabsContextValue {\n tabIds: 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 tabIds?: 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: RenderTabProps) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> & {\n Tab: typeof Tab\n} = ({\n tabIds: propTabs,\n activeTabId: propActiveTabId,\n locked: propLocked,\n tabsMetadata: propTabsMetadata,\n selectTab: propSelectTab,\n removeTab: propRemoveTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const paneContext = useContext(PaneContext)\n\n const tabIds = propTabs ?? paneContext?.tabIds ?? []\n const activeTabId = propActiveTabId ?? paneContext?.activeTabId ?? ''\n const locked = propLocked ?? paneContext?.locked ?? false\n const tabsMetadata = propTabsMetadata ?? paneContext?.tabsMetadata\n const selectTab = propSelectTab ?? paneContext?.selectTab ?? (() => {})\n const removeTab = propRemoveTab ?? paneContext?.removeTab ?? (() => {})\n\n const { classNames: globalClassNames = {}, activeType, poppedOutTabIds = [] } = useZeugmaState()\n const actions = useContext(ZeugmaActionsContext)\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabIds,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabIds, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabIds, 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 {tabIds.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 id: tabId,\n paneId: paneContext?.id ?? '',\n isActive: tabId === activeTabId,\n index,\n isDragging,\n isOver,\n metadata,\n onSelect: () => selectTab(tabId),\n onRemove: () => removeTab(tabId),\n isPoppedOut: poppedOutTabIds.includes(tabId),\n popout: () => actions?.popoutTab(tabId),\n dock: () => actions?.dockTab(tabId),\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabIds.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n\nTabs.Tab = Tab\n","import React from 'react'\n\nexport interface PaneControlsProps {\n /** Custom CSS class applied to the controls container. */\n className?: string\n /** Custom inline CSS style applied to the controls container. */\n style?: React.CSSProperties\n /** The children elements (e.g. close and fullscreen buttons) to render inside the controls container. */\n children?: React.ReactNode\n}\n\nexport const PaneControls: React.FC<PaneControlsProps> = ({ className, style, children }) => {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n}\n","import React, { useMemo, useEffect, useContext, useRef, createContext } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n TabDetails,\n} from '../../../shared'\nimport { findPaneOrContainingTab, findPaneContainingTab } from '../../../shared/lib/tree'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { DropZone } from './DropZone'\nimport { DragHandle } from './DragHandle'\nimport { Tabs } from './Tabs'\nimport { Tab } from './Tab'\nimport { PaneControls } from './PaneControls'\n\nexport interface PaneContextValue extends PaneRenderProps {\n id: string\n}\n\nexport const PaneContext = createContext<PaneContextValue | undefined>(undefined)\n\nexport const usePaneContext = () => {\n const context = useContext(PaneContext)\n if (!context) {\n throw new Error('usePaneContext must be used within a Pane component')\n }\n return context\n}\n\nexport interface PaneContentProps {\n /** A render callback (tab) => ReactNode or static ReactNode content to render for the active tab. */\n children?: React.ReactNode | ((tab: TabDetails) => React.ReactNode)\n /** Custom CSS class applied to the tab content wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab content wrapper. */\n style?: React.CSSProperties\n}\n\nexport const PaneContent: React.FC<PaneContentProps> = ({ children, className, style }) => {\n const { activeTabId } = usePaneContext()\n const { classNames, isTabPoppedOut } = useZeugmaState()\n const { dockTab } = useZeugmaActions()\n const targetRef = useRef<HTMLDivElement | null>(null)\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('PaneContent must be used within a Zeugma provider')\n }\n const { registerPortalTarget, registerRenderCallback } = portalRegistry\n\n const renderCallback = useMemo(() => {\n if (typeof children === 'function') {\n return children as (tab: TabDetails) => React.ReactNode\n }\n return () => children\n }, [children])\n\n // Register render callback synchronously during the render phase\n registerRenderCallback(activeTabId, renderCallback)\n\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null, el)\n }\n }, [activeTabId, registerPortalTarget])\n\n const poppedOut = isTabPoppedOut(activeTabId)\n\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className={`${classNames.tabContentWrapper || ''} ${className || ''}`.trim()}\n style={{\n height: '100%',\n width: '100%',\n position: 'relative',\n ...style,\n }}\n >\n {poppedOut && (\n <div\n className=\"zeugma-popout-placeholder\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '12px',\n padding: '24px',\n textAlign: 'center',\n backgroundColor: '#161719',\n color: '#94a3b8',\n fontSize: '13px',\n fontWeight: 500,\n }}\n >\n <div>This panel is open in a new window</div>\n <button\n onClick={() => dockTab(activeTabId)}\n style={{\n padding: '6px 12px',\n fontSize: '11px',\n fontWeight: 600,\n borderRadius: '4px',\n backgroundColor: '#2563eb',\n color: '#ffffff',\n border: 'none',\n cursor: 'pointer',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }}\n onMouseOver={(e) => {\n e.currentTarget.style.backgroundColor = '#1d4ed8'\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.backgroundColor = '#2563eb'\n }}\n >\n Dock Back\n </button>\n </div>\n )}\n </div>\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** The children elements inside the pane (e.g. headers, tabs, content). */\n children: React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> & {\n Content: typeof PaneContent\n DragHandle: typeof DragHandle\n Tabs: typeof Tabs\n Tab: typeof Tab\n Controls: typeof PaneControls\n} = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n renderingLayout,\n activeId,\n activeType,\n classNames: globalClassNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n poppedOutTabIds = [],\n } = useZeugmaState()\n const { removePane, updateMetadata, selectTab, removeTab, popoutTab, dockTab } =\n useZeugmaActions()\n\n const paneNode = useMemo(() => {\n if (activeType === 'tab' && id === activeId) {\n const originalPane = findPaneContainingTab(layout, id)\n const sourceMetadata = originalPane?.tabsMetadata?.[id]\n return {\n type: 'pane' as const,\n id,\n tabIds: [id],\n activeTabId: id,\n tabsMetadata: sourceMetadata ? { [id]: sourceMetadata } : undefined,\n }\n }\n const targetTree = id === activeId ? layout : renderingLayout\n return findPaneOrContainingTab(targetTree, id)\n }, [layout, renderingLayout, id, activeId, activeType])\n const paneContainerId = paneNode?.id ?? id\n const tabIds = paneNode?.tabIds ?? [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 || fullscreenPaneId !== null\n const isDroppableDisabled = globalLocked || isPaneLocked || fullscreenPaneId !== null\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabIds.includes(activeId) || tabIds.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabIds.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabIds,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateMetadata(tabId, updater)\n },\n isActiveTabPoppedOut: poppedOutTabIds.includes(activeTabId),\n popoutTab: (tabId) => popoutTab(tabId || activeTabId),\n dockTab: (tabId) => dockTab(tabId || activeTabId),\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateMetadata,\n isDraggableDisabled,\n tabIds,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n poppedOutTabIds,\n popoutTab,\n dockTab,\n ],\n )\n\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${globalClassNames.pane || ''} ${\n isPaneLocked ? globalClassNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <PaneContext.Provider value={{ id, ...renderProps }}>\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n id={id}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={globalClassNames.dropPreview}\n />\n ))}\n {activeType === 'tab' && (\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={globalClassNames.swapPreview ?? globalClassNames.dropPreview}\n />\n )}\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={globalClassNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n </PaneContext.Provider>\n )\n}\n\nPane.Content = PaneContent\nPane.DragHandle = DragHandle\nPane.Tabs = Tabs\nPane.Tab = Tab\nPane.Controls = PaneControls\n"]}
|