react-zeugma 6.9.6 → 6.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/lib/drag-session.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/lib/tree/compare.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","../src/devtools/store.ts","../src/devtools/use-render-counter.ts","../src/devtools/render-counter-badge.tsx","../src/devtools/render-counter-footer.tsx"],"names":["createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerMove","e","handlePointerUp","globalStyle","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","areObjectsEqual","a","b","keysA","keysB","key","valA","valB","areMetadataEqual","areLayoutsEqual","sb","pb","i","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","setLocalLayout","renderingLayout","setRenderingLayout","prevControlledLayoutRef","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","poppedOutTabIds","setPoppedOutTabIds","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","fullscreenPaneIdRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","prevPopped","filtered","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","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","mainListeners","headObserver","startHeadObserver","mutations","mutation","doc","cloned","href","stopHeadObserver","htmlObserver","startHtmlObserver","val","stopHtmlObserver","delayClose","closeFn","getActiveDocument","currentEvent","setupPopoutInterception","isProtoOf","instance","proto","currentProto","patchHasInstance","Constructor","checkFn","docProto","originalDocBody","originalDocEl","originalDocHead","originalDocActive","originalDocDefaultView","originalDocScrolling","activeDoc","winProto","winProperties","originalWinGetters","prop","desc","orig","originalContains","otherNode","resetActive","evtName","originalCreateElement","tagName","originalDocAddEventListener","type","listener","originalDocRemoveEventListener","record","originalWinAddEventListener","originalWinRemoveEventListener","originalGetElementById","mainEl","originalQuerySelector","selector","originalQuerySelectorAll","mainResults","results","useZeugmaPopouts","dockTab","popoutWindowsRef","activeWindows","title","popup","baseNode","clonedNode","rules","cssText","rule","clonedSheets","sheet","newSheet","s","attr","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","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","targetDoc","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","store","getCounterRecord","subscribeCounter","notifyCounter","fn","resetCounterRecord","useRenderCounter","idOrOptions","maybeOptions","defaultAutoId","useId","logToConsole","renderCountRef","forceUpdate","unsubscribe","c","reset","POSITION_STYLES","RenderCounterBadge","mounts","renders","posClass","RenderCounterFooter","label","footerClassName","displayId"],"mappings":"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","file":"index.js","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","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 { TreeNode, SplitNode, PaneNode } from '../../model/types'\n\nfunction areObjectsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true\n if (!a || !b) return false\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n const valA = a[key]\n const valB = b[key]\n if (typeof valA === 'object' && valA !== null && typeof valB === 'object' && valB !== null) {\n if (!areObjectsEqual(valA as Record<string, unknown>, valB as Record<string, unknown>)) {\n return false\n }\n } else if (valA !== valB) {\n return false\n }\n }\n return true\n}\n\nfunction areMetadataEqual(\n a: Record<string, Record<string, unknown>> | undefined,\n b: Record<string, Record<string, unknown>> | undefined,\n): boolean {\n if (a === b) return true\n if (!a || !b) return false\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!areObjectsEqual(a[key], b[key])) return false\n }\n return true\n}\n\n/**\n * Perform a fast deep equality comparison of two layout tree nodes,\n * short-circuiting as soon as a difference is found and avoiding costly\n * JSON stringification on every render.\n */\nexport function areLayoutsEqual(a: TreeNode | null, b: TreeNode | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n if (a.type !== b.type) return false\n\n if (a.type === 'split') {\n const sb = b as SplitNode\n return (\n a.direction === sb.direction &&\n a.splitPercentage === sb.splitPercentage &&\n areLayoutsEqual(a.first, sb.first) &&\n areLayoutsEqual(a.second, sb.second)\n )\n } else {\n const pb = b as PaneNode\n if (a.id !== pb.id) return false\n if (a.activeTabId !== pb.activeTabId) return false\n if (a.locked !== pb.locked) return false\n if (a.tabIds.length !== pb.tabIds.length) return false\n for (let i = 0; i < a.tabIds.length; i++) {\n if (a.tabIds[i] !== pb.tabIds[i]) return false\n }\n return areMetadataEqual(a.tabsMetadata, pb.tabsMetadata)\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n removePane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n areLayoutsEqual,\n} from '../../../shared/lib/tree'\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 prevControlledLayoutRef = useRef<TreeNode | null | undefined>(controlledLayout)\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 fullscreenPaneIdRef = useRef<string | null>(fullscreenPaneId)\n fullscreenPaneIdRef.current = fullscreenPaneId\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 if (!areLayoutsEqual(controlledLayout, prevControlledLayoutRef.current ?? null)) {\n prevControlledLayoutRef.current = controlledLayout\n setLocalLayout(controlledLayout)\n setRenderingLayout(controlledLayout)\n setPoppedOutTabIds((prevPopped) => {\n if (prevPopped.length === 0) return prevPopped\n const filtered = prevPopped.filter((id) => findTabById(controlledLayout, id) !== null)\n return filtered.length === prevPopped.length ? prevPopped : filtered\n })\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 (!areLayoutsEqual(prev, next)) {\n layoutRef.current = next\n setLocalLayout(next)\n setRenderingLayout(next)\n\n setPoppedOutTabIds((prevPopped) => {\n if (prevPopped.length === 0) return prevPopped\n const filtered = prevPopped.filter((id) => findTabById(next, id) !== null)\n return filtered.length === prevPopped.length ? prevPopped : filtered\n })\n\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 if (fullscreenPaneIdRef.current !== null) return\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) => {\n if (fullscreenPaneIdRef.current !== null) return prev\n return removePane(prev, paneId)\n }),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n if (fullscreenPaneIdRef.current !== null) return prev\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 if (fullscreenPaneIdRef.current !== null) return prev\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 if (fullscreenPaneIdRef.current !== null) return prev\n return 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 if (fullscreenPaneIdRef.current !== null) return prev\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 (\n prev,\n draggedTabId: string,\n targetTabId: string,\n position?: 'before' | 'after' | 'center',\n ) => {\n if (fullscreenPaneIdRef.current !== null) return prev\n return moveTab(prev, draggedTabId, targetTabId, position)\n },\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => {\n if (fullscreenPaneIdRef.current !== null) return prev\n return removeTab(prev, tabId)\n }),\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 if (fullscreenPaneIdRef.current !== null) return\n setPoppedOutTabIds((prev) => {\n if (prev.includes(tabId)) return prev\n return [...prev, tabId]\n })\n }, [])\n\n const handleDockTab = useCallback((tabId: string) => {\n if (fullscreenPaneIdRef.current !== null) return\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\ninterface RegisteredListener {\n target: 'window' | 'document'\n type: string\n listener: EventListenerOrEventListenerObject\n options?: boolean | AddEventListenerOptions\n}\n\nconst mainListeners = new Set<RegisteredListener>()\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\nlet htmlObserver: MutationObserver | null = null\n\nfunction startHtmlObserver() {\n if (typeof window === 'undefined' || htmlObserver) return\n htmlObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes' && mutation.attributeName) {\n const val = document.documentElement.getAttribute(mutation.attributeName)\n activePopoutDocuments.forEach((doc) => {\n try {\n if (doc && doc.documentElement) {\n if (val !== null) {\n doc.documentElement.setAttribute(mutation.attributeName!, val)\n } else {\n doc.documentElement.removeAttribute(mutation.attributeName!)\n }\n }\n } catch (e) {\n console.warn('Failed to sync documentElement attribute:', e)\n }\n })\n }\n })\n })\n htmlObserver.observe(document.documentElement, { attributes: true })\n}\n\nfunction stopHtmlObserver() {\n if (htmlObserver) {\n htmlObserver.disconnect()\n htmlObserver = 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 // Patch [Symbol.hasInstance] globally on constructors to correctly identify cross-window DOM nodes\n const isProtoOf = (instance: unknown, proto: unknown) => {\n if (!instance || !proto) return false\n try {\n let currentProto = Object.getPrototypeOf(instance)\n while (currentProto) {\n if (currentProto === proto) return true\n currentProto = Object.getPrototypeOf(currentProto)\n }\n } catch {}\n return false\n }\n\n const patchHasInstance = (\n Constructor: unknown,\n checkFn: (obj: Record<string, unknown>) => boolean,\n ) => {\n try {\n Object.defineProperty(Constructor as object, Symbol.hasInstance, {\n value: function (instance: unknown) {\n if (!instance) return false\n if (isProtoOf(instance, (Constructor as { prototype?: unknown }).prototype)) return true\n return checkFn(instance as Record<string, unknown>)\n },\n configurable: true,\n writable: true,\n })\n } catch (e) {\n console.warn('Failed to patch Symbol.hasInstance on', Constructor, e)\n }\n }\n\n if (typeof Node !== 'undefined') {\n patchHasInstance(Node, (instance) => {\n return typeof instance.nodeType === 'number' && typeof instance.nodeName === 'string'\n })\n }\n if (typeof Element !== 'undefined') {\n patchHasInstance(Element, (instance) => {\n return instance.nodeType === 1\n })\n }\n if (typeof HTMLElement !== 'undefined') {\n patchHasInstance(HTMLElement, (instance) => {\n return instance.nodeType === 1 && typeof instance.style === 'object'\n })\n }\n if (typeof HTMLBodyElement !== 'undefined') {\n patchHasInstance(HTMLBodyElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'BODY'\n })\n }\n if (typeof HTMLHtmlElement !== 'undefined') {\n patchHasInstance(HTMLHtmlElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'HTML'\n })\n }\n if (typeof HTMLInputElement !== 'undefined') {\n patchHasInstance(HTMLInputElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'INPUT'\n })\n }\n if (typeof HTMLTextAreaElement !== 'undefined') {\n patchHasInstance(HTMLTextAreaElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'TEXTAREA'\n })\n }\n if (typeof ShadowRoot !== 'undefined') {\n patchHasInstance(ShadowRoot, (instance) => {\n return instance.nodeType === 11 && instance.host !== undefined\n })\n }\n if (typeof SVGElement !== 'undefined') {\n patchHasInstance(SVGElement, (instance) => {\n return instance.nodeType === 1 && typeof instance.getBBox === 'function'\n })\n }\n if (typeof Document !== 'undefined') {\n patchHasInstance(Document, (instance) => {\n return instance.nodeType === 9\n })\n }\n if (typeof Window !== 'undefined') {\n patchHasInstance(Window, (instance) => {\n return (\n instance && typeof instance.document === 'object' && typeof instance.location === 'object'\n )\n })\n }\n\n // Proxy Document properties to active popout document when one is active\n const docProto = Document.prototype\n const originalDocBody = Object.getOwnPropertyDescriptor(docProto, 'body')\n const originalDocEl = Object.getOwnPropertyDescriptor(docProto, 'documentElement')\n const originalDocHead = Object.getOwnPropertyDescriptor(docProto, 'head')\n const originalDocActive = Object.getOwnPropertyDescriptor(docProto, 'activeElement')\n const originalDocDefaultView = Object.getOwnPropertyDescriptor(docProto, 'defaultView')\n const originalDocScrolling = Object.getOwnPropertyDescriptor(docProto, 'scrollingElement')\n\n Object.defineProperties(document, {\n body: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.body\n }\n return originalDocBody?.get?.call(document) || document.body\n },\n configurable: true,\n },\n documentElement: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.documentElement\n }\n return originalDocEl?.get?.call(document) || document.documentElement\n },\n configurable: true,\n },\n head: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.head\n }\n return originalDocHead?.get?.call(document) || document.head\n },\n configurable: true,\n },\n activeElement: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.activeElement\n }\n return originalDocActive?.get?.call(document) || document.activeElement\n },\n configurable: true,\n },\n defaultView: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.defaultView\n }\n return originalDocDefaultView?.get?.call(document) || document.defaultView\n },\n configurable: true,\n },\n scrollingElement: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.scrollingElement\n }\n return originalDocScrolling?.get?.call(document) || document.scrollingElement\n },\n configurable: true,\n },\n })\n\n // Proxy Window properties to active popout window when one is active\n const winProto = Window.prototype\n const winProperties = [\n 'innerWidth',\n 'innerHeight',\n 'pageXOffset',\n 'pageYOffset',\n 'scrollX',\n 'scrollY',\n 'screenX',\n 'screenY',\n 'outerWidth',\n 'outerHeight',\n 'devicePixelRatio',\n ] as const\n\n const originalWinGetters: Record<string, (() => unknown) | undefined> = {}\n winProperties.forEach((prop) => {\n const desc =\n Object.getOwnPropertyDescriptor(winProto, prop) ||\n Object.getOwnPropertyDescriptor(window, prop)\n if (desc && desc.get) {\n originalWinGetters[prop] = desc.get\n }\n })\n\n winProperties.forEach((prop) => {\n Object.defineProperty(window, prop, {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document && activeDoc.defaultView) {\n try {\n return (activeDoc.defaultView as unknown as Record<string, unknown>)[prop]\n } catch {}\n }\n const orig = originalWinGetters[prop]\n if (orig) {\n return orig.call(window)\n }\n return (window as unknown as Record<string, unknown>)[prop]\n },\n configurable: true,\n })\n })\n\n const originalContains = Node.prototype.contains\n Node.prototype.contains = function (this: Node, otherNode: Node | null) {\n if (!otherNode) return false\n if (originalContains.call(this, otherNode)) return true\n\n if (this === document || this === document.body || this === document.documentElement) {\n for (const doc of activePopoutDocuments) {\n try {\n if (doc.contains(otherNode)) {\n return true\n }\n } catch {}\n }\n }\n return false\n }\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 originalDocAddEventListener = document.addEventListener\n document.addEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n mainListeners.add({ target: 'document', type, listener, options })\n originalDocAddEventListener.call(document, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n doc.addEventListener(type, listener, options)\n } catch {}\n })\n }\n\n const originalDocRemoveEventListener = document.removeEventListener\n document.removeEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) {\n for (const record of mainListeners) {\n if (record.target === 'document' && record.type === type && record.listener === listener) {\n mainListeners.delete(record)\n break\n }\n }\n originalDocRemoveEventListener.call(document, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n doc.removeEventListener(type, listener, options)\n } catch {}\n })\n }\n\n const originalWinAddEventListener = window.addEventListener\n window.addEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n mainListeners.add({ target: 'window', type, listener, options })\n originalWinAddEventListener.call(window, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n if (doc.defaultView) {\n doc.defaultView.addEventListener(type, listener, options)\n }\n } catch {}\n })\n }\n\n const originalWinRemoveEventListener = window.removeEventListener\n window.removeEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) {\n for (const record of mainListeners) {\n if (record.target === 'window' && record.type === type && record.listener === listener) {\n mainListeners.delete(record)\n break\n }\n }\n originalWinRemoveEventListener.call(window, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n if (doc.defaultView) {\n doc.defaultView.removeEventListener(type, listener, options)\n }\n } catch {}\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\n mainListeners.forEach((record) => {\n try {\n if (record.target === 'window') {\n popup.addEventListener(record.type, record.listener, record.options)\n } else {\n popup.document.addEventListener(record.type, record.listener, record.options)\n }\n } catch {}\n })\n\n startHeadObserver()\n startHtmlObserver()\n\n // Copy document title & styles\n popup.document.title = title\n popup.document.head.innerHTML = ''\n try {\n const baseNode = popup.document.createElement('base')\n baseNode.setAttribute('href', window.location.origin + '/')\n popup.document.head.appendChild(baseNode)\n } catch {}\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 // Copy adopted stylesheets if supported\n if (\n typeof document.adoptedStyleSheets !== 'undefined' &&\n typeof popup.document.adoptedStyleSheets !== 'undefined'\n ) {\n try {\n const clonedSheets = Array.from(document.adoptedStyleSheets)\n .map((sheet) => {\n try {\n const newSheet = new (\n popup as unknown as {\n CSSStyleSheet: typeof CSSStyleSheet\n }\n ).CSSStyleSheet()\n const cssText = Array.from(sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n newSheet.replaceSync(cssText)\n return newSheet\n } catch {\n return null\n }\n })\n .filter((s): s is CSSStyleSheet => s !== null)\n popup.document.adoptedStyleSheets = clonedSheets\n } catch (e) {\n console.warn('Failed to copy adoptedStyleSheets:', e)\n }\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 Array.from(document.documentElement.attributes).forEach((attr) => {\n popup.document.documentElement.setAttribute(attr.name, attr.value)\n })\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 const themeAttr = document.documentElement.getAttribute('data-theme')\n if (!themeAttr) {\n popup.document.documentElement.style.backgroundColor = finalBgColor\n popup.document.body.style.backgroundColor = finalBgColor\n }\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 setTimeout(() => {\n if (lastActiveEvent === e) {\n lastActiveEvent = null\n ;(\n globalThis as unknown as { __zeugmaActivePopoutDocument?: Document | null }\n ).__zeugmaActivePopoutDocument = null\n }\n }, 0)\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 stopHtmlObserver()\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 stopHtmlObserver()\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 stopHtmlObserver()\n }\n }\n }, [])\n}\n\nif (typeof window !== 'undefined') {\n setupPopoutInterception()\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 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 [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 const targetDoc = target ? target.ownerDocument : document\n if (wrapperRef.current && wrapperRef.current.ownerDocument !== targetDoc) {\n targetDoc.adoptNode(wrapperRef.current)\n }\n\n if (!wrapperRef.current) {\n wrapperRef.current = targetDoc.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 const widget: React.ReactNode = (\n <React.Fragment key={`${tabId}${keySuffix}`}>{renderWidget(tabDetails)}</React.Fragment>\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 } = 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 }),\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 ],\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","type Listener = () => void\n\ninterface GlobalCounterRecord {\n mounts: number\n renders: number\n listeners: Set<Listener>\n}\n\nconst store = new Map<string, GlobalCounterRecord>()\n\nexport function getCounterRecord(id: string): GlobalCounterRecord {\n let record = store.get(id)\n if (!record) {\n record = { mounts: 0, renders: 0, listeners: new Set() }\n store.set(id, record)\n }\n return record\n}\n\nexport function subscribeCounter(id: string, listener: Listener): () => void {\n const record = getCounterRecord(id)\n record.listeners.add(listener)\n return () => {\n record.listeners.delete(listener)\n }\n}\n\nexport function notifyCounter(id: string) {\n const record = store.get(id)\n if (record) {\n record.listeners.forEach((fn) => fn())\n }\n}\n\nexport function resetCounterRecord(id: string) {\n const record = store.get(id)\n if (record) {\n record.mounts = 0\n record.renders = 0\n notifyCounter(id)\n }\n}\n\nexport function clearAllCounters() {\n store.clear()\n}\n","'use client'\n\nimport { useRef, useEffect, useState, useCallback, useId } from 'react'\nimport type { RenderCounterOptions, RenderCounterState } from './types'\nimport { getCounterRecord, subscribeCounter, notifyCounter, resetCounterRecord } from './store'\n\n/**\n * A React hook that tracks component mount and render counts in a React 18/19 StrictMode safe manner.\n * Supports optional global ID sharing, console logging, and manual reset.\n */\nexport function useRenderCounter(\n idOrOptions?: string | RenderCounterOptions,\n maybeOptions?: RenderCounterOptions,\n): RenderCounterState {\n const defaultAutoId = useId()\n\n const options: RenderCounterOptions =\n typeof idOrOptions === 'string' ? { id: idOrOptions, ...maybeOptions } : idOrOptions || {}\n\n const { id = defaultAutoId, logToConsole = false, disabled = false } = options\n\n const renderCountRef = useRef<number>(0)\n const isMountedRef = useRef<boolean>(false)\n const [, forceUpdate] = useState<number>(0)\n\n if (!disabled) {\n renderCountRef.current += 1\n }\n\n useEffect(() => {\n if (disabled) return\n\n const unsubscribe = subscribeCounter(id, () => {\n forceUpdate((c) => c + 1)\n })\n\n const record = getCounterRecord(id)\n record.mounts += 1\n isMountedRef.current = true\n\n if (logToConsole) {\n console.log(\n `[DevTools:${id}] Mounted: ${record.mounts} | Rendered: ${renderCountRef.current}`,\n )\n }\n\n notifyCounter(id)\n\n return () => {\n isMountedRef.current = false\n unsubscribe()\n }\n }, [id, disabled, logToConsole])\n\n if (!disabled) {\n const record = getCounterRecord(id)\n record.renders = Math.max(record.renders, renderCountRef.current)\n }\n\n const reset = useCallback(() => {\n renderCountRef.current = 0\n resetCounterRecord(id)\n }, [id])\n\n if (disabled) {\n return { mounts: 0, renders: 0, reset }\n }\n\n const record = getCounterRecord(id)\n\n return {\n mounts: record.mounts,\n renders: renderCountRef.current,\n reset,\n }\n}\n","'use client'\n\nimport type { RenderCounterBadgeProps } from './types'\nimport { useRenderCounter } from './use-render-counter'\n\nconst POSITION_STYLES: Record<NonNullable<RenderCounterBadgeProps['position']>, string> = {\n 'top-right': 'top-2 right-2',\n 'top-left': 'top-2 left-2',\n 'bottom-right': 'bottom-2 right-2',\n 'bottom-left': 'bottom-2 left-2',\n}\n\n/**\n * A floating overlay badge displaying mount and render counters for debugging component lifecycles.\n */\nexport function RenderCounterBadge({\n id,\n position = 'top-right',\n className = '',\n style,\n logToConsole = false,\n disabled = false,\n}: RenderCounterBadgeProps) {\n const { mounts, renders } = useRenderCounter(id, { logToConsole, disabled })\n\n if (disabled) {\n return null\n }\n\n const posClass = POSITION_STYLES[position] || POSITION_STYLES['top-right']\n\n return (\n <div\n className={`absolute ${posClass} z-50 pointer-events-none flex items-center gap-2 rounded px-2 py-1 text-[11px] font-mono bg-zinc-900/90 text-zinc-200 border border-zinc-700/80 shadow-md backdrop-blur-xs select-none ${className}`}\n style={style}\n >\n <span>\n M: <strong className=\"text-emerald-400 font-semibold\">{mounts}</strong>\n </span>\n <span className=\"opacity-30\">|</span>\n <span>\n R: <strong className=\"text-indigo-400 font-semibold\">{renders}</strong>\n </span>\n </div>\n )\n}\n","'use client'\n\nimport type { RenderCounterFooterProps } from './types'\nimport { useRenderCounter } from './use-render-counter'\n\n/**\n * A container footer component for displaying mount and render counters at the bottom of widgets or panels.\n */\nexport function RenderCounterFooter({\n id,\n label,\n children,\n className = '',\n footerClassName = '',\n style,\n logToConsole = false,\n disabled = false,\n}: RenderCounterFooterProps) {\n const displayId = label || id || 'widget'\n const { mounts, renders } = useRenderCounter(id, { logToConsole, disabled })\n\n if (disabled) {\n return <>{children}</>\n }\n\n return (\n <div\n className={`h-full w-full flex flex-col overflow-hidden min-h-0 ${className}`}\n style={style}\n >\n {children && <div className=\"flex-1 overflow-hidden relative min-h-0\">{children}</div>}\n <div\n className={`bg-zinc-900/90 border-t border-zinc-800 px-3 py-1.5 flex items-center justify-between text-[11px] text-zinc-400 font-mono shrink-0 select-none ${footerClassName}`}\n >\n <span className=\"truncate max-w-[140px] text-zinc-300 font-semibold\">{displayId}</span>\n <div className=\"flex items-center gap-3\">\n <span>\n Mounts: <strong className=\"text-emerald-400 font-semibold\">{mounts}</strong>\n </span>\n <span className=\"opacity-20\">|</span>\n <span>\n Renders: <strong className=\"text-indigo-400 font-semibold\">{renders}</strong>\n </span>\n </div>\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/lib/drag-session.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/lib/tree/compare.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","../src/devtools/store.ts","../src/devtools/use-render-counter.ts","../src/devtools/render-counter-badge.tsx","../src/devtools/render-counter-footer.tsx"],"names":["createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerMove","e","handlePointerUp","globalStyle","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","areObjectsEqual","a","b","keysA","keysB","key","valA","valB","areMetadataEqual","areLayoutsEqual","sb","pb","i","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","setLocalLayout","renderingLayout","setRenderingLayout","prevControlledLayoutRef","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","poppedOutTabIds","setPoppedOutTabIds","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","fullscreenPaneIdRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","prevPopped","filtered","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","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","mainListeners","headObserver","startHeadObserver","mutations","mutation","doc","cloned","href","stopHeadObserver","htmlObserver","startHtmlObserver","val","stopHtmlObserver","delayClose","closeFn","getActiveDocument","currentEvent","setupPopoutInterception","isProtoOf","instance","proto","currentProto","patchHasInstance","Constructor","checkFn","docProto","originalDocBody","originalDocEl","originalDocHead","originalDocActive","originalDocDefaultView","originalDocScrolling","activeDoc","winProto","winProperties","originalWinGetters","prop","desc","orig","originalContains","otherNode","resetActive","evtName","originalCreateElement","tagName","originalDocAddEventListener","type","listener","originalDocRemoveEventListener","record","originalWinAddEventListener","originalWinRemoveEventListener","originalGetElementById","mainEl","originalQuerySelector","selector","originalQuerySelectorAll","mainResults","results","useZeugmaPopouts","dockTab","popoutWindowsRef","activeWindows","title","popup","baseNode","clonedNode","rules","cssText","rule","clonedSheets","sheet","newSheet","s","attr","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","targetDoc","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","store","getCounterRecord","subscribeCounter","notifyCounter","fn","resetCounterRecord","useRenderCounter","idOrOptions","maybeOptions","defaultAutoId","useId","logToConsole","renderCountRef","forceUpdate","unsubscribe","c","reset","RenderCounterBadge","mounts","renders","RenderCounterFooter","label","footerClassName","displayId"],"mappings":"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","file":"index.js","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","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 { TreeNode, SplitNode, PaneNode } from '../../model/types'\n\nfunction areObjectsEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n if (a === b) return true\n if (!a || !b) return false\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n const valA = a[key]\n const valB = b[key]\n if (typeof valA === 'object' && valA !== null && typeof valB === 'object' && valB !== null) {\n if (!areObjectsEqual(valA as Record<string, unknown>, valB as Record<string, unknown>)) {\n return false\n }\n } else if (valA !== valB) {\n return false\n }\n }\n return true\n}\n\nfunction areMetadataEqual(\n a: Record<string, Record<string, unknown>> | undefined,\n b: Record<string, Record<string, unknown>> | undefined,\n): boolean {\n if (a === b) return true\n if (!a || !b) return false\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!areObjectsEqual(a[key], b[key])) return false\n }\n return true\n}\n\n/**\n * Perform a fast deep equality comparison of two layout tree nodes,\n * short-circuiting as soon as a difference is found and avoiding costly\n * JSON stringification on every render.\n */\nexport function areLayoutsEqual(a: TreeNode | null, b: TreeNode | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n if (a.type !== b.type) return false\n\n if (a.type === 'split') {\n const sb = b as SplitNode\n return (\n a.direction === sb.direction &&\n a.splitPercentage === sb.splitPercentage &&\n areLayoutsEqual(a.first, sb.first) &&\n areLayoutsEqual(a.second, sb.second)\n )\n } else {\n const pb = b as PaneNode\n if (a.id !== pb.id) return false\n if (a.activeTabId !== pb.activeTabId) return false\n if (a.locked !== pb.locked) return false\n if (a.tabIds.length !== pb.tabIds.length) return false\n for (let i = 0; i < a.tabIds.length; i++) {\n if (a.tabIds[i] !== pb.tabIds[i]) return false\n }\n return areMetadataEqual(a.tabsMetadata, pb.tabsMetadata)\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n removePane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n areLayoutsEqual,\n} from '../../../shared/lib/tree'\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 prevControlledLayoutRef = useRef<TreeNode | null | undefined>(controlledLayout)\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 fullscreenPaneIdRef = useRef<string | null>(fullscreenPaneId)\n fullscreenPaneIdRef.current = fullscreenPaneId\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 if (!areLayoutsEqual(controlledLayout, prevControlledLayoutRef.current ?? null)) {\n prevControlledLayoutRef.current = controlledLayout\n setLocalLayout(controlledLayout)\n setRenderingLayout(controlledLayout)\n setPoppedOutTabIds((prevPopped) => {\n if (prevPopped.length === 0) return prevPopped\n const filtered = prevPopped.filter((id) => findTabById(controlledLayout, id) !== null)\n return filtered.length === prevPopped.length ? prevPopped : filtered\n })\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 (!areLayoutsEqual(prev, next)) {\n layoutRef.current = next\n setLocalLayout(next)\n setRenderingLayout(next)\n\n setPoppedOutTabIds((prevPopped) => {\n if (prevPopped.length === 0) return prevPopped\n const filtered = prevPopped.filter((id) => findTabById(next, id) !== null)\n return filtered.length === prevPopped.length ? prevPopped : filtered\n })\n\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 if (fullscreenPaneIdRef.current !== null) return\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) => {\n if (fullscreenPaneIdRef.current !== null) return prev\n return removePane(prev, paneId)\n }),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n if (fullscreenPaneIdRef.current !== null) return prev\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 if (fullscreenPaneIdRef.current !== null) return prev\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 if (fullscreenPaneIdRef.current !== null) return prev\n return 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 if (fullscreenPaneIdRef.current !== null) return prev\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 (\n prev,\n draggedTabId: string,\n targetTabId: string,\n position?: 'before' | 'after' | 'center',\n ) => {\n if (fullscreenPaneIdRef.current !== null) return prev\n return moveTab(prev, draggedTabId, targetTabId, position)\n },\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => {\n if (fullscreenPaneIdRef.current !== null) return prev\n return removeTab(prev, tabId)\n }),\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 if (fullscreenPaneIdRef.current !== null) return\n setPoppedOutTabIds((prev) => {\n if (prev.includes(tabId)) return prev\n return [...prev, tabId]\n })\n }, [])\n\n const handleDockTab = useCallback((tabId: string) => {\n if (fullscreenPaneIdRef.current !== null) return\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\ninterface RegisteredListener {\n target: 'window' | 'document'\n type: string\n listener: EventListenerOrEventListenerObject\n options?: boolean | AddEventListenerOptions\n}\n\nconst mainListeners = new Set<RegisteredListener>()\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\nlet htmlObserver: MutationObserver | null = null\n\nfunction startHtmlObserver() {\n if (typeof window === 'undefined' || htmlObserver) return\n htmlObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === 'attributes' && mutation.attributeName) {\n const val = document.documentElement.getAttribute(mutation.attributeName)\n activePopoutDocuments.forEach((doc) => {\n try {\n if (doc && doc.documentElement) {\n if (val !== null) {\n doc.documentElement.setAttribute(mutation.attributeName!, val)\n } else {\n doc.documentElement.removeAttribute(mutation.attributeName!)\n }\n }\n } catch (e) {\n console.warn('Failed to sync documentElement attribute:', e)\n }\n })\n }\n })\n })\n htmlObserver.observe(document.documentElement, { attributes: true })\n}\n\nfunction stopHtmlObserver() {\n if (htmlObserver) {\n htmlObserver.disconnect()\n htmlObserver = 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 // Patch [Symbol.hasInstance] globally on constructors to correctly identify cross-window DOM nodes\n const isProtoOf = (instance: unknown, proto: unknown) => {\n if (!instance || !proto) return false\n try {\n let currentProto = Object.getPrototypeOf(instance)\n while (currentProto) {\n if (currentProto === proto) return true\n currentProto = Object.getPrototypeOf(currentProto)\n }\n } catch {}\n return false\n }\n\n const patchHasInstance = (\n Constructor: unknown,\n checkFn: (obj: Record<string, unknown>) => boolean,\n ) => {\n try {\n Object.defineProperty(Constructor as object, Symbol.hasInstance, {\n value: function (instance: unknown) {\n if (!instance) return false\n if (isProtoOf(instance, (Constructor as { prototype?: unknown }).prototype)) return true\n return checkFn(instance as Record<string, unknown>)\n },\n configurable: true,\n writable: true,\n })\n } catch (e) {\n console.warn('Failed to patch Symbol.hasInstance on', Constructor, e)\n }\n }\n\n if (typeof Node !== 'undefined') {\n patchHasInstance(Node, (instance) => {\n return typeof instance.nodeType === 'number' && typeof instance.nodeName === 'string'\n })\n }\n if (typeof Element !== 'undefined') {\n patchHasInstance(Element, (instance) => {\n return instance.nodeType === 1\n })\n }\n if (typeof HTMLElement !== 'undefined') {\n patchHasInstance(HTMLElement, (instance) => {\n return instance.nodeType === 1 && typeof instance.style === 'object'\n })\n }\n if (typeof HTMLBodyElement !== 'undefined') {\n patchHasInstance(HTMLBodyElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'BODY'\n })\n }\n if (typeof HTMLHtmlElement !== 'undefined') {\n patchHasInstance(HTMLHtmlElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'HTML'\n })\n }\n if (typeof HTMLInputElement !== 'undefined') {\n patchHasInstance(HTMLInputElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'INPUT'\n })\n }\n if (typeof HTMLTextAreaElement !== 'undefined') {\n patchHasInstance(HTMLTextAreaElement, (instance) => {\n return instance.nodeType === 1 && instance.tagName === 'TEXTAREA'\n })\n }\n if (typeof ShadowRoot !== 'undefined') {\n patchHasInstance(ShadowRoot, (instance) => {\n return instance.nodeType === 11 && instance.host !== undefined\n })\n }\n if (typeof SVGElement !== 'undefined') {\n patchHasInstance(SVGElement, (instance) => {\n return instance.nodeType === 1 && typeof instance.getBBox === 'function'\n })\n }\n if (typeof Document !== 'undefined') {\n patchHasInstance(Document, (instance) => {\n return instance.nodeType === 9\n })\n }\n if (typeof Window !== 'undefined') {\n patchHasInstance(Window, (instance) => {\n return (\n instance && typeof instance.document === 'object' && typeof instance.location === 'object'\n )\n })\n }\n\n // Proxy Document properties to active popout document when one is active\n const docProto = Document.prototype\n const originalDocBody = Object.getOwnPropertyDescriptor(docProto, 'body')\n const originalDocEl = Object.getOwnPropertyDescriptor(docProto, 'documentElement')\n const originalDocHead = Object.getOwnPropertyDescriptor(docProto, 'head')\n const originalDocActive = Object.getOwnPropertyDescriptor(docProto, 'activeElement')\n const originalDocDefaultView = Object.getOwnPropertyDescriptor(docProto, 'defaultView')\n const originalDocScrolling = Object.getOwnPropertyDescriptor(docProto, 'scrollingElement')\n\n Object.defineProperties(document, {\n body: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.body\n }\n return originalDocBody?.get?.call(document) || document.body\n },\n configurable: true,\n },\n documentElement: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.documentElement\n }\n return originalDocEl?.get?.call(document) || document.documentElement\n },\n configurable: true,\n },\n head: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.head\n }\n return originalDocHead?.get?.call(document) || document.head\n },\n configurable: true,\n },\n activeElement: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.activeElement\n }\n return originalDocActive?.get?.call(document) || document.activeElement\n },\n configurable: true,\n },\n defaultView: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.defaultView\n }\n return originalDocDefaultView?.get?.call(document) || document.defaultView\n },\n configurable: true,\n },\n scrollingElement: {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document) {\n return activeDoc.scrollingElement\n }\n return originalDocScrolling?.get?.call(document) || document.scrollingElement\n },\n configurable: true,\n },\n })\n\n // Proxy Window properties to active popout window when one is active\n const winProto = Window.prototype\n const winProperties = [\n 'innerWidth',\n 'innerHeight',\n 'pageXOffset',\n 'pageYOffset',\n 'scrollX',\n 'scrollY',\n 'screenX',\n 'screenY',\n 'outerWidth',\n 'outerHeight',\n 'devicePixelRatio',\n ] as const\n\n const originalWinGetters: Record<string, (() => unknown) | undefined> = {}\n winProperties.forEach((prop) => {\n const desc =\n Object.getOwnPropertyDescriptor(winProto, prop) ||\n Object.getOwnPropertyDescriptor(window, prop)\n if (desc && desc.get) {\n originalWinGetters[prop] = desc.get\n }\n })\n\n winProperties.forEach((prop) => {\n Object.defineProperty(window, prop, {\n get() {\n const activeDoc = getActiveDocument()\n if (activeDoc && activeDoc !== document && activeDoc.defaultView) {\n try {\n return (activeDoc.defaultView as unknown as Record<string, unknown>)[prop]\n } catch {}\n }\n const orig = originalWinGetters[prop]\n if (orig) {\n return orig.call(window)\n }\n return (window as unknown as Record<string, unknown>)[prop]\n },\n configurable: true,\n })\n })\n\n const originalContains = Node.prototype.contains\n Node.prototype.contains = function (this: Node, otherNode: Node | null) {\n if (!otherNode) return false\n if (originalContains.call(this, otherNode)) return true\n\n if (this === document || this === document.body || this === document.documentElement) {\n for (const doc of activePopoutDocuments) {\n try {\n if (doc.contains(otherNode)) {\n return true\n }\n } catch {}\n }\n }\n return false\n }\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 originalDocAddEventListener = document.addEventListener\n document.addEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n mainListeners.add({ target: 'document', type, listener, options })\n originalDocAddEventListener.call(document, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n doc.addEventListener(type, listener, options)\n } catch {}\n })\n }\n\n const originalDocRemoveEventListener = document.removeEventListener\n document.removeEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) {\n for (const record of mainListeners) {\n if (record.target === 'document' && record.type === type && record.listener === listener) {\n mainListeners.delete(record)\n break\n }\n }\n originalDocRemoveEventListener.call(document, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n doc.removeEventListener(type, listener, options)\n } catch {}\n })\n }\n\n const originalWinAddEventListener = window.addEventListener\n window.addEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) {\n mainListeners.add({ target: 'window', type, listener, options })\n originalWinAddEventListener.call(window, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n if (doc.defaultView) {\n doc.defaultView.addEventListener(type, listener, options)\n }\n } catch {}\n })\n }\n\n const originalWinRemoveEventListener = window.removeEventListener\n window.removeEventListener = function (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ) {\n for (const record of mainListeners) {\n if (record.target === 'window' && record.type === type && record.listener === listener) {\n mainListeners.delete(record)\n break\n }\n }\n originalWinRemoveEventListener.call(window, type, listener, options)\n activePopoutDocuments.forEach((doc) => {\n try {\n if (doc.defaultView) {\n doc.defaultView.removeEventListener(type, listener, options)\n }\n } catch {}\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\n mainListeners.forEach((record) => {\n try {\n if (record.target === 'window') {\n popup.addEventListener(record.type, record.listener, record.options)\n } else {\n popup.document.addEventListener(record.type, record.listener, record.options)\n }\n } catch {}\n })\n\n startHeadObserver()\n startHtmlObserver()\n\n // Copy document title & styles\n popup.document.title = title\n popup.document.head.innerHTML = ''\n try {\n const baseNode = popup.document.createElement('base')\n baseNode.setAttribute('href', window.location.origin + '/')\n popup.document.head.appendChild(baseNode)\n } catch {}\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 // Copy adopted stylesheets if supported\n if (\n typeof document.adoptedStyleSheets !== 'undefined' &&\n typeof popup.document.adoptedStyleSheets !== 'undefined'\n ) {\n try {\n const clonedSheets = Array.from(document.adoptedStyleSheets)\n .map((sheet) => {\n try {\n const newSheet = new (\n popup as unknown as {\n CSSStyleSheet: typeof CSSStyleSheet\n }\n ).CSSStyleSheet()\n const cssText = Array.from(sheet.cssRules)\n .map((rule) => rule.cssText)\n .join('\\n')\n newSheet.replaceSync(cssText)\n return newSheet\n } catch {\n return null\n }\n })\n .filter((s): s is CSSStyleSheet => s !== null)\n popup.document.adoptedStyleSheets = clonedSheets\n } catch (e) {\n console.warn('Failed to copy adoptedStyleSheets:', e)\n }\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 Array.from(document.documentElement.attributes).forEach((attr) => {\n popup.document.documentElement.setAttribute(attr.name, attr.value)\n })\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 const themeAttr = document.documentElement.getAttribute('data-theme')\n if (!themeAttr) {\n popup.document.documentElement.style.backgroundColor = finalBgColor\n popup.document.body.style.backgroundColor = finalBgColor\n }\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 setTimeout(() => {\n if (lastActiveEvent === e) {\n lastActiveEvent = null\n ;(\n globalThis as unknown as { __zeugmaActivePopoutDocument?: Document | null }\n ).__zeugmaActivePopoutDocument = null\n }\n }, 0)\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 stopHtmlObserver()\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 stopHtmlObserver()\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 stopHtmlObserver()\n }\n }\n }, [])\n}\n\nif (typeof window !== 'undefined') {\n setupPopoutInterception()\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 const targetDoc = target ? target.ownerDocument : document\n if (wrapperRef.current && wrapperRef.current.ownerDocument !== targetDoc) {\n targetDoc.adoptNode(wrapperRef.current)\n }\n\n if (!wrapperRef.current) {\n wrapperRef.current = targetDoc.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","type Listener = () => void\n\ninterface GlobalCounterRecord {\n mounts: number\n renders: number\n listeners: Set<Listener>\n}\n\nconst store = new Map<string, GlobalCounterRecord>()\n\nexport function getCounterRecord(id: string): GlobalCounterRecord {\n let record = store.get(id)\n if (!record) {\n record = { mounts: 0, renders: 0, listeners: new Set() }\n store.set(id, record)\n }\n return record\n}\n\nexport function subscribeCounter(id: string, listener: Listener): () => void {\n const record = getCounterRecord(id)\n record.listeners.add(listener)\n return () => {\n record.listeners.delete(listener)\n }\n}\n\nexport function notifyCounter(id: string) {\n const record = store.get(id)\n if (record) {\n record.listeners.forEach((fn) => fn())\n }\n}\n\nexport function resetCounterRecord(id: string) {\n const record = store.get(id)\n if (record) {\n record.mounts = 0\n record.renders = 0\n notifyCounter(id)\n }\n}\n\nexport function clearAllCounters() {\n store.clear()\n}\n","'use client'\n\nimport { useRef, useEffect, useState, useCallback, useId } from 'react'\nimport type { RenderCounterOptions, RenderCounterState } from './types'\nimport { getCounterRecord, subscribeCounter, notifyCounter, resetCounterRecord } from './store'\n\n/**\n * A React hook that tracks component mount and render counts in a React 18/19 StrictMode safe manner.\n * Supports optional global ID sharing, console logging, and manual reset.\n */\nexport function useRenderCounter(\n idOrOptions?: string | RenderCounterOptions,\n maybeOptions?: RenderCounterOptions,\n): RenderCounterState {\n const defaultAutoId = useId()\n\n const options: RenderCounterOptions =\n typeof idOrOptions === 'string' ? { id: idOrOptions, ...maybeOptions } : idOrOptions || {}\n\n const { id = defaultAutoId, logToConsole = false, disabled = false } = options\n\n const renderCountRef = useRef<number>(0)\n const isMountedRef = useRef<boolean>(false)\n const [, forceUpdate] = useState<number>(0)\n\n if (!disabled) {\n renderCountRef.current += 1\n }\n\n useEffect(() => {\n if (disabled) return\n\n const unsubscribe = subscribeCounter(id, () => {\n forceUpdate((c) => c + 1)\n })\n\n const record = getCounterRecord(id)\n record.mounts += 1\n isMountedRef.current = true\n\n if (logToConsole) {\n console.log(\n `[DevTools:${id}] Mounted: ${record.mounts} | Rendered: ${renderCountRef.current}`,\n )\n }\n\n notifyCounter(id)\n\n return () => {\n isMountedRef.current = false\n unsubscribe()\n }\n }, [id, disabled, logToConsole])\n\n if (!disabled) {\n const record = getCounterRecord(id)\n record.renders = Math.max(record.renders, renderCountRef.current)\n }\n\n const reset = useCallback(() => {\n renderCountRef.current = 0\n resetCounterRecord(id)\n }, [id])\n\n if (disabled) {\n return { mounts: 0, renders: 0, reset }\n }\n\n const record = getCounterRecord(id)\n\n return {\n mounts: record.mounts,\n renders: renderCountRef.current,\n reset,\n }\n}\n","'use client'\n\nimport type { RenderCounterBadgeProps } from './types'\nimport { useRenderCounter } from './use-render-counter'\n\n/**\n * A badge displaying mount and render counters for debugging component lifecycles.\n */\nexport function RenderCounterBadge({\n id,\n className,\n style,\n logToConsole = false,\n disabled = false,\n}: RenderCounterBadgeProps) {\n const { mounts, renders } = useRenderCounter(id, { logToConsole, disabled })\n\n if (disabled) {\n return null\n }\n\n return (\n <div className={className} style={style}>\n <span>\n M: <strong>{mounts}</strong>\n </span>\n <span>|</span>\n <span>\n R: <strong>{renders}</strong>\n </span>\n </div>\n )\n}\n","'use client'\n\nimport type { RenderCounterFooterProps } from './types'\nimport { useRenderCounter } from './use-render-counter'\n\n/**\n * A container footer component for displaying mount and render counters at the bottom of widgets or panels.\n */\nexport function RenderCounterFooter({\n id,\n label,\n children,\n className,\n footerClassName,\n style,\n logToConsole = false,\n disabled = false,\n}: RenderCounterFooterProps) {\n const displayId = label || id || 'widget'\n const { mounts, renders } = useRenderCounter(id, { logToConsole, disabled })\n\n if (disabled) {\n return <>{children}</>\n }\n\n return (\n <div className={className} style={style}>\n {children && <div className=\"flex-1 overflow-hidden relative min-h-0\">{children}</div>}\n <div className={footerClassName}>\n <span className=\"truncate\">{displayId}</span>\n <div className=\"flex items-center gap-3\">\n <span>\n Mounts: <strong className=\"counter-mounts\">{mounts}</strong>\n </span>\n <span>|</span>\n <span>\n Renders: <strong className=\"counter-renders\">{renders}</strong>\n </span>\n </div>\n </div>\n </div>\n )\n}\n"]}