react-zeugma 2.2.2 → 3.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/README.md +46 -13
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +122 -16
- package/dist/index.d.ts +122 -16
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -12
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","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","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","stableRenderPane","stableClassNames","useMemo","sensors","useSensors","useSensor","handleDragStart","draggingId","ae","handleDragMove","containerRect","px","py","coords","distance","dx","dy","activeRect","cx","cy","handleDragEnd","active","over","wasDismissIntent","handleRemovePane","overIdStr","swapMatch","newLayout","match","dropZone","draggedPaneNode","treeWithoutDragging","handleLocalLayoutChange","localOnly","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleUpdateSplitPercentage","currentNode","percentage","handleUpdatePaneMetadata","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","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","showDropZones","attributes","listeners","isDragging","useDraggable","dragging","metadata","renderProps","contextValue","DragHandle","dragProps"],"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","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","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} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport { ZeugmaStateContext, ZeugmaActionsContext, useLatestPointer } 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 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 // 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.dropPreview,\n classNames.swapPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\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 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 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 // 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 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 }),\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 ],\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 }),\n [\n handleRemovePane,\n handleAddPane,\n handleSwapPanes,\n handleSplitPane,\n handleUpdateSplitPercentage,\n handleUpdatePaneMetadata,\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 } = useZeugmaState()\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\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 } = 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: 'col-resize',\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: 'row-resize',\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 } = 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 return (\n <div\n ref={handleRef}\n className={`zeugma-dashboard-root ${isDismissActive ? 'zeugma-dashboard-dismiss-active' : ''}`.trim()}\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 { createContext } from 'react'\n\nexport const DragListenersCtx = createContext<Record<string, unknown> | 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'\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}\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}\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}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style }) => {\n const { layout, activeId, classNames, fullscreenPaneId, onRemove, onFullscreenChange } =\n useZeugmaState()\n const { removePane, updatePaneMetadata } = useZeugmaActions()\n const showDropZones = activeId !== null && activeId !== id\n\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id })\n const dragging = activeId === id || isDragging\n const isFullscreen = fullscreenPaneId === id\n\n const paneNode = useMemo(() => findPane(layout, id), [layout, id])\n const metadata = paneNode?.metadata\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 }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n onRemove,\n removePane,\n metadata,\n updatePaneMetadata,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(\n () => ({\n ...listeners,\n ...attributes,\n }),\n [listeners, attributes],\n )\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={classNames.pane}\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 </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 return (\n <div\n className={className}\n style={{ cursor: 'grab', userSelect: 'none', touchAction: 'none', ...style }}\n {...dragProps}\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/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","../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","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","swapPanes","idA","idB","nodeA","findPane","nodeB","swap","node","addPane","insert","parentDirection","updateSplitPercentage","target","newPercentage","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","newTabsMetadata","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","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","renderWidget","renderDragOverlay","classNames","fullscreenPaneId","onFullscreenChange","onRemove","dragActivationDistance","snapThreshold","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onDismissIntentChange","children","localLayout","setLocalLayout","prevLayout","setPrevLayout","setActiveId","activeType","setActiveType","dismissIntentId","setDismissIntentId","containerRef","containerRectRef","setContainerRef","element","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","handleRemoveTab","overIdStr","tabDropMatch","overRect","center","newLayout","swapMatch","match","dropZone","parentPane","isParentTarget","isOnlyTab","draggedPaneNode","treeWithoutDragging","handleLocalLayoutChange","localOnly","handleRemovePane","handleAddPane","handleSwapPanes","paneIdA","paneIdB","handleSplitPane","handleSelectTab","handleMergeTab","handleMoveTab","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","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","import { TreeNode, SplitNode, SplitDirection, PaneNode } from '../../model'\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 return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\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: paneToAdd, 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: paneToAdd, 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: 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 // 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 function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === nodeA!.id) return { ...nodeB! }\n if (node.id === nodeB!.id) 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', id: paneToAdd, 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: paneToAdd, 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: draggedTabId,\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: draggedTabId,\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","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, 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,\n removeTab,\n splitPane,\n swapPanes,\n addPane,\n updateSplitPercentage,\n updateTabMetadata,\n findPane,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n} from '../../../shared/lib/tree'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\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> = ({\n layout,\n onChange,\n renderPane,\n renderWidget,\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 [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\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 customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const pointerCollisions = pointerWithin(args)\n if (pointerCollisions.length > 0) return pointerCollisions\n\n const activeId = args.active.id.toString()\n if (activeId.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 handleRemoveTab(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 const newLayout = moveTab(localLayout, draggingId, targetTabId, position)\n setLocalLayout(newLayout)\n onChange(newLayout)\n }\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'swap', position: 'center' })\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 const parentPane = findPane(localLayout, 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(localLayout, draggingId)\n const sourceMetadata = originalPane?.tabsMetadata?.[draggingId]\n draggedPaneNode = {\n type: 'pane',\n id: draggingId,\n tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPane(localLayout, draggingId) ?? {\n type: 'pane',\n id: draggingId,\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n const treeWithoutDragging = isTabDrag\n ? removeTab(localLayout, draggingId)\n : 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 id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: 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 handleSelectTab = useCallback(\n (paneId: string, tabId: string) => {\n const newLayout = selectTab(localLayout, paneId, tabId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleMergeTab = useCallback(\n (draggedTabId: string, targetPaneId: string) => {\n const newLayout = mergeTab(localLayout, draggedTabId, targetPaneId)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleMoveTab = useCallback(\n (draggedTabId: string, targetTabId: string, position?: 'before' | 'after') => {\n const newLayout = moveTab(localLayout, draggedTabId, targetTabId, position)\n setLocalLayout(newLayout)\n onChange(newLayout)\n },\n [localLayout, onChange],\n )\n\n const handleRemoveTab = useCallback(\n (tabId: string) => {\n const newLayout = removeTab(localLayout, tabId)\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 handleUpdateTabMetadata = useCallback(\n (\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => {\n const newLayout = updateTabMetadata(localLayout, tabId, 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 updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n }),\n [\n handleRemovePane,\n handleAddPane,\n handleSwapPanes,\n handleSplitPane,\n handleUpdateSplitPercentage,\n handleUpdateTabMetadata,\n handleUpdatePaneLock,\n handleSelectTab,\n handleMergeTab,\n handleMoveTab,\n handleRemoveTab,\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(localLayout)\n return ids\n }, [localLayout])\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' | 'center' | '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 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 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 {!tabs.includes(activeId) && (\n <DropZone\n id={`drop-center-${id}`}\n position=\"center\"\n activeClassName={classNames.swapPreview}\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"]}
|