react-zeugma 6.6.1 → 6.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +5 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/lib/drag-session.ts","../src/shared/lib/json.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/entities/zeugma/model/useZeugma.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/lib/collisions.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/DragOverlayPreview.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/FlatSplitter.tsx","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../src/entities/zeugma/ui/RootDropZones.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/DropZone.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx","../src/entities/pane/ui/PaneControls.tsx","../src/entities/pane/ui/Pane.tsx"],"names":["createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerMove","e","handlePointerUp","globalStyle","safeJsonStringify","val","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","ZeugmaDragContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaDrag","drag","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","renderCallbacksRef","renderPaneRef","tabHeadersRef","activeIdRef","isMountedRef","registerPortalTarget","useCallback","tabId","el","prev","next","registerRenderCallback","render","registerRenderPane","registerTabHeader","collectAllTabIds","layout","layoutBeforeDrag","ids","traverse","node","useAllTabIds","useMemo","useZeugmaDragMeasurement","props","findPaneContainingTab","onDragStart","onDragEnd","overTabId","setOverTabId","overTabPosition","setOverTabPosition","draggedSize","setDraggedSize","handleDragStartInternal","draggingId","parentPane","rect","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","findTabById","pane","index","getTabMetadata","getActiveTabMetadata","updateMetadata","id","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","calculateTabDropIndex","tabs","activeType","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","setLayoutBeforeDrag","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","layoutBeforeDragRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","handleSetLayout","nextLayoutOrUpdater","_internalSetLayout","setLayout","handleRemovePane","handleAddTab","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","tab","handleGetTabMetadata","handleGetActiveTabMetadata","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","customCollisionDetection","isTabDrag","pointerCollisions","pointerWithin","filteredCollisions","collision","a","b","aId","bId","aIsTab","bIsTab","aIsRoot","bIsRoot","tabDroppables","container","closestCenter","getPointerCoordinates","useZeugmaDnd","dragActivationDistance","enableDragToDismiss","dismissThreshold","onRemove","onDismissIntentChange","containerRectRef","setIsOverLocked","useSensors","useSensor","rawId","ae","layoutAfterSelect","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","CursorOverlay","className","ref","handleMove","jsx","PortalHostItem","React","tabDetails","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","DragOverlayPreview","renderDragOverlay","classNames","Fragment","paneRender","tabHeaderRender","tabClass","useResizer","resizerSize","snapThreshold","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","minSplitPercentage","maxSplitPercentage","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","PaneTree","propResizerSize","propSnapThreshold","contextSnapThreshold","contextResizerSize","panes","splitters","renderContent","jsxs","isFullscreen","isDismissActive","handleRef","dashboardClass","RootDropZones","ZeugmaProviderInternal","controller","children","onResizeStart","onResize","onResizeEnd","internalController","dnd","stableClassNames","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","portalRegistryValue","DndContext","ZeugmaRenderer","Zeugma","restProps","activationPositions","previewPositions","RootDropZone","activeClassName","setNodeRef","isOver","useDroppable","previewStyle","zone","DragListenersCtx","DropZone","DragHandle","dragProps","disabled","TabContext","Tab","globalLocked","portalRegistry","tabsContext","TabsContext","attributes","listeners","setDragRef","isDragging","useDraggable","setDropRef","isTargetOver","activeTabId","separator","isActive","selectThisTab","removeThisTab","tabContextValue","resolveDynamicProp","value","Tabs","propTabs","propActiveTabId","propLocked","propTabsMetadata","propSelectTab","propRemoveTab","renderTab","styles","paneContext","PaneContext","tabsMetadata","globalClassNames","contextValue","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere","PaneControls","usePaneContext","context","PaneContent","targetRef","renderCallback","Pane","paneNode","paneContainerId","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","dragging","renderProps","paneClass"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared drag-session lifecycle utility.\n *\n * Handles the common boilerplate for pointer-based resize operations:\n * - Adds `zeugma-resizing` class to `document.body`\n * - Injects a global `cursor` style so the resize cursor stays active\n * even when the pointer leaves the handle element\n * - Sets `data-resizing` on the resizer element\n * - Attaches `pointermove` / `pointerup` listeners to `document`\n * - Cleans everything up on pointer-up\n *\n * Consumers provide domain-specific `onMove` and `onEnd` callbacks.\n */\n\nexport interface DragSessionConfig {\n /** CSS cursor to enforce globally during the drag */\n cursor: 'col-resize' | 'row-resize'\n /** The resizer DOM element (receives `data-resizing` attribute) */\n resizerEl: HTMLElement\n /** Called on every `pointermove` during the drag */\n onMove: (e: PointerEvent) => void\n /** Called once on `pointerup` — after cleanup has already run */\n onEnd: () => void\n}\n\nexport function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void {\n // 1. Body class\n document.body.classList.add('zeugma-resizing')\n\n // 2. Global cursor override\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${cursor} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n // 3. Mark the resizer element\n resizerEl.setAttribute('data-resizing', 'true')\n\n // 4. Document-level listeners\n const handlePointerMove = (e: PointerEvent) => {\n onMove(e)\n }\n\n const handlePointerUp = () => {\n // Cleanup\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Notify consumer\n onEnd()\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { createContext, useContext } from 'react'\nimport {\n ZeugmaStateValue,\n ZeugmaActionsValue,\n PortalRegistryValue,\n ZeugmaDragStateValue,\n} from '../model/types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\nexport const ZeugmaDragContext = createContext<ZeugmaDragStateValue | undefined>(undefined)\n\nexport const useZeugmaState = (): ZeugmaStateValue => {\n const state = useContext(ZeugmaStateContext)\n if (!state) {\n throw new Error('useZeugmaState must be used within a Zeugma provider')\n }\n return state\n}\n\nexport const useZeugmaActions = (): ZeugmaActionsValue => {\n const actions = useContext(ZeugmaActionsContext)\n if (!actions) {\n throw new Error('useZeugmaActions must be used within a Zeugma provider')\n }\n return actions\n}\n\nexport const useZeugmaDrag = (): ZeugmaDragStateValue => {\n const drag = useContext(ZeugmaDragContext)\n if (!drag) {\n throw new Error('useZeugmaDrag must be used within a Zeugma provider')\n }\n return drag\n}\n","import { useEffect, useRef, useState, useCallback, useMemo, useContext } from 'react'\nimport { TabDetails, TreeNode, PaneNode, PortalRegistryContext } from '../../../shared'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const renderCallbacksRef = useRef<Record<string, (tab: TabDetails) => React.ReactNode>>({})\n const renderPaneRef = useRef<((paneId: string) => React.ReactNode) | null>(null)\n const tabHeadersRef = useRef<\n Record<string, (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode>\n >({})\n const activeIdRef = useRef<string | null>(null)\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const registerPortalTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (!el) {\n if (!prev[tabId]) return prev\n const next = { ...prev }\n delete next[tabId]\n return next\n }\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n const registerRenderCallback = useCallback(\n (tabId: string, render: (tab: TabDetails) => React.ReactNode) => {\n renderCallbacksRef.current[tabId] = render\n },\n [],\n )\n\n const registerRenderPane = useCallback((render: (paneId: string) => React.ReactNode) => {\n renderPaneRef.current = render\n }, [])\n\n const registerTabHeader = useCallback(\n (\n tabId: string,\n render: (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode,\n ) => {\n tabHeadersRef.current[tabId] = render\n },\n [],\n )\n\n return {\n portalTargets,\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n }\n}\n\nexport function collectAllTabIds(\n layout: TreeNode | null,\n layoutBeforeDrag: TreeNode | null,\n): string[] {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabs.forEach((tabId) => {\n ids.add(tabId)\n })\n } else if (node.type === 'split') {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n if (layoutBeforeDrag) {\n traverse(layoutBeforeDrag)\n }\n return Array.from(ids).sort()\n}\n\nexport function useAllTabIds(layout: TreeNode | null, layoutBeforeDrag: TreeNode | null): string[] {\n return useMemo(() => collectAllTabIds(layout, layoutBeforeDrag), [layout, layoutBeforeDrag])\n}\n\ninterface UseZeugmaDragMeasurementProps {\n activeId: string | null\n findPaneContainingTab: (tabId: string) => PaneNode | null\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 { activeId, findPaneContainingTab, onDragStart, onDragEnd } = props\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n const [draggedSize, setDraggedSize] = useState<{ width: number; height: number } | null>(null)\n\n const handleDragStartInternal = useCallback(\n (draggingId: string) => {\n const parentPane = findPaneContainingTab(draggingId)\n let el: HTMLElement | null = null\n if (parentPane) {\n el = document.getElementById(parentPane.id)\n } else {\n el = document.getElementById(draggingId)\n }\n\n if (el) {\n const rect = el.getBoundingClientRect()\n setDraggedSize({ width: rect.width, height: rect.height })\n } else {\n setDraggedSize(null)\n }\n if (onDragStart) {\n onDragStart(draggingId)\n }\n },\n [onDragStart, findPaneContainingTab],\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 setDraggedSize(null)\n if (onDragEnd) {\n onDragEnd(actId, ovId, dropAction)\n }\n },\n [onDragEnd],\n )\n\n useEffect(() => {\n if (!activeId) {\n setDraggedSize(null)\n }\n }, [activeId])\n\n return {\n overTabId,\n setOverTabId,\n overTabPosition,\n setOverTabPosition,\n draggedSize,\n setDraggedSize,\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.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane or widget by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: PaneNode): TreeNode {\n if (tree === null) {\n return leafNode\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: leafNode,\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage }\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode or WidgetNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Get the metadata for a specific tab by its ID.\n */\nexport function getTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneContainingTab(tree, tabId)\n return pane?.tabsMetadata?.[tabId]\n}\n\n/**\n * Get the metadata of the active item (either tab or pane).\n */\n/**\n * Get the metadata of the active tab in a specific pane.\n */\nexport function getActiveTabMetadata(\n tree: TreeNode | null,\n paneId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneById(tree, paneId)\n return pane?.tabsMetadata?.[pane.activeTabId]\n}\n\n/**\n * Update metadata on a specific tab or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabs: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTab = activeType === 'tab'\n const isHoveredTabInThisPane = isDraggingTab && overTabId && tabs.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabs.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n removePane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n const [layoutBeforeDrag, setLayoutBeforeDrag] = useState<TreeNode | null>(null)\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Keep layout and callback refs in sync to make actions and queries completely stable\n const layoutRef = useRef<TreeNode | null>(layout)\n layoutRef.current = layout\n\n const layoutBeforeDragRef = useRef<TreeNode | null>(layoutBeforeDrag)\n layoutBeforeDragRef.current = layoutBeforeDrag\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n onFullscreenChangeRef.current = onFullscreenChange\n\n const setFullscreenPaneId = useCallback((paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChangeRef.current?.(paneId)\n }, [])\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layoutRef.current\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n layoutRef.current = next\n setLocalLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n // Internal setter used by DnD — does NOT trigger onChange or reset transient states\n const _internalSetLayout = useCallback((nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setLocalLayout((prev) => {\n const next =\n typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n layoutRef.current = next\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 setLayoutBeforeDrag(null)\n setActiveId(null)\n setActiveType(null)\n setDismissIntentId(null)\n handleSetLayout(nextLayoutOrUpdater)\n },\n [handleSetLayout],\n )\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n const cleanedPrev = removeTab(prev, tabId) ?? prev\n return addTab(cleanedPrev, targetPaneId, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateMetadata = useCallback(\n wrapMutation(\n (\n prev,\n id: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateMetadata(prev, id, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback((paneId: string) => {\n let pane = findPaneById(layoutRef.current, paneId)\n if (!pane && layoutBeforeDragRef.current) {\n pane = findPaneById(layoutBeforeDragRef.current, paneId)\n }\n return pane\n }, [])\n\n const handleFindPaneContainingTab = useCallback((tabId: string) => {\n let pane = findPaneContainingTab(layoutRef.current, tabId)\n if (!pane && layoutBeforeDragRef.current) {\n pane = findPaneContainingTab(layoutBeforeDragRef.current, tabId)\n }\n return pane\n }, [])\n\n const handleFindTabById = useCallback((tabId: string) => {\n let tab = findTabById(layoutRef.current, tabId)\n if (!tab && layoutBeforeDragRef.current) {\n tab = findTabById(layoutBeforeDragRef.current, tabId)\n }\n return tab\n }, [])\n\n const handleGetTabMetadata = useCallback((tabId: string) => {\n let metadata = getTabMetadata(layoutRef.current, tabId)\n if (!metadata && layoutBeforeDragRef.current) {\n metadata = getTabMetadata(layoutBeforeDragRef.current, tabId)\n }\n return metadata\n }, [])\n\n const handleGetActiveTabMetadata = useCallback((paneId: string) => {\n let metadata = getActiveTabMetadata(layoutRef.current, paneId)\n if (!metadata && layoutBeforeDragRef.current) {\n metadata = getActiveTabMetadata(layoutBeforeDragRef.current, paneId)\n }\n return metadata\n }, [])\n\n const controller: ZeugmaControllerInternal = {\n layout,\n setLayout,\n _internalSetLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Actions\n removePane: handleRemovePane,\n addTab: handleAddTab,\n updateMetadata: handleUpdateMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n getTabMetadata: handleGetTabMetadata,\n getActiveTabMetadata: handleGetActiveTabMetadata,\n }\n\n return controller\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaController } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaController => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return {\n layout: state.layout,\n setLayout: state.setLayout,\n fullscreenPaneId: state.fullscreenPaneId,\n setFullscreenPaneId: actions.setFullscreenPaneId,\n locked: state.locked,\n setLocked: actions.setLocked,\n removePane: actions.removePane,\n addTab: actions.addTab,\n updateMetadata: actions.updateMetadata,\n updatePaneLock: actions.updatePaneLock,\n selectTab: actions.selectTab,\n mergeTab: actions.mergeTab,\n removeTab: actions.removeTab,\n splitPane: actions.splitPane,\n updateSplitPercentage: actions.updateSplitPercentage,\n moveTab: actions.moveTab,\n findPaneById: state.findPaneById,\n findPaneContainingTab: state.findPaneContainingTab,\n findTabById: state.findTabById,\n getTabMetadata: state.getTabMetadata,\n getActiveTabMetadata: state.getActiveTabMetadata,\n }\n}\n","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nexport class SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n","import { CollisionDetection, DroppableContainer, pointerWithin, closestCenter } from '@dnd-kit/core'\n\nexport const customCollisionDetection: CollisionDetection = (args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // If we're dragging a pane, filter out any tab-drop colliders\n const filteredCollisions = isTabDrag\n ? pointerCollisions\n : pointerCollisions.filter((collision) => !collision.id.toString().startsWith('tab-drop-'))\n\n if (filteredCollisions.length > 0) {\n const sortedCollisions = [...filteredCollisions].sort((a, b) => {\n const aId = a.id.toString()\n const bId = b.id.toString()\n\n if (isTabDrag) {\n const aIsTab = aId.startsWith('tab-drop-')\n const bIsTab = bId.startsWith('tab-drop-')\n if (aIsTab && !bIsTab) return -1\n if (!aIsTab && bIsTab) return 1\n }\n\n const aIsRoot = aId.startsWith('drop-root-')\n const bIsRoot = bId.startsWith('drop-root-')\n if (aIsRoot && !bIsRoot) return -1\n if (!aIsRoot && bIsRoot) return 1\n\n return 0\n })\n return sortedCollisions\n }\n\n if (isTabDrag) {\n const tabDroppables = args.droppableContainers.filter((container: DroppableContainer) =>\n container.id.toString().startsWith('tab-drop-'),\n )\n return closestCenter({ ...args, droppableContainers: tabDroppables })\n }\n return []\n}\n","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 as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab as moveTabHelper,\n selectTab as selectTabHelper,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\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 layoutBeforeDrag: TreeNode | null\n setLayoutBeforeDrag: Dispatch<SetStateAction<TreeNode | null>>\n activeId: string | null\n setActiveId: Dispatch<SetStateAction<string | null>>\n activeType: 'pane' | 'tab' | null\n setActiveType: Dispatch<SetStateAction<'pane' | 'tab' | null>>\n dismissIntentId: string | null\n setDismissIntentId: Dispatch<SetStateAction<string | null>>\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n containerRef: React.RefObject<HTMLElement | null>\n\n // Config\n dragActivationDistance: number\n enableDragToDismiss: boolean\n dismissThreshold: number\n\n // Callbacks\n onRemove?: (paneId: string) => void\n onDragStart?: (activeId: string) => void\n onDragEnd?: (\n activeId: string,\n overId: string | null,\n dropAction: {\n type: 'split' | 'move'\n direction?: SplitDirection\n position?: 'top' | 'bottom' | 'left' | 'right' | 'center'\n } | null,\n ) => void\n onDismissIntentChange?: (paneId: string | null) => void\n\n // Actions\n removeTab: (tabId: string) => void\n removePane: (paneId: string) => void\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n _internalSetLayout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n activeId,\n setActiveId,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n removePane,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n useBodyCursorOverride(isOverLocked)\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const handleDragStart = (event: DragStartEvent) => {\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n setActiveId(draggingId)\n setActiveType(isTabDrag ? 'tab' : 'pane')\n setOverTabId(null)\n setOverTabPosition(null)\n\n const ae = event.activatorEvent\n latestPointerRef.current = getPointerCoordinates(ae)\n\n if (enableDragToDismiss && containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n\n let layoutAfterSelect = layout\n if (isTabDrag) {\n const parentPane = findPaneContainingTab(layout, draggingId)\n if (parentPane) {\n layoutAfterSelect = selectTabHelper(layout, parentPane.id, draggingId) || layout\n }\n }\n\n setLayoutBeforeDrag(layoutAfterSelect)\n 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) {\n const [, targetTabId] = tabDropMatch\n\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n setOverTabId((prev) => (prev === targetTabId ? prev : targetTabId))\n setOverTabPosition((prev) => (prev === position ? prev : position))\n } else {\n setOverTabId((prev) => (prev === null ? prev : null))\n setOverTabPosition((prev) => (prev === null ? prev : null))\n }\n } else {\n setOverTabId((prev) => (prev === null ? prev : null))\n setOverTabPosition((prev) => (prev === null ? prev : null))\n }\n\n if (!enableDragToDismiss) return\n\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n py = latestPointerRef.current.y\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n py = coords.y + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n onDismissIntentChange?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n const { active, over } = event\n const rawId = active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n // Capture the original layout before drag\n const originalLayout = layoutBeforeDrag || layout\n setLayoutBeforeDrag(null)\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n 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 if (!isTabDrag) {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n const [, targetTabId] = tabDropMatch\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n const newLayout = moveTabHelper(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n return\n }\n\n // Check for root split drop\n const rootMatch = overIdStr.match(/^drop-root-(1\\/4|1\\/3)-(top|bottom|left|right|start|end)$/)\n if (rootMatch) {\n const [, fraction, rawEdge] = rootMatch\n let edge = rawEdge\n if (edge === 'start') edge = 'left'\n if (edge === 'end') edge = 'right'\n\n const cleanLayout = isTabDrag\n ? removeTabHelper(originalLayout, draggingId)\n : removePaneHelper(originalLayout, draggingId)\n\n let draggedPaneNode: PaneNode\n if (isTabDrag) {\n const originalPane = findPaneContainingTab(originalLayout, draggingId)\n const sourceMetadata = originalPane?.tabsMetadata?.[draggingId]\n draggedPaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(originalLayout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n if (cleanLayout === null) {\n setLayout(draggedPaneNode)\n } else {\n const isRow = edge === 'left' || edge === 'right'\n const isFirst = edge === 'left' || edge === 'top'\n let splitPercentage = 50\n if (fraction === '1/4') {\n splitPercentage = isFirst ? 25 : 75\n } else if (fraction === '1/3') {\n splitPercentage = isFirst ? 100 / 3 : 200 / 3\n }\n\n const newLayout: TreeNode = {\n type: 'split',\n direction: isRow ? 'row' : 'column',\n first: isFirst ? draggedPaneNode : cleanLayout,\n second: isFirst ? cleanLayout : draggedPaneNode,\n splitPercentage,\n }\n setLayout(newLayout)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction: edge === 'left' || edge === 'right' ? 'row' : 'column',\n position: edge as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n const parentPane = isTabDrag\n ? findPaneContainingTab(originalLayout, draggingId)\n : findPaneById(originalLayout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabs.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n _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 tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(originalLayout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n // We need to first remove the dragged tab/pane from the original layout tree before splitting.\n const cleanLayout = isTabDrag\n ? removeTabHelper(originalLayout, draggingId)\n : removePaneHelper(originalLayout, draggingId)\n\n const newLayout = splitPaneHelper(\n cleanLayout,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n if (layoutBeforeDrag !== null) {\n _internalSetLayout(layoutBeforeDrag)\n setLayoutBeforeDrag(null)\n }\n }\n\n return {\n sensors,\n collisionDetection: customCollisionDetection,\n onDragStart: handleDragStart,\n onDragMove: handleDragMove,\n onDragEnd: handleDragEnd,\n onDragCancel: handleDragCancel,\n }\n}\n","import React, { useEffect, useRef, ReactNode } from 'react'\n\nexport const CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { TabDetails } from '../../../shared'\n\nexport interface PortalHostItemProps {\n tabDetails: TabDetails\n target: HTMLDivElement | null\n renderWidget?: (tab: TabDetails) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = React.memo(\n ({ tabDetails, target, renderWidget }) => {\n const { id: tabId } = tabDetails\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabDetails), wrapper)\n },\n (prev, next) => {\n return (\n prev.target === next.target &&\n prev.renderWidget === next.renderWidget &&\n prev.tabDetails.id === next.tabDetails.id &&\n prev.tabDetails.paneId === next.tabDetails.paneId &&\n prev.tabDetails.isActive === next.tabDetails.isActive &&\n prev.tabDetails.index === next.tabDetails.index &&\n prev.tabDetails.metadata === next.tabDetails.metadata\n )\n },\n)\n","import React from 'react'\nimport { ZeugmaClassNames } from '../../../shared'\n\ninterface DragOverlayPreviewProps {\n activeId: string\n activeType: 'pane' | 'tab'\n dismissIntentId: string | null\n draggedSize: { width: number; height: number } | 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 draggedSize,\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: draggedSize ? `${draggedSize.width}px` : 'auto',\n height: draggedSize ? `${draggedSize.height}px` : 'auto',\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: draggedSize ? `${draggedSize.width}px` : 'auto',\n height: draggedSize ? `${draggedSize.height}px` : 'auto',\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 width: draggedSize ? `${draggedSize.width}px` : 'auto',\n height: draggedSize ? `${draggedSize.height}px` : 'auto',\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 minWidth: '200px',\n minHeight: '120px',\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 { layout, setLayout, classNames, locked } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange: setLayout,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(var(--splitter-pos-${splitter.id}, ${left}%) - ${resizerSize / 2}px)`,\n top: `calc(${top}% + ${resizerSize / 2}px)`,\n width: `${resizerSize}px`,\n height: `calc(${height}% - ${resizerSize}px)`,\n cursor: locked ? 'default' : 'col-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `calc(${left}% + ${resizerSize / 2}px)`,\n top: `calc(var(--splitter-pos-${splitter.id}, ${top}%) - ${resizerSize / 2}px)`,\n width: `calc(${width}% - ${resizerSize}px)`,\n height: `${resizerSize}px`,\n cursor: locked ? 'default' : 'row-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={classNames.resizer || ''}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\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 layout,\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 : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode && tree !== undefined) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n {activeId !== null && !locked && (\n <RootDropZones activeClassName={classNames.rootDropPreview ?? classNames.dropPreview} />\n )}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\nimport {\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaDragContext,\n ZeugmaDragStateValue,\n ZeugmaProps,\n BaseZeugmaProps,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport { usePortalRegistry, useZeugmaDnd, useAllTabIds, useZeugmaDragMeasurement } 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 } = props\n\n const internalController = controller as ZeugmaControllerInternal\n const {\n layout,\n setLayout,\n _internalSetLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n } = internalController\n\n const {\n portalTargets,\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n } = usePortalRegistry()\n\n const {\n overTabId,\n setOverTabId,\n overTabPosition,\n setOverTabPosition,\n draggedSize,\n handleDragStartInternal,\n handleDragEndInternal,\n } = useZeugmaDragMeasurement({\n activeId,\n findPaneContainingTab,\n onDragStart,\n onDragEnd,\n })\n\n const dnd = useZeugmaDnd({\n layout,\n _internalSetLayout,\n setLayout,\n layoutBeforeDrag,\n setLayoutBeforeDrag,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart: 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 setLayout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n }),\n [\n layout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n ],\n )\n\n // Collect all tab IDs and widget IDs in the current layout tree\n const allTabIds = useAllTabIds(layout, layoutBeforeDrag)\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n }),\n [\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n ],\n )\n\n if (activeIdRef) {\n activeIdRef.current = activeId\n }\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <ZeugmaDragContext.Provider value={dragValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => (\n <DragOverlayPreview\n activeId={id}\n activeType={activeType}\n dismissIntentId={dismissIntentId}\n draggedSize={draggedSize}\n renderDragOverlay={renderDragOverlay}\n renderPaneRef={renderPaneRef}\n renderPane={renderPane}\n tabHeadersRef={tabHeadersRef}\n classNames={stableClassNames}\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'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport const DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback, useEffect } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaDrag, PortalRegistryContext } from '../../../shared'\nimport { TabsContext } from './Tabs'\n\nexport interface TabContextValue {\n tabId: string\n isActive: boolean\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n locked: boolean\n selectTab: () => void\n removeTab: () => void\n}\n\nexport const TabContext = createContext<TabContextValue | undefined>(undefined)\n\nexport const useTabContext = () => {\n const context = useContext(TabContext)\n if (!context) {\n throw new Error('useTabContext must be used within a Tab component')\n }\n return context\n}\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const { locked: globalLocked, classNames = {}, activeType } = useZeugmaState()\n const { overTabId } = useZeugmaDrag()\n const portalRegistry = useContext(PortalRegistryContext)\n\n useEffect(() => {\n if (portalRegistry?.registerTabHeader) {\n portalRegistry.registerTabHeader(id, children)\n }\n return () => {\n if (portalRegistry?.registerTabHeader) {\n if (portalRegistry.activeIdRef?.current !== id) {\n portalRegistry.registerTabHeader(id, () => null)\n }\n }\n }\n }, [id, children, portalRegistry])\n\n const tabsContext = useContext(TabsContext)\n const isLocked = locked || globalLocked || (tabsContext?.locked ?? false)\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked || activeType === 'pane',\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n\n const tabs = tabsContext?.tabs || []\n const index = tabs.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabs[index - 1] !== activeTabId\n\n const separator = showSeparator ? <div className={classNames.tabSeparator} /> : null\n\n const isActive = tabsContext ? tabsContext.activeTabId === id : false\n const metadata = tabsContext?.tabsMetadata?.[id]\n\n const selectThisTab = useCallback(() => {\n tabsContext?.selectTab(id)\n }, [tabsContext, id])\n\n const removeThisTab = useCallback(() => {\n tabsContext?.removeTab(id)\n }, [tabsContext, id])\n\n const tabContextValue = useMemo<TabContextValue>(\n () => ({\n tabId: id,\n isActive,\n isDragging,\n isOver: isTargetOver,\n metadata,\n locked: isLocked,\n selectTab: selectThisTab,\n removeTab: removeThisTab,\n }),\n [id, isActive, isDragging, isTargetOver, metadata, isLocked, selectThisTab, removeThisTab],\n )\n\n return (\n <TabContext.Provider value={tabContextValue}>\n <div\n ref={handleRef}\n id={`tab-header-${id}`}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {separator}\n {children({\n isDragging,\n isOver: isTargetOver,\n })}\n </div>\n </TabContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Tab } from './Tab'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\nimport { PaneContext } from './Pane'\n\nexport interface TabsContextValue {\n tabs: string[]\n activeTabId: string\n locked: boolean\n tabsMetadata?: Record<string, Record<string, unknown>>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(undefined)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component')\n }\n return context\n}\n\nexport interface TabsProps {\n /** The list of tab IDs in this pane. */\n tabs?: string[]\n /** The currently active tab ID. */\n activeTabId?: string\n /** Whether dragging is locked on these tabs. */\n locked?: boolean\n /** Metadata for the tabs. */\n tabsMetadata?: Record<string, Record<string, unknown>>\n /** Callback when a tab is selected. */\n selectTab?: (id: string) => void\n /** Callback when a tab is closed/removed. */\n removeTab?: (id: string) => void\n /** Render function for each individual tab content. */\n renderTab: (props: {\n tabId: string\n activeTabId: string\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n onSelect: () => void\n onRemove: () => void\n }) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> & {\n Tab: typeof Tab\n} = ({\n tabs: propTabs,\n activeTabId: propActiveTabId,\n locked: propLocked,\n tabsMetadata: propTabsMetadata,\n selectTab: propSelectTab,\n removeTab: propRemoveTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const paneContext = useContext(PaneContext)\n\n const tabs = propTabs ?? paneContext?.tabs ?? []\n const activeTabId = propActiveTabId ?? paneContext?.activeTabId ?? ''\n const locked = propLocked ?? paneContext?.locked ?? false\n const tabsMetadata = propTabsMetadata ?? paneContext?.tabsMetadata\n const selectTab = propSelectTab ?? paneContext?.selectTab ?? (() => {})\n const removeTab = propRemoveTab ?? paneContext?.removeTab ?? (() => {})\n\n const { classNames: globalClassNames = {}, activeType } = useZeugmaState()\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabs,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabs, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabs, activeType, overTabId, overTabPosition)\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div\n className={classNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n ...styles?.container,\n }}\n >\n {tabs.map((tabId, index) => {\n const metadata = tabsMetadata?.[tabId]\n const resolvedClassName = resolveDynamicProp(classNames?.tab, tabId)\n const resolvedStyle = resolveDynamicProp(styles?.tab, tabId)\n\n const showPreviewHere = index === targetIndex\n\n return (\n <React.Fragment key={tabId}>\n {showPreviewHere && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: index === 0 ? 'none' : 'translateX(-50%)',\n }}\n />\n </div>\n )}\n <Tab id={tabId} locked={locked} className={resolvedClassName} style={resolvedStyle}>\n {({ isDragging, isOver }) =>\n renderTab({\n tabId,\n activeTabId,\n isDragging,\n isOver,\n metadata,\n onSelect: () => selectTab(tabId),\n onRemove: () => removeTab(tabId),\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabs.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n\nTabs.Tab = Tab\n","import React from 'react'\n\nexport interface PaneControlsProps {\n /** Custom CSS class applied to the controls container. */\n className?: string\n /** Custom inline CSS style applied to the controls container. */\n style?: React.CSSProperties\n /** The children elements (e.g. close and fullscreen buttons) to render inside the controls container. */\n children?: React.ReactNode\n}\n\nexport const PaneControls: React.FC<PaneControlsProps> = ({ className, style, children }) => {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n}\n","import React, { useMemo, useEffect, useContext, useRef, createContext } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n PaneNode,\n TabDetails,\n} from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { DropZone } from './DropZone'\nimport { DragHandle } from './DragHandle'\nimport { Tabs } from './Tabs'\nimport { Tab } from './Tab'\nimport { PaneControls } from './PaneControls'\n\nexport interface PaneContextValue extends PaneRenderProps {\n id: string\n}\n\nexport const PaneContext = createContext<PaneContextValue | undefined>(undefined)\n\nexport const usePaneContext = () => {\n const context = useContext(PaneContext)\n if (!context) {\n throw new Error('usePaneContext must be used within a Pane component')\n }\n return context\n}\n\nexport interface PaneContentProps {\n /** A render callback (tab) => ReactNode or static ReactNode content to render for the active tab. */\n children?: React.ReactNode | ((tab: TabDetails) => React.ReactNode)\n /** Custom CSS class applied to the tab content wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab content wrapper. */\n style?: React.CSSProperties\n}\n\nexport const PaneContent: React.FC<PaneContentProps> = ({ children, className, style }) => {\n const { activeTabId } = usePaneContext()\n const { classNames } = useZeugmaState()\n const targetRef = useRef<HTMLDivElement | null>(null)\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('PaneContent must be used within a Zeugma provider')\n }\n const { registerPortalTarget, registerRenderCallback } = portalRegistry\n\n const renderCallback = useMemo(() => {\n if (typeof children === 'function') {\n return children as (tab: TabDetails) => React.ReactNode\n }\n return () => children\n }, [children])\n\n // Register render callback synchronously during the render phase\n registerRenderCallback(activeTabId, renderCallback)\n\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\n\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className={`${classNames.tabContentWrapper || ''} ${className || ''}`.trim()}\n style={{\n height: '100%',\n width: '100%',\n ...style,\n }}\n />\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** The children elements inside the pane (e.g. headers, tabs, content). */\n children: React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> & {\n Content: typeof PaneContent\n DragHandle: typeof DragHandle\n Tabs: typeof Tabs\n Tab: typeof Tab\n Controls: typeof PaneControls\n} = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n activeId,\n classNames: globalClassNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n findPaneById,\n } = useZeugmaState()\n const { removePane, updateMetadata, selectTab, removeTab } = useZeugmaActions()\n\n const paneNode = useMemo(() => findPaneById(id) as PaneNode | null, [layout, id, findPaneById])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateMetadata(tabId, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n ],\n )\n\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${globalClassNames.pane || ''} ${\n isPaneLocked ? globalClassNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <PaneContext.Provider value={{ id, ...renderProps }}>\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n 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 </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={globalClassNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n </PaneContext.Provider>\n )\n}\n\nPane.Content = PaneContent\nPane.DragHandle = DragHandle\nPane.Tabs = Tabs\nPane.Tab = Tab\nPane.Controls = PaneControls\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/lib/drag-session.ts","../src/shared/lib/json.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/entities/zeugma/model/useZeugma.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/lib/collisions.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/DragOverlayPreview.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/FlatSplitter.tsx","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../src/entities/zeugma/ui/RootDropZones.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/DropZone.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx","../src/entities/pane/ui/Tabs.tsx","../src/entities/pane/ui/PaneControls.tsx","../src/entities/pane/ui/Pane.tsx"],"names":["createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerMove","e","handlePointerUp","globalStyle","safeJsonStringify","val","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","ZeugmaDragContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaDrag","drag","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","renderCallbacksRef","renderPaneRef","tabHeadersRef","activeIdRef","isMountedRef","registerPortalTarget","useCallback","tabId","el","prev","next","registerRenderCallback","render","registerRenderPane","registerTabHeader","collectAllTabIds","layout","ids","traverse","node","useAllTabIds","useMemo","useZeugmaDragMeasurement","props","onDragStart","onDragEnd","overTabId","setOverTabId","overTabPosition","setOverTabPosition","handleDragStartInternal","draggingId","handleDragEndInternal","actId","ovId","dropAction","useRegisterRenderPane","renderPane","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","insertLeaf","leafNode","insert","parentDirection","addTab","targetPaneId","metadata","targetPane","findPaneById","appendTabToTarget","newPane","updateSplitPercentage","target","newPercentage","findPaneContainingTab","findTabById","pane","index","getTabMetadata","getActiveTabMetadata","updateMetadata","id","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","calculateTabDropIndex","tabs","activeType","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","setLocalLayout","renderingLayout","setRenderingLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","setActiveId","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","handleSetLayout","nextLayoutOrUpdater","_internalSetLayout","setLayout","handleRemovePane","handleAddTab","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","handleGetTabMetadata","handleGetActiveTabMetadata","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","customCollisionDetection","isTabDrag","pointerCollisions","pointerWithin","filteredCollisions","collision","a","b","aId","bId","aIsTab","bIsTab","aIsRoot","bIsRoot","tabDroppables","container","closestCenter","getPointerCoordinates","useZeugmaDnd","dragActivationDistance","enableDragToDismiss","dismissThreshold","onRemove","onDismissIntentChange","containerRectRef","initialLayoutForDragRef","setIsOverLocked","useSensors","useSensor","rawId","ae","layoutAfterSelect","parentPane","layoutAfterRemove","over","overIdStr","isOverLockedPane","tabDropMatch","overRect","px","coords","center","containerRect","py","distance","dx","dy","activeRect","cx","cy","active","wasDismissIntent","originalLayout","newLayout","rootMatch","fraction","rawEdge","edge","cleanLayout","isRow","match","dropZone","isParentTarget","isOnlyTab","CursorOverlay","className","ref","handleMove","jsx","PortalHostItem","React","tabDetails","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","DragOverlayPreview","renderDragOverlay","classNames","Fragment","paneRender","tabHeaderRender","tabClass","useResizer","resizerSize","snapThreshold","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","minSplitPercentage","maxSplitPercentage","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","PaneTree","propResizerSize","propSnapThreshold","contextSnapThreshold","contextResizerSize","panes","splitters","renderContent","jsxs","isFullscreen","isDismissActive","handleRef","dashboardClass","RootDropZones","ZeugmaProviderInternal","controller","children","onResizeStart","onResize","onResizeEnd","internalController","dnd","stableClassNames","handleResizeEnd","stateValue","dragValue","actionsValue","allTabIds","portalRegistryValue","DndContext","ZeugmaRenderer","Zeugma","restProps","activationPositions","previewPositions","RootDropZone","activeClassName","setNodeRef","isOver","useDroppable","previewStyle","zone","DragListenersCtx","DropZone","DragHandle","dragProps","disabled","TabContext","Tab","globalLocked","portalRegistry","tabsContext","TabsContext","attributes","listeners","setDragRef","isDragging","useDraggable","setDropRef","isTargetOver","activeTabId","separator","isActive","selectThisTab","removeThisTab","tabContextValue","resolveDynamicProp","value","Tabs","propTabs","propActiveTabId","propLocked","propTabsMetadata","propSelectTab","propRemoveTab","renderTab","styles","paneContext","PaneContext","tabsMetadata","globalClassNames","contextValue","targetIndex","resolvedClassName","resolvedStyle","showPreviewHere","PaneControls","usePaneContext","context","PaneContent","targetRef","renderCallback","Pane","paneNode","paneContainerId","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","dragging","renderProps","paneClass"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared drag-session lifecycle utility.\n *\n * Handles the common boilerplate for pointer-based resize operations:\n * - Adds `zeugma-resizing` class to `document.body`\n * - Injects a global `cursor` style so the resize cursor stays active\n * even when the pointer leaves the handle element\n * - Sets `data-resizing` on the resizer element\n * - Attaches `pointermove` / `pointerup` listeners to `document`\n * - Cleans everything up on pointer-up\n *\n * Consumers provide domain-specific `onMove` and `onEnd` callbacks.\n */\n\nexport interface DragSessionConfig {\n /** CSS cursor to enforce globally during the drag */\n cursor: 'col-resize' | 'row-resize'\n /** The resizer DOM element (receives `data-resizing` attribute) */\n resizerEl: HTMLElement\n /** Called on every `pointermove` during the drag */\n onMove: (e: PointerEvent) => void\n /** Called once on `pointerup` — after cleanup has already run */\n onEnd: () => void\n}\n\nexport function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void {\n // 1. Body class\n document.body.classList.add('zeugma-resizing')\n\n // 2. Global cursor override\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${cursor} !important;\n user-select: none !important;\n }\n .zeugma-resizing *:not([role=\"separator\"]) {\n pointer-events: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n // 3. Mark the resizer element\n resizerEl.setAttribute('data-resizing', 'true')\n\n // 4. Document-level listeners\n const handlePointerMove = (e: PointerEvent) => {\n onMove(e)\n }\n\n const handlePointerUp = () => {\n // Cleanup\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Notify consumer\n onEnd()\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { createContext, useContext } from 'react'\nimport {\n ZeugmaStateValue,\n ZeugmaActionsValue,\n PortalRegistryValue,\n ZeugmaDragStateValue,\n} from '../model/types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\nexport const ZeugmaDragContext = createContext<ZeugmaDragStateValue | undefined>(undefined)\n\nexport const useZeugmaState = (): ZeugmaStateValue => {\n const state = useContext(ZeugmaStateContext)\n if (!state) {\n throw new Error('useZeugmaState must be used within a Zeugma provider')\n }\n return state\n}\n\nexport const useZeugmaActions = (): ZeugmaActionsValue => {\n const actions = useContext(ZeugmaActionsContext)\n if (!actions) {\n throw new Error('useZeugmaActions must be used within a Zeugma provider')\n }\n return actions\n}\n\nexport const useZeugmaDrag = (): ZeugmaDragStateValue => {\n const drag = useContext(ZeugmaDragContext)\n if (!drag) {\n throw new Error('useZeugmaDrag must be used within a Zeugma provider')\n }\n return drag\n}\n","import { useEffect, useRef, useState, useCallback, useMemo, useContext } from 'react'\nimport { TabDetails, TreeNode, PortalRegistryContext } from '../../../shared'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const renderCallbacksRef = useRef<Record<string, (tab: TabDetails) => React.ReactNode>>({})\n const renderPaneRef = useRef<((paneId: string) => React.ReactNode) | null>(null)\n const tabHeadersRef = useRef<\n Record<string, (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode>\n >({})\n const activeIdRef = useRef<string | null>(null)\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const registerPortalTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (!el) {\n if (!prev[tabId]) return prev\n const next = { ...prev }\n delete next[tabId]\n return next\n }\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n const registerRenderCallback = useCallback(\n (tabId: string, render: (tab: TabDetails) => React.ReactNode) => {\n renderCallbacksRef.current[tabId] = render\n },\n [],\n )\n\n const registerRenderPane = useCallback((render: (paneId: string) => React.ReactNode) => {\n renderPaneRef.current = render\n }, [])\n\n const registerTabHeader = useCallback(\n (\n tabId: string,\n render: (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode,\n ) => {\n tabHeadersRef.current[tabId] = render\n },\n [],\n )\n\n return {\n portalTargets,\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n }\n}\n\nexport function collectAllTabIds(layout: TreeNode | null): string[] {\n const ids = new Set<string>()\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n node.tabs.forEach((tabId) => {\n ids.add(tabId)\n })\n } else if (node.type === 'split') {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n 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.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane or widget by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: PaneNode): TreeNode {\n if (tree === null) {\n return leafNode\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: leafNode,\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage }\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode or WidgetNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Get the metadata for a specific tab by its ID.\n */\nexport function getTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneContainingTab(tree, tabId)\n return pane?.tabsMetadata?.[tabId]\n}\n\n/**\n * Get the metadata of the active item (either tab or pane).\n */\n/**\n * Get the metadata of the active tab in a specific pane.\n */\nexport function getActiveTabMetadata(\n tree: TreeNode | null,\n paneId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneById(tree, paneId)\n return pane?.tabsMetadata?.[pane.activeTabId]\n}\n\n/**\n * Update metadata on a specific tab or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabs: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTab = activeType === 'tab'\n const isHoveredTabInThisPane = isDraggingTab && overTabId && tabs.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabs.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport {\n removePane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [renderingLayout, setRenderingLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Keep layout and callback refs in sync to make actions and queries completely stable\n const layoutRef = useRef<TreeNode | null>(layout)\n layoutRef.current = layout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n onFullscreenChangeRef.current = onFullscreenChange\n\n const setFullscreenPaneId = useCallback((paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChangeRef.current?.(paneId)\n }, [])\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n setRenderingLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layoutRef.current\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n layoutRef.current = next\n setLocalLayout(next)\n setRenderingLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n // Internal setter used by DnD — does NOT trigger onChange or reset transient states\n const _internalSetLayout = useCallback((nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setRenderingLayout((prev) => {\n const next =\n typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n return next\n })\n }, [])\n\n // Public setter — resets transient states when layout is replaced programmatically\n const setLayout = useCallback(\n (nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n setLocalFullscreenPaneId(null)\n onFullscreenChangeRef.current?.(null)\n setActiveId(null)\n setActiveType(null)\n setDismissIntentId(null)\n handleSetLayout(nextLayoutOrUpdater)\n },\n [handleSetLayout],\n )\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, tabId: string, targetPaneId?: string, metadata?: Record<string, unknown>) => {\n const cleanedPrev = removeTab(prev, tabId) ?? prev\n return addTab(cleanedPrev, targetPaneId, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateMetadata = useCallback(\n wrapMutation(\n (\n prev,\n id: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateMetadata(prev, id, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback((paneId: string) => {\n return findPaneById(layoutRef.current, paneId)\n }, [])\n\n const handleFindPaneContainingTab = useCallback((tabId: string) => {\n return findPaneContainingTab(layoutRef.current, tabId)\n }, [])\n\n const handleFindTabById = useCallback((tabId: string) => {\n return findTabById(layoutRef.current, tabId)\n }, [])\n\n const handleGetTabMetadata = useCallback((tabId: string) => {\n return getTabMetadata(layoutRef.current, tabId)\n }, [])\n\n const handleGetActiveTabMetadata = useCallback((paneId: string) => {\n return getActiveTabMetadata(layoutRef.current, paneId)\n }, [])\n\n const controller: ZeugmaControllerInternal = {\n layout,\n setLayout,\n _internalSetLayout,\n renderingLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Actions\n removePane: handleRemovePane,\n addTab: handleAddTab,\n updateMetadata: handleUpdateMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n getTabMetadata: handleGetTabMetadata,\n getActiveTabMetadata: handleGetActiveTabMetadata,\n }\n\n return controller\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaController } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaController => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return {\n layout: state.layout,\n setLayout: state.setLayout,\n fullscreenPaneId: state.fullscreenPaneId,\n setFullscreenPaneId: actions.setFullscreenPaneId,\n locked: state.locked,\n setLocked: actions.setLocked,\n removePane: actions.removePane,\n addTab: actions.addTab,\n updateMetadata: actions.updateMetadata,\n updatePaneLock: actions.updatePaneLock,\n selectTab: actions.selectTab,\n mergeTab: actions.mergeTab,\n removeTab: actions.removeTab,\n splitPane: actions.splitPane,\n updateSplitPercentage: actions.updateSplitPercentage,\n moveTab: actions.moveTab,\n findPaneById: state.findPaneById,\n findPaneContainingTab: state.findPaneContainingTab,\n findTabById: state.findTabById,\n getTabMetadata: state.getTabMetadata,\n getActiveTabMetadata: state.getActiveTabMetadata,\n }\n}\n","import { PointerSensor, TouchSensor } from '@dnd-kit/core'\n\nexport class SmartPointerSensor extends PointerSensor {\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: PointerEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n\nexport class SmartTouchSensor extends TouchSensor {\n static activators = [\n {\n eventName: 'onTouchStart' as const,\n handler: ({ nativeEvent: event }: { nativeEvent: TouchEvent }) => {\n const element = event.target as HTMLElement | null\n if (element?.closest('.drag-cancel')) {\n return false\n }\n return true\n },\n },\n ]\n}\n","import { CollisionDetection, DroppableContainer, pointerWithin, closestCenter } from '@dnd-kit/core'\n\nexport const customCollisionDetection: CollisionDetection = (args) => {\n const activeIdStr = args.active.id.toString()\n const isTabDrag = activeIdStr.startsWith('tab-header-')\n\n const pointerCollisions = pointerWithin(args)\n // If we're dragging a pane, filter out any tab-drop colliders\n const filteredCollisions = isTabDrag\n ? pointerCollisions\n : pointerCollisions.filter((collision) => !collision.id.toString().startsWith('tab-drop-'))\n\n if (filteredCollisions.length > 0) {\n const sortedCollisions = [...filteredCollisions].sort((a, b) => {\n const aId = a.id.toString()\n const bId = b.id.toString()\n\n if (isTabDrag) {\n const aIsTab = aId.startsWith('tab-drop-')\n const bIsTab = bId.startsWith('tab-drop-')\n if (aIsTab && !bIsTab) return -1\n if (!aIsTab && bIsTab) return 1\n }\n\n const aIsRoot = aId.startsWith('drop-root-')\n const bIsRoot = bId.startsWith('drop-root-')\n if (aIsRoot && !bIsRoot) return -1\n if (!aIsRoot && bIsRoot) return 1\n\n return 0\n })\n return sortedCollisions\n }\n\n if (isTabDrag) {\n const tabDroppables = args.droppableContainers.filter((container: DroppableContainer) =>\n container.id.toString().startsWith('tab-drop-'),\n )\n return closestCenter({ ...args, droppableContainers: tabDroppables })\n }\n return []\n}\n","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 as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n moveTab as moveTabHelper,\n selectTab as selectTabHelper,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\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 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 = selectTabHelper(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) {\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 if (!isTabDrag) {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n const [, targetTabId] = tabDropMatch\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n const newLayout = moveTabHelper(originalLayout, draggingId, targetTabId, position)\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n return\n }\n\n // Check for root split drop\n const rootMatch = overIdStr.match(/^drop-root-(1\\/4|1\\/3)-(top|bottom|left|right|start|end)$/)\n if (rootMatch) {\n const [, fraction, rawEdge] = rootMatch\n let edge = rawEdge\n if (edge === 'start') edge = 'left'\n if (edge === 'end') edge = 'right'\n\n const cleanLayout = isTabDrag\n ? removeTabHelper(originalLayout, draggingId)\n : removePaneHelper(originalLayout, draggingId)\n\n let draggedPaneNode: PaneNode\n if (isTabDrag) {\n const originalPane = findPaneContainingTab(originalLayout, draggingId)\n const sourceMetadata = originalPane?.tabsMetadata?.[draggingId]\n draggedPaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(originalLayout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n if (cleanLayout === null) {\n setLayout(draggedPaneNode)\n } else {\n const isRow = edge === 'left' || edge === 'right'\n const isFirst = edge === 'left' || edge === 'top'\n let splitPercentage = 50\n if (fraction === '1/4') {\n splitPercentage = isFirst ? 25 : 75\n } else if (fraction === '1/3') {\n splitPercentage = isFirst ? 100 / 3 : 200 / 3\n }\n\n const newLayout: TreeNode = {\n type: 'split',\n direction: isRow ? 'row' : 'column',\n first: isFirst ? draggedPaneNode : cleanLayout,\n second: isFirst ? cleanLayout : draggedPaneNode,\n splitPercentage,\n }\n setLayout(newLayout)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, 'root', {\n type: 'split',\n direction: edge === 'left' || edge === 'right' ? 'row' : 'column',\n position: edge as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n _internalSetLayout(originalLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n const parentPane = isTabDrag\n ? findPaneContainingTab(originalLayout, draggingId)\n : findPaneById(originalLayout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabs.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n _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 tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(originalLayout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n // We need to first remove the dragged tab/pane from the original layout tree before splitting.\n const cleanLayout = isTabDrag\n ? removeTabHelper(originalLayout, draggingId)\n : removePaneHelper(originalLayout, draggingId)\n\n const newLayout = splitPaneHelper(\n cleanLayout,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n 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 React, { useEffect, useRef, ReactNode } from 'react'\n\nexport const CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { TabDetails } from '../../../shared'\n\nexport interface PortalHostItemProps {\n tabDetails: TabDetails\n target: HTMLDivElement | null\n renderWidget?: (tab: TabDetails) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = React.memo(\n ({ tabDetails, target, renderWidget }) => {\n const { id: tabId } = tabDetails\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabDetails), wrapper)\n },\n (prev, next) => {\n return (\n prev.target === next.target &&\n prev.renderWidget === next.renderWidget &&\n prev.tabDetails.id === next.tabDetails.id &&\n prev.tabDetails.paneId === next.tabDetails.paneId &&\n prev.tabDetails.isActive === next.tabDetails.isActive &&\n prev.tabDetails.index === next.tabDetails.index &&\n prev.tabDetails.metadata === next.tabDetails.metadata\n )\n },\n)\n","import React from 'react'\nimport { ZeugmaClassNames } from '../../../shared'\n\ninterface DragOverlayPreviewProps {\n activeId: string\n activeType: 'pane' | 'tab'\n dismissIntentId: string | null\n renderDragOverlay?: (active: {\n type: 'tab' | 'pane'\n id: string\n isDismissing: boolean\n }) => React.ReactNode\n renderPaneRef: React.RefObject<((paneId: string) => React.ReactNode) | null>\n renderPane?: (paneId: string) => React.ReactNode\n tabHeadersRef: React.RefObject<\n Record<string, (props: { isDragging: boolean; isOver: boolean }) => React.ReactNode>\n >\n classNames: ZeugmaClassNames\n}\n\nexport const DragOverlayPreview: React.FC<DragOverlayPreviewProps> = ({\n activeId,\n activeType,\n dismissIntentId,\n renderDragOverlay,\n renderPaneRef,\n renderPane,\n tabHeadersRef,\n classNames,\n}) => {\n if (renderDragOverlay) {\n return (\n <>\n {renderDragOverlay({\n type: activeType,\n id: activeId,\n isDismissing: activeId === dismissIntentId,\n })}\n </>\n )\n }\n\n if (activeType === 'pane') {\n const paneRender = renderPaneRef.current || renderPane\n if (paneRender) {\n return (\n <div\n className={classNames.paneDragPreview || ''}\n style={{\n pointerEvents: 'none',\n width: '420px',\n height: '260px',\n overflow: 'hidden',\n }}\n >\n {paneRender(activeId)}\n </div>\n )\n }\n } else if (activeType === 'tab') {\n const paneRender = renderPaneRef.current || renderPane\n if (paneRender) {\n return (\n <div\n className={classNames.tabDragPreview || ''}\n style={{\n pointerEvents: 'none',\n width: '420px',\n height: '260px',\n overflow: 'hidden',\n }}\n >\n {paneRender(activeId)}\n </div>\n )\n }\n const tabHeaderRender = tabHeadersRef.current[activeId]\n if (tabHeaderRender) {\n const tabClass = classNames.tab\n ? typeof classNames.tab === 'function'\n ? classNames.tab(activeId)\n : classNames.tab\n : ''\n return (\n <div\n className={`${classNames.tabDragPreview || ''} ${tabClass}`.trim()}\n style={{\n display: 'inline-flex',\n position: 'relative',\n pointerEvents: 'none',\n overflow: 'hidden',\n width: '420px',\n height: '260px',\n }}\n >\n {tabHeaderRender({ isDragging: true, isOver: false })}\n </div>\n )\n }\n }\n\n return (\n <div\n style={{\n pointerEvents: 'none',\n overflow: 'hidden',\n width: '100%',\n height: '100%',\n }}\n />\n )\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection, useZeugmaState } from '../../../shared'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useState } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { useResizer } from '../../../features/resize-pane'\nimport { ComputedSplitter } from '../../../shared/lib/tree'\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nexport const FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { renderingLayout, setLayout, classNames, locked } = useZeugmaState()\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout: renderingLayout,\n currentNode,\n onLayoutChange: setLayout,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(var(--splitter-pos-${splitter.id}, ${left}%) - ${resizerSize / 2}px)`,\n top: `calc(${top}% + ${resizerSize / 2}px)`,\n width: `${resizerSize}px`,\n height: `calc(${height}% - ${resizerSize}px)`,\n cursor: locked ? 'default' : 'col-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `calc(${left}% + ${resizerSize / 2}px)`,\n top: `calc(var(--splitter-pos-${splitter.id}, ${top}%) - ${resizerSize / 2}px)`,\n width: `calc(${width}% - ${resizerSize}px)`,\n height: `${resizerSize}px`,\n cursor: locked ? 'default' : 'row-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={classNames.resizer || ''}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nexport const MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (paneId: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\n)\n","import React, { useRef, useMemo } from 'react'\nimport { useZeugmaState } from '../../../shared'\nimport { TreeNode } from '../../../shared'\nimport { computeLayout } from '../../../shared/lib/tree'\nimport { RootDropZones } from '../../../entities/zeugma/ui'\nimport { FlatSplitter, MemoizedPaneContent } from './FlatSplitter'\nimport { useRegisterRenderPane } from '../../../entities/zeugma/model'\n\nexport interface PaneTreeProps {\n /** Render function mapping unique pane nodes to React elements. Usually renders a <Pane> wrapper. */\n renderPane: (paneId: string) => React.ReactNode\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n renderPane,\n tree,\n resizerSize: propResizerSize,\n snapThreshold: propSnapThreshold,\n}) => {\n useRegisterRenderPane(renderPane)\n const {\n renderingLayout,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n locked,\n classNames,\n resizerSize: contextResizerSize,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const resizerSize = propResizerSize !== undefined ? propResizerSize : (contextResizerSize ?? 4)\n\n const currentNode = tree !== undefined ? tree : renderingLayout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode && tree !== undefined) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n {activeId !== null && !locked && (\n <RootDropZones activeClassName={classNames.rootDropPreview ?? classNames.dropPreview} />\n )}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\nimport {\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaDragContext,\n ZeugmaDragStateValue,\n ZeugmaProps,\n BaseZeugmaProps,\n ZeugmaControllerInternal,\n} from '../../../shared'\nimport { usePortalRegistry, useZeugmaDnd, useAllTabIds, useZeugmaDragMeasurement } 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 } = props\n\n const internalController = controller as ZeugmaControllerInternal\n const {\n layout,\n setLayout,\n _internalSetLayout,\n renderingLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n } = internalController\n\n const {\n portalTargets,\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n } = usePortalRegistry()\n\n const {\n overTabId,\n setOverTabId,\n overTabPosition,\n setOverTabPosition,\n handleDragStartInternal,\n handleDragEndInternal,\n } = useZeugmaDragMeasurement({\n onDragStart,\n onDragEnd,\n })\n\n const dnd = useZeugmaDnd({\n layout,\n _internalSetLayout,\n setLayout,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart: handleDragStartInternal,\n onDragEnd: handleDragEndInternal,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n removePane,\n })\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.rootDropPreview,\n classNames.dragOverlay,\n classNames.paneDragPreview,\n classNames.tabDragPreview,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n classNames.tabSeparator,\n classNames.tabsContainer,\n classNames.tab,\n classNames.paneContainer,\n classNames.paneHeader,\n classNames.paneControls,\n classNames.paneButton,\n classNames.tabCloseButton,\n classNames.dragHandle,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n renderingLayout,\n setLayout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n }),\n [\n layout,\n renderingLayout,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n getTabMetadata,\n getActiveTabMetadata,\n renderPane,\n resizerSize,\n ],\n )\n\n const dragValue = useMemo<ZeugmaDragStateValue>(\n () => ({\n overTabId,\n overTabPosition,\n }),\n [overTabId, overTabPosition],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addTab,\n updateMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n ],\n )\n\n // Collect all tab IDs and widget IDs in the current layout tree\n const allTabIds = useAllTabIds(layout)\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n }),\n [\n registerPortalTarget,\n registerRenderCallback,\n renderCallbacksRef,\n registerRenderPane,\n renderPaneRef,\n registerTabHeader,\n tabHeadersRef,\n activeIdRef,\n ],\n )\n\n if (activeIdRef) {\n activeIdRef.current = activeId\n }\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <ZeugmaDragContext.Provider value={dragValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => {\n const isDismissing = id === dismissIntentId\n return (\n <div\n style={{\n transition: 'transform 150ms cubic-bezier(0.2, 0, 0, 1)',\n transform: isDismissing ? 'scale(0.8)' : 'scale(1)',\n transformOrigin: 'top left',\n }}\n >\n <DragOverlayPreview\n activeId={id}\n activeType={activeType}\n dismissIntentId={dismissIntentId}\n renderDragOverlay={renderDragOverlay}\n renderPaneRef={renderPaneRef}\n renderPane={renderPane}\n tabHeadersRef={tabHeadersRef}\n classNames={stableClassNames}\n />\n </div>\n )\n }}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => {\n const target = portalTargets[tabId]\n const tabDetails = findTabById(tabId)\n if (!tabDetails) return null\n return (\n <PortalHostItem\n key={tabId}\n tabDetails={tabDetails}\n target={target || null}\n renderWidget={renderCallbacksRef.current[tabId]}\n />\n )\n })}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaDragContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n\nconst ZeugmaRenderer: React.FC<{\n renderPane?: (paneId: string) => React.ReactNode\n resizerSize?: number\n snapThreshold?: number\n}> = ({ renderPane, resizerSize, snapThreshold }) => {\n if (!renderPane) {\n throw new Error(\n 'Zeugma component requires a renderPane prop when used as a standalone renderer.',\n )\n }\n return (\n <PaneTree renderPane={renderPane} resizerSize={resizerSize} snapThreshold={snapThreshold} />\n )\n}\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const { children, ...restProps } = props as unknown as {\n children?: React.ReactNode\n renderPane?: (paneId: string) => React.ReactNode\n }\n\n const { controller } = props as unknown as { controller?: ZeugmaControllerInternal }\n if (!controller) {\n throw new Error('Zeugma component requires a controller.')\n }\n\n return (\n <ZeugmaProviderInternal\n {...(props as unknown as BaseZeugmaProps & {\n children?: React.ReactNode\n renderPane?: (paneId: string) => React.ReactNode\n })}\n >\n {children !== undefined ? children : <ZeugmaRenderer {...restProps} />}\n </ZeugmaProviderInternal>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\ninterface RootDropZoneProps {\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n activeClassName?: string\n}\n\nconst activationPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n top: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n bottom: {\n '1/4': {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n bottom: '24px',\n left: 0,\n width: '100%',\n height: '24px',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n left: {\n '1/4': {\n position: 'absolute',\n left: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n left: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n right: {\n '1/4': {\n position: 'absolute',\n right: 0,\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n '1/3': {\n position: 'absolute',\n right: '24px',\n top: '48px',\n width: '24px',\n height: 'calc(100% - 96px)',\n zIndex: 100,\n pointerEvents: 'auto',\n },\n },\n}\n\nconst previewPositions: Record<\n 'top' | 'bottom' | 'left' | 'right',\n Record<'1/4' | '1/3', React.CSSProperties>\n> = {\n top: {\n '1/4': {\n top: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n '1/3': {\n top: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderBottomLeftRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderTopRightRadius: '0px',\n },\n },\n bottom: {\n '1/4': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '60px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n bottom: 0,\n left: 0,\n width: '100%',\n height: '96px',\n borderTopLeftRadius: '12px',\n borderTopRightRadius: '12px',\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n left: {\n '1/4': {\n left: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n '1/3': {\n left: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopRightRadius: '12px',\n borderBottomRightRadius: '12px',\n borderTopLeftRadius: '0px',\n borderBottomLeftRadius: '0px',\n },\n },\n right: {\n '1/4': {\n right: 0,\n top: 0,\n width: '60px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n '1/3': {\n right: 0,\n top: 0,\n width: '96px',\n height: '100%',\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px',\n borderTopRightRadius: '0px',\n borderBottomRightRadius: '0px',\n },\n },\n}\n\nconst RootDropZone: React.FC<RootDropZoneProps> = ({ id, fraction, edge, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n\n const previewStyle: React.CSSProperties = {\n position: 'absolute',\n pointerEvents: 'none',\n zIndex: 101,\n boxSizing: 'border-box',\n ...previewPositions[edge][fraction],\n }\n\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[edge][fraction]} />\n {isOver && <div className={activeClassName} style={previewStyle} />}\n </>\n )\n}\n\ninterface RootDropZonesProps {\n activeClassName?: string\n}\n\nexport const RootDropZones: React.FC<RootDropZonesProps> = ({ activeClassName }) => {\n const zones: Array<{\n id: string\n fraction: '1/4' | '1/3'\n edge: 'top' | 'bottom' | 'left' | 'right'\n }> = [\n { id: 'drop-root-1/4-top', fraction: '1/4', edge: 'top' },\n { id: 'drop-root-1/3-top', fraction: '1/3', edge: 'top' },\n { id: 'drop-root-1/4-bottom', fraction: '1/4', edge: 'bottom' },\n { id: 'drop-root-1/3-bottom', fraction: '1/3', edge: 'bottom' },\n { id: 'drop-root-1/4-left', fraction: '1/4', edge: 'left' },\n { id: 'drop-root-1/3-left', fraction: '1/3', edge: 'left' },\n { id: 'drop-root-1/4-right', fraction: '1/4', edge: 'right' },\n { id: 'drop-root-1/3-right', fraction: '1/3', edge: 'right' },\n ]\n\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 99,\n pointerEvents: 'none',\n }}\n >\n {zones.map((zone) => (\n <RootDropZone\n key={zone.id}\n id={zone.id}\n fraction={zone.fraction}\n edge={zone.edge}\n activeClassName={activeClassName}\n />\n ))}\n </div>\n )\n}\n","import React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\n\nexport interface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: '100%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '50%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nexport const DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React, { createContext, useContext, useMemo, useCallback, useEffect } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaDrag, PortalRegistryContext } from '../../../shared'\nimport { TabsContext } from './Tabs'\n\nexport interface TabContextValue {\n tabId: string\n isActive: boolean\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n locked: boolean\n selectTab: () => void\n removeTab: () => void\n}\n\nexport const TabContext = createContext<TabContextValue | undefined>(undefined)\n\nexport const useTabContext = () => {\n const context = useContext(TabContext)\n if (!context) {\n throw new Error('useTabContext must be used within a Tab component')\n }\n return context\n}\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const { locked: globalLocked, classNames = {}, activeType } = useZeugmaState()\n const { overTabId } = useZeugmaDrag()\n const portalRegistry = useContext(PortalRegistryContext)\n\n useEffect(() => {\n if (portalRegistry?.registerTabHeader) {\n portalRegistry.registerTabHeader(id, children)\n }\n return () => {\n if (portalRegistry?.registerTabHeader) {\n if (portalRegistry.activeIdRef?.current !== id) {\n portalRegistry.registerTabHeader(id, () => null)\n }\n }\n }\n }, [id, children, portalRegistry])\n\n const tabsContext = useContext(TabsContext)\n const isLocked = locked || globalLocked || (tabsContext?.locked ?? false)\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked || activeType === 'pane',\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n\n const tabs = tabsContext?.tabs || []\n const index = tabs.indexOf(id)\n const activeTabId = tabsContext?.activeTabId\n\n const showSeparator = index > 0 && id !== activeTabId && tabs[index - 1] !== activeTabId\n\n const separator = showSeparator ? <div className={classNames.tabSeparator} /> : null\n\n const isActive = tabsContext ? tabsContext.activeTabId === id : false\n const metadata = tabsContext?.tabsMetadata?.[id]\n\n const selectThisTab = useCallback(() => {\n tabsContext?.selectTab(id)\n }, [tabsContext, id])\n\n const removeThisTab = useCallback(() => {\n tabsContext?.removeTab(id)\n }, [tabsContext, id])\n\n const tabContextValue = useMemo<TabContextValue>(\n () => ({\n tabId: id,\n isActive,\n isDragging,\n isOver: isTargetOver,\n metadata,\n locked: isLocked,\n selectTab: selectThisTab,\n removeTab: removeThisTab,\n }),\n [id, isActive, isDragging, isTargetOver, metadata, isLocked, selectThisTab, removeThisTab],\n )\n\n return (\n <TabContext.Provider value={tabContextValue}>\n <div\n ref={handleRef}\n id={`tab-header-${id}`}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {separator}\n {children({\n isDragging,\n isOver: isTargetOver,\n })}\n </div>\n </TabContext.Provider>\n )\n}\n","import React, { createContext, useContext, useMemo } from 'react'\nimport { Tab } from './Tab'\nimport { useZeugmaState, useZeugmaDrag } from '../../../shared'\nimport { calculateTabDropIndex } from '../../../shared/lib/tree'\nimport { PaneContext } from './Pane'\n\nexport interface TabsContextValue {\n tabs: string[]\n activeTabId: string\n locked: boolean\n tabsMetadata?: Record<string, Record<string, unknown>>\n selectTab: (id: string) => void\n removeTab: (id: string) => void\n}\n\nexport const TabsContext = createContext<TabsContextValue | undefined>(undefined)\n\nexport const useTabsContext = () => {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component')\n }\n return context\n}\n\nexport interface TabsProps {\n /** The list of tab IDs in this pane. */\n tabs?: string[]\n /** The currently active tab ID. */\n activeTabId?: string\n /** Whether dragging is locked on these tabs. */\n locked?: boolean\n /** Metadata for the tabs. */\n tabsMetadata?: Record<string, Record<string, unknown>>\n /** Callback when a tab is selected. */\n selectTab?: (id: string) => void\n /** Callback when a tab is closed/removed. */\n removeTab?: (id: string) => void\n /** Render function for each individual tab content. */\n renderTab: (props: {\n tabId: string\n activeTabId: string\n isDragging: boolean\n isOver: boolean\n metadata?: Record<string, unknown>\n onSelect: () => void\n onRemove: () => void\n }) => React.ReactNode\n /** Custom CSS classes for Tabs container and tab wrappers. */\n classNames?: {\n container?: string\n tab?: string | ((tabId: string) => string)\n }\n /** Custom inline CSS styles for Tabs container and tab wrappers. */\n styles?: {\n container?: React.CSSProperties\n tab?: React.CSSProperties | ((tabId: string) => React.CSSProperties)\n }\n}\n\nconst resolveDynamicProp = <T,>(\n value: T | ((id: string) => T) | undefined,\n id: string,\n): T | undefined => {\n return typeof value === 'function' ? (value as (id: string) => T)(id) : value\n}\n\nexport const Tabs: React.FC<TabsProps> & {\n Tab: typeof Tab\n} = ({\n tabs: propTabs,\n activeTabId: propActiveTabId,\n locked: propLocked,\n tabsMetadata: propTabsMetadata,\n selectTab: propSelectTab,\n removeTab: propRemoveTab,\n renderTab,\n classNames,\n styles,\n}) => {\n const paneContext = useContext(PaneContext)\n\n const tabs = propTabs ?? paneContext?.tabs ?? []\n const activeTabId = propActiveTabId ?? paneContext?.activeTabId ?? ''\n const locked = propLocked ?? paneContext?.locked ?? false\n const tabsMetadata = propTabsMetadata ?? paneContext?.tabsMetadata\n const selectTab = propSelectTab ?? paneContext?.selectTab ?? (() => {})\n const removeTab = propRemoveTab ?? paneContext?.removeTab ?? (() => {})\n\n const { classNames: globalClassNames = {}, activeType } = useZeugmaState()\n const { overTabId, overTabPosition } = useZeugmaDrag()\n\n const contextValue = useMemo<TabsContextValue>(\n () => ({\n tabs,\n activeTabId,\n locked,\n tabsMetadata,\n selectTab,\n removeTab,\n }),\n [tabs, activeTabId, locked, tabsMetadata, selectTab, removeTab],\n )\n\n const targetIndex = calculateTabDropIndex(tabs, activeType, overTabId, overTabPosition)\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div\n className={classNames?.container}\n style={{\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n ...styles?.container,\n }}\n >\n {tabs.map((tabId, index) => {\n const metadata = tabsMetadata?.[tabId]\n const resolvedClassName = resolveDynamicProp(classNames?.tab, tabId)\n const resolvedStyle = resolveDynamicProp(styles?.tab, tabId)\n\n const showPreviewHere = index === targetIndex\n\n return (\n <React.Fragment key={tabId}>\n {showPreviewHere && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: index === 0 ? 'none' : 'translateX(-50%)',\n }}\n />\n </div>\n )}\n <Tab id={tabId} locked={locked} className={resolvedClassName} style={resolvedStyle}>\n {({ isDragging, isOver }) =>\n renderTab({\n tabId,\n activeTabId,\n isDragging,\n isOver,\n metadata,\n onSelect: () => selectTab(tabId),\n onRemove: () => removeTab(tabId),\n })\n }\n </Tab>\n </React.Fragment>\n )\n })}\n\n {targetIndex === tabs.length && globalClassNames.tabDropPreview && (\n <div style={{ position: 'relative', height: '100%', width: 0, zIndex: 10 }}>\n <div\n className={globalClassNames.tabDropPreview}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n transform: 'translateX(-100%)',\n }}\n />\n </div>\n )}\n </div>\n </TabsContext.Provider>\n )\n}\n\nTabs.Tab = Tab\n","import React from 'react'\n\nexport interface PaneControlsProps {\n /** Custom CSS class applied to the controls container. */\n className?: string\n /** Custom inline CSS style applied to the controls container. */\n style?: React.CSSProperties\n /** The children elements (e.g. close and fullscreen buttons) to render inside the controls container. */\n children?: React.ReactNode\n}\n\nexport const PaneControls: React.FC<PaneControlsProps> = ({ className, style, children }) => {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n}\n","import React, { useMemo, useEffect, useContext, useRef, createContext } from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n PaneNode,\n TabDetails,\n} from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { DropZone } from './DropZone'\nimport { DragHandle } from './DragHandle'\nimport { Tabs } from './Tabs'\nimport { Tab } from './Tab'\nimport { PaneControls } from './PaneControls'\n\nexport interface PaneContextValue extends PaneRenderProps {\n id: string\n}\n\nexport const PaneContext = createContext<PaneContextValue | undefined>(undefined)\n\nexport const usePaneContext = () => {\n const context = useContext(PaneContext)\n if (!context) {\n throw new Error('usePaneContext must be used within a Pane component')\n }\n return context\n}\n\nexport interface PaneContentProps {\n /** A render callback (tab) => ReactNode or static ReactNode content to render for the active tab. */\n children?: React.ReactNode | ((tab: TabDetails) => React.ReactNode)\n /** Custom CSS class applied to the tab content wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab content wrapper. */\n style?: React.CSSProperties\n}\n\nexport const PaneContent: React.FC<PaneContentProps> = ({ children, className, style }) => {\n const { activeTabId } = usePaneContext()\n const { classNames } = useZeugmaState()\n const targetRef = useRef<HTMLDivElement | null>(null)\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('PaneContent must be used within a Zeugma provider')\n }\n const { registerPortalTarget, registerRenderCallback } = portalRegistry\n\n const renderCallback = useMemo(() => {\n if (typeof children === 'function') {\n return children as (tab: TabDetails) => React.ReactNode\n }\n return () => children\n }, [children])\n\n // Register render callback synchronously during the render phase\n registerRenderCallback(activeTabId, renderCallback)\n\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\n\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className={`${classNames.tabContentWrapper || ''} ${className || ''}`.trim()}\n style={{\n height: '100%',\n width: '100%',\n ...style,\n }}\n />\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** The children elements inside the pane (e.g. headers, tabs, content). */\n children: React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> & {\n Content: typeof PaneContent\n DragHandle: typeof DragHandle\n Tabs: typeof Tabs\n Tab: typeof Tab\n Controls: typeof PaneControls\n} = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n activeId,\n classNames: globalClassNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n findPaneById,\n } = useZeugmaState()\n const { removePane, updateMetadata, selectTab, removeTab } = useZeugmaActions()\n\n const paneNode = useMemo(() => findPaneById(id) as PaneNode | null, [layout, id, findPaneById])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateMetadata(tabId, updater)\n },\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n ],\n )\n\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${globalClassNames.pane || ''} ${\n isPaneLocked ? globalClassNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <PaneContext.Provider value={{ id, ...renderProps }}>\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n 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 </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"]}
|