react-zeugma 2.3.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entities/zeugma/model/context.ts","../src/entities/zeugma/model/hooks.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/config/constants.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/ui/Zeugma.tsx","../src/shared/lib/drag-session.ts","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/widgets/resizable-container/ui/ResizableContainer.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx"],"names":["ZeugmaStateContext","createContext","ZeugmaActionsContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","removePane","tree","idToRemove","newFirst","newSecond","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","swapPanes","idA","idB","nodeA","findPane","nodeB","swap","node","addPane","insert","parentDirection","updateSplitPercentage","target","newPercentage","paneId","updatePaneMetadata","updater","newMetadata","_","rest","updatePaneLock","locked","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","CursorOverlay","render","className","ref","handleMove","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","Zeugma","layout","onChange","renderPane","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onDismissIntentChange","children","localLayout","setLocalLayout","useState","prevLayout","setPrevLayout","setActiveId","dismissIntentId","setDismissIntentId","containerRef","containerRectRef","setContainerRef","useCallback","element","setIsOverLocked","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","draggingId","ae","handleDragMove","over","isOverLockedPane","containerRect","px","py","coords","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","wasDismissIntent","handleRemovePane","overIdStr","swapMatch","newLayout","match","dropZone","draggedPaneNode","treeWithoutDragging","handleLocalLayoutChange","localOnly","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","handleUpdatePaneLock","isLocked","handleResizeEnd","stateValue","actionsValue","jsxs","DndContext","pointerWithin","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","useResizer","isRow","splitPercentage","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","container","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","el","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","finalLayout","computeLayout","left","top","width","height","path","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","Fragment","pane","isFullscreen","isDismissActive","handleRef","dashboardClass","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","id","position","activeClassName","setNodeRef","isOver","useDroppable","Pane","propLocked","globalLocked","paneNode","metadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","renderProps","contextValue","paneClass","DragHandle","dragProps","disabled"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext } from 'react'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\n","import { useContext, useEffect, useRef } from 'react'\nimport { ZeugmaStateContext, ZeugmaActionsContext } from './context'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\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\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","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\n\n/**\n * Tree Helper: Remove a pane and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, idToRemove: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === idToRemove ? null : tree\n }\n const newFirst = removePane(tree.first, idToRemove)\n const newSecond = removePane(tree.second, idToRemove)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n return typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.paneId === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string' ? { type: 'pane', paneId: paneToAdd } : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Swap the position of two panes in the tree structure.\n */\nexport function swapPanes(tree: TreeNode | null, idA: string, idB: string): TreeNode | null {\n if (tree === null) return null\n\n // First pass: collect the full PaneNode references\n const nodeA = findPane(tree, idA)\n const nodeB = findPane(tree, idB)\n if (!nodeA || !nodeB) return tree\n\n // Second pass: replace each location with the other node\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.paneId === idA) return { ...nodeB! }\n if (node.paneId === idB) return { ...nodeA! }\n return node\n }\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', paneId: paneToAdd }\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: { type: 'pane', paneId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode by its paneId.\n */\nexport function findPane(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.paneId === paneId ? tree : null\n }\n return findPane(tree.first, paneId) ?? findPane(tree.second, paneId)\n}\n\n/**\n * Update metadata on a specific pane node using an updater function.\n */\nexport function updatePaneMetadata(\n tree: TreeNode | null,\n paneId: 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.paneId === paneId) {\n const newMetadata = updater(tree.metadata)\n if (newMetadata === undefined) {\n // Remove metadata key\n const { metadata: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, metadata: newMetadata }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneMetadata(tree.first, paneId, updater) ?? tree.first,\n second: updatePaneMetadata(tree.second, paneId, updater) ?? tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.paneId === paneId) {\n if (locked === false) {\n // If false, we can delete the key or keep it. Let's delete it if false or just set it\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\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 { 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 React, { useState, useRef, useMemo, useCallback } from 'react'\nimport {\n DndContext,\n useSensor,\n useSensors,\n DragStartEvent,\n DragEndEvent,\n DragMoveEvent,\n pointerWithin,\n} from '@dnd-kit/core'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\nimport {\n removePane,\n splitPane,\n swapPanes,\n addPane,\n updateSplitPercentage,\n updatePaneMetadata,\n findPane,\n updatePaneLock,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n ZeugmaStateContext,\n ZeugmaActionsContext,\n useLatestPointer,\n useBodyCursorOverride,\n} from '../model'\nimport { ZeugmaProps } from '../model/types'\nimport { CursorOverlay } from './CursorOverlay'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\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\nexport const Zeugma: React.FC<ZeugmaProps> = ({\n layout,\n onChange,\n renderPane,\n renderDragOverlay,\n classNames = {},\n fullscreenPaneId = null,\n onFullscreenChange,\n onRemove,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onDismissIntentChange,\n locked = false,\n children,\n}) => {\n const [localLayout, setLocalLayout] = useState<TreeNode | null>(layout)\n const [prevLayout, setPrevLayout] = useState<TreeNode | null>(layout)\n\n if (layout !== prevLayout) {\n setPrevLayout(layout)\n setLocalLayout(layout)\n }\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n const containerRef = useRef<HTMLElement | null>(null)\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n\n useBodyCursorOverride(isOverLocked)\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPane(paneId), [renderPane])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.swapPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n ],\n )\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 draggingId = event.active.id.toString()\n setActiveId(draggingId)\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 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(isOverLockedPane)\n\n if (!enableDragToDismiss) return\n\n const draggingId = event.active.id.toString()\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 setIsOverLocked(false)\n const { active, over } = event\n const draggingId = active.id.toString()\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n handleRemovePane(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\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 if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n // Check for center (swap) drop\n const swapMatch = overIdStr.match(/^drop-center-(.+)$/)\n if (swapMatch) {\n const [, targetId] = swapMatch\n if (draggingId !== targetId) {\n const newLayout = swapPanes(localLayout, draggingId, targetId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, { type: 'swap', position: 'center' })\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 if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n if (draggingId === targetId) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n const draggedPaneNode = findPane(localLayout, draggingId) ?? {\n type: 'pane',\n paneId: draggingId,\n }\n const treeWithoutDragging = removePane(localLayout, draggingId)\n\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(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 handleLocalLayoutChange = useCallback(\n (newLayout: TreeNode | null, localOnly = false) => {\n setLocalLayout(newLayout)\n if (!localOnly) {\n onChange(newLayout)\n }\n },\n [onChange],\n )\n\n const handleRemovePane = useCallback(\n (paneId: string) => {\n const newLayout = removePane(localLayout, paneId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleAddPane = useCallback(\n (paneId: string) => {\n const newLayout = addPane(localLayout, paneId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleSwapPanes = useCallback(\n (paneIdA: string, paneIdB: string) => {\n const newLayout = swapPanes(localLayout, paneIdA, paneIdB)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleSplitPane = useCallback(\n (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const draggedPaneNode = findPane(localLayout, paneToAdd) ?? {\n type: 'pane',\n paneId: paneToAdd,\n }\n const treeWithoutDragging = removePane(localLayout, paneToAdd)\n const newLayout = splitPane(\n treeWithoutDragging,\n targetId,\n direction,\n splitType,\n draggedPaneNode,\n )\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n const newLayout = updateSplitPercentage(localLayout, currentNode, percentage)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleUpdatePaneMetadata = useCallback(\n (\n paneId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => {\n const newLayout = updatePaneMetadata(localLayout, paneId, updater)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleUpdatePaneLock = useCallback(\n (paneId: string, isLocked: boolean) => {\n const newLayout = updatePaneLock(localLayout, paneId, isLocked)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\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: localLayout,\n onLayoutChange: handleLocalLayoutChange,\n renderPane: stableRenderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n }),\n [\n localLayout,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n onFullscreenChange,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n handleLocalLayoutChange,\n stableRenderPane,\n handleResizeEnd,\n locked,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane: handleRemovePane,\n addPane: handleAddPane,\n swapPanes: handleSwapPanes,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updatePaneMetadata: handleUpdatePaneMetadata,\n updatePaneLock: handleUpdatePaneLock,\n }),\n [\n handleRemovePane,\n handleAddPane,\n handleSwapPanes,\n handleSplitPane,\n handleUpdateSplitPercentage,\n handleUpdatePaneMetadata,\n handleUpdatePaneLock,\n ],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <DndContext\n id=\"zeugma-dnd-context\"\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n {activeId && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={renderDragOverlay}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId\n ? classNames.dismissPreview || 'zeugma-dismiss-preview'\n : ''\n }`.trim()}\n />\n )}\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","/**\n * Shared drag-session lifecycle utility.\n *\n * Handles the common boilerplate for pointer-based resize operations:\n * - Adds `zeugma-resizing` class to `document.body`\n * - Injects a global `cursor` style so the resize cursor stays active\n * even when the pointer leaves the handle element\n * - Sets `data-resizing` on the resizer element\n * - Attaches `pointermove` / `pointerup` listeners to `document`\n * - Cleans everything up on pointer-up\n *\n * Consumers provide domain-specific `onMove` and `onEnd` callbacks.\n */\n\nexport interface DragSessionConfig {\n /** CSS cursor to enforce globally during the drag */\n cursor: 'col-resize' | 'row-resize'\n /** The resizer DOM element (receives `data-resizing` attribute) */\n resizerEl: HTMLElement\n /** Called on every `pointermove` during the drag */\n onMove: (e: PointerEvent) => void\n /** Called once on `pointerup` — after cleanup has already run */\n onEnd: () => void\n}\n\nexport function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void {\n // 1. Body class\n document.body.classList.add('zeugma-resizing')\n\n // 2. Global cursor override\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${cursor} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n // 3. Mark the resizer element\n resizerEl.setAttribute('data-resizing', 'true')\n\n // 4. Document-level listeners\n const handlePointerMove = (e: PointerEvent) => {\n onMove(e)\n }\n\n const handlePointerUp = () => {\n // Cleanup\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Notify consumer\n onEnd()\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\nimport { useZeugmaState } from '../../../entities/zeugma'\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 React layout state live on every move event\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n onLayoutChange(newLayout, true)\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState } from '../../../entities/zeugma'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../../shared/model'\n\nexport interface PaneTreeProps {\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\ninterface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\ninterface 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\nfunction computeLayout(\n node: TreeNode,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.paneId, 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\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, onLayoutChange, 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,\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(${left}% - ${resizerSize / 2}px)`,\n top: `${top}%`,\n width: `${resizerSize}px`,\n height: `${height}%`,\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: `${left}%`,\n top: `calc(${top}% - ${resizerSize / 2}px)`,\n width: `${width}%`,\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={`zeugma-resizer ${classNames.resizer || ''}`.trim()}\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 PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n locked,\n classNames,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `${pane.left}%`,\n top: isFullscreen ? '0%' : `${pane.top}%`,\n width: isFullscreen ? '100%' : `${pane.width}%`,\n height: isFullscreen ? '100%' : `${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 {renderPane(pane.paneId)}\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 = `zeugma-dashboard-root ${\n isDismissActive ? 'zeugma-dashboard-dismiss-active' : ''\n } ${locked ? classNames.dashboardLocked || 'zeugma-dashboard-locked' : ''}`.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 </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={`zeugma-resizable-container disabled ${className || ''}`.trim()}\n style={{\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ height: '100%', overflow: 'hidden' }}>{children}</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={`zeugma-resizable-container ${className || ''}`.trim()}\n style={{\n height: `${effectiveHeight}px`,\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n {/* Content area fills entire container minus the resizer */}\n <div\n style={{\n height: `calc(100% - ${resizerHeight}px)`,\n overflow: 'hidden',\n }}\n >\n {children}\n </div>\n\n {/* Resizer handle */}\n <div\n className={`zeugma-resizable-handle ${resizerClassName || ''}`.trim()}\n style={{\n height: `${resizerHeight}px`,\n cursor: 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-valuenow={Math.round(effectiveHeight)}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight === Infinity ? undefined : maxHeight}\n />\n </div>\n )\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n if (typeof window === 'undefined' || !node) {\n return null\n }\n\n const parent = node.parentElement\n if (!parent) {\n return document.documentElement\n }\n\n const style = window.getComputedStyle(parent)\n const overflowY = style.overflowY\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll'\n\n if (isScrollable) {\n return parent\n }\n\n return getScrollParent(parent)\n}\n","import React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React, { useMemo } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaActions } from '../../zeugma'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPane } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'center' | 'full'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n center: {\n position: 'absolute',\n top: '25%',\n left: '25%',\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 center: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onRemove,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updatePaneMetadata } = useZeugmaActions()\n\n const paneNode = useMemo(() => findPane(layout, id), [layout, id])\n const metadata = paneNode?.metadata\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 = activeId !== null && activeId !== id && !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n const dragging = activeId === id || isDragging\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 if (onRemove) {\n onRemove(id)\n } else {\n removePane(id)\n }\n },\n metadata,\n updateMetadata: (updater) => {\n updatePaneMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n onRemove,\n removePane,\n metadata,\n updatePaneMetadata,\n isDraggableDisabled,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || 'zeugma-pane-locked' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={classNames.swapPreview}\n />\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || 'zeugma-locked-preview'}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/entities/zeugma/model/context.ts","../src/entities/zeugma/model/hooks.ts","../src/entities/zeugma/model/portal-context.ts","../src/shared/config/constants.ts","../src/shared/lib/tree/tree-helpers.ts","../src/entities/zeugma/model/useZeugma.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/ui/Zeugma.tsx","../src/shared/lib/drag-session.ts","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/widgets/resizable-container/ui/ResizableContainer.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx"],"names":["ZeugmaStateContext","createContext","ZeugmaActionsContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","registerPortalTarget","useCallback","tabId","el","prev","PortalRegistryContext","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","addPane","insert","node","parentDirection","updateSplitPercentage","target","newPercentage","findPane","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","targetPaneId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","useZeugma","options","initialLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","dragActivationDistance","snapThreshold","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","onDismissIntentChange","layout","setLayout","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","setActiveId","activeType","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","setFullscreenPaneId","isFirstRender","handleRemovePane","handleAddPane","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","CursorOverlay","render","className","ref","handleMove","jsx","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","Zeugma","props","renderPane","renderWidget","renderDragOverlay","classNames","children","containerRectRef","setIsOverLocked","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","customCollisionDetection","args","pointerCollisions","pointerWithin","tabDroppables","container","closestCenter","handleDragStart","rawId","isTabDrag","draggingId","ae","handleDragMove","over","isOverLockedPane","containerRect","px","py","coords","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","wasDismissIntent","overIdStr","tabDropMatch","overRect","center","match","dropZone","parentPane","isParentTarget","isOnlyTab","newLayout","handleResizeEnd","stateValue","actionsValue","allTabIds","ids","traverse","portalRegistryValue","jsxs","DndContext","id","PortalHostItem","wrapperRef","wrapper","hiddenContainer","createPortal","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","useResizer","isRow","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","pane","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","React","Fragment","next","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","isFullscreen","isDismissActive","handleRef","dashboardClass","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","activeClassName","setNodeRef","isOver","useDroppable","Pane","propLocked","globalLocked","portalRegistry","paneNode","paneContainerId","tabs","activeTabId","tabsMetadata","metadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","useDraggable","dragging","renderActiveTab","renderProps","contextValue","paneClass","DragHandle","dragProps","disabled","Tab","setDragRef","isDragging","setDropRef"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext } from 'react'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\n","import { useContext, useEffect, useRef, useState, useCallback } from 'react'\nimport { ZeugmaStateContext, ZeugmaActionsContext } from './context'\nimport { ZeugmaStateValue, ZeugmaActionsValue } from './types'\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\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\n const registerPortalTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n setPortalTargets((prev) => {\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n return { portalTargets, registerPortalTarget }\n}\n","import { createContext } from 'react'\n\nexport interface PortalRegistryValue {\n registerPortalTarget: (tabId: string, el: HTMLDivElement | null) => void\n}\n\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\n","export const DEFAULT_SNAP_THRESHOLD = 8 // px\nexport const DEFAULT_DRAG_ACTIVATION_DISTANCE = 8 // px\nexport const DEFAULT_RESIZER_SIZE = 4 // px\n","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId || tree.tabs.includes(targetId)) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\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: { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode by its ID or by any of its tab IDs.\n */\nexport function findPane(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId || tree.tabs.includes(paneId) ? tree : null\n }\n return findPane(tree.first, paneId) ?? findPane(tree.second, paneId)\n}\n\n/**\n * Update metadata on a specific tab node using an updater function.\n */\nexport function updateTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === tabId || tree.tabs.includes(tabId)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[tabId]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[tabId]\n } else {\n newTabsMetadata[tabId] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: updateTabMetadata(tree.first, tabId, updater) ?? tree.first,\n second: updateTabMetadata(tree.second, tabId, updater) ?? tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId || tree.tabs.includes(paneId)) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId || tree.tabs.includes(paneId)) {\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPane(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 || node.tabs.includes(targetPaneId)) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPane(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 === targetTabId || node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n","import { useState, useRef, useEffect, useCallback } from 'react'\nimport { TreeNode, SplitDirection, SplitNode } from '../../../shared/model'\nimport { UseZeugmaOptions, ZeugmaController } from './types'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n removePane,\n addPane,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPane,\n} from '../../../shared/lib/tree'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = options\n\n const [layout, setLayout] = useState<TreeNode | null>(initialLayout)\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 const setFullscreenPaneId = useCallback(\n (paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChange?.(paneId)\n },\n [onFullscreenChange],\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 // Trigger onChange when layout state changes\n const isFirstRender = useRef(true)\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false\n return\n }\n onChange?.(layout)\n }, [layout, onChange])\n\n // Layout Modification Actions using functional updates to remain stable\n const handleRemovePane = useCallback((paneId: string) => {\n setLayout((prev) => removePane(prev, paneId))\n }, [])\n\n const handleAddPane = useCallback((paneId: string) => {\n setLayout((prev) => addPane(prev, paneId))\n }, [])\n\n const handleSplitPane = useCallback(\n (\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n setLayout((prev) => {\n const draggedPaneNode = findPane(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, targetId, direction, splitType, draggedPaneNode)\n })\n },\n [],\n )\n\n const handleUpdateSplitPercentage = useCallback((currentNode: SplitNode, percentage: number) => {\n setLayout((prev) => updateSplitPercentage(prev, currentNode, percentage))\n }, [])\n\n const handleUpdateTabMetadata = useCallback(\n (\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => {\n setLayout((prev) => updateTabMetadata(prev, tabId, updater))\n },\n [],\n )\n\n const handleUpdatePaneLock = useCallback((paneId: string, isLocked: boolean) => {\n setLayout((prev) => updatePaneLock(prev, paneId, isLocked))\n }, [])\n\n const handleSelectTab = useCallback((paneId: string, tabId: string) => {\n setLayout((prev) => selectTab(prev, paneId, tabId))\n }, [])\n\n const handleMergeTab = useCallback((draggedTabId: string, targetPaneId: string) => {\n setLayout((prev) => mergeTab(prev, draggedTabId, targetPaneId))\n }, [])\n\n const handleMoveTab = useCallback(\n (draggedTabId: string, targetTabId: string, position?: 'before' | 'after') => {\n setLayout((prev) => moveTab(prev, draggedTabId, targetTabId, position))\n },\n [],\n )\n\n const handleRemoveTab = useCallback((tabId: string) => {\n setLayout((prev) => removeTab(prev, tabId))\n }, [])\n\n return {\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Config options\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane: handleRemovePane,\n addPane: handleAddPane,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n }\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 { 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 React, { useState, useRef, useMemo, useCallback, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n DndContext,\n useSensor,\n useSensors,\n DragStartEvent,\n DragEndEvent,\n DragMoveEvent,\n pointerWithin,\n closestCenter,\n CollisionDetection,\n DroppableContainer,\n} from '@dnd-kit/core'\nimport { TreeNode, SplitDirection, SplitNode, PaneNode } from '../../../shared/model'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane as splitPaneHelper,\n findPane,\n generateUniqueId,\n} from '../../../shared/lib/tree'\nimport {\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n useLatestPointer,\n useBodyCursorOverride,\n usePortalRegistry,\n} from '../model'\nimport { ZeugmaProps } from '../model/types'\nimport { CursorOverlay } from './CursorOverlay'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\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\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const {\n renderPane,\n renderWidget,\n renderDragOverlay,\n classNames = {},\n children,\n\n // Controller state\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Configuration settings\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane,\n addPane,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n } = props\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n\n useBodyCursorOverride(isOverLocked)\n\n // Stable renderPane wrapper — immune to consumer passing inline functions\n const stableRenderPane = useCallback((paneId: string) => renderPane(paneId), [renderPane])\n\n // Shallow-memoize classNames by individual fields to avoid identity busting from inline objects\n const stableClassNames = useMemo(\n () => classNames,\n [\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n ],\n )\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const pointerCollisions = pointerWithin(args)\n if (pointerCollisions.length > 0) return pointerCollisions\n\n const activeIdStr = args.active.id.toString()\n if (activeIdStr.startsWith('tab-header-')) {\n const tabDroppables = args.droppableContainers.filter((container: DroppableContainer) =>\n container.id.toString().startsWith('tab-drop-'),\n )\n return closestCenter({ ...args, droppableContainers: tabDroppables })\n }\n return []\n }, [])\n\n const handleDragStart = (event: DragStartEvent) => {\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n setActiveId(draggingId)\n setActiveType(isTabDrag ? 'tab' : 'pane')\n\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 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(isOverLockedPane)\n\n if (!enableDragToDismiss) return\n\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\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 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 if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n removeTab(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n 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 if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n // Check for tab reorder drop\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch) {\n const [, targetTabId] = tabDropMatch\n if (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 moveTab(draggingId, targetTabId, position)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'swap', position: 'center' })\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 if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n const parentPane = findPane(layout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabs.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\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 = findPane(layout, 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 = findPane(layout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n const treeWithoutDragging = isTabDrag\n ? removeTabHelper(layout, draggingId)\n : removePaneHelper(layout, draggingId)\n\n const newLayout = splitPaneHelper(\n treeWithoutDragging,\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 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 onLayoutChange: (newLayout: TreeNode | null) => setLayout(newLayout),\n renderPane: stableRenderPane,\n activeId,\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 }),\n [\n layout,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n stableRenderPane,\n handleResizeEnd,\n locked,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addPane,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n }),\n [\n removePane,\n addPane,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n ],\n )\n\n // Collect all tab IDs in the current layout tree\n const allTabIds = useMemo(() => {\n const ids: string[] = []\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n ids.push(...node.tabs)\n } else {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n return ids\n }, [layout])\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n }),\n [registerPortalTarget],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext\n id=\"zeugma-dnd-context\"\n sensors={sensors}\n collisionDetection={customCollisionDetection}\n onDragStart={handleDragStart}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {children}\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => renderDragOverlay(id, activeType!)}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId\n ? classNames.dismissPreview || 'zeugma-dismiss-preview'\n : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => (\n <PortalHostItem\n key={tabId}\n tabId={tabId}\n target={portalTargets[tabId] || null}\n renderWidget={renderWidget}\n />\n ))}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n\ninterface PortalHostItemProps {\n tabId: string\n target: HTMLDivElement | null\n renderWidget?: (tabId: string) => React.ReactNode\n}\n\nconst PortalHostItem: React.FC<PortalHostItemProps> = ({ tabId, target, renderWidget }) => {\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n if (!wrapperRef.current && typeof window !== 'undefined') {\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 // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!wrapper) return\n\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, wrapper])\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 (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabId), wrapper)\n}\n","/**\n * Shared drag-session lifecycle utility.\n *\n * Handles the common boilerplate for pointer-based resize operations:\n * - Adds `zeugma-resizing` class to `document.body`\n * - Injects a global `cursor` style so the resize cursor stays active\n * even when the pointer leaves the handle element\n * - Sets `data-resizing` on the resizer element\n * - Attaches `pointermove` / `pointerup` listeners to `document`\n * - Cleans everything up on pointer-up\n *\n * Consumers provide domain-specific `onMove` and `onEnd` callbacks.\n */\n\nexport interface DragSessionConfig {\n /** CSS cursor to enforce globally during the drag */\n cursor: 'col-resize' | 'row-resize'\n /** The resizer DOM element (receives `data-resizing` attribute) */\n resizerEl: HTMLElement\n /** Called on every `pointermove` during the drag */\n onMove: (e: PointerEvent) => void\n /** Called once on `pointerup` — after cleanup has already run */\n onEnd: () => void\n}\n\nexport function createDragSession({ cursor, resizerEl, onMove, onEnd }: DragSessionConfig): void {\n // 1. Body class\n document.body.classList.add('zeugma-resizing')\n\n // 2. Global cursor override\n const styleEl = document.createElement('style')\n styleEl.id = 'zeugma-global-cursor-style'\n styleEl.textContent = `\n * {\n cursor: ${cursor} !important;\n user-select: none !important;\n }\n `\n document.head.appendChild(styleEl)\n\n // 3. Mark the resizer element\n resizerEl.setAttribute('data-resizing', 'true')\n\n // 4. Document-level listeners\n const handlePointerMove = (e: PointerEvent) => {\n onMove(e)\n }\n\n const handlePointerUp = () => {\n // Cleanup\n document.body.classList.remove('zeugma-resizing')\n resizerEl.removeAttribute('data-resizing')\n\n const globalStyle = document.getElementById('zeugma-global-cursor-style')\n if (globalStyle) {\n globalStyle.remove()\n }\n\n document.removeEventListener('pointermove', handlePointerMove)\n document.removeEventListener('pointerup', handlePointerUp)\n\n // Notify consumer\n onEnd()\n }\n\n document.addEventListener('pointermove', handlePointerMove)\n document.addEventListener('pointerup', handlePointerUp)\n}\n","import React, { useCallback } from 'react'\nimport { TreeNode, SplitNode, SplitDirection } from '../../../shared/model'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\nimport { useZeugmaState } from '../../../entities/zeugma'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState } from '../../../entities/zeugma'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode } from '../../../shared/model'\nimport { ComputedSplitter, computeLayout } from '../../../shared/lib/tree'\n\nexport interface PaneTreeProps {\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, onLayoutChange, 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,\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={`zeugma-resizer ${classNames.resizer || ''}`.trim()}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nconst MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (id: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\n)\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n locked,\n classNames,\n } = useZeugmaState()\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `zeugma-dashboard-root ${\n isDismissActive ? 'zeugma-dashboard-dismiss-active' : ''\n } ${locked ? classNames.dashboardLocked || 'zeugma-dashboard-locked' : ''}`.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 </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={`zeugma-resizable-container disabled ${className || ''}`.trim()}\n style={{\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ height: '100%', overflow: 'hidden' }}>{children}</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={`zeugma-resizable-container ${className || ''}`.trim()}\n style={{\n height: `${effectiveHeight}px`,\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n {/* Content area fills entire container minus the resizer */}\n <div\n style={{\n height: `calc(100% - ${resizerHeight}px)`,\n overflow: 'hidden',\n }}\n >\n {children}\n </div>\n\n {/* Resizer handle */}\n <div\n className={`zeugma-resizable-handle ${resizerClassName || ''}`.trim()}\n style={{\n height: `${resizerHeight}px`,\n cursor: 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-valuenow={Math.round(effectiveHeight)}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight === Infinity ? undefined : maxHeight}\n />\n </div>\n )\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n if (typeof window === 'undefined' || !node) {\n return null\n }\n\n const parent = node.parentElement\n if (!parent) {\n return document.documentElement\n }\n\n const style = window.getComputedStyle(parent)\n const overflowY = style.overflowY\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll'\n\n if (isScrollable) {\n return parent\n }\n\n return getScrollParent(parent)\n}\n","import React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React, { useMemo, useCallback, useEffect, useContext } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, useZeugmaActions, PortalRegistryContext } from '../../zeugma'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPane } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState()\n const { removePane, updateTabMetadata, selectTab, removeTab } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Pane must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const paneNode = useMemo(() => findPane(layout, id), [layout, id])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderActiveTab = useCallback(() => {\n return (\n <div\n id={`zeugma-tab-target-${activeTabId}`}\n className=\"zeugma-tab-content-wrapper\"\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }, [activeTabId])\n\n // Register portal targets using selector-based useEffect to avoid ref callback loops\n useEffect(() => {\n const el = document.getElementById(`zeugma-tab-target-${activeTabId}`) as HTMLDivElement | null\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateTabMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateTabMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateTabMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n renderActiveTab,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || 'zeugma-pane-locked' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || 'zeugma-locked-preview'}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState } from '../../zeugma'\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 } = useZeugmaState()\n const isLocked = locked || globalLocked\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked,\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n return (\n <div\n ref={handleRef}\n className={className}\n style={{\n display: 'inline-flex',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {children({ isDragging, isOver })}\n </div>\n )\n}\n"]}