react-zeugma 2.2.2 → 2.3.0

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