react-zeugma 5.1.0 → 5.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/{types-CaiXD2pG.d.cts → types-BjBbRjIM.d.cts} +22 -2
- package/dist/{types-CaiXD2pG.d.ts → types-BjBbRjIM.d.ts} +22 -2
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +2 -2
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +8 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entities/zeugma/model/hooks.ts","../src/shared/config/constants.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/lib/json.ts","../src/entities/zeugma/model/useZeugma.ts","../src/shared/lib/drag-session.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/widgets/resizable-container/ui/ResizableContainer.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx"],"names":["useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","isMountedRef","registerPortalTarget","useCallback","tabId","el","prev","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","addPane","insert","node","parentDirection","updateSplitPercentage","target","newPercentage","findPaneById","findPaneContainingTab","findTabById","pane","index","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","targetPaneId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","safeJsonStringify","val","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","dragActivationDistance","snapThreshold","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","onDismissIntentChange","layout","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","setActiveId","activeType","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","next","setLayout","nextLayoutOrUpdater","handleRemovePane","handleAddPane","handleSplitPane","targetPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","useZeugmaDnd","props","setOverTabId","setOverTabPosition","containerRectRef","setIsOverLocked","sensors","useSensors","useSensor","customCollisionDetection","pointerCollisions","pointerWithin","tabDroppables","container","closestCenter","rawId","isTabDrag","draggingId","ae","parentPane","over","overIdStr","isOverLockedPane","tabDropMatch","overRect","px","coords","center","containerRect","py","distance","dx","dy","activeRect","cx","cy","active","wasDismissIntent","match","dropZone","isParentTarget","isOnlyTab","newLayout","CursorOverlay","render","className","ref","handleMove","jsx","PortalHostItem","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","Zeugma","internalProps","renderPane","renderDragOverlay","classNames","children","overTabId","overTabPosition","dnd","stableRenderPane","stableClassNames","useMemo","handleResizeEnd","stateValue","actionsValue","allTabIds","ids","traverse","portalRegistryValue","jsxs","DndContext","id","useResizer","isRow","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","React","Fragment","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","isFullscreen","isDismissActive","handleRef","dashboardClass","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","activeClassName","setNodeRef","isOver","useDroppable","Pane","propLocked","targetRef","globalLocked","portalRegistry","paneNode","paneContainerId","tabs","activeTabId","tabsMetadata","metadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","useDraggable","dragging","renderActiveTab","renderProps","contextValue","paneClass","DragHandle","dragProps","disabled","Tab","setDragRef","isDragging","setDropRef","isTargetOver","dropPosition"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useRef, useState, useCallback } from 'react'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const registerPortalTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n return { portalTargets, registerPortalTarget }\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 { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(tree: TreeNode | null, paneToAdd: string): TreeNode {\n if (tree === null) {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Update metadata on a specific tab node using an updater function.\n */\nexport function updateTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[tabId]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[tabId]\n } else {\n newTabsMetadata[tabId] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: updateTabMetadata(tree.first, tabId, updater) ?? tree.first,\n second: updateTabMetadata(tree.second, tabId, updater) ?? tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n} from '../../../shared'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n removePane,\n addPane,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n const setFullscreenPaneId = useCallback(\n (paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChange?.(paneId)\n },\n [onFullscreenChange],\n )\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layout\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n setLocalLayout(next)\n onChange?.(next)\n }\n }\n },\n [layout, onChange],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n const setLayout = handleSetLayout\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddPane = useCallback(\n wrapMutation((prev, paneId: string) => addPane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateTabMetadata = useCallback(\n wrapMutation(\n (\n prev,\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateTabMetadata(prev, tabId, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback(\n (paneId: string) => findPaneById(layout, paneId),\n [layout],\n )\n\n const handleFindPaneContainingTab = useCallback(\n (tabId: string) => findPaneContainingTab(layout, tabId),\n [layout],\n )\n\n const handleFindTabById = useCallback(\n (tabId: string) => findTabById(layout, tabId),\n [layout],\n )\n\n return {\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Config options\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane: handleRemovePane,\n addPane: handleAddPane,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n } as unknown as ZeugmaController\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 { createContext, useContext } from 'react'\nimport {\n ZeugmaStateValue,\n ZeugmaInternalStateValue,\n ZeugmaActionsValue,\n PortalRegistryValue,\n} from '../model/types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaInternalStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\n\nexport const useZeugmaState = (): ZeugmaStateValue => {\n const state = useContext(ZeugmaStateContext)\n if (!state) {\n throw new Error('useZeugmaState must be used within a Zeugma provider')\n }\n return state\n}\n\nexport const useZeugmaActions = (): ZeugmaActionsValue => {\n const actions = useContext(ZeugmaActionsContext)\n if (!actions) {\n throw new Error('useZeugmaActions must be used within a Zeugma provider')\n }\n return actions\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaContextValue } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaContextValue => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return { ...state, ...actions }\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 { useState, useRef, useCallback, Dispatch, SetStateAction } from 'react'\nimport {\n useSensor,\n useSensors,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n pointerWithin,\n closestCenter,\n CollisionDetection,\n DroppableContainer,\n} from '@dnd-kit/core'\nimport { SplitDirection, PaneNode, ZeugmaInternalController } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps extends ZeugmaInternalController {\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n setLayout,\n activeId,\n setActiveId,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n moveTab,\n selectTab,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n useBodyCursorOverride(isOverLocked)\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const pointerCollisions = pointerWithin(args)\n if (pointerCollisions.length > 0) return pointerCollisions\n\n const activeIdStr = args.active.id.toString()\n if (activeIdStr.startsWith('tab-header-')) {\n const tabDroppables = args.droppableContainers.filter((container: DroppableContainer) =>\n container.id.toString().startsWith('tab-drop-'),\n )\n return closestCenter({ ...args, droppableContainers: tabDroppables })\n }\n return []\n }, [])\n\n const handleDragStart = (event: DragStartEvent) => {\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n setActiveId(draggingId)\n setActiveType(isTabDrag ? 'tab' : 'pane')\n setOverTabId(null)\n setOverTabPosition(null)\n\n const ae = event.activatorEvent\n latestPointerRef.current = getPointerCoordinates(ae)\n\n if (enableDragToDismiss && containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n\n if (isTabDrag) {\n const parentPane = findPaneContainingTab(layout, draggingId)\n if (parentPane) {\n selectTab(parentPane.id, draggingId)\n }\n }\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 // Handle tab drop hover location\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch && over) {\n const [, targetTabId] = tabDropMatch\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n setOverTabId(targetTabId)\n setOverTabPosition(position)\n } else {\n setOverTabId(null)\n setOverTabPosition(null)\n }\n } else {\n setOverTabId(null)\n setOverTabPosition(null)\n }\n\n if (!enableDragToDismiss) return\n\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n py = latestPointerRef.current.y\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n py = coords.y + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n onDismissIntentChange?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n const { active, over } = event\n const rawId = active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n removeTab(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n if (overIdStr.startsWith('drop-locked-')) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n // Check for tab reorder drop\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch) {\n const [, targetTabId] = tabDropMatch\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n moveTab(draggingId, targetTabId, position)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n const parentPane = isTabDrag\n ? findPaneContainingTab(layout, draggingId)\n : findPaneById(layout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabs.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n\n let draggedPaneNode: PaneNode\n if (isTabDrag) {\n const originalPane = findPaneContainingTab(layout, draggingId)\n const sourceMetadata = originalPane?.tabsMetadata?.[draggingId]\n draggedPaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(layout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n const treeWithoutDragging = isTabDrag\n ? removeTabHelper(layout, draggingId)\n : removePaneHelper(layout, draggingId)\n\n const newLayout = splitPaneHelper(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n }\n\n return {\n sensors,\n collisionDetection: customCollisionDetection,\n onDragStart: handleDragStart,\n onDragMove: handleDragMove,\n onDragEnd: handleDragEnd,\n onDragCancel: handleDragCancel,\n }\n}\n","import React, { useEffect, useRef, ReactNode } from 'react'\n\nexport const CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface PortalHostItemProps {\n tabId: string\n target: HTMLDivElement | null\n renderWidget?: (tabId: string) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = ({ tabId, target, renderWidget }) => {\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabId), wrapper)\n}\n","import React, { useState, useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\nimport {\n TreeNode,\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaProps,\n ZeugmaInternalController,\n} from '../../../shared'\nimport { usePortalRegistry, useZeugmaDnd } from '../model'\nimport { CursorOverlay } from './CursorOverlay'\nimport { PortalHostItem } from './PortalHostItem'\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const internalProps = props as unknown as ZeugmaInternalController & ZeugmaProps\n const {\n renderPane,\n renderWidget,\n renderDragOverlay,\n classNames = {},\n children,\n\n // Controller state\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n\n // Configuration settings\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n\n // Callbacks\n onRemove,\n onResizeStart,\n onResize,\n onResizeEnd,\n\n // Actions\n removePane,\n addPane,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n } = internalProps\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const dnd = useZeugmaDnd({\n ...internalProps,\n setOverTabId,\n setOverTabPosition,\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.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n setLayout,\n renderPane: stableRenderPane,\n activeId,\n dismissIntentId,\n overTabId,\n overTabPosition,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n }),\n [\n layout,\n activeId,\n dismissIntentId,\n overTabId,\n overTabPosition,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n stableRenderPane,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addPane,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n }),\n [removePane, addPane, updateTabMetadata, updatePaneLock, selectTab, mergeTab, removeTab],\n )\n\n // Collect all tab IDs in the current layout tree\n const allTabIds = useMemo(() => {\n const ids: string[] = []\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n ids.push(...node.tabs)\n } else {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n return ids\n }, [layout])\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n }),\n [registerPortalTarget],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => renderDragOverlay(id, activeType!)}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => (\n <PortalHostItem\n key={tabId}\n tabId={tabId}\n target={portalTargets[tabId] || null}\n renderWidget={renderWidget}\n />\n ))}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","import React, { useCallback } from 'react'\nimport {\n TreeNode,\n SplitNode,\n SplitDirection,\n useZeugmaState,\n ZeugmaInternalStateValue,\n} from '../../../shared'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState() as ZeugmaInternalStateValue\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState, ZeugmaInternalStateValue } from '../../../shared'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode } from '../../../shared'\nimport { ComputedSplitter, computeLayout } from '../../../shared/lib/tree'\n\nexport interface PaneTreeProps {\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, setLayout, classNames, locked } = useZeugmaState() as ZeugmaInternalStateValue\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange: setLayout,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(var(--splitter-pos-${splitter.id}, ${left}%) - ${resizerSize / 2}px)`,\n top: `calc(${top}% + ${resizerSize / 2}px)`,\n width: `${resizerSize}px`,\n height: `calc(${height}% - ${resizerSize}px)`,\n cursor: locked ? 'default' : 'col-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `calc(${left}% + ${resizerSize / 2}px)`,\n top: `calc(var(--splitter-pos-${splitter.id}, ${top}%) - ${resizerSize / 2}px)`,\n width: `calc(${width}% - ${resizerSize}px)`,\n height: `${resizerSize}px`,\n cursor: locked ? 'default' : 'row-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={classNames.resizer || ''}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nconst MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (id: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\n)\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n locked,\n classNames,\n } = useZeugmaState() as ZeugmaInternalStateValue\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={`zeugma-resizable-container disabled ${className || ''}`.trim()}\n style={{\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ height: '100%', overflow: 'hidden' }}>{children}</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={`zeugma-resizable-container ${className || ''}`.trim()}\n style={{\n height: `${effectiveHeight}px`,\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n {/* Content area fills entire container minus the resizer */}\n <div\n style={{\n height: `calc(100% - ${resizerHeight}px)`,\n overflow: 'hidden',\n }}\n >\n {children}\n </div>\n\n {/* Resizer handle */}\n <div\n className={`zeugma-resizable-handle ${resizerClassName || ''}`.trim()}\n style={{\n height: `${resizerHeight}px`,\n cursor: 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-valuenow={Math.round(effectiveHeight)}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight === Infinity ? undefined : maxHeight}\n />\n </div>\n )\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n if (typeof window === 'undefined' || !node) {\n return null\n }\n\n const parent = node.parentElement\n if (!parent) {\n return document.documentElement\n }\n\n const style = window.getComputedStyle(parent)\n const overflowY = style.overflowY\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll'\n\n if (isScrollable) {\n return parent\n }\n\n return getScrollParent(parent)\n}\n","import React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React, { useMemo, useCallback, useEffect, useContext, useRef } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n ZeugmaInternalStateValue,\n} from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const targetRef = useRef<HTMLDivElement | null>(null)\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState() as ZeugmaInternalStateValue\n const { removePane, updateTabMetadata, selectTab, removeTab } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Pane must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const paneNode = useMemo(() => findPaneById(layout, id), [layout, id])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderActiveTab = useCallback(() => {\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className=\"zeugma-tab-content-wrapper\"\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }, [activeTabId])\n\n // Register portal targets using targetRef to avoid race conditions during drag & layout changes\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateTabMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateTabMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateTabMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n renderActiveTab,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, ZeugmaInternalStateValue } from '../../../shared'\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const {\n locked: globalLocked,\n classNames = {},\n overTabId,\n overTabPosition,\n } = useZeugmaState() as ZeugmaInternalStateValue\n const isLocked = locked || globalLocked\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked,\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n const dropPosition = isTargetOver ? overTabPosition : null\n\n return (\n <div\n ref={handleRef}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {children({ isDragging, isOver: isTargetOver })}\n\n {isTargetOver && dropPosition && (\n <div\n className={classNames.tabDropPreview || ''}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '2px',\n backgroundColor: '#6366f1',\n left: dropPosition === 'before' ? 0 : undefined,\n right: dropPosition === 'after' ? 0 : undefined,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n />\n )}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/entities/zeugma/model/hooks.ts","../src/shared/config/constants.ts","../src/shared/lib/tree/tree-helpers.ts","../src/shared/lib/json.ts","../src/entities/zeugma/model/useZeugma.ts","../src/shared/lib/drag-session.ts","../src/shared/lib/context.ts","../src/entities/zeugma/model/useZeugmaContext.ts","../src/entities/zeugma/lib/sensors.ts","../src/entities/zeugma/model/useZeugmaDnd.ts","../src/entities/zeugma/ui/CursorOverlay.tsx","../src/entities/zeugma/ui/PortalHostItem.tsx","../src/entities/zeugma/ui/Zeugma.tsx","../src/features/resize-pane/hooks/useResizer.ts","../src/widgets/pane-tree/ui/PaneTree.tsx","../src/widgets/resizable-container/ui/ResizableContainer.tsx","../src/entities/pane/model/context.ts","../src/entities/pane/ui/Pane.tsx","../src/entities/pane/ui/DragHandle.tsx","../src/entities/pane/ui/Tab.tsx"],"names":["useLatestPointer","activeId","latestPointerRef","useRef","useEffect","handlePointerMove","e","handleTouchMove","touch","useBodyCursorOverride","isOverLocked","usePortalRegistry","portalTargets","setPortalTargets","useState","isMountedRef","registerPortalTarget","useCallback","tabId","el","prev","DEFAULT_SNAP_THRESHOLD","DEFAULT_DRAG_ACTIVATION_DISTANCE","DEFAULT_RESIZER_SIZE","generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","addPane","metadata","insert","node","parentDirection","updateSplitPercentage","target","newPercentage","findPaneById","findPaneContainingTab","findTabById","pane","index","updateTabMetadata","updater","currentTabsMetadata","currentTabMeta","newTabMeta","addTab","targetPaneId","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","moveTab","targetTabId","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","safeJsonStringify","val","useZeugma","options","initialLayout","controlledLayout","onChange","controlledFullscreenPaneId","onFullscreenChange","initialLocked","dragActivationDistance","snapThreshold","minSplitPercentage","maxSplitPercentage","enableDragToDismiss","dismissThreshold","onRemove","onDragStart","onDragEnd","onResizeStart","onResize","onResizeEnd","onDismissIntentChange","layout","setLocalLayout","prevControlledLayoutJson","setPrevControlledLayoutJson","fullscreenPaneId","setLocalFullscreenPaneId","setLocked","setActiveId","activeType","setActiveType","dismissIntentId","setDismissIntentId","containerRef","setContainerRef","element","layoutRef","onChangeRef","onFullscreenChangeRef","setFullscreenPaneId","currentControlledLayoutJson","wrapMutation","mutationFn","args","next","setLayout","nextLayoutOrUpdater","handleRemovePane","handleAddPane","handleAddTab","targetPane","sourcePane","cleanedPrev","handleSplitPane","draggedPaneNode","treeWithoutDragging","handleUpdateSplitPercentage","currentNode","percentage","handleUpdateTabMetadata","handleUpdatePaneLock","isLocked","handleSelectTab","handleMergeTab","handleMoveTab","handleRemoveTab","handleFindPaneById","handleFindPaneContainingTab","handleFindTabById","createDragSession","cursor","resizerEl","onMove","onEnd","styleEl","handlePointerUp","globalStyle","ZeugmaStateContext","createContext","ZeugmaActionsContext","PortalRegistryContext","useZeugmaState","state","useContext","useZeugmaActions","actions","useZeugmaContext","SmartPointerSensor","PointerSensor","event","SmartTouchSensor","TouchSensor","getPointerCoordinates","useZeugmaDnd","props","setOverTabId","setOverTabPosition","containerRectRef","setIsOverLocked","sensors","useSensors","useSensor","customCollisionDetection","pointerCollisions","pointerWithin","tabDroppables","container","closestCenter","rawId","isTabDrag","draggingId","ae","parentPane","over","overIdStr","isOverLockedPane","tabDropMatch","overRect","px","coords","center","containerRect","py","distance","dx","dy","activeRect","cx","cy","active","wasDismissIntent","match","dropZone","isParentTarget","isOnlyTab","newLayout","CursorOverlay","render","className","ref","handleMove","jsx","PortalHostItem","renderWidget","mounted","setMounted","wrapperRef","wrapper","hiddenContainer","createPortal","Zeugma","internalProps","renderPane","renderDragOverlay","classNames","children","overTabId","overTabPosition","dnd","stableRenderPane","stableClassNames","useMemo","handleResizeEnd","stateValue","actionsValue","allTabIds","ids","traverse","portalRegistryValue","jsxs","DndContext","id","useResizer","isRow","resizerSize","onLayoutChange","localOnResizeStart","localOnResizeEnd","parentLeft","parentTop","parentWidth","parentHeight","globalOnResizeStart","globalOnResize","globalOnResizeEnd","rect","startX","startY","startPercentage","splitAreaLeft","splitAreaTop","splitAreaWidth","splitAreaHeight","otherPositions","r","currentPercentage","moveEvent","delta","proposedPercentage","proposedPos","closestDistance","bestTarget","pos","dist","snappedPercentage","finalPercentage","newPanes","newSplitters","spl","finalLayout","FlatSplitter","splitter","isResizing","setIsResizing","handlePointerDown","style","MemoizedPaneContent","React","Fragment","PaneTree","propSnapThreshold","contextSnapThreshold","panes","splitters","renderContent","isFullscreen","isDismissActive","handleRef","dashboardClass","STORAGE_PREFIX","DEFAULT_PERSIST_KEY","readPersistedHeight","key","raw","parsed","writePersistedHeight","ResizableContainer","heightProp","onHeightChange","minHeight","maxHeight","persist","localStorageKey","resizerHeight","resizerClassName","storageKey","getInitialHeight","baseHeight","clamp","internalHeight","setInternalHeight","effectiveHeight","prevHeightPropRef","clamped","resolveMaxHeight","startHeight","resolvedMaxHeight","scrollParent","getScrollParent","startScrollTop","lastClientY","animationFrameId","updateHeight","clientY","currentScrollTop","scrollDelta","totalDelta","newHeight","scrollLoop","parentRect","threshold","maxSpeed","finalHeight","value","min","max","parent","overflowY","DragListenersCtx","activationPositions","previewPositions","DropZone","activeClassName","setNodeRef","isOver","useDroppable","Pane","propLocked","targetRef","globalLocked","portalRegistry","paneNode","paneContainerId","tabs","activeTabId","tabsMetadata","localLocked","isPaneLocked","isDraggableDisabled","isDroppableDisabled","showDropZones","attributes","listeners","useDraggable","dragging","renderActiveTab","renderProps","contextValue","paneClass","DragHandle","dragProps","disabled","Tab","setDragRef","isDragging","setDropRef","isTargetOver","dropPosition"],"mappings":"2PAMO,SAASA,EAAAA,CAAiBC,CAAAA,CAAyB,CACxD,IAAMC,CAAAA,CAAmBC,SAAAA,CAAwC,IAAI,CAAA,CAErE,OAAAC,YAAAA,CAAU,IAAM,CACd,GAAI,CAACH,CAAAA,CAAU,CACbC,CAAAA,CAAiB,OAAA,CAAU,IAAA,CAC3B,MACF,CAEA,IAAMG,CAAAA,CAAqBC,CAAAA,EAAoB,CAC7CJ,CAAAA,CAAiB,OAAA,CAAU,CAAE,CAAA,CAAGI,CAAAA,CAAE,QAAS,CAAA,CAAGA,CAAAA,CAAE,OAAQ,EAC1D,CAAA,CAEMC,CAAAA,CAAmBD,CAAAA,EAAkB,CACzC,IAAME,CAAAA,CAAQF,CAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAKA,CAAAA,CAAE,cAAA,CAAe,CAAC,EAC5CE,CAAAA,GACFN,CAAAA,CAAiB,OAAA,CAAU,CAAE,CAAA,CAAGM,CAAAA,CAAM,OAAA,CAAS,CAAA,CAAGA,EAAM,OAAQ,CAAA,EAEpE,CAAA,CAEA,OAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,CAAeH,CAAAA,CAAmB,CAAE,QAAS,IAAK,CAAC,CAAA,CAC3E,MAAA,CAAO,gBAAA,CAAiB,WAAA,CAAaE,CAAAA,CAAiB,CAAE,QAAS,IAAK,CAAC,CAAA,CAEhE,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,aAAA,CAAeF,CAAiB,CAAA,CAC3D,MAAA,CAAO,mBAAA,CAAoB,WAAA,CAAaE,CAAe,EACzD,CACF,CAAA,CAAG,CAACN,CAAQ,CAAC,CAAA,CAENC,CACT,CAKO,SAASO,EAAAA,CAAsBC,CAAAA,CAAuB,CAC3DN,YAAAA,CAAU,KACJM,CAAAA,CACF,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,QAAA,CAAU,cAAe,WAAW,CAAA,CAEpE,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,QAAQ,CAAA,CAEtC,IAAM,CACX,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,eAAe,QAAQ,EAC7C,CAAA,CAAA,CACC,CAACA,CAAY,CAAC,EACnB,CAEO,SAASC,EAAAA,EAAoB,CAClC,GAAM,CAACC,EAAeC,CAAgB,CAAA,CAAIC,WAAAA,CAAgD,EAAE,CAAA,CACtFC,CAAAA,CAAeZ,SAAAA,CAAO,IAAI,CAAA,CAEhCC,YAAAA,CAAU,KACRW,CAAAA,CAAa,OAAA,CAAU,IAAA,CAChB,IAAM,CACXA,EAAa,OAAA,CAAU,MACzB,CAAA,CAAA,CACC,EAAE,CAAA,CAEL,IAAMC,CAAAA,CAAuBC,eAAY,CAACC,CAAAA,CAAeC,CAAAA,GAA8B,CAChFJ,CAAAA,CAAa,OAAA,EAClBF,CAAAA,CAAkBO,CAAAA,EACZA,EAAKF,CAAK,CAAA,GAAMC,CAAAA,CAAWC,CAAAA,CACxB,CAAE,GAAGA,CAAAA,CAAM,CAACF,CAAK,EAAGC,CAAG,CAC/B,EACH,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CAAE,aAAA,CAAAP,CAAAA,CAAe,oBAAA,CAAAI,CAAqB,CAC/C,KC1EaK,EAAAA,CAAyB,CAAA,CACzBC,EAAAA,CAAmC,CAAA,CACnCC,EAAAA,CAAuB,ECA7B,SAASC,EAAAA,EAA2B,CACzC,OAAO,OAAA,CAAU,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,UAAU,CAAA,CAAG,EAAE,CAC7D,CAKO,SAASC,EAAAA,CAAWC,CAAAA,CAAuBC,CAAAA,CAAiC,CACjF,GAAID,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,OAChB,OAAIA,CAAAA,CAAK,EAAA,GAAOC,CAAAA,CAAe,IAAA,CACxBD,CAAAA,CAET,IAAME,CAAAA,CAAWH,GAAWC,CAAAA,CAAK,KAAA,CAAOC,CAAM,CAAA,CACxCE,CAAAA,CAAYJ,EAAAA,CAAWC,CAAAA,CAAK,MAAA,CAAQC,CAAM,CAAA,CAChD,OAAIC,CAAAA,GAAa,IAAA,CAAaC,EAC1BA,CAAAA,GAAc,IAAA,CAAaD,CAAAA,CACxB,CAAE,GAAGF,CAAAA,CAAM,KAAA,CAAOE,CAAAA,CAAU,MAAA,CAAQC,CAAU,CACvD,CAKO,SAASC,GAAUJ,CAAAA,CAAuBR,CAAAA,CAAgC,CAC/E,GAAIQ,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAASR,CAAK,CAAA,CAAG,CAC7B,IAAMa,CAAAA,CAAUL,CAAAA,CAAK,IAAA,CAAK,MAAA,CAAQM,CAAAA,EAAMA,IAAMd,CAAK,CAAA,CACnD,GAAIa,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CACjC,IAAIE,CAAAA,CAAYP,CAAAA,CAAK,WAAA,CACjBA,CAAAA,CAAK,WAAA,GAAgBR,CAAAA,GACvBe,CAAAA,CAAYF,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAEvB,IAAMG,CAAAA,CAAkB,CAAE,GAAGR,CAAAA,CAAK,YAAa,CAAA,CAC/C,cAAOQ,CAAAA,CAAgBhB,CAAK,CAAA,CACrB,CACL,GAAGQ,CAAAA,CACH,IAAA,CAAMK,CAAAA,CACN,YAAaE,CAAAA,CACb,YAAA,CAAc,MAAA,CAAO,IAAA,CAAKC,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,EAAkB,MAC5E,CACF,CACA,OAAOR,CACT,CACA,IAAME,CAAAA,CAAWE,GAAUJ,CAAAA,CAAK,KAAA,CAAOR,CAAK,CAAA,CACtCW,CAAAA,CAAYC,EAAAA,CAAUJ,CAAAA,CAAK,MAAA,CAAQR,CAAK,CAAA,CAC9C,OAAIU,CAAAA,GAAa,IAAA,CAAaC,CAAAA,CAC1BA,CAAAA,GAAc,IAAA,CAAaD,CAAAA,CACxB,CAAE,GAAGF,CAAAA,CAAM,KAAA,CAAOE,CAAAA,CAAU,MAAA,CAAQC,CAAU,CACvD,CAKO,SAASM,EAAAA,CACdT,CAAAA,CACAU,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACiB,CACjB,GAAIb,IAAS,IAAA,CACX,OAAI,OAAOa,CAAAA,EAAc,QAAA,CAChB,CAAE,IAAA,CAAM,MAAA,CAAQ,GAAIf,EAAAA,EAAiB,CAAG,IAAA,CAAM,CAACe,CAAS,CAAA,CAAG,WAAA,CAAaA,CAAU,CAAA,CAEpFA,EAET,GAAIb,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,EAAA,GAAOU,EAAU,CACxB,IAAMI,CAAAA,CACJ,OAAOD,CAAAA,EAAc,QAAA,CACjB,CAAE,IAAA,CAAM,OAAQ,EAAA,CAAIf,EAAAA,EAAiB,CAAG,IAAA,CAAM,CAACe,CAAS,CAAA,CAAG,WAAA,CAAaA,CAAU,CAAA,CAClFA,CAAAA,CACAE,CAAAA,CAAUH,CAAAA,GAAc,MAAA,EAAUA,CAAAA,GAAc,KAAA,CACtD,OAAO,CACL,IAAA,CAAM,OAAA,CACN,SAAA,CAAAD,CAAAA,CACA,KAAA,CAAOI,CAAAA,CAAUD,CAAAA,CAAYd,CAAAA,CAC7B,OAAQe,CAAAA,CAAUf,CAAAA,CAAOc,CAAAA,CACzB,eAAA,CAAiB,EACnB,CACF,CACA,OAAOd,CACT,CACA,OAAO,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOS,EAAAA,CAAUT,CAAAA,CAAK,MAAOU,CAAAA,CAAUC,CAAAA,CAAWC,CAAAA,CAAWC,CAAS,GAAKb,CAAAA,CAAK,KAAA,CAChF,MAAA,CAAQS,EAAAA,CAAUT,EAAK,MAAA,CAAQU,CAAAA,CAAUC,CAAAA,CAAWC,CAAAA,CAAWC,CAAS,CAAA,EAAKb,CAAAA,CAAK,MACpF,CACF,CAKO,SAASgB,EAAAA,CACdhB,CAAAA,CACAa,CAAAA,CACAI,CAAAA,CACU,CACV,GAAIjB,IAAS,IAAA,CACX,OAAO,CACL,IAAA,CAAM,MAAA,CACN,EAAA,CAAIF,EAAAA,EAAiB,CACrB,KAAM,CAACe,CAAS,CAAA,CAChB,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcI,CAAAA,CAAW,CAAE,CAACJ,CAAS,EAAGI,CAAS,CAAA,CAAI,MACvD,CAAA,CAGF,SAASC,CAAAA,CAAOC,EAAgBC,CAAAA,CAAkD,CAChF,OAAID,CAAAA,CAAK,IAAA,GAAS,MAAA,CAET,CACL,IAAA,CAAM,QACN,SAAA,CAHgCC,CAAAA,GAAoB,KAAA,CAAQ,QAAA,CAAW,KAAA,CAIvE,eAAA,CAAiB,EAAA,CACjB,KAAA,CAAOD,EACP,MAAA,CAAQ,CACN,IAAA,CAAM,MAAA,CACN,GAAIrB,EAAAA,EAAiB,CACrB,IAAA,CAAM,CAACe,CAAS,CAAA,CAChB,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcI,CAAAA,CAAW,CAAE,CAACJ,CAAS,EAAGI,CAAS,CAAA,CAAI,MACvD,CACF,CAAA,CAGK,CACL,GAAGE,CAAAA,CACH,OAAQD,CAAAA,CAAOC,CAAAA,CAAK,MAAA,CAAQA,CAAAA,CAAK,SAAS,CAC5C,CACF,CAEA,OAAOD,CAAAA,CAAOlB,CAAAA,CAAM,IAAI,CAC1B,CAKO,SAASqB,EAAAA,CACdrB,CAAAA,CACAsB,EACAC,CAAAA,CACiB,CACjB,OAAIvB,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,GAASsB,CAAAA,CACJ,CAAE,GAAGtB,CAAAA,CAAM,eAAA,CAAiBuB,CAAc,CAAA,CAE/CvB,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOqB,EAAAA,CAAsBrB,CAAAA,CAAK,KAAA,CAAOsB,CAAAA,CAAQC,CAAa,GAAKvB,CAAAA,CAAK,KAAA,CACxE,MAAA,CAAQqB,EAAAA,CAAsBrB,CAAAA,CAAK,MAAA,CAAQsB,CAAAA,CAAQC,CAAa,GAAKvB,CAAAA,CAAK,MAC5E,CAAA,CAEKA,CACT,CAKO,SAASwB,CAAAA,CAAaxB,CAAAA,CAAuBC,EAAiC,CACnF,OAAID,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,CAAK,IAAA,GAAS,MAAA,CACTA,EAAK,EAAA,GAAOC,CAAAA,CAASD,CAAAA,CAAO,IAAA,CAE9BwB,CAAAA,CAAaxB,CAAAA,CAAK,KAAA,CAAOC,CAAM,GAAKuB,CAAAA,CAAaxB,CAAAA,CAAK,MAAA,CAAQC,CAAM,CAC7E,CAKO,SAASwB,CAAAA,CAAsBzB,EAAuBR,CAAAA,CAAgC,CAC3F,OAAIQ,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,CAAK,IAAA,GAAS,OACTA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAASR,CAAK,CAAA,CAAIQ,CAAAA,CAAO,IAAA,CAErCyB,CAAAA,CAAsBzB,EAAK,KAAA,CAAOR,CAAK,CAAA,EAAKiC,CAAAA,CAAsBzB,CAAAA,CAAK,MAAA,CAAQR,CAAK,CAC7F,CAKO,SAASkC,EAAAA,CAAY1B,CAAAA,CAAuBR,CAAAA,CAAkC,CACnF,IAAMmC,CAAAA,CAAOF,CAAAA,CAAsBzB,CAAAA,CAAMR,CAAK,CAAA,CAC9C,GAAI,CAACmC,CAAAA,CAAM,OAAO,IAAA,CAClB,IAAMC,CAAAA,CAAQD,EAAK,IAAA,CAAK,OAAA,CAAQnC,CAAK,CAAA,CACrC,OAAO,CACL,EAAA,CAAIA,CAAAA,CACJ,OAAQmC,CAAAA,CAAK,EAAA,CACb,QAAA,CAAUA,CAAAA,CAAK,WAAA,GAAgBnC,CAAAA,CAC/B,KAAA,CAAAoC,CAAAA,CACA,SAAUD,CAAAA,CAAK,YAAA,GAAenC,CAAK,CACrC,CACF,CAKO,SAASqC,EAAAA,CACd7B,EACAR,CAAAA,CACAsC,CAAAA,CACiB,CACjB,GAAI9B,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAASR,CAAK,CAAA,CAAG,CAC7B,IAAMuC,CAAAA,CAAsB/B,CAAAA,CAAK,YAAA,EAAgB,EAAC,CAC5CgC,EAAiBD,CAAAA,CAAoBvC,CAAK,CAAA,CAC1CyC,CAAAA,CAAaH,CAAAA,CAAQE,CAAc,CAAA,CAEnCxB,CAAAA,CAAkB,CAAE,GAAGuB,CAAoB,CAAA,CACjD,OAAIE,CAAAA,GAAe,MAAA,CACjB,OAAOzB,CAAAA,CAAgBhB,CAAK,CAAA,CAE5BgB,CAAAA,CAAgBhB,CAAK,CAAA,CAAIyC,CAAAA,CAGpB,CACL,GAAGjC,CAAAA,CACH,aAAc,MAAA,CAAO,IAAA,CAAKQ,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,MAC5E,CACF,CACA,OAAOR,CACT,CACA,OAAO,CACL,GAAGA,CAAAA,CACH,MAAO6B,EAAAA,CAAkB7B,CAAAA,CAAK,KAAA,CAAOR,CAAAA,CAAOsC,CAAO,CAAA,EAAK9B,CAAAA,CAAK,KAAA,CAC7D,OAAQ6B,EAAAA,CAAkB7B,CAAAA,CAAK,MAAA,CAAQR,CAAAA,CAAOsC,CAAO,CAAA,EAAK9B,CAAAA,CAAK,MACjE,CACF,CAKO,SAASkC,EAAAA,CACdlC,CAAAA,CACAmC,CAAAA,CACA3C,CAAAA,CACAyB,CAAAA,CACiB,CACjB,GAAIjB,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,EAAA,GAAOmC,CAAAA,CAAc,CAC5B,IAAM9B,CAAAA,CAAU,CAAC,GAAGL,EAAK,IAAI,CAAA,CACxBK,CAAAA,CAAQ,QAAA,CAASb,CAAK,CAAA,EACzBa,CAAAA,CAAQ,IAAA,CAAKb,CAAK,CAAA,CAEpB,IAAIgB,CAAAA,CAAkBR,CAAAA,CAAK,YAAA,CAC3B,OAAIiB,CAAAA,GACFT,CAAAA,CAAkB,CAChB,GAAGR,CAAAA,CAAK,YAAA,CACR,CAACR,CAAK,EAAGyB,CACX,CAAA,CAAA,CAEK,CACL,GAAGjB,CAAAA,CACH,IAAA,CAAMK,CAAAA,CACN,WAAA,CAAab,CAAAA,CACb,YAAA,CAAcgB,CAChB,CACF,CACA,OAAOR,CACT,CACA,OAAO,CACL,GAAGA,CAAAA,CACH,MAAOkC,EAAAA,CAAOlC,CAAAA,CAAK,KAAA,CAAOmC,CAAAA,CAAc3C,CAAAA,CAAOyB,CAAQ,CAAA,EAAKjB,CAAAA,CAAK,MACjE,MAAA,CAAQkC,EAAAA,CAAOlC,CAAAA,CAAK,MAAA,CAAQmC,CAAAA,CAAc3C,CAAAA,CAAOyB,CAAQ,CAAA,EAAKjB,EAAK,MACrE,CACF,CAKO,SAASoC,EAAAA,CACdpC,CAAAA,CACAC,CAAAA,CACAoC,CAAAA,CACiB,CACjB,GAAIrC,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,OAAQ,CACxB,GAAIA,CAAAA,CAAK,EAAA,GAAOC,CAAAA,CAAQ,CACtB,GAAIoC,CAAAA,GAAW,MAAO,CACpB,GAAM,CAAE,MAAA,CAAQC,CAAAA,CAAG,GAAGC,CAAK,CAAA,CAAIvC,EAC/B,OAAOuC,CACT,CACA,OAAO,CAAE,GAAGvC,CAAAA,CAAM,MAAA,CAAAqC,CAAO,CAC3B,CACA,OAAOrC,CACT,CACA,OAAO,CACL,GAAGA,EACH,KAAA,CAAOoC,EAAAA,CAAepC,CAAAA,CAAK,KAAA,CAAOC,CAAAA,CAAQoC,CAAM,CAAA,EAAKrC,CAAAA,CAAK,MAC1D,MAAA,CAAQoC,EAAAA,CAAepC,CAAAA,CAAK,MAAA,CAAQC,EAAQoC,CAAM,CAAA,EAAKrC,CAAAA,CAAK,MAC9D,CACF,CAKO,SAASwC,EAAAA,CAAUxC,CAAAA,CAAuBC,CAAAA,CAAgBT,CAAAA,CAAgC,CAC/F,OAAIQ,IAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,CAAK,IAAA,GAAS,MAAA,CACZA,CAAAA,CAAK,EAAA,GAAOC,CAAAA,CACP,CAAE,GAAGD,CAAAA,CAAM,WAAA,CAAaR,CAAM,CAAA,CAEhCQ,CAAAA,CAEF,CACL,GAAGA,EACH,KAAA,CAAOwC,EAAAA,CAAUxC,CAAAA,CAAK,KAAA,CAAOC,CAAAA,CAAQT,CAAK,CAAA,EAAKQ,CAAAA,CAAK,MACpD,MAAA,CAAQwC,EAAAA,CAAUxC,CAAAA,CAAK,MAAA,CAAQC,CAAAA,CAAQT,CAAK,CAAA,EAAKQ,CAAAA,CAAK,MACxD,CACF,CAKO,SAASyC,EAAAA,CACdzC,CAAAA,CACA0C,CAAAA,CACAP,CAAAA,CACiB,CACjB,GAAInC,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAG1B,IAAM2C,CAAAA,CADalB,CAAAA,CAAsBzB,CAAAA,CAAM0C,CAAY,CAAA,EACxB,YAAA,GAAeA,CAAY,CAAA,CAExDE,EAAYxC,EAAAA,CAAUJ,CAAAA,CAAM0C,CAAY,CAAA,CAC9C,GAAIE,CAAAA,GAAc,IAAA,CAChB,OAAO,CACL,IAAA,CAAM,MAAA,CACN,EAAA,CAAI9C,EAAAA,GACJ,IAAA,CAAM,CAAC4C,CAAY,CAAA,CACnB,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcC,CAAAA,CAAiB,CAAE,CAACD,CAAY,EAAGC,CAAe,CAAA,CAAI,MACtE,CAAA,CAGF,SAASzB,EAAOC,CAAAA,CAA0B,CACxC,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,EAAK,EAAA,GAAOgB,CAAAA,CAAc,CAC5B,IAAM9B,CAAAA,CAAU,CAAC,GAAGc,CAAAA,CAAK,IAAI,CAAA,CACxBd,CAAAA,CAAQ,QAAA,CAASqC,CAAY,CAAA,EAChCrC,CAAAA,CAAQ,IAAA,CAAKqC,CAAY,EAE3B,IAAMlC,CAAAA,CAAkB,CAAE,GAAGW,CAAAA,CAAK,YAAa,CAAA,CAC/C,OAAIwB,IACFnC,CAAAA,CAAgBkC,CAAY,CAAA,CAAIC,CAAAA,CAAAA,CAE3B,CACL,GAAGxB,CAAAA,CACH,IAAA,CAAMd,CAAAA,CACN,YAAaqC,CAAAA,CACb,YAAA,CAAc,MAAA,CAAO,IAAA,CAAKlC,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,EAAkB,MAC5E,CACF,CACA,OAAOW,CACT,CACA,OAAO,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOD,CAAAA,CAAOC,CAAAA,CAAK,KAAK,CAAA,CACxB,MAAA,CAAQD,CAAAA,CAAOC,EAAK,MAAM,CAC5B,CACF,CAEA,OAAOD,CAAAA,CAAO0B,CAAS,CACzB,CAKO,SAASC,EAAAA,CACd7C,CAAAA,CACA0C,CAAAA,CACAI,CAAAA,CACAC,CAAAA,CAA+B,QAAA,CACd,CACjB,GAAI/C,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAG1B,IAAM2C,CAAAA,CADalB,CAAAA,CAAsBzB,CAAAA,CAAM0C,CAAY,CAAA,EACxB,YAAA,GAAeA,CAAY,CAAA,CAExDE,CAAAA,CAAYxC,EAAAA,CAAUJ,CAAAA,CAAM0C,CAAY,EAC9C,GAAIE,CAAAA,GAAc,IAAA,CAChB,OAAO,CACL,IAAA,CAAM,MAAA,CACN,EAAA,CAAI9C,IAAiB,CACrB,IAAA,CAAM,CAAC4C,CAAY,CAAA,CACnB,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcC,EAAiB,CAAE,CAACD,CAAY,EAAGC,CAAe,CAAA,CAAI,MACtE,CAAA,CAGF,SAASzB,CAAAA,CAAOC,CAAAA,CAA0B,CACxC,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS2B,CAAW,CAAA,CAAG,CAEnC,IAAME,CAAAA,CADU,CAAC,GAAG7B,CAAAA,CAAK,IAAI,CAAA,CACA,MAAA,CAAQb,CAAAA,EAAMA,CAAAA,GAAMoC,CAAY,EACzDO,CAAAA,CAAcD,CAAAA,CAAa,OAAA,CAAQF,CAAW,CAAA,CAC9CG,CAAAA,CAAc,CAAA,GAChBA,CAAAA,CAAc,GAEZF,CAAAA,GAAa,OAAA,GACfE,CAAAA,EAAe,CAAA,CAAA,CAEjBD,CAAAA,CAAa,MAAA,CAAOC,CAAAA,CAAa,CAAA,CAAGP,CAAY,CAAA,CAEhD,IAAMlC,CAAAA,CAAkB,CAAE,GAAGW,CAAAA,CAAK,YAAa,CAAA,CAC/C,OAAIwB,IACFnC,CAAAA,CAAgBkC,CAAY,CAAA,CAAIC,CAAAA,CAAAA,CAE3B,CACL,GAAGxB,CAAAA,CACH,IAAA,CAAM6B,EACN,WAAA,CAAaN,CAAAA,CACb,YAAA,CAAc,MAAA,CAAO,IAAA,CAAKlC,CAAe,CAAA,CAAE,MAAA,CAAS,EAAIA,CAAAA,CAAkB,MAC5E,CACF,CACA,OAAOW,CACT,CACA,OAAO,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOD,CAAAA,CAAOC,CAAAA,CAAK,KAAK,CAAA,CACxB,MAAA,CAAQD,EAAOC,CAAAA,CAAK,MAAM,CAC5B,CACF,CAEA,OAAOD,CAAAA,CAAO0B,CAAS,CACzB,CAyBO,SAASM,EAAAA,CACd/B,CAAAA,CACAgC,CAAAA,CAAO,CAAA,CACPC,CAAAA,CAAM,CAAA,CACNC,EAAQ,GAAA,CACRC,CAAAA,CAAS,GAAA,CACTC,CAAAA,CAAO,MAAA,CACmD,CAC1D,GAAIpC,CAAAA,GAAS,KAAM,OAAO,CAAE,KAAA,CAAO,EAAC,CAAG,SAAA,CAAW,EAAG,EACrD,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAChB,OAAO,CACL,KAAA,CAAO,CAAC,CAAE,MAAA,CAAQA,CAAAA,CAAK,EAAA,CAAI,IAAA,CAAAgC,CAAAA,CAAM,GAAA,CAAAC,CAAAA,CAAK,KAAA,CAAAC,EAAO,MAAA,CAAAC,CAAAA,CAAQ,IAAA,CAAAnC,CAAK,CAAC,CAAA,CAC3D,SAAA,CAAW,EACb,CAAA,CAGF,GAAM,CAAE,SAAA,CAAAR,CAAAA,CAAW,eAAA,CAAA6C,CAAAA,CAAiB,KAAA,CAAAC,EAAO,MAAA,CAAAC,CAAO,CAAA,CAAIvC,CAAAA,CAGhDwC,CAAAA,CAAoC,CACxC,EAAA,CAHiB,CAAA,SAAA,EAAYJ,CAAI,CAAA,CAAA,EAAI5C,CAAS,CAAA,CAAA,CAI9C,WAAA,CAAaQ,CAAAA,CACb,SAAA,CAAAR,CAAAA,CACA,IAAA,CAAMA,IAAc,KAAA,CAAQwC,CAAAA,CAAOE,CAAAA,EAASG,CAAAA,CAAkB,GAAA,CAAA,CAAOL,CAAAA,CACrE,GAAA,CAAKxC,CAAAA,GAAc,SAAWyC,CAAAA,CAAME,CAAAA,EAAUE,CAAAA,CAAkB,GAAA,CAAA,CAAOJ,EACvE,KAAA,CAAOzC,CAAAA,GAAc,KAAA,CAAQ,CAAA,CAAI0C,EACjC,MAAA,CAAQ1C,CAAAA,GAAc,QAAA,CAAW,CAAA,CAAI2C,CAAAA,CACrC,UAAA,CAAYH,CAAAA,CACZ,SAAA,CAAWC,EACX,WAAA,CAAaC,CAAAA,CACb,YAAA,CAAcC,CAChB,CAAA,CAEIM,CAAAA,CAAc,CAAE,KAAA,CAAO,EAAC,CAAqB,SAAA,CAAW,EAAyB,CAAA,CACjFC,CAAAA,CAAe,CAAE,KAAA,CAAO,EAAC,CAAqB,SAAA,CAAW,EAAyB,CAAA,CAEtF,GAAIlD,CAAAA,GAAc,KAAA,CAAO,CACvB,IAAMmD,CAAAA,CAAaT,CAAAA,EAASG,CAAAA,CAAkB,GAAA,CAAA,CAC9CI,CAAAA,CAAcV,EAAAA,CAAcO,CAAAA,CAAON,EAAMC,CAAAA,CAAKU,CAAAA,CAAYR,CAAAA,CAAQ,CAAA,EAAGC,CAAI,CAAA,EAAA,CAAI,CAAA,CAC7EM,CAAAA,CAAeX,GACbQ,CAAAA,CACAP,CAAAA,CAAOW,CAAAA,CACPV,CAAAA,CACAC,CAAAA,CAAQS,CAAAA,CACRR,CAAAA,CACA,CAAA,EAAGC,CAAI,CAAA,EAAA,CACT,EACF,CAAA,KAAO,CACL,IAAMQ,CAAAA,CAAcT,CAAAA,EAAUE,CAAAA,CAAkB,KAChDI,CAAAA,CAAcV,EAAAA,CAAcO,CAAAA,CAAON,CAAAA,CAAMC,CAAAA,CAAKC,CAAAA,CAAOU,CAAAA,CAAa,CAAA,EAAGR,CAAI,CAAA,EAAA,CAAI,CAAA,CAC7EM,CAAAA,CAAeX,EAAAA,CACbQ,CAAAA,CACAP,CAAAA,CACAC,CAAAA,CAAMW,CAAAA,CACNV,EACAC,CAAAA,CAASS,CAAAA,CACT,CAAA,EAAGR,CAAI,CAAA,EAAA,CACT,EACF,CAEA,OAAO,CACL,KAAA,CAAO,CAAC,GAAGK,CAAAA,CAAY,KAAA,CAAO,GAAGC,CAAAA,CAAa,KAAK,EACnD,SAAA,CAAW,CAACF,CAAAA,CAAiB,GAAGC,CAAAA,CAAY,SAAA,CAAW,GAAGC,CAAAA,CAAa,SAAS,CAClF,CACF,CCxgBO,SAASG,EAAAA,CAAkBC,CAAAA,CAAsB,CACtD,GAAI,CACF,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAG,CAC3B,CAAA,KAAQ,CACN,OAAO,EACT,CACF,CCqBO,SAASC,EAAAA,CAAUC,EAA6C,CACrE,GAAM,CACJ,aAAA,CAAAC,EACA,MAAA,CAAQC,CAAAA,CACR,QAAA,CAAAC,CAAAA,CACA,gBAAA,CAAkBC,CAAAA,CAClB,kBAAA,CAAAC,CAAAA,CACA,OAAQC,CAAAA,CAAgB,KAAA,CACxB,sBAAA,CAAAC,CAAAA,CAAyB,CAAA,CACzB,aAAA,CAAAC,CAAAA,CAAgB,CAAA,CAChB,mBAAAC,CAAAA,CAAqB,CAAA,CACrB,kBAAA,CAAAC,CAAAA,CAAqB,EAAA,CACrB,mBAAA,CAAAC,CAAAA,CAAsB,KAAA,CACtB,iBAAAC,CAAAA,CAAmB,EAAA,CACnB,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,cAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,qBAAA,CAAAC,CACF,CAAA,CAAInB,EAEE,CAACoB,CAAAA,CAAQC,CAAc,CAAA,CAAIpG,WAAAA,CAA0B,IAClDiF,CAAAA,GAAqB,MAAA,CAAYA,EAAoBD,CAAAA,EAAiB,IAC9E,CAAA,CACK,CAACqB,CAAAA,CAA0BC,CAA2B,CAAA,CAAItG,WAAAA,CAAiB,IACxE4E,EAAAA,CAAkBK,CAAAA,GAAqB,MAAA,CAAYA,CAAAA,CAAmB,IAAI,CAClF,CAAA,CACK,CAACsB,CAAAA,CAAkBC,CAAwB,CAAA,CAAIxG,WAAAA,CACnDmF,CAAAA,EAA8B,IAChC,CAAA,CACM,CAAClC,CAAAA,CAAQwD,CAAS,EAAIzG,WAAAA,CAASqF,CAAa,CAAA,CAE5C,CAAClG,CAAAA,CAAUuH,CAAW,CAAA,CAAI1G,WAAAA,CAAwB,IAAI,CAAA,CACtD,CAAC2G,EAAAA,CAAYC,CAAa,CAAA,CAAI5G,WAAAA,CAAgC,IAAI,CAAA,CAClE,CAAC6G,CAAAA,CAAiBC,CAAkB,CAAA,CAAI9G,WAAAA,CAAwB,IAAI,CAAA,CAEpE+G,CAAAA,CAAe1H,SAAAA,CAA2B,IAAI,CAAA,CAE9C2H,CAAAA,CAAkB7G,cAAAA,CAAa8G,CAAAA,EAAgC,CACnEF,CAAAA,CAAa,OAAA,CAAUE,EACzB,EAAG,EAAE,CAAA,CAGCC,CAAAA,CAAY7H,SAAAA,CAAwB8G,CAAM,CAAA,CAChDe,CAAAA,CAAU,QAAUf,CAAAA,CAEpB,IAAMgB,CAAAA,CAAc9H,SAAAA,CAAO6F,CAAQ,CAAA,CACnCiC,CAAAA,CAAY,OAAA,CAAUjC,EAEtB,IAAMkC,CAAAA,CAAwB/H,SAAAA,CAAO+F,CAAkB,EACvDgC,CAAAA,CAAsB,OAAA,CAAUhC,CAAAA,CAEhC,IAAMiC,EAAsBlH,cAAAA,CAAaU,CAAAA,EAA0B,CACjE2F,CAAAA,CAAyB3F,CAAM,CAAA,CAC/BuG,CAAAA,CAAsB,OAAA,GAAUvG,CAAM,EACxC,CAAA,CAAG,EAAE,CAAA,CAcL,GAXAvB,YAAAA,CAAU,IAAM,CACdmH,CAAAA,CAAUpB,CAAa,EACzB,CAAA,CAAG,CAACA,CAAa,CAAC,CAAA,CAElB/F,aAAU,IAAM,CACV6F,CAAAA,GAA+B,MAAA,EACjCqB,CAAAA,CAAyBrB,CAA0B,EAEvD,CAAA,CAAG,CAACA,CAA0B,CAAC,CAAA,CAG3BF,CAAAA,GAAqB,MAAA,CAAW,CAClC,IAAMqC,CAAAA,CAA8B1C,GAAkBK,CAAgB,CAAA,CAClEqC,CAAAA,GAAgCjB,CAAAA,GAClCC,CAAAA,CAA4BgB,CAA2B,CAAA,CACvDlB,CAAAA,CAAenB,CAAgB,CAAA,EAEnC,CAGA,IAAMsC,CAAAA,CAAepH,cAAAA,CAEjBqH,CAAAA,EAEO,CAAA,GAAIC,CAAAA,GAAe,CACxB,IAAMnH,CAAAA,CAAO4G,CAAAA,CAAU,OAAA,CACjBQ,CAAAA,CAAOF,CAAAA,CAAWlH,CAAAA,CAAM,GAAGmH,CAAI,CAAA,CAEjC7C,EAAAA,CAAkBtE,CAAI,CAAA,GAAMsE,EAAAA,CAAkB8C,CAAI,CAAA,GACpDR,CAAAA,CAAU,QAAUQ,CAAAA,CACpBtB,CAAAA,CAAesB,CAAI,CAAA,CACnBP,CAAAA,CAAY,OAAA,GAAUO,CAAI,CAAA,EAE9B,EAEF,EACF,CAAA,CAWMC,CAAAA,CATkBxH,cAAAA,CACtBoH,CAAAA,CAAa,CAACjH,CAAAA,CAAMsH,IACX,OAAOA,CAAAA,EAAwB,UAAA,CACjCA,CAAAA,CAAmEtH,CAAI,CAAA,CACxEsH,CACL,CAAA,CACD,CAACL,CAAY,CACf,CAAA,CAKMM,CAAAA,CAAmB1H,cAAAA,CACvBoH,CAAAA,CAAa,CAACjH,CAAAA,CAAMO,IAAmBF,EAAAA,CAAWL,CAAAA,CAAMO,CAAM,CAAC,CAAA,CAC/D,CAAC0G,CAAY,CACf,EAEMO,EAAAA,CAAgB3H,cAAAA,CACpBoH,CAAAA,CAAa,CAACjH,CAAAA,CAAMO,CAAAA,CAAgBgB,CAAAA,GAClCD,EAAAA,CAAQtB,EAAMO,CAAAA,CAAQgB,CAAQ,CAChC,CAAA,CACA,CAAC0F,CAAY,CACf,CAAA,CAEMQ,CAAAA,CAAe5H,eACnBoH,CAAAA,CACE,CAACjH,CAAAA,CAAMyC,CAAAA,CAAsB3C,CAAAA,CAAeyB,CAAAA,GAAuC,CACjF,IAAMmG,GACJ5F,CAAAA,CAAa9B,CAAAA,CAAMyC,CAAY,CAAA,EAAKV,CAAAA,CAAsB/B,CAAAA,CAAMyC,CAAY,CAAA,CAC9E,GAAI,CAACiF,EAAAA,CAAY,OAAO1H,CAAAA,CAExB,IAAM2H,EAAAA,CAAa5F,CAAAA,CAAsB/B,CAAAA,CAAMF,CAAK,CAAA,CAG9C8H,EAAAA,CAFoBD,EAAAA,EAAcA,EAAAA,CAAW,EAAA,GAAOD,EAAAA,CAAW,EAAA,CAE7B1H,CAAAA,CAAQU,GAAUV,CAAAA,CAAMF,CAAK,CAAA,EAAKE,CAAAA,CAC1E,OAAOwC,EAAAA,CAAOoF,EAAAA,CAAaF,EAAAA,CAAW,GAAI5H,CAAAA,CAAOyB,CAAQ,CAC3D,CACF,CAAA,CACA,CAAC0F,CAAY,CACf,EAEMY,CAAAA,CAAkBhI,cAAAA,CACtBoH,CAAAA,CACE,CACEjH,CAAAA,CACAgB,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,KACG,CACH,IAAMuG,EAAAA,CAAa5F,CAAAA,CAAa9B,CAAAA,CAAMgB,CAAQ,CAAA,EAAKe,CAAAA,CAAsB/B,EAAMgB,CAAQ,CAAA,CACvF,GAAI,CAAC0G,EAAAA,CAAY,OAAO1H,CAAAA,CAExB,IAAM8H,GAAkBhG,CAAAA,CAAa9B,CAAAA,CAAMmB,EAAS,CAAA,EAClDY,CAAAA,CAAsB/B,CAAAA,CAAMmB,EAAS,CAAA,EAAK,CACxC,IAAA,CAAM,MAAA,CACN,EAAA,CAAIA,EAAAA,CACJ,IAAA,CAAM,CAACA,EAAS,CAAA,CAChB,YAAaA,EACf,CAAA,CACI4G,EAAAA,CAAsB1H,EAAAA,CAAWL,CAAAA,CAAMmB,EAAS,CAAA,CACtD,OAAOJ,GAAUgH,EAAAA,CAAqBL,EAAAA,CAAW,EAAA,CAAIzG,CAAAA,CAAWC,CAAAA,CAAW4G,EAAe,CAC5F,CACF,EACA,CAACb,CAAY,CACf,CAAA,CAEMe,CAAAA,CAA8BnI,cAAAA,CAClCoH,CAAAA,CAAa,CAACjH,EAAMiI,CAAAA,CAAwBC,CAAAA,GAC1CvG,EAAAA,CAAsB3B,CAAAA,CAAMiI,CAAAA,CAAaC,CAAU,CACrD,CAAA,CACA,CAACjB,CAAY,CACf,CAAA,CAEMkB,EAAAA,CAA0BtI,eAC9BoH,CAAAA,CACE,CACEjH,CAAAA,CACAF,CAAAA,CACAsC,IAGGD,EAAAA,CAAkBnC,CAAAA,CAAMF,CAAAA,CAAOsC,CAAO,CAC7C,CAAA,CACA,CAAC6E,CAAY,CACf,CAAA,CAEMmB,EAAAA,CAAuBvI,cAAAA,CAC3BoH,CAAAA,CAAa,CAACjH,CAAAA,CAAMO,CAAAA,CAAgB8H,CAAAA,GAAsB,CACxD,IAAMX,CAAAA,CAAa5F,CAAAA,CAAa9B,CAAAA,CAAMO,CAAM,CAAA,EAAKwB,CAAAA,CAAsB/B,CAAAA,CAAMO,CAAM,CAAA,CACnF,OAAKmH,CAAAA,CACEhF,EAAAA,CAAe1C,CAAAA,CAAM0H,CAAAA,CAAW,EAAA,CAAIW,CAAQ,EAD3BrI,CAE1B,CAAC,CAAA,CACD,CAACiH,CAAY,CACf,CAAA,CAEMqB,EAAAA,CAAkBzI,eACtBoH,CAAAA,CAAa,CAACjH,CAAAA,CAAMO,CAAAA,CAAgBT,CAAAA,GAAkB,CACpD,IAAM4H,CAAAA,CAAa5F,EAAa9B,CAAAA,CAAMO,CAAM,CAAA,EAAKwB,CAAAA,CAAsB/B,CAAAA,CAAMO,CAAM,CAAA,CACnF,OAAKmH,EACE5E,EAAAA,CAAU9C,CAAAA,CAAM0H,CAAAA,CAAW,EAAA,CAAI5H,CAAK,CAAA,CADnBE,CAE1B,CAAC,EACD,CAACiH,CAAY,CACf,CAAA,CAEMsB,EAAAA,CAAiB1I,cAAAA,CACrBoH,CAAAA,CAAa,CAACjH,EAAMgD,CAAAA,CAAsBP,CAAAA,GAAyB,CACjE,IAAMiF,CAAAA,CACJ5F,CAAAA,CAAa9B,CAAAA,CAAMyC,CAAY,GAAKV,CAAAA,CAAsB/B,CAAAA,CAAMyC,CAAY,CAAA,CAC9E,OAAKiF,CAAAA,CACE3E,EAAAA,CAAS/C,CAAAA,CAAMgD,EAAc0E,CAAAA,CAAW,EAAE,CAAA,CADzB1H,CAE1B,CAAC,CAAA,CACD,CAACiH,CAAY,CACf,CAAA,CAEMuB,CAAAA,CAAgB3I,cAAAA,CACpBoH,CAAAA,CAAa,CAACjH,CAAAA,CAAMgD,CAAAA,CAAsBI,CAAAA,CAAqBC,IAC7DF,EAAAA,CAAQnD,CAAAA,CAAMgD,CAAAA,CAAcI,CAAAA,CAAaC,CAAQ,CACnD,CAAA,CACA,CAAC4D,CAAY,CACf,CAAA,CAEMwB,EAAAA,CAAkB5I,cAAAA,CACtBoH,CAAAA,CAAa,CAACjH,CAAAA,CAAMF,CAAAA,GAAkBY,GAAUV,CAAAA,CAAMF,CAAK,CAAC,CAAA,CAC5D,CAACmH,CAAY,CACf,CAAA,CAEMyB,EAAAA,CAAqB7I,eACxBU,CAAAA,EAAmBuB,CAAAA,CAAa8E,CAAAA,CAAU,OAAA,CAASrG,CAAM,CAAA,CAC1D,EACF,EAEMoI,EAAAA,CAA8B9I,cAAAA,CACjCC,CAAAA,EAAkBiC,CAAAA,CAAsB6E,CAAAA,CAAU,OAAA,CAAS9G,CAAK,CAAA,CACjE,EACF,CAAA,CAEM8I,EAAAA,CAAoB/I,cAAAA,CACvBC,CAAAA,EAAkBkC,EAAAA,CAAY4E,CAAAA,CAAU,OAAA,CAAS9G,CAAK,CAAA,CACvD,EACF,CAAA,CAEA,OAAO,CACL,MAAA,CAAA+F,CAAAA,CACA,UAAAwB,CAAAA,CACA,gBAAA,CAAApB,CAAAA,CACA,mBAAA,CAAAc,CAAAA,CACA,MAAA,CAAApE,CAAAA,CACA,SAAA,CAAAwD,EACA,QAAA,CAAAtH,CAAAA,CACA,WAAA,CAAAuH,CAAAA,CACA,UAAA,CAAAC,EAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,gBAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CAGA,sBAAA,CAAA1B,EACA,aAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,mBAAAC,CAAAA,CACA,mBAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,EAGA,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,qBAAA,CAAAC,CAAAA,CAGA,UAAA,CAAY2B,CAAAA,CACZ,OAAA,CAASC,GACT,MAAA,CAAQC,CAAAA,CACR,SAAA,CAAWI,CAAAA,CACX,qBAAA,CAAuBG,CAAAA,CACvB,iBAAA,CAAmBG,EAAAA,CACnB,eAAgBC,EAAAA,CAChB,SAAA,CAAWE,EAAAA,CACX,QAAA,CAAUC,EAAAA,CACV,OAAA,CAASC,CAAAA,CACT,SAAA,CAAWC,GAGX,YAAA,CAAcC,EAAAA,CACd,qBAAA,CAAuBC,EAAAA,CACvB,WAAA,CAAaC,EACf,CACF,CCrSO,SAASC,EAAAA,CAAkB,CAAE,MAAA,CAAAC,CAAAA,CAAQ,SAAA,CAAAC,CAAAA,CAAW,MAAA,CAAAC,CAAAA,CAAQ,MAAAC,CAAM,CAAA,CAA4B,CAE/F,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,iBAAiB,EAG7C,IAAMC,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,CAC9CA,CAAAA,CAAQ,EAAA,CAAK,4BAAA,CACbA,EAAQ,WAAA,CAAc;AAAA;AAAA,cAAA,EAERJ,CAAM,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAIpB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYI,CAAO,CAAA,CAGjCH,CAAAA,CAAU,YAAA,CAAa,eAAA,CAAiB,MAAM,CAAA,CAG9C,IAAM9J,CAAAA,CAAqBC,GAAoB,CAC7C8J,CAAAA,CAAO9J,CAAC,EACV,CAAA,CAEMiK,CAAAA,CAAkB,IAAM,CAE5B,SAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,iBAAiB,CAAA,CAChDJ,CAAAA,CAAU,eAAA,CAAgB,eAAe,EAEzC,IAAMK,CAAAA,CAAc,QAAA,CAAS,cAAA,CAAe,4BAA4B,CAAA,CACpEA,CAAAA,EACFA,CAAAA,CAAY,QAAO,CAGrB,QAAA,CAAS,mBAAA,CAAoB,aAAA,CAAenK,CAAiB,CAAA,CAC7D,QAAA,CAAS,mBAAA,CAAoB,YAAakK,CAAe,CAAA,CAGzDF,CAAAA,GACF,CAAA,CAEA,QAAA,CAAS,gBAAA,CAAiB,aAAA,CAAehK,CAAiB,CAAA,CAC1D,QAAA,CAAS,gBAAA,CAAiB,WAAA,CAAakK,CAAe,EACxD,CC3DO,IAAME,EAAAA,CAAqBC,gBAAAA,CAAoD,MAAS,CAAA,CAClFC,EAAAA,CAAuBD,gBAAAA,CAA8C,MAAS,CAAA,CAC9EE,EAAAA,CAAwBF,gBAAAA,CAA+C,MAAS,EAEhFG,EAAAA,CAAiB,IAAwB,CACpD,IAAMC,CAAAA,CAAQC,aAAAA,CAAWN,EAAkB,CAAA,CAC3C,GAAI,CAACK,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA,CAExE,OAAOA,CACT,CAAA,CAEaE,EAAAA,CAAmB,IAA0B,CACxD,IAAMC,CAAAA,CAAUF,aAAAA,CAAWJ,EAAoB,EAC/C,GAAI,CAACM,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,wDAAwD,CAAA,CAE1E,OAAOA,CACT,ECxBO,IAAMC,EAAAA,CAAmB,IAA0B,CACxD,IAAMJ,CAAAA,CAAQD,IAAe,CACvBI,CAAAA,CAAUD,EAAAA,EAAiB,CACjC,OAAO,CAAE,GAAGF,CAAAA,CAAO,GAAGG,CAAQ,CAChC,ECJO,IAAME,EAAAA,CAAN,cAAiCC,kBAAc,CACpD,OAAO,UAAA,CAAa,CAClB,CACE,SAAA,CAAW,eAAA,CACX,OAAA,CAAS,CAAC,CAAE,WAAA,CAAaC,CAAM,IAEzB,CADYA,CAAAA,CAAM,MAAA,EACT,OAAA,CAAQ,cAAc,CAKvC,CACF,CACF,EAEaC,EAAAA,CAAN,cAA+BC,gBAAY,CAChD,OAAO,UAAA,CAAa,CAClB,CACE,UAAW,cAAA,CACX,OAAA,CAAS,CAAC,CAAE,WAAA,CAAaF,CAAM,CAAA,GAEzB,CADYA,EAAM,MAAA,EACT,OAAA,CAAQ,cAAc,CAKvC,CACF,CACF,CAAA,CCNA,SAASG,EAAAA,CAAsBH,CAAAA,CAA+C,CAC5E,GAAIA,CAAAA,YAAiB,UAAA,EAAcA,CAAAA,YAAiB,YAAA,CAClD,OAAO,CAAE,CAAA,CAAGA,CAAAA,CAAM,OAAA,CAAS,CAAA,CAAGA,CAAAA,CAAM,OAAQ,CAAA,CAE9C,GAAI,OAAO,UAAA,CAAe,GAAA,EAAeA,CAAAA,YAAiB,UAAA,CAAY,CACpE,IAAM7K,CAAAA,CAAQ6K,EAAM,OAAA,CAAQ,CAAC,CAAA,EAAKA,CAAAA,CAAM,cAAA,CAAe,CAAC,CAAA,CACxD,GAAI7K,EACF,OAAO,CAAE,CAAA,CAAGA,CAAAA,CAAM,OAAA,CAAS,CAAA,CAAGA,CAAAA,CAAM,OAAQ,CAEhD,CACA,OAAO,IACT,CAOO,SAASiL,EAAAA,CAAaC,CAAAA,CAA0B,CACrD,GAAM,CACJ,MAAA,CAAAzE,CAAAA,CACA,SAAA,CAAAwB,CAAAA,CACA,QAAA,CAAAxI,CAAAA,CACA,WAAA,CAAAuH,EACA,aAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,YAAA,CAAA+D,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,YAAA,CAAA/D,CAAAA,CAGA,sBAAA,CAAAzB,CAAAA,CACA,mBAAA,CAAAI,CAAAA,CACA,iBAAAC,CAAAA,CAGA,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,qBAAA,CAAAI,EAGA,SAAA,CAAAlF,CAAAA,CACA,OAAA,CAAAyC,CAAAA,CACA,SAAA,CAAAL,CACF,CAAA,CAAIwH,CAAAA,CAEEG,EAAmB1L,SAAAA,CAAuB,IAAI,CAAA,CAC9CD,CAAAA,CAAmBF,EAAAA,CAAiBC,CAAQ,CAAA,CAE5C,CAACS,EAAcoL,CAAe,CAAA,CAAIhL,WAAAA,CAAS,KAAK,CAAA,CACtDL,EAAAA,CAAsBC,CAAY,CAAA,CAElC,IAAMqL,CAAAA,CAAUC,eAAAA,CACdC,cAAAA,CAAUd,EAAAA,CAAoB,CAC5B,oBAAA,CAAsB,CAAE,QAAA,CAAU/E,CAAuB,CAC3D,CAAC,CAAA,CACD6F,cAAAA,CAAUX,EAAAA,CAAkB,CAC1B,oBAAA,CAAsB,CAAE,MAAO,GAAA,CAAK,SAAA,CAAW,CAAE,CACnD,CAAC,CACH,CAAA,CAEMY,CAAAA,CAA2BjL,cAAAA,CAAiCsH,CAAAA,EAAS,CACzE,IAAM4D,CAAAA,CAAoBC,kBAAAA,CAAc7D,CAAI,CAAA,CAC5C,GAAI4D,CAAAA,CAAkB,MAAA,CAAS,CAAA,CAAG,OAAOA,CAAAA,CAGzC,GADoB5D,CAAAA,CAAK,MAAA,CAAO,GAAG,QAAA,EAAS,CAC5B,UAAA,CAAW,aAAa,CAAA,CAAG,CACzC,IAAM8D,CAAAA,CAAgB9D,EAAK,mBAAA,CAAoB,MAAA,CAAQ+D,CAAAA,EACrDA,CAAAA,CAAU,EAAA,CAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAChD,CAAA,CACA,OAAOC,kBAAAA,CAAc,CAAE,GAAGhE,CAAAA,CAAM,mBAAA,CAAqB8D,CAAc,CAAC,CACtE,CACA,OAAO,EACT,CAAA,CAAG,EAAE,CAAA,CAoUL,OAAO,CACL,OAAA,CAAAN,CAAAA,CACA,kBAAA,CAAoBG,CAAAA,CACpB,WAAA,CArUuBb,GAA0B,CACjD,IAAMmB,CAAAA,CAAQnB,CAAAA,CAAM,MAAA,CAAO,EAAA,CAAG,QAAA,EAAS,CACjCoB,CAAAA,CAAYD,CAAAA,CAAM,UAAA,CAAW,aAAa,CAAA,CAC1CE,CAAAA,CAAaD,CAAAA,CAAYD,CAAAA,CAAM,UAAU,EAAE,CAAA,CAAIA,CAAAA,CACrDhF,CAAAA,CAAYkF,CAAU,CAAA,CACtBhF,CAAAA,CAAc+E,CAAAA,CAAY,MAAQ,MAAM,CAAA,CACxCd,CAAAA,CAAa,IAAI,CAAA,CACjBC,CAAAA,CAAmB,IAAI,CAAA,CAEvB,IAAMe,CAAAA,CAAKtB,CAAAA,CAAM,cAAA,CASjB,GARAnL,CAAAA,CAAiB,OAAA,CAAUsL,EAAAA,CAAsBmB,CAAE,EAE/CnG,CAAAA,EAAuBqB,CAAAA,CAAa,OAAA,CACtCgE,CAAAA,CAAiB,OAAA,CAAUhE,CAAAA,CAAa,OAAA,CAAQ,qBAAA,GAEhDgE,CAAAA,CAAiB,OAAA,CAAU,IAAA,CAGzBY,CAAAA,CAAW,CACb,IAAMG,CAAAA,CAAazJ,CAAAA,CAAsB8D,EAAQyF,CAAU,CAAA,CACvDE,CAAAA,EACF1I,CAAAA,CAAU0I,CAAAA,CAAW,EAAA,CAAIF,CAAU,EAEvC,CAEI/F,CAAAA,EACFA,CAAAA,CAAY+F,CAAU,EAE1B,CAAA,CA0SE,UAAA,CAxSsBrB,CAAAA,EAAyB,CAC/C,GAAM,CAAE,IAAA,CAAAwB,CAAK,CAAA,CAAIxB,CAAAA,CACXyB,CAAAA,CAAYD,CAAAA,EAAM,GAAG,QAAA,EAAS,EAAK,EAAA,CACnCE,CAAAA,CAAmBD,CAAAA,CAAU,UAAA,CAAW,cAAc,CAAA,CAC5DhB,EAAgBiB,CAAgB,CAAA,CAGhC,IAAMC,CAAAA,CAAeF,CAAAA,CAAU,KAAA,CAAM,iBAAiB,CAAA,CACtD,GAAIE,CAAAA,EAAgBH,CAAAA,CAAM,CACxB,GAAM,EAAGrI,CAAW,CAAA,CAAIwI,EAClBR,CAAAA,CAAQnB,CAAAA,CAAM,MAAA,CAAO,EAAA,CAAG,QAAA,EAAS,CAIvC,GAAA,CAHkBmB,CAAAA,CAAM,WAAW,aAAa,CAAA,CACjBA,CAAAA,CAAM,SAAA,CAAU,EAAE,CAAA,CAAIA,CAAAA,IAElChI,CAAAA,CAAa,CAC9B,IAAIC,EAAAA,CAA+B,QAAA,CAC7BwI,EAAAA,CAAWJ,CAAAA,CAAK,IAAA,CAChB,EAAA,CAAKxB,CAAAA,CAAM,eACb6B,CAAAA,CAAoB,IAAA,CACxB,GAAIhN,CAAAA,CAAiB,OAAA,CACnBgN,CAAAA,CAAKhN,CAAAA,CAAiB,OAAA,CAAQ,CAAA,CAAA,KACzB,CACL,IAAMiN,EAAAA,CAAS3B,EAAAA,CAAsB,EAAE,CAAA,CACnC2B,EAAAA,GACFD,EAAKC,EAAAA,CAAO,CAAA,CAAI9B,CAAAA,CAAM,KAAA,CAAM,CAAA,EAEhC,CAEA,GAAI6B,CAAAA,GAAO,KAAM,CACf,IAAME,EAAAA,CAASH,EAAAA,CAAS,IAAA,CAAOA,EAAAA,CAAS,KAAA,CAAQ,CAAA,CAC5CC,EAAKE,EAAAA,GACP3I,EAAAA,CAAW,OAAA,EAEf,CAEAkH,CAAAA,CAAanH,CAAW,CAAA,CACxBoH,CAAAA,CAAmBnH,EAAQ,EAC7B,CAAA,KACEkH,CAAAA,CAAa,IAAI,CAAA,CACjBC,CAAAA,CAAmB,IAAI,EAE3B,MACED,CAAAA,CAAa,IAAI,CAAA,CACjBC,CAAAA,CAAmB,IAAI,CAAA,CAGzB,GAAI,CAACpF,EAAqB,OAE1B,IAAMgG,CAAAA,CAAQnB,CAAAA,CAAM,MAAA,CAAO,EAAA,CAAG,QAAA,EAAS,CAEjCqB,EADYF,CAAAA,CAAM,UAAA,CAAW,aAAa,CAAA,CACjBA,CAAAA,CAAM,SAAA,CAAU,EAAE,CAAA,CAAIA,CAAAA,CAC/Ca,CAAAA,CAAgBxB,CAAAA,CAAiB,OAAA,CAEvC,GAAI,CAACwB,CAAAA,CAAe,CACd1F,IAAoB,IAAA,GACtBC,CAAAA,CAAmB,IAAI,CAAA,CACvBZ,CAAAA,GAAwB,IAAI,CAAA,CAAA,CAE9B,MACF,CAEA,IAAM2F,CAAAA,CAAKtB,CAAAA,CAAM,cAAA,CACb6B,CAAAA,CAAoB,IAAA,CACpBI,CAAAA,CAAoB,IAAA,CAExB,GAAIpN,CAAAA,CAAiB,OAAA,CACnBgN,CAAAA,CAAKhN,CAAAA,CAAiB,OAAA,CAAQ,CAAA,CAC9BoN,CAAAA,CAAKpN,CAAAA,CAAiB,QAAQ,CAAA,CAAA,KACzB,CACL,IAAMiN,CAAAA,CAAS3B,EAAAA,CAAsBmB,CAAE,CAAA,CACnCQ,CAAAA,GACFD,EAAKC,CAAAA,CAAO,CAAA,CAAI9B,CAAAA,CAAM,KAAA,CAAM,CAAA,CAC5BiC,CAAAA,CAAKH,CAAAA,CAAO,CAAA,CAAI9B,EAAM,KAAA,CAAM,CAAA,EAEhC,CAEA,IAAIkC,CAAAA,CAAW,CAAA,CACf,GAAIL,CAAAA,GAAO,MAAQI,CAAAA,GAAO,IAAA,CAAM,CAC9B,IAAIE,CAAAA,CAAK,CAAA,CACLC,CAAAA,CAAK,CAAA,CAELP,CAAAA,CAAKG,CAAAA,CAAc,IAAA,CACrBG,CAAAA,CAAKH,CAAAA,CAAc,IAAA,CAAOH,CAAAA,CACjBA,CAAAA,CAAKG,EAAc,KAAA,GAC5BG,CAAAA,CAAKN,CAAAA,CAAKG,CAAAA,CAAc,KAAA,CAAA,CAGtBC,CAAAA,CAAKD,CAAAA,CAAc,GAAA,CACrBI,EAAKJ,CAAAA,CAAc,GAAA,CAAMC,CAAAA,CAChBA,CAAAA,CAAKD,CAAAA,CAAc,MAAA,GAC5BI,CAAAA,CAAKH,CAAAA,CAAKD,EAAc,MAAA,CAAA,CAG1BE,CAAAA,CAAW,IAAA,CAAK,IAAA,CAAKC,CAAAA,CAAKA,CAAAA,CAAKC,CAAAA,CAAKA,CAAE,EACxC,CAAA,KAAO,CACL,IAAMC,CAAAA,CAAarC,CAAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,WAC7C,GAAIqC,CAAAA,CAAY,CACd,IAAMC,CAAAA,CAAKD,CAAAA,CAAW,IAAA,CAAOA,CAAAA,CAAW,MAAQ,CAAA,CAC1CE,CAAAA,CAAKF,CAAAA,CAAW,GAAA,CAAMA,CAAAA,CAAW,MAAA,CAAS,CAAA,CAC5CF,EAAAA,CAAK,EACLC,EAAAA,CAAK,CAAA,CAELE,CAAAA,CAAKN,CAAAA,CAAc,IAAA,CACrBG,EAAAA,CAAKH,CAAAA,CAAc,IAAA,CAAOM,CAAAA,CACjBA,CAAAA,CAAKN,CAAAA,CAAc,KAAA,GAC5BG,EAAAA,CAAKG,CAAAA,CAAKN,CAAAA,CAAc,KAAA,CAAA,CAGtBO,EAAKP,CAAAA,CAAc,GAAA,CACrBI,EAAAA,CAAKJ,CAAAA,CAAc,GAAA,CAAMO,CAAAA,CAChBA,CAAAA,CAAKP,CAAAA,CAAc,SAC5BI,EAAAA,CAAKG,CAAAA,CAAKP,CAAAA,CAAc,MAAA,CAAA,CAG1BE,CAAAA,CAAW,IAAA,CAAK,IAAA,CAAKC,EAAAA,CAAKA,GAAKC,EAAAA,CAAKA,EAAE,EACxC,CACF,CAEwBF,CAAAA,CAAW9G,CAAAA,CAE7BkB,CAAAA,GAAoB+E,IACtB9E,CAAAA,CAAmB8E,CAAU,CAAA,CAC7B1F,CAAAA,GAAwB0F,CAAU,CAAA,CAAA,CAGhC/E,CAAAA,GAAoB,IAAA,GACtBC,EAAmB,IAAI,CAAA,CACvBZ,CAAAA,GAAwB,IAAI,CAAA,EAGlC,CAAA,CAuKE,SAAA,CArKqBqE,CAAAA,EAAwB,CAC7C7D,CAAAA,CAAY,IAAI,CAAA,CAChBE,CAAAA,CAAc,IAAI,CAAA,CAClBoE,CAAAA,CAAgB,KAAK,EACrBH,CAAAA,CAAa,IAAI,CAAA,CACjBC,CAAAA,CAAmB,IAAI,CAAA,CACvB,GAAM,CAAE,MAAA,CAAAiC,CAAAA,CAAQ,IAAA,CAAAhB,CAAK,CAAA,CAAIxB,CAAAA,CACnBmB,CAAAA,CAAQqB,CAAAA,CAAO,GAAG,QAAA,EAAS,CAC3BpB,CAAAA,CAAYD,CAAAA,CAAM,UAAA,CAAW,aAAa,CAAA,CAC1CE,CAAAA,CAAaD,EAAYD,CAAAA,CAAM,SAAA,CAAU,EAAE,CAAA,CAAIA,CAAAA,CAE/CsB,CAAAA,CAAmBtH,CAAAA,EAAuBmB,CAAAA,GAAoB+E,EAMpE,GAJA9E,CAAAA,CAAmB,IAAI,CAAA,CACvBZ,CAAAA,GAAwB,IAAI,CAAA,CAC5B6E,CAAAA,CAAiB,QAAU,IAAA,CAEvBiC,CAAAA,CAAkB,CAChBpH,CAAAA,CACFA,CAAAA,CAASgG,CAAU,CAAA,CAEnB5K,CAAAA,CAAU4K,CAAU,CAAA,CAGlB9F,CAAAA,EACFA,CAAAA,CAAU8F,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,GAAI,CAACG,CAAAA,CAAM,CACLjG,CAAAA,EACFA,CAAAA,CAAU8F,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,IAAMI,CAAAA,CAAYD,CAAAA,CAAK,EAAA,CAAG,QAAA,EAAS,CAEnC,GAAIC,CAAAA,CAAU,UAAA,CAAW,cAAc,CAAA,CAAG,CACpClG,CAAAA,EACFA,EAAU8F,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAGA,IAAMM,CAAAA,CAAeF,EAAU,KAAA,CAAM,iBAAiB,CAAA,CACtD,GAAIE,CAAAA,CAAc,CAChB,GAAM,EAAGxI,EAAW,CAAA,CAAIwI,CAAAA,CACxB,GAAIN,CAAAA,GAAelI,EAAAA,CAAa,CAC9B,IAAIC,GAA+B,QAAA,CAC7BwI,CAAAA,CAAWJ,CAAAA,CAAK,IAAA,CAChBF,EAAAA,CAAKtB,CAAAA,CAAM,cAAA,CACb6B,EAAAA,CAAoB,KACxB,GAAIhN,CAAAA,CAAiB,OAAA,CACnBgN,EAAAA,CAAKhN,CAAAA,CAAiB,OAAA,CAAQ,CAAA,CAAA,KACzB,CACL,IAAMiN,EAAAA,CAAS3B,EAAAA,CAAsBmB,EAAE,CAAA,CACnCQ,EAAAA,GACFD,EAAAA,CAAKC,EAAAA,CAAO,CAAA,CAAI9B,EAAM,KAAA,CAAM,CAAA,EAEhC,CAEA,GAAI6B,EAAAA,GAAO,IAAA,CAAM,CACf,IAAME,EAAAA,CAASH,CAAAA,CAAS,IAAA,CAAOA,CAAAA,CAAS,KAAA,CAAQ,CAAA,CAC5CC,EAAAA,CAAKE,EAAAA,GACP3I,GAAW,OAAA,EAEf,CAEAF,CAAAA,CAAQmI,CAAAA,CAAYlI,EAAAA,CAAaC,EAAQ,CAAA,CACrCmC,CAAAA,EACFA,EAAU8F,CAAAA,CAAYlI,EAAAA,CAAa,CAAE,IAAA,CAAM,MAAA,CAAQ,QAAA,CAAU,QAAS,CAAC,EAE3E,CAAA,KACMoC,CAAAA,EACFA,CAAAA,CAAU8F,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAGpC,MACF,CAGA,IAAMqB,CAAAA,CAAQjB,CAAAA,CAAU,KAAA,CAAM,qCAAqC,CAAA,CACnE,GAAI,CAACiB,EAAO,CACNnH,CAAAA,EACFA,CAAAA,CAAU8F,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,GAAM,EAAGsB,CAAAA,CAAU5L,CAAQ,CAAA,CAAI2L,CAAAA,CACzBnB,CAAAA,CAAaH,EACftJ,CAAAA,CAAsB8D,CAAAA,CAAQyF,CAAU,CAAA,CACxCxJ,CAAAA,CAAa+D,CAAAA,CAAQyF,CAAU,CAAA,CAC7BuB,GAAiBrB,CAAAA,EAAcA,CAAAA,CAAW,EAAA,GAAOxK,CAAAA,CACjD8L,CAAAA,CAAYtB,CAAAA,EAAcA,CAAAA,CAAW,IAAA,CAAK,SAAW,CAAA,CAE3D,GAAIF,CAAAA,GAAetK,CAAAA,EAAa6L,EAAAA,EAAkBC,CAAAA,CAAY,CACxDtH,CAAAA,EACFA,EAAU8F,CAAAA,CAAY,IAAA,CAAM,IAAI,CAAA,CAElC,MACF,CAEA,IAAMrK,CAAAA,CAA4B2L,IAAa,MAAA,EAAUA,CAAAA,GAAa,OAAA,CAAU,KAAA,CAAQ,QAAA,CAEpF9E,CAAAA,CACJ,GAAIuD,CAAAA,CAAW,CAEb,IAAMpI,EAAAA,CADelB,CAAAA,CAAsB8D,CAAAA,CAAQyF,CAAU,CAAA,EACxB,YAAA,GAAeA,CAAU,EAC9DxD,CAAAA,CAAkB,CAChB,IAAA,CAAM,MAAA,CACN,EAAA,CAAI1H,EAAAA,EAAiB,CACrB,IAAA,CAAM,CAACkL,CAAU,CAAA,CACjB,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcrI,EAAAA,CAAiB,CAAE,CAACqI,CAAU,EAAGrI,EAAe,CAAA,CAAI,MACpE,EACF,CAAA,KACE6E,CAAAA,CAAkBhG,CAAAA,CAAa+D,CAAAA,CAAQyF,CAAU,CAAA,EAAK,CACpD,IAAA,CAAM,MAAA,CACN,EAAA,CAAIlL,EAAAA,GACJ,IAAA,CAAM,CAACkL,CAAU,CAAA,CACjB,WAAA,CAAaA,CACf,CAAA,CAGF,IAAMvD,GAAsBsD,CAAAA,CACxB3K,EAAAA,CAAgBmF,CAAAA,CAAQyF,CAAU,CAAA,CAClCjL,EAAAA,CAAiBwF,CAAAA,CAAQyF,CAAU,EAEjCyB,EAAAA,CAAYhM,EAAAA,CAChBgH,EAAAA,CACA/G,CAAAA,CACAC,CAAAA,CACA2L,CAAAA,CACA9E,CACF,CAAA,CACAT,EAAU0F,EAAS,CAAA,CACfvH,CAAAA,EACFA,CAAAA,CAAU8F,CAAAA,CAAYtK,CAAAA,CAAU,CAC9B,IAAA,CAAM,QACN,SAAA,CAAAC,CAAAA,CACA,QAAA,CAAU2L,CACZ,CAAC,EAEL,CAAA,CAmBE,YAAA,CAjBuB,IAAM,CAC7BxG,CAAAA,CAAY,IAAI,CAAA,CAChBE,CAAAA,CAAc,IAAI,CAAA,CAClBoE,CAAAA,CAAgB,KAAK,CAAA,CACrBH,CAAAA,CAAa,IAAI,CAAA,CACjBC,CAAAA,CAAmB,IAAI,CAAA,CACvBhE,CAAAA,CAAmB,IAAI,CAAA,CACvBZ,CAAAA,GAAwB,IAAI,CAAA,CAC5B6E,CAAAA,CAAiB,OAAA,CAAU,KAC7B,CASA,CACF,CC7aO,IAAMuC,EAAAA,CAIR,CAAC,CAAE,QAAA,CAAAnO,CAAAA,CAAU,MAAA,CAAAoO,CAAAA,CAAQ,SAAA,CAAAC,CAAU,CAAA,GAAM,CACxC,IAAMC,CAAAA,CAAMpO,SAAAA,CAAuB,IAAI,CAAA,CAEvC,OAAAC,YAAAA,CAAU,IAAM,CACd,IAAMoO,CAAAA,CAAclO,CAAAA,EAAoB,CAClCiO,CAAAA,CAAI,OAAA,GACNA,CAAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,UAAY,CAAA,UAAA,EAAajO,CAAAA,CAAE,OAAA,CAAU,EAAE,CAAA,IAAA,EAAOA,CAAAA,CAAE,OAAA,CAAU,EAAE,CAAA,GAAA,CAAA,EAElF,CAAA,CACA,OAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,CAAekO,CAAU,CAAA,CAC5C,IAAM,SAAS,mBAAA,CAAoB,aAAA,CAAeA,CAAU,CACrE,CAAA,CAAG,EAAE,CAAA,CAGHC,eAAC,KAAA,CAAA,CACC,GAAA,CAAKF,CAAAA,CACL,SAAA,CAAWD,CAAAA,CACX,KAAA,CAAO,CACL,QAAA,CAAU,QACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,MAAA,CAAQ,IAAA,CACR,aAAA,CAAe,MACjB,EAEC,QAAA,CAAAD,CAAAA,CAAOpO,CAAQ,CAAA,CAClB,CAEJ,CAAA,CCzBO,IAAMyO,EAAAA,CAAgD,CAAC,CAAE,KAAA,CAAAxN,CAAAA,CAAO,MAAA,CAAA8B,CAAAA,CAAQ,aAAA2L,CAAa,CAAA,GAAM,CAChG,GAAM,CAACC,CAAAA,CAASC,CAAU,CAAA,CAAI/N,WAAAA,CAAS,KAAK,CAAA,CACtCgO,CAAAA,CAAa3O,SAAAA,CAA8B,IAAI,CAAA,CAkCrD,GAhCAC,aAAU,IAAM,CACdyO,CAAAA,CAAW,IAAI,EACjB,CAAA,CAAG,EAAE,EAGLzO,YAAAA,CAAU,IAAM,CACd,GAAI,CAACwO,CAAAA,EAAW,CAACE,CAAAA,CAAW,QAAS,OAErC,IAAMC,CAAAA,CAAUD,CAAAA,CAAW,OAAA,CAC3B,GAAI9L,CAAAA,CACFA,CAAAA,CAAO,YAAY+L,CAAO,CAAA,CAAA,KACrB,CACL,IAAIC,CAAAA,CAAkB,QAAA,CAAS,cAAA,CAAe,gCAAgC,EACzEA,CAAAA,GACHA,CAAAA,CAAkB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC9CA,CAAAA,CAAgB,EAAA,CAAK,iCACrBA,CAAAA,CAAgB,KAAA,CAAM,OAAA,CAAU,MAAA,CAChC,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYA,CAAe,GAE3CA,CAAAA,CAAgB,WAAA,CAAYD,CAAO,EACrC,CACF,CAAA,CAAG,CAAC/L,CAAAA,CAAQ4L,CAAO,CAAC,CAAA,CAGpBxO,YAAAA,CAAU,IACD,IAAM,CACP0O,CAAAA,CAAW,SACbA,CAAAA,CAAW,OAAA,CAAQ,MAAA,GAEvB,CAAA,CACC,EAAE,CAAA,CAED,CAACF,CAAAA,CAAS,OAAO,IAAA,CAEhBE,CAAAA,CAAW,OAAA,GACdA,CAAAA,CAAW,OAAA,CAAU,QAAA,CAAS,cAAc,KAAK,CAAA,CACjDA,CAAAA,CAAW,OAAA,CAAQ,SAAA,CAAY,CAAA,sBAAA,EAAyB5N,CAAK,CAAA,CAAA,CAC7D4N,EAAW,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAQ,MAAA,CACjCA,CAAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAS,QAGpC,IAAMC,CAAAA,CAAUD,CAAAA,CAAW,OAAA,CAE3B,OAAI,CAACC,CAAAA,EAAW,CAACJ,EAAqB,IAAA,CAE/BM,qBAAAA,CAAaN,CAAAA,CAAazN,CAAK,CAAA,CAAG6N,CAAO,CAClD,CAAA,CC5CO,IAAMG,EAAAA,CAAiCxD,CAAAA,EAAU,CACtD,IAAMyD,CAAAA,CAAgBzD,CAAAA,CAChB,CACJ,UAAA,CAAA0D,CAAAA,CACA,YAAA,CAAAT,EACA,iBAAA,CAAAU,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,EAAC,CACd,QAAA,CAAAC,CAAAA,CAGA,OAAAtI,CAAAA,CACA,SAAA,CAAAwB,CAAAA,CACA,gBAAA,CAAApB,CAAAA,CACA,mBAAA,CAAAc,CAAAA,CACA,MAAA,CAAApE,EACA,SAAA,CAAAwD,CAAAA,CACA,YAAA,CAAArE,CAAAA,CACA,qBAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAAnD,CAAAA,CACA,UAAA,CAAAwH,CAAAA,CACA,eAAA,CAAAE,CAAAA,CACA,eAAA,CAAAG,CAAAA,CAGA,aAAA,CAAAzB,EACA,kBAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CAGA,QAAA,CAAAG,CAAAA,CACA,aAAA,CAAAG,CAAAA,CACA,SAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAGA,UAAA,CAAAtF,CAAAA,CACA,OAAA,CAAAiB,CAAAA,CACA,MAAA,CAAAkB,EACA,iBAAA,CAAAL,EAAAA,CACA,cAAA,CAAAO,CAAAA,CACA,SAAA,CAAAI,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAArC,CAAAA,CACA,SAAA,CAAAK,CAAAA,CACA,qBAAA,CAAAY,CAAAA,CACA,OAAA,CAAAwB,CACF,EAAI4K,CAAAA,CAEE,CAAE,aAAA,CAAAvO,CAAAA,CAAe,oBAAA,CAAAI,CAAqB,CAAA,CAAIL,EAAAA,GAE1C,CAAC6O,CAAAA,CAAW7D,CAAY,CAAA,CAAI7K,WAAAA,CAAwB,IAAI,CAAA,CACxD,CAAC2O,EAAiB7D,CAAkB,CAAA,CAAI9K,WAAAA,CAAoC,IAAI,CAAA,CAEhF4O,EAAAA,CAAMjE,EAAAA,CAAa,CACvB,GAAG0D,CAAAA,CACH,YAAA,CAAAxD,CAAAA,CACA,kBAAA,CAAAC,CACF,CAAC,CAAA,CAGK+D,CAAAA,CAAmB1O,eAAaU,CAAAA,EAAmByN,CAAAA,CAAWzN,CAAM,CAAA,CAAG,CAACyN,CAAU,CAAC,CAAA,CAGnFQ,EAAmBC,UAAAA,CACvB,IAAMP,CAAAA,CACN,CACEA,CAAAA,CAAW,SAAA,CACXA,CAAAA,CAAW,sBAAA,CACXA,EAAW,IAAA,CACXA,CAAAA,CAAW,UAAA,CACXA,CAAAA,CAAW,WAAA,CACXA,CAAAA,CAAW,WAAA,CACXA,CAAAA,CAAW,OAAA,CACXA,CAAAA,CAAW,cAAA,CACXA,CAAAA,CAAW,eAAA,CACXA,CAAAA,CAAW,aAAA,CACXA,CAAAA,CAAW,cACb,CACF,CAAA,CAEMQ,CAAAA,CAAkB7O,cAAAA,CACtB,CAACoI,CAAAA,CAAwBC,EAAAA,GAAuB,CAC1CvC,GACFA,CAAAA,CAAYsC,CAAAA,CAAaC,EAAU,EAEvC,CAAA,CACA,CAACvC,CAAW,CACd,EAGMgJ,EAAAA,CAAaF,UAAAA,CACjB,KAAO,CACL,MAAA,CAAA5I,CAAAA,CACA,SAAA,CAAAwB,CAAAA,CACA,WAAYkH,CAAAA,CACZ,QAAA,CAAA1P,CAAAA,CACA,eAAA,CAAA0H,CAAAA,CACA,SAAA,CAAA6H,CAAAA,CACA,eAAA,CAAAC,EACA,eAAA,CAAA3H,CAAAA,CACA,gBAAA,CAAAT,CAAAA,CACA,UAAA,CAAYuI,CAAAA,CACZ,QAAA,CAAAlJ,CAAAA,CACA,mBAAoByB,CAAAA,CACpB,aAAA,CAAA9B,CAAAA,CACA,aAAA,CAAAQ,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAagJ,EACb,kBAAA,CAAAxJ,CAAAA,CACA,kBAAA,CAAAC,CAAAA,CACA,MAAA,CAAAxC,CAAAA,CACA,SAAA,CAAAwD,CAAAA,CACA,YAAA,CAAArE,CAAAA,CACA,qBAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CACF,CAAA,CAAA,CACA,CACE6D,EACAhH,CAAAA,CACA0H,CAAAA,CACA6H,CAAAA,CACAC,CAAAA,CACA3H,CAAAA,CACAT,CAAAA,CACAuI,CAAAA,CACAlJ,CAAAA,CACAyB,EACA9B,CAAAA,CACAQ,CAAAA,CACAC,CAAAA,CACAR,CAAAA,CACAC,CAAAA,CACAkC,CAAAA,CACAkH,CAAAA,CACAG,CAAAA,CACA/L,EACAwD,CAAAA,CACArE,CAAAA,CACAC,CAAAA,CACAC,CACF,CACF,CAAA,CAGM4M,EAAAA,CAAeH,UAAAA,CACnB,KAAO,CACL,UAAA,CAAApO,CAAAA,CACA,OAAA,CAAAiB,CAAAA,CACA,MAAA,CAAAkB,CAAAA,CACA,iBAAA,CAAAL,GACA,cAAA,CAAAO,CAAAA,CACA,SAAA,CAAAI,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,SAAA,CAAArC,CAAAA,CACA,oBAAAqG,CAAAA,CACA,SAAA,CAAAZ,CAAAA,CACA,SAAA,CAAApF,CAAAA,CACA,qBAAA,CAAAY,CAAAA,CACA,OAAA,CAAAwB,CACF,CAAA,CAAA,CACA,CACE9C,CAAAA,CACAiB,CAAAA,CACAkB,CAAAA,CACAL,EAAAA,CACAO,CAAAA,CACAI,CAAAA,CACAC,CAAAA,CACArC,CAAAA,CACAqG,CAAAA,CACAZ,CAAAA,CACApF,CAAAA,CACAY,CAAAA,CACAwB,CACF,CACF,EAGM0L,EAAAA,CAAYJ,UAAAA,CAAQ,IAAM,CAC9B,IAAMK,CAAAA,CAAgB,EAAC,CACvB,SAASC,EAAAA,CAAStN,EAAAA,CAAuB,CAClCA,EAAAA,GACDA,EAAAA,CAAK,IAAA,GAAS,MAAA,CAChBqN,CAAAA,CAAI,KAAK,GAAGrN,EAAAA,CAAK,IAAI,CAAA,EAErBsN,EAAAA,CAAStN,EAAAA,CAAK,KAAK,CAAA,CACnBsN,GAAStN,EAAAA,CAAK,MAAM,CAAA,CAAA,EAExB,CACA,OAAAsN,EAAAA,CAASlJ,CAAM,CAAA,CACRiJ,CACT,CAAA,CAAG,CAACjJ,CAAM,CAAC,CAAA,CAELmJ,EAAAA,CAAsBP,UAAAA,CAC1B,KAAO,CACL,oBAAA,CAAA7O,CACF,CAAA,CAAA,CACA,CAACA,CAAoB,CACvB,CAAA,CAEA,OACEyN,eAAC9D,EAAAA,CAAqB,QAAA,CAArB,CAA8B,KAAA,CAAOqF,EAAAA,CACpC,QAAA,CAAAvB,cAAAA,CAAChE,EAAAA,CAAmB,QAAA,CAAnB,CAA4B,KAAA,CAAOsF,EAAAA,CAClC,QAAA,CAAAM,eAAAA,CAACzF,EAAAA,CAAsB,QAAA,CAAtB,CAA+B,KAAA,CAAOwF,EAAAA,CACrC,QAAA,CAAA,CAAA3B,cAAAA,CAAC6B,eAAAA,CAAA,CAAW,EAAA,CAAG,oBAAA,CAAsB,GAAGZ,EAAAA,CACrC,QAAA,CAAAH,CAAAA,CACH,CAAA,CACCtP,CAAAA,EAAYwH,CAAAA,EAAc4H,CAAAA,EACzBZ,cAAAA,CAACL,GAAA,CACC,QAAA,CAAUnO,CAAAA,CACV,MAAA,CAASsQ,CAAAA,EAAOlB,CAAAA,CAAkBkB,CAAAA,CAAI9I,CAAW,EACjD,SAAA,CAAW,CAAA,EAAG6H,CAAAA,CAAW,WAAA,EAAe,EAAE,CAAA,CAAA,EACxCrP,CAAAA,GAAa0H,CAAAA,EAAkB2H,EAAW,cAAA,EAAkB,EAC9D,CAAA,CAAA,CAAG,IAAA,EAAK,CACV,CAAA,CAGFb,cAAAA,CAAC,KAAA,CAAA,CAAI,GAAG,oBAAA,CAAqB,KAAA,CAAO,CAAE,OAAA,CAAS,MAAO,CAAA,CACnD,QAAA,CAAAwB,EAAAA,CAAU,IAAK/O,CAAAA,EACduN,cAAAA,CAACC,EAAAA,CAAA,CAEC,KAAA,CAAOxN,CAAAA,CACP,MAAA,CAAQN,CAAAA,CAAcM,CAAK,CAAA,EAAK,IAAA,CAChC,YAAA,CAAcyN,CAAAA,CAAAA,CAHTzN,CAIP,CACD,CAAA,CACH,GACF,CAAA,CACF,CAAA,CACF,CAEJ,EC1NO,SAASsP,EAAAA,CAAW,CACzB,YAAA,CAAA3I,CAAAA,CACA,KAAA,CAAA4I,CAAAA,CACA,SAAA,CAAApO,CAAAA,CACA,gBAAA6C,CAAAA,CACA,WAAA,CAAAwL,CAAAA,CACA,aAAA,CAAArK,CAAAA,CACA,MAAA,CAAAY,CAAAA,CACA,WAAA,CAAAoC,EACA,cAAA,CAAAsH,CAAAA,CACA,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaC,CAAAA,CACb,UAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CACF,CAAA,CAAoB,CAClB,GAAM,CACJ,aAAA,CAAeC,CAAAA,CACf,QAAA,CAAUC,CAAAA,CACV,WAAA,CAAaC,CAAAA,CACb,kBAAA,CAAA9K,CAAAA,CAAqB,EACrB,kBAAA,CAAAC,CAAAA,CAAqB,EAAA,CACrB,MAAA,CAAAxC,CAAAA,CAAS,KACX,CAAA,CAAI8G,EAAAA,EAAe,CAEnB,OAAO5J,cAAAA,CACJX,CAAAA,EAA0C,CACzC,GAAIyD,CAAAA,CAAQ,OACZzD,EAAE,cAAA,EAAe,CACjB,IAAMgM,CAAAA,CAAYzE,CAAAA,CAAa,OAAA,CAC/B,GAAI,CAACyE,EAAW,OAEZsE,CAAAA,EACFA,CAAAA,EAAmB,CAEjBM,CAAAA,EACFA,CAAAA,CAAoB7H,CAAW,CAAA,CAGjC,IAAMgI,CAAAA,CAAO/E,CAAAA,CAAU,qBAAA,EAAsB,CACvCgF,CAAAA,CAAShR,CAAAA,CAAE,OAAA,CACXiR,CAAAA,CAASjR,EAAE,OAAA,CACXkR,CAAAA,CAAkBtM,CAAAA,CAClBiF,CAAAA,CAAY7J,CAAAA,CAAE,aAAA,CAGdmR,CAAAA,CAAgBJ,CAAAA,CAAK,KAAOA,CAAAA,CAAK,KAAA,EAASP,CAAAA,CAAa,GAAA,CAAA,CACvDY,CAAAA,CAAeL,CAAAA,CAAK,GAAA,CAAMA,CAAAA,CAAK,QAAUN,CAAAA,CAAY,GAAA,CAAA,CACrDY,EAAAA,CAAiBN,CAAAA,CAAK,KAAA,EAASL,CAAAA,CAAc,GAAA,CAAA,CAC7CY,CAAAA,CAAkBP,EAAK,MAAA,EAAUJ,CAAAA,CAAe,GAAA,CAAA,CAOhDY,CAAAA,CAJgB,KAAA,CAAM,IAAA,CAC1B,QAAA,CAAS,gBAAA,CAAiB,uCAAuC,CACnE,CAAA,CAAE,MAAA,CAAQ1Q,CAAAA,EAAOA,CAAAA,GAAOgJ,CAAAA,EAAahJ,CAAAA,CAAG,aAAa,gBAAgB,CAAA,GAAMkB,CAAS,CAAA,CAE/C,GAAA,CAAKlB,CAAAA,EAAO,CAC/C,IAAM2Q,EAAI3Q,CAAAA,CAAG,qBAAA,EAAsB,CACnC,OAAOsP,CAAAA,CAAQqB,CAAAA,CAAE,IAAA,CAAOA,CAAAA,CAAE,MAAQ,CAAA,CAAIA,CAAAA,CAAE,GAAA,CAAMA,CAAAA,CAAE,MAAA,CAAS,CAC3D,CAAC,CAAA,CAEGC,EAAoBP,CAAAA,CAExBvH,EAAAA,CAAkB,CAChB,MAAA,CAAQwG,CAAAA,CAAQ,YAAA,CAAe,YAAA,CAC/B,SAAA,CAAAtG,EACA,MAAA,CAAS6H,CAAAA,EAA4B,CACnC,IAAMC,CAAAA,CAAQxB,CAAAA,CAAAA,CACRuB,CAAAA,CAAU,OAAA,CAAUV,GAAUK,EAAAA,CAAkB,GAAA,CAAA,CAChDK,CAAAA,CAAU,OAAA,CAAUT,CAAAA,EAAUK,CAAAA,CAAmB,GAAA,CACjDM,CAAAA,CAAqBV,EAAkBS,CAAAA,CAGvCE,CAAAA,CAAc1B,CAAAA,CAChBgB,CAAAA,CAAAA,CACCE,EAAAA,CAAiBjB,CAAAA,GAAgBwB,CAAAA,CAAqB,GAAA,CAAA,CACvDxB,CAAAA,CAAc,CAAA,CACdgB,CAAAA,CAAAA,CACCE,CAAAA,CAAkBlB,CAAAA,GAAgBwB,CAAAA,CAAqB,GAAA,CAAA,CACxDxB,CAAAA,CAAc,EAEd0B,CAAAA,CAAkB,CAAA,CAAA,CAAA,CAClBC,CAAAA,CAA4B,IAAA,CAEhC,IAAA,IAAWC,EAAAA,IAAOT,CAAAA,CAAgB,CAChC,IAAMU,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAIJ,CAAAA,CAAcG,EAAG,CAAA,CACnCC,CAAAA,CAAOlM,CAAAA,EAAiBkM,EAAOH,CAAAA,GACjCA,CAAAA,CAAkBG,CAAAA,CAClBF,CAAAA,CAAaC,EAAAA,EAEjB,CAEA,IAAIE,CAAAA,CAAoBN,EACpBG,CAAAA,GAAe,IAAA,GACjBG,CAAAA,CAAoB/B,CAAAA,CAAAA,CACd4B,CAAAA,CAAa3B,CAAAA,CAAc,CAAA,CAAIe,CAAAA,GAAkBE,GAAiBjB,CAAAA,CAAAA,CACpE,GAAA,CAAA,CACE2B,CAAAA,CAAa3B,CAAAA,CAAc,CAAA,CAAIgB,CAAAA,GAAiBE,CAAAA,CAAkBlB,CAAAA,CAAAA,CACpE,KAGN,IAAM+B,CAAAA,CAAkB,IAAA,CAAK,GAAA,CAC3BnM,CAAAA,CACA,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAoBiM,CAAiB,CAChD,CAAA,CACAT,CAAAA,CAAoBU,CAAAA,CAGpB,IAAMtE,CAAAA,CAAYpL,EAAAA,CAAsBkE,CAAAA,CAAQoC,EAAaoJ,CAAe,CAAA,CAC5E,GAAItE,CAAAA,CAAW,CACb,GAAM,CAAE,KAAA,CAAOuE,GAAU,SAAA,CAAWC,CAAa,CAAA,CAAI/N,EAAAA,CAAcuJ,CAAS,CAAA,CACtE7B,CAAAA,CAAYzE,CAAAA,CAAa,QAC/B,GAAIyE,CAAAA,CAAW,CACb,IAAA,IAAWjJ,CAAAA,IAAQqP,EAAAA,CACjBpG,CAAAA,CAAU,KAAA,CAAM,YAAY,CAAA,YAAA,EAAejJ,CAAAA,CAAK,MAAM,CAAA,CAAA,CAAI,CAAA,EAAGA,CAAAA,CAAK,IAAI,CAAA,CAAA,CAAG,EACzEiJ,CAAAA,CAAU,KAAA,CAAM,WAAA,CAAY,CAAA,WAAA,EAAcjJ,CAAAA,CAAK,MAAM,CAAA,CAAA,CAAI,CAAA,EAAGA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA,CACvEiJ,CAAAA,CAAU,KAAA,CAAM,WAAA,CAAY,CAAA,aAAA,EAAgBjJ,CAAAA,CAAK,MAAM,CAAA,CAAA,CAAI,CAAA,EAAGA,CAAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA,CAC3EiJ,CAAAA,CAAU,KAAA,CAAM,YAAY,CAAA,cAAA,EAAiBjJ,CAAAA,CAAK,MAAM,CAAA,CAAA,CAAI,CAAA,EAAGA,CAAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA,CAE/E,IAAA,IAAWuP,CAAAA,IAAOD,CAAAA,CAChBrG,CAAAA,CAAU,KAAA,CAAM,WAAA,CACd,CAAA,eAAA,EAAkBsG,EAAI,EAAE,CAAA,CAAA,CACxB,CAAA,EAAGA,CAAAA,CAAI,SAAA,GAAc,KAAA,CAAQA,CAAAA,CAAI,IAAA,CAAOA,EAAI,GAAG,CAAA,CAAA,CACjD,EAEJ,CACF,CAEIzB,CAAAA,EACFA,CAAAA,CAAe9H,CAAAA,CAAaoJ,CAAe,EAE/C,CAAA,CACA,KAAA,CAAO,IAAM,CACX,IAAMI,CAAAA,CAAc9P,EAAAA,CAAsBkE,EAAQoC,CAAAA,CAAa0I,CAAiB,CAAA,CAG1EzF,CAAAA,CAAYzE,CAAAA,CAAa,OAAA,CAC/B,GAAIyE,CAAAA,CAAW,CACb,GAAM,CAAE,KAAA,CAAOoG,CAAAA,CAAU,SAAA,CAAWC,CAAa,CAAA,CAAI/N,EAAAA,CAAciO,CAAW,CAAA,CAC9E,IAAA,IAAWxP,CAAAA,IAAQqP,CAAAA,CACjBpG,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe,CAAA,YAAA,EAAejJ,EAAK,MAAM,CAAA,CAAE,CAAA,CAC3DiJ,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe,CAAA,WAAA,EAAcjJ,CAAAA,CAAK,MAAM,CAAA,CAAE,CAAA,CAC1DiJ,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe,CAAA,aAAA,EAAgBjJ,CAAAA,CAAK,MAAM,CAAA,CAAE,CAAA,CAC5DiJ,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe,CAAA,cAAA,EAAiBjJ,CAAAA,CAAK,MAAM,EAAE,CAAA,CAE/D,IAAA,IAAWuP,CAAAA,IAAOD,CAAAA,CAChBrG,CAAAA,CAAU,KAAA,CAAM,cAAA,CAAe,CAAA,eAAA,EAAkBsG,EAAI,EAAE,CAAA,CAAE,EAE7D,CAEAjC,CAAAA,CAAekC,CAAW,CAAA,CAEtBhC,CAAAA,EACFA,GAAiB,CAEfO,CAAAA,EACFA,CAAAA,CAAkB/H,CAAAA,CAAa0I,CAAiB,EAEpD,CACF,CAAC,EACH,CAAA,CACA,CACElK,CAAAA,CACA4I,CAAAA,CACApO,CAAAA,CACA6C,CAAAA,CACAwL,CAAAA,CACArK,CAAAA,CACAY,EACAoC,CAAAA,CACAsH,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAK,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACA9K,CAAAA,CACAC,EACAuK,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CACF,CACF,CACF,CChMA,IAAM6B,GAA4C,CAAC,CACjD,QAAA,CAAAC,CAAAA,CACA,WAAA,CAAArC,CAAAA,CACA,aAAA,CAAArK,CAAAA,CACA,aAAAwB,CACF,CAAA,GAAM,CACJ,GAAM,CAAE,MAAA,CAAAZ,CAAAA,CAAQ,SAAA,CAAAwB,EAAW,UAAA,CAAA6G,CAAAA,CAAY,MAAA,CAAAvL,CAAO,CAAA,CAAI8G,EAAAA,EAAe,CAC3D,CAACmI,EAAYC,CAAa,CAAA,CAAInS,WAAAA,CAAS,KAAK,CAAA,CAE5C,CACJ,WAAA,CAAAuI,CAAAA,CACA,UAAAhH,CAAAA,CACA,IAAA,CAAAwC,CAAAA,CACA,GAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,EACA,UAAA,CAAA8L,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CACF,CAAA,CAAI8B,CAAAA,CAEEtC,CAAAA,CAAQpO,CAAAA,GAAc,KAAA,CAEtB6Q,CAAAA,CAAoB1C,EAAAA,CAAW,CACnC,aAAA3I,CAAAA,CACA,KAAA,CAAA4I,CAAAA,CACA,SAAA,CAAApO,CAAAA,CACA,eAAA,CAAiBgH,CAAAA,CAAY,eAAA,CAC7B,YAAAqH,CAAAA,CACA,aAAA,CAAArK,CAAAA,CACA,MAAA,CAAAY,CAAAA,CACA,WAAA,CAAAoC,CAAAA,CACA,cAAA,CAAgBZ,EAChB,aAAA,CAAe,IAAMwK,CAAAA,CAAc,IAAI,CAAA,CACvC,WAAA,CAAa,IAAMA,CAAAA,CAAc,KAAK,CAAA,CACtC,UAAA,CAAAnC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CACF,CAAC,CAAA,CAEKkC,CAAAA,CAA6B1C,CAAAA,CAC/B,CACE,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,2BAA2BsC,CAAAA,CAAS,EAAE,CAAA,EAAA,EAAKlO,CAAI,CAAA,KAAA,EAAQ6L,CAAAA,CAAc,CAAC,CAAA,GAAA,CAAA,CAC5E,IAAK,CAAA,KAAA,EAAQ5L,CAAG,CAAA,IAAA,EAAO4L,CAAAA,CAAc,CAAC,CAAA,GAAA,CAAA,CACtC,KAAA,CAAO,CAAA,EAAGA,CAAW,CAAA,EAAA,CAAA,CACrB,MAAA,CAAQ,CAAA,KAAA,EAAQ1L,CAAM,CAAA,IAAA,EAAO0L,CAAW,CAAA,GAAA,CAAA,CACxC,OAAQ3M,CAAAA,CAAS,SAAA,CAAY,YAAA,CAC7B,aAAA,CAAeA,CAAAA,CAAS,MAAA,CAAS,MAAA,CACjC,MAAA,CAAQ,GACR,UAAA,CAAY,MAAA,CACZ,WAAA,CAAa,MAAA,CACb,SAAA,CAAW,YACb,CAAA,CACA,CACE,SAAU,UAAA,CACV,IAAA,CAAM,CAAA,KAAA,EAAQc,CAAI,CAAA,IAAA,EAAO6L,CAAAA,CAAc,CAAC,CAAA,GAAA,CAAA,CACxC,IAAK,CAAA,wBAAA,EAA2BqC,CAAAA,CAAS,EAAE,CAAA,EAAA,EAAKjO,CAAG,CAAA,KAAA,EAAQ4L,CAAAA,CAAc,CAAC,MAC1E,KAAA,CAAO,CAAA,KAAA,EAAQ3L,CAAK,CAAA,IAAA,EAAO2L,CAAW,CAAA,GAAA,CAAA,CACtC,MAAA,CAAQ,CAAA,EAAGA,CAAW,CAAA,EAAA,CAAA,CACtB,MAAA,CAAQ3M,CAAAA,CAAS,SAAA,CAAY,YAAA,CAC7B,aAAA,CAAeA,CAAAA,CAAS,MAAA,CAAS,OACjC,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,MAAA,CACZ,WAAA,CAAa,MAAA,CACb,SAAA,CAAW,YACb,CAAA,CAEJ,OACE0K,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWa,CAAAA,CAAW,OAAA,EAAW,EAAA,CACjC,iBAAgBjN,CAAAA,CAChB,eAAA,CAAe2Q,CAAAA,EAAc,MAAA,CAC7B,KAAA,CAAOG,CAAAA,CACP,aAAA,CAAeD,CAAAA,CACf,KAAK,WAAA,CACL,eAAA,CAAe7J,CAAAA,CAAY,eAAA,CAC3B,eAAA,CAAe,CAAA,CACf,eAAA,CAAe,EAAA,CACjB,CAEJ,CAAA,CAEM+J,EAAAA,CAAsBC,mBAAAA,CAAM,IAAA,CAChC,CAAC,CAAE,MAAA,CAAA1R,CAAAA,CAAQ,WAAAyN,CAAW,CAAA,GACbX,cAAAA,CAAA6E,mBAAAA,CAAA,CAAG,QAAA,CAAAlE,CAAAA,CAAWzN,CAAM,EAAE,CAAA,CAE/B,CAACP,CAAAA,CAAMoH,CAAAA,GAASpH,CAAAA,CAAK,MAAA,GAAWoH,CAAAA,CAAK,MAAA,EAAUpH,EAAK,UAAA,GAAeoH,CAAAA,CAAK,UAC1E,CAAA,CAEa+K,EAAAA,CAAoC,CAAC,CAChD,IAAA,CAAA7R,EACA,WAAA,CAAAgP,CAAAA,CAAc,CAAA,CACd,aAAA,CAAe8C,CACjB,CAAA,GAAM,CACJ,GAAM,CACJ,MAAA,CAAAvM,CAAAA,CACA,UAAA,CAAAmI,CAAAA,CACA,QAAA,CAAAnP,CAAAA,CACA,eAAA,CAAA0H,EACA,eAAA,CAAAG,CAAAA,CACA,gBAAA,CAAAT,CAAAA,CACA,aAAA,CAAeoM,CAAAA,CACf,MAAA,CAAA1P,CAAAA,CACA,WAAAuL,CACF,CAAA,CAAIzE,EAAAA,EAAe,CAEbxE,CAAAA,CACJmN,CAAAA,GAAsB,MAAA,CAAYA,CAAAA,CAAqBC,GAAwB,CAAA,CAE3EpK,CAAAA,CAAc3H,CAAAA,GAAS,MAAA,CAAYA,CAAAA,CAAOuF,CAAAA,CAE1CY,CAAAA,CAAe1H,SAAAA,CAAuB,IAAI,CAAA,CAE1C,CAAE,KAAA,CAAAuT,CAAAA,CAAO,SAAA,CAAAC,CAAU,CAAA,CAAI9D,UAAAA,CAAQ,IAC9BxG,CAAAA,CACEzE,EAAAA,CAAcyE,CAAW,CAAA,CADP,CAAE,KAAA,CAAO,EAAC,CAAG,UAAW,EAAG,CAAA,CAEnD,CAACA,CAAW,CAAC,CAAA,CAEhB,GAAI,CAACA,CAAAA,CAAa,OAAO,IAAA,CAEzB,IAAMuK,CAAAA,CAAgB,IAElBvD,eAAAA,CAAAiD,mBAAAA,CAAA,CACG,QAAA,CAAA,CAAAI,CAAAA,CAAM,GAAA,CAAKrQ,CAAAA,EAAS,CACnB,IAAMwQ,CAAAA,CAAexM,IAAqBhE,CAAAA,CAAK,MAAA,CAC/C,OACEoL,cAAAA,CAAC,KAAA,CAAA,CAEC,KAAA,CAAO,CACL,QAAA,CAAU,WACV,IAAA,CAAMoF,CAAAA,CAAe,IAAA,CAAO,CAAA,gBAAA,EAAmBxQ,CAAAA,CAAK,MAAM,CAAA,EAAA,EAAKA,CAAAA,CAAK,IAAI,CAAA,EAAA,CAAA,CACxE,GAAA,CAAKwQ,CAAAA,CAAe,IAAA,CAAO,CAAA,eAAA,EAAkBxQ,CAAAA,CAAK,MAAM,CAAA,EAAA,EAAKA,EAAK,GAAG,CAAA,EAAA,CAAA,CACrE,KAAA,CAAOwQ,CAAAA,CAAe,MAAA,CAAS,CAAA,iBAAA,EAAoBxQ,CAAAA,CAAK,MAAM,KAAKA,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAC7E,MAAA,CAAQwQ,CAAAA,CACJ,MAAA,CACA,CAAA,kBAAA,EAAqBxQ,CAAAA,CAAK,MAAM,CAAA,EAAA,EAAKA,CAAAA,CAAK,MAAM,CAAA,EAAA,CAAA,CACpD,QAAA,CAAU,QAAA,CACV,MAAA,CAAQwQ,CAAAA,CAAe,GAAK,CAAA,CAC5B,OAAA,CAASxM,CAAAA,EAAoB,CAACwM,CAAAA,CAAe,MAAA,CAAS,OAAA,CACtD,OAAA,CAASA,CAAAA,CAAe,KAAA,CAAQ,CAAA,EAAGnD,CAAAA,CAAc,CAAC,CAAA,EAAA,CAAA,CAClD,SAAA,CAAW,YACb,EAEA,QAAA,CAAAjC,cAAAA,CAAC2E,EAAAA,CAAA,CAAoB,MAAA,CAAQ/P,CAAAA,CAAK,MAAA,CAAQ,UAAA,CAAY+L,EAAY,CAAA,CAAA,CAhB7D/L,CAAAA,CAAK,MAiBZ,CAEJ,CAAC,CAAA,CAEA,CAACgE,CAAAA,EACAsM,EAAU,GAAA,CAAKZ,CAAAA,EACbtE,cAAAA,CAACqE,EAAAA,CAAA,CAEC,QAAA,CAAUC,CAAAA,CACV,WAAA,CAAarC,EACb,aAAA,CAAerK,CAAAA,CACf,YAAA,CAAcwB,CAAAA,CAAAA,CAJTkL,CAAAA,CAAS,EAKhB,CACD,CAAA,CAAA,CACL,EAKJ,GAAIrR,CAAAA,GAAS,MAAA,CAAW,CACtB,IAAMoS,CAAAA,CAAkB7T,CAAAA,GAAa,IAAA,EAAQA,IAAa0H,CAAAA,CAGpDoM,CAAAA,CAAa5S,CAAAA,EAA8B,CAC/C2G,CAAAA,CAAgB3G,CAAE,CAAA,CAChB0G,CAAAA,CAAwD,QAAU1G,EACtE,CAAA,CAEM6S,CAAAA,CAAiB,CAAA,EAAG1E,CAAAA,CAAW,SAAA,EAAa,EAAE,CAAA,CAAA,EAClDwE,CAAAA,EAAkBxE,CAAAA,CAAW,sBAAA,EAA0B,EACzD,CAAA,CAAA,EAAIvL,CAAAA,EAASuL,CAAAA,CAAW,eAAA,EAAmB,EAAO,CAAA,CAAA,CAAG,IAAA,EAAK,CAE1D,OACEb,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKsF,CAAAA,CACL,UAAWC,CAAAA,CACX,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,OACR,QAAA,CAAU,QACZ,CAAA,CAEC,QAAA,CAAAJ,CAAAA,EAAc,CACjB,CAEJ,CAEA,OACEnF,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK5G,CAAAA,CACL,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,MAAO,MAAA,CACP,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,QACZ,CAAA,CAEC,QAAA,CAAA+L,CAAAA,GACH,CAEJ,ECnOA,IAAMK,EAAAA,CAAiB,gBAAA,CACjBC,EAAAA,CAAsB,cAAA,CA0B5B,SAASC,EAAAA,CAAoBC,CAAAA,CAA4B,CACvD,GAAI,CACF,IAAMC,CAAAA,CAAM,YAAA,CAAa,OAAA,CAAQJ,EAAAA,CAAiBG,CAAG,EACrD,GAAIC,CAAAA,GAAQ,IAAA,CAAM,CAChB,IAAMC,CAAAA,CAAS,MAAA,CAAOD,CAAG,EACzB,GAAI,MAAA,CAAO,QAAA,CAASC,CAAM,CAAA,EAAKA,CAAAA,CAAS,CAAA,CAAG,OAAOA,CACpD,CACF,CAAA,KAAQ,CAER,CACA,OAAO,IACT,CAEA,SAASC,GAAqBH,CAAAA,CAAapP,CAAAA,CAAsB,CAC/D,GAAI,CACF,YAAA,CAAa,OAAA,CAAQiP,EAAAA,CAAiBG,EAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAMpP,CAAM,CAAC,CAAC,EACvE,CAAA,KAAQ,CAER,CACF,CAEO,IAAMwP,EAAAA,CAAwD,CAAC,CACpE,QAAA,CAAAjF,CAAAA,CACA,MAAA,CAAA1B,CAAAA,CAAS,IAAA,CACT,MAAA,CAAQ4G,CAAAA,CACR,cAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,EAAY,GAAA,CACZ,SAAA,CAAAC,CAAAA,CAAY,CAAA,CAAA,CAAA,CACZ,OAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,CAAAA,CACA,cAAAC,CAAAA,CAAgB,CAAA,CAChB,SAAA,CAAAzG,CAAAA,CACA,gBAAA,CAAA0G,CACF,CAAA,GAAM,CACJ,IAAMC,CAAAA,CAAaJ,CAAAA,CAAUC,CAAAA,EAAmBZ,EAAAA,CAAsB,IAAA,CAEhEgB,CAAAA,CAAmB,IAAc,CACrC,IAAMC,CAAAA,CAAAA,CAAcF,CAAAA,CAAad,EAAAA,CAAoBc,CAAU,CAAA,CAAI,IAAA,GAASR,CAAAA,EAAc,GAAA,CAC1F,OAAOW,EAAAA,CAAMD,CAAAA,CAAYR,CAAAA,CAAWC,CAAS,CAC/C,CAAA,CAEM,CAACS,CAAAA,CAAgBC,CAAiB,CAAA,CAAIxU,WAAAA,CAAiBoU,CAAgB,CAAA,CACvErN,CAAAA,CAAe1H,SAAAA,CAAuB,IAAI,CAAA,CAG1CoV,EAAkBN,CAAAA,CAAaI,CAAAA,CAAkBZ,CAAAA,EAAcY,CAAAA,CAE/DG,CAAAA,CAAoBrV,SAAAA,CAA2BsU,CAAU,CAAA,CAG/DrU,YAAAA,CAAU,IAAM,CACd,GAAIqU,CAAAA,GAAe,MAAA,EAAaA,CAAAA,GAAee,CAAAA,CAAkB,QAAS,CACxE,IAAMC,CAAAA,CAAUL,EAAAA,CAAMX,CAAAA,CAAYE,CAAAA,CAAWC,CAAS,CAAA,CACtDU,EAAkBG,CAAO,CAAA,CACrBR,CAAAA,EACFV,EAAAA,CAAqBU,CAAAA,CAAYQ,CAAO,EAE5C,CACAD,EAAkB,OAAA,CAAUf,EAC9B,CAAA,CAAG,CAACA,CAAAA,CAAYE,CAAAA,CAAWC,CAAAA,CAAWK,CAAU,CAAC,CAAA,CAGjD,IAAMS,CAAAA,CAAmBzU,cAAAA,CAAY,IAC5B2T,CAAAA,CACN,CAACA,CAAS,CAAC,CAAA,CAER1B,CAAAA,CAAoBjS,cAAAA,CACvBX,CAAAA,EAA0C,CACzCA,CAAAA,CAAE,cAAA,EAAe,CAEjB,IAAMiR,CAAAA,CAASjR,CAAAA,CAAE,OAAA,CACXqV,CAAAA,CAAcJ,CAAAA,CACdK,CAAAA,CAAoBF,CAAAA,EAAiB,CACrCvL,EAAY7J,CAAAA,CAAE,aAAA,CAEduV,CAAAA,CAAeC,EAAAA,CAAgBjO,CAAAA,CAAa,OAAO,CAAA,CACnDkO,CAAAA,CAAiBF,CAAAA,CAAeA,CAAAA,CAAa,SAAA,CAAY,CAAA,CAE3DG,CAAAA,CAAczE,CAAAA,CACd0E,CAAAA,CAAkC,IAAA,CAEhCC,EAAe,CAACC,CAAAA,CAAiBC,CAAAA,GAA6B,CAClE,IAAMC,CAAAA,CAAcD,CAAAA,CAAmBL,CAAAA,CAEjCO,EADaH,CAAAA,CAAU5E,CAAAA,CACG8E,CAAAA,CAC1BE,CAAAA,CAAYnB,EAAAA,CAAMO,CAAAA,CAAcW,CAAAA,CAAY3B,CAAAA,CAAWiB,CAAiB,CAAA,CAE9E,OAAI/N,CAAAA,CAAa,OAAA,GACfA,CAAAA,CAAa,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAS,GAAG0O,CAAS,CAAA,EAAA,CAAA,CAAA,CAE3CA,CACT,CAAA,CAEMC,EAAAA,CAAa,IAAM,CACvB,GAAI,CAACX,CAAAA,CAAc,OAEnB,IAAMY,CAAAA,CACJZ,CAAAA,GAAiB,QAAA,CAAS,eAAA,EAAmBA,CAAAA,GAAiB,SAAS,IAAA,CACnE,CAAE,GAAA,CAAK,CAAA,CAAG,MAAA,CAAQ,MAAA,CAAO,WAA+C,CAAA,CACxEA,CAAAA,CAAa,qBAAA,EAAsB,CAEnCa,CAAAA,CAAY,EAAA,CACZC,CAAAA,CAAW,EAAA,CAEbN,CAAAA,CAAc,CAAA,CACdL,CAAAA,CAAcS,CAAAA,CAAW,MAAA,CAASC,EAEpCL,CAAAA,CADkB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,CAAIL,CAAAA,EAAeS,CAAAA,CAAW,MAAA,CAASC,CAAAA,CAAAA,EAAcA,CAAS,CAAA,CAC/DC,CAAAA,CACjBX,CAAAA,CAAcS,CAAAA,CAAW,GAAA,CAAMC,CAAAA,GAExCL,CAAAA,CAAc,CADI,KAAK,GAAA,CAAI,CAAA,CAAA,CAAII,CAAAA,CAAW,GAAA,CAAMC,CAAAA,CAAYV,CAAAA,EAAeU,CAAS,CAAA,CACzDC,GAGzBN,CAAAA,GAAgB,CAAA,GAClBR,CAAAA,CAAa,SAAA,EAAaQ,CAAAA,CAC1BH,CAAAA,CAAaF,CAAAA,CAAaH,CAAAA,CAAa,SAAS,CAAA,CAAA,CAGlDI,CAAAA,CAAmB,qBAAA,CAAsBO,EAAU,EACrD,CAAA,CAGAP,CAAAA,CAAmB,qBAAA,CAAsBO,EAAU,CAAA,CAEnDvM,EAAAA,CAAkB,CAChB,MAAA,CAAQ,YAAA,CACR,SAAA,CAAAE,CAAAA,CACA,MAAA,CAAS6H,GAA4B,CACnCgE,CAAAA,CAAchE,CAAAA,CAAU,OAAA,CACpB6D,CAAAA,EACFK,CAAAA,CAAaF,CAAAA,CAAaH,CAAAA,CAAa,SAAS,EAEpD,CAAA,CACA,KAAA,CAAO,IAAM,CACPI,CAAAA,GAAqB,IAAA,EACvB,oBAAA,CAAqBA,CAAgB,CAAA,CAIvC,IAAIW,CAAAA,CAAcjB,CAAAA,CACd9N,CAAAA,CAAa,OAAA,GACf+O,CAAAA,CAAc/O,CAAAA,CAAa,QAAQ,qBAAA,EAAsB,CAAE,MAAA,CAAA,CAE7D+O,CAAAA,CAAcxB,EAAAA,CAAMwB,CAAAA,CAAajC,CAAAA,CAAWiB,CAAiB,EAG7DN,CAAAA,CAAkBsB,CAAW,CAAA,CAEzBlC,CAAAA,EACFA,CAAAA,CAAekC,CAAW,CAAA,CAExB3B,CAAAA,EACFV,GAAqBU,CAAAA,CAAY2B,CAAW,EAEhD,CACF,CAAC,EACH,CAAA,CACA,CAACrB,EAAiBZ,CAAAA,CAAWe,CAAAA,CAAkBhB,CAAAA,CAAgBO,CAAU,CAC3E,CAAA,CAEA,OAAKpH,CAAAA,CAiBHwC,gBAAC,KAAA,CAAA,CACC,GAAA,CAAKxI,CAAAA,CACL,SAAA,CAAW,CAAA,2BAAA,EAA8ByG,CAAAA,EAAa,EAAE,CAAA,CAAA,CAAG,MAAK,CAChE,KAAA,CAAO,CACL,MAAA,CAAQ,CAAA,EAAGiH,CAAe,CAAA,EAAA,CAAA,CAC1B,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,QAAA,CACV,SAAA,CAAW,YACb,CAAA,CAGA,QAAA,CAAA,CAAA9G,cAAAA,CAAC,OACC,KAAA,CAAO,CACL,MAAA,CAAQ,CAAA,YAAA,EAAesG,CAAa,CAAA,GAAA,CAAA,CACpC,QAAA,CAAU,QACZ,EAEC,QAAA,CAAAxF,CAAAA,CACH,CAAA,CAGAd,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,wBAAA,EAA2BuG,CAAAA,EAAoB,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK,CACpE,KAAA,CAAO,CACL,MAAA,CAAQ,CAAA,EAAGD,CAAa,KACxB,MAAA,CAAQ,YAAA,CACR,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,EAAA,CACR,UAAA,CAAY,MAAA,CACZ,YAAa,MAAA,CACb,SAAA,CAAW,YAAA,CACX,UAAA,CAAY,CACd,CAAA,CACA,aAAA,CAAe7B,CAAAA,CACf,KAAK,WAAA,CACL,kBAAA,CAAiB,YAAA,CACjB,eAAA,CAAe,IAAA,CAAK,KAAA,CAAMqC,CAAe,CAAA,CACzC,gBAAeZ,CAAAA,CACf,eAAA,CAAeC,CAAAA,GAAc,CAAA,CAAA,CAAA,CAAW,MAAA,CAAYA,CAAAA,CACtD,CAAA,CAAA,CACF,CAAA,CAvDEnG,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAW,CAAA,oCAAA,EAAuCH,CAAAA,EAAa,EAAE,CAAA,CAAA,CAAG,IAAA,GACpE,KAAA,CAAO,CACL,MAAA,CAAQ,MAAA,CACR,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,QAAA,CACV,UAAW,YACb,CAAA,CAEA,QAAA,CAAAG,cAAAA,CAAC,KAAA,CAAA,CAAI,KAAA,CAAO,CAAE,MAAA,CAAQ,OAAQ,QAAA,CAAU,QAAS,CAAA,CAAI,QAAA,CAAAc,CAAAA,CAAS,CAAA,CAChE,CA+CN,EAEA,SAAS6F,EAAAA,CAAMyB,CAAAA,CAAeC,CAAAA,CAAaC,CAAAA,CAAqB,CAC9D,OAAO,IAAA,CAAK,GAAA,CAAID,EAAK,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAKF,CAAK,CAAC,CAC3C,CAEA,SAASf,GAAgBjT,CAAAA,CAA8C,CACrE,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,CAACA,CAAAA,CACpC,OAAO,IAAA,CAGT,IAAMmU,CAAAA,CAASnU,CAAAA,CAAK,aAAA,CACpB,GAAI,CAACmU,CAAAA,CACH,OAAO,QAAA,CAAS,eAAA,CAIlB,IAAMC,CAAAA,CADQ,MAAA,CAAO,gBAAA,CAAiBD,CAAM,EACpB,SAAA,CAGxB,OAFqBC,CAAAA,GAAc,MAAA,EAAUA,CAAAA,GAAc,QAAA,CAGlDD,CAAAA,CAGFlB,EAAAA,CAAgBkB,CAAM,CAC/B,CC5QO,IAAME,EAAAA,CAAmBxM,iBAA4C,IAAI,CAAA,CCYhF,IAAMyM,EAAAA,CAA2D,CAC/D,GAAA,CAAK,CACH,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,EACL,IAAA,CAAM,KAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,MAAA,CAAQ,CACN,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,EACR,IAAA,CAAM,KAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,cAAe,MACjB,CAAA,CACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,KAAA,CACL,KAAM,CAAA,CACN,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CACA,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,KAAA,CACL,KAAA,CAAO,EACP,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,KAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,EACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,MAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,MAAA,CAAQ,aACV,CACF,CAAA,CAEMC,EAAAA,CAAwD,CAC5D,GAAA,CAAK,CACH,QAAA,CAAU,WACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,KAAA,CACR,OAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,MAAA,CAAQ,CACN,SAAU,UAAA,CACV,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,MACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,IAAA,CAAM,CAAA,CACN,MAAO,KAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,MAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,KAAA,CAAO,CAAA,CACP,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,YACb,CAAA,CACA,IAAA,CAAM,CACJ,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,EACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MAAA,CACf,UAAW,YACb,CACF,CAAA,CAEMC,EAAAA,CAAoC,CAAC,CAAE,EAAA,CAAA9G,CAAAA,CAAI,SAAA9L,CAAAA,CAAU,eAAA,CAAA6S,CAAgB,CAAA,GAAM,CAC/E,GAAM,CAAE,UAAA,CAAAC,EAAY,MAAA,CAAAC,CAAO,CAAA,CAAIC,iBAAAA,CAAa,CAAE,EAAA,CAAAlH,CAAG,CAAC,EAClD,OACEF,eAAAA,CAAAiD,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAA7E,cAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAK8I,EAAY,KAAA,CAAOJ,EAAAA,CAAoB1S,CAAQ,CAAA,CAAG,CAAA,CAC3D+S,CAAAA,EAAU/I,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAW6I,CAAAA,CAAiB,KAAA,CAAOF,EAAAA,CAAiB3S,CAAQ,CAAA,CAAG,CAAA,CAAA,CACjF,CAEJ,EAaaiT,EAAAA,CAA4B,CAAC,CAAE,EAAA,CAAAnH,CAAAA,CAAI,QAAA,CAAAhB,CAAAA,CAAU,KAAA,CAAA4D,EAAO,MAAA,CAAQwE,CAAAA,CAAa,KAAM,CAAA,GAAM,CAChG,IAAMC,CAAAA,CAAYzX,SAAAA,CAA8B,IAAI,CAAA,CAC9C,CACJ,MAAA,CAAA8G,CAAAA,CACA,QAAA,CAAAhH,CAAAA,CACA,UAAA,CAAAqP,CAAAA,CACA,iBAAAjI,CAAAA,CACA,kBAAA,CAAAnB,CAAAA,CACA,MAAA,CAAQ2R,CACV,CAAA,CAAIhN,EAAAA,EAAe,CACb,CAAE,UAAA,CAAApJ,CAAAA,CAAY,iBAAA,CAAA8B,CAAAA,CAAmB,SAAA,CAAAW,CAAAA,CAAW,SAAA,CAAApC,CAAU,EAAIkJ,EAAAA,EAAiB,CAC3E8M,CAAAA,CAAiB/M,aAAAA,CAAWH,EAAqB,CAAA,CACvD,GAAI,CAACkN,EACH,MAAM,IAAI,KAAA,CAAM,4CAA4C,CAAA,CAE9D,GAAM,CAAE,oBAAA,CAAA9W,CAAqB,CAAA,CAAI8W,CAAAA,CAE3BC,CAAAA,CAAWlI,UAAAA,CAAQ,IAAM3M,CAAAA,CAAa+D,CAAAA,CAAQsJ,CAAE,CAAA,CAAG,CAACtJ,CAAAA,CAAQsJ,CAAE,CAAC,CAAA,CAC/DyH,CAAAA,CAAkBD,CAAAA,EAAU,IAAMxH,CAAAA,CAClC0H,CAAAA,CAAOF,CAAAA,EAAU,IAAA,EAAQ,CAACxH,CAAE,CAAA,CAC5B2H,CAAAA,CAAcH,GAAU,WAAA,EAAexH,CAAAA,CACvC4H,CAAAA,CAAeJ,CAAAA,EAAU,YAAA,CAEzBpV,CAAAA,CAAWwV,CAAAA,GAAe5H,CAAE,EAC5B6H,CAAAA,CAAcL,CAAAA,EAAU,MAAA,EAAU,KAAA,CAElCM,CAAAA,CAAeV,CAAAA,EAAcS,CAAAA,CAC7BE,CAAAA,CAAsBT,GAAgBQ,CAAAA,CACtCE,CAAAA,CAAsBV,CAAAA,EAAgBQ,CAAAA,CAEtCG,CAAAA,CACJvY,CAAAA,GAAa,IAAA,EACbA,CAAAA,GAAasQ,IACZ,CAAC0H,CAAAA,CAAK,QAAA,CAAShY,CAAQ,CAAA,EAAKgY,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAA,EAC3C,CAACM,CAAAA,CAEG,CAAE,UAAA,CAAAE,CAAAA,CAAY,SAAA,CAAAC,CAAAA,CAAW,UAAA,CAAAnB,EAAW,CAAA,CAAIoB,iBAAAA,CAAa,CACzD,EAAA,CAAApI,CAAAA,CACA,QAAA,CAAU+H,CACZ,CAAC,EAEKM,CAAAA,CAAW3Y,CAAAA,GAAa,IAAA,EAAQgY,CAAAA,CAAK,QAAA,CAAShY,CAAQ,CAAA,CACtD4T,CAAAA,CAAexM,IAAqBkJ,CAAAA,CAEpCsI,CAAAA,CAAkB5X,cAAAA,CAAY,IAEhCwN,cAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKmJ,CAAAA,CACL,GAAI,CAAA,kBAAA,EAAqBM,CAAW,CAAA,CAAA,CACpC,SAAA,CAAU,4BAAA,CACV,KAAA,CAAO,CACL,MAAA,CAAQ,OACR,KAAA,CAAO,MACT,CAAA,CACF,CAAA,CAED,CAACA,CAAW,CAAC,CAAA,CAGhB9X,aAAU,IAAM,CACd,IAAMe,CAAAA,CAAKyW,CAAAA,CAAU,OAAA,CACrB,OAAA5W,CAAAA,CAAqBkX,EAAa/W,CAAE,CAAA,CAC7B,IAAM,CACXH,CAAAA,CAAqBkX,CAAAA,CAAa,IAAI,EACxC,CACF,CAAA,CAAG,CAACA,CAAAA,CAAalX,CAAoB,CAAC,CAAA,CAEtC,IAAM8X,CAAAA,CAA+BjJ,UAAAA,CACnC,KAAO,CACL,UAAA,CAAY+I,CAAAA,CACZ,YAAA,CAAA/E,CAAAA,CACA,gBAAA,CAAkB,IAAM3N,CAAAA,GAAqB2N,CAAAA,CAAe,IAAA,CAAOtD,CAAE,CAAA,CACrE,MAAA,CAAQ,IAAM,CACRsD,GACF3N,CAAAA,GAAqB,IAAI,CAAA,CAE3BzE,CAAAA,CAAWuW,CAAe,EAC5B,CAAA,CACA,QAAA,CAAArV,EACA,cAAA,CAAiBa,CAAAA,EAAY,CAC3BD,CAAAA,CAAkBgN,CAAAA,CAAI/M,CAAO,EAC/B,CAAA,CACA,OAAQ8U,CAAAA,CACR,IAAA,CAAAL,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,SAAA,CAAYhX,CAAAA,EAAUgD,CAAAA,CAAU8T,EAAiB9W,CAAK,CAAA,CACtD,SAAA,CAAYA,CAAAA,EAAU,CAChB2S,CAAAA,EAAgB3S,CAAAA,GAAUgX,CAAAA,EAC5BhS,IAAqB,IAAI,CAAA,CAE3BpE,CAAAA,CAAUZ,CAAK,EACjB,CAAA,CACA,YAAA,CAAAiX,CAAAA,CACA,kBAAmB,CAACjX,CAAAA,CAAOsC,CAAAA,GAAY,CACrCD,CAAAA,CAAkBrC,CAAAA,CAAOsC,CAAO,EAClC,CAAA,CACA,eAAA,CAAAqV,CACF,CAAA,CAAA,CACA,CACED,CAAAA,CACA/E,CAAAA,CACA3N,CAAAA,CACAqK,EACAzO,CAAAA,CACAa,CAAAA,CACAY,CAAAA,CACA+U,CAAAA,CACAL,CAAAA,CACAC,CAAAA,CACAhU,CAAAA,CACA8T,CAAAA,CACAG,EACAU,CACF,CACF,CAAA,CAGME,CAAAA,CAAelJ,UAAAA,CAAQ,IACvByI,CAAAA,CACK,CAAE,SAAU,IAAK,CAAA,CAEnB,CACL,GAAGI,CAAAA,CACH,GAAGD,CACL,CAAA,CACC,CAACC,CAAAA,CAAWD,CAAAA,CAAYH,CAAmB,CAAC,CAAA,CAEzCU,CAAAA,CAAY,CAAA,EAAG1J,CAAAA,CAAW,MAAQ,EAAE,CAAA,CAAA,EACxC+I,CAAAA,EAAe/I,CAAAA,CAAW,UAAA,EAAc,EAC1C,CAAA,CAAA,CAAG,IAAA,GAEH,OACEb,cAAAA,CAACyI,EAAAA,CAAiB,QAAA,CAAjB,CAA0B,KAAA,CAAO6B,CAAAA,CAChC,QAAA,CAAA1I,gBAAC,KAAA,CAAA,CACC,GAAA,CAAKkH,EAAAA,CACL,SAAA,CAAWyB,CAAAA,CACX,KAAA,CAAO,CAAE,QAAA,CAAU,UAAA,CAAY,KAAA,CAAO,MAAA,CAAQ,MAAA,CAAQ,MAAA,CAAQ,GAAG7F,CAAM,CAAA,CAEtE,UAAA5D,CAAAA,CAASuJ,CAAW,CAAA,CAEpBN,CAAAA,EACC/J,cAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,SAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,EACR,MAAA,CAAQ,EAAA,CACR,aAAA,CAAe,MACjB,CAAA,CAEE,QAAA,CAAA,CAAC,KAAA,CAAO,QAAA,CAAU,OAAQ,OAAO,CAAA,CAAY,GAAA,CAAK6D,CAAAA,EAClD7D,cAAAA,CAAC4I,EAAAA,CAAA,CAEC,EAAA,CAAI,QAAQ/E,CAAG,CAAA,CAAA,EAAI/B,CAAE,CAAA,CAAA,CACrB,QAAA,CAAU+B,CAAAA,CACV,eAAA,CAAiBhD,CAAAA,CAAW,aAHvBgD,CAIP,CACD,CAAA,CACH,CAAA,CAGDrS,CAAAA,GAAa,IAAA,EAAQA,CAAAA,GAAasQ,CAAAA,EAAMgI,GACvC9J,cAAAA,CAAC,KAAA,CAAA,CACC,KAAA,CAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,IAAA,CAAM,CAAA,CACN,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,MAAA,CAAQ,EAAA,CACR,cAAe,MACjB,CAAA,CAEA,QAAA,CAAAA,cAAAA,CAAC4I,EAAAA,CAAA,CACC,EAAA,CAAI,CAAA,YAAA,EAAe9G,CAAE,CAAA,CAAA,CACrB,QAAA,CAAS,MAAA,CACT,eAAA,CAAiBjB,CAAAA,CAAW,aAAA,EAAiB,EAAA,CAC/C,CAAA,CACF,GAEJ,CAAA,CACF,CAEJ,EC1TO,IAAM2J,EAAAA,CAAwC,CAAC,CAAE,QAAA,CAAA1J,CAAAA,CAAU,SAAA,CAAAjB,EAAW,KAAA,CAAA6E,CAAM,CAAA,GAAM,CACvF,IAAM+F,CAAAA,CAAYnO,aAAAA,CAAWmM,EAAgB,EAC7C,GAAI,CAACgC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAAA,CAE7D,GAAM,CAAE,QAAA,CAAAC,CAAAA,CAAU,GAAGlV,CAAK,CAAA,CAAIiV,CAAAA,CAE9B,OACEzK,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWH,CAAAA,CACX,KAAA,CAAO,CACL,MAAA,CAAQ6K,CAAAA,CAAW,UAAY,MAAA,CAC/B,UAAA,CAAYA,CAAAA,CAAW,MAAA,CAAS,MAAA,CAChC,WAAA,CAAaA,CAAAA,CAAW,MAAA,CAAS,OACjC,GAAGhG,CACL,CAAA,CACC,GAAIgG,CAAAA,CAAW,EAAC,CAAIlV,CAAAA,CAEpB,SAAAsL,CAAAA,CACH,CAEJ,ECXO,IAAM6J,EAAAA,CAA0B,CAAC,CAAE,EAAA,CAAA7I,CAAAA,CAAI,MAAA,CAAAxM,CAAAA,CAAS,KAAA,CAAO,QAAA,CAAAwL,CAAAA,CAAU,UAAAjB,CAAAA,CAAW,KAAA,CAAA6E,CAAM,CAAA,GAAM,CAC7F,GAAM,CACJ,MAAA,CAAQ0E,EACR,UAAA,CAAAvI,CAAAA,CAAa,EAAC,CACd,SAAA,CAAAE,CAAAA,CACA,eAAA,CAAAC,CACF,CAAA,CAAI5E,EAAAA,EAAe,CACbpB,CAAAA,CAAW1F,CAAAA,EAAU8T,CAAAA,CAErB,CACJ,UAAA,CAAAY,EACA,SAAA,CAAAC,CAAAA,CACA,UAAA,CAAYW,CAAAA,CACZ,UAAA,CAAAC,CACF,CAAA,CAAIX,iBAAAA,CAAa,CACf,EAAA,CAAI,CAAA,WAAA,EAAcpI,CAAE,CAAA,CAAA,CACpB,QAAA,CAAU9G,CACZ,CAAC,CAAA,CAEK,CAAE,UAAA,CAAY8P,CAAAA,CAAY,MAAA,CAAA/B,CAAO,CAAA,CAAIC,iBAAAA,CAAa,CACtD,EAAA,CAAI,YAAYlH,CAAE,CAAA,CAAA,CAClB,QAAA,CAAU9G,CACZ,CAAC,CAAA,CAEKsK,CAAAA,CAAa5S,CAAAA,EAA8B,CAC/CkY,CAAAA,CAAWlY,CAAE,CAAA,CACboY,CAAAA,CAAWpY,CAAE,EACf,CAAA,CAEMqY,CAAAA,CAAehC,GAAUhI,CAAAA,GAAce,CAAAA,CACvCkJ,CAAAA,CAAeD,CAAAA,CAAe/J,CAAAA,CAAkB,IAAA,CAEtD,OACEY,eAAAA,CAAC,OACC,GAAA,CAAK0D,CAAAA,CACL,SAAA,CAAWzF,CAAAA,CACX,KAAA,CAAO,CACL,OAAA,CAAS,aAAA,CACT,SAAU,UAAA,CACV,MAAA,CAAQ7E,CAAAA,CAAW,SAAA,CAAY,MAAA,CAC/B,GAAG0J,CACL,CAAA,CACC,GAAI1J,CAAAA,CAAW,EAAC,CAAIiP,CAAAA,CACpB,GAAIjP,CAAAA,CAAW,EAAC,CAAIgP,EAEpB,QAAA,CAAA,CAAAlJ,CAAAA,CAAS,CAAE,UAAA,CAAA+J,CAAAA,CAAY,MAAA,CAAQE,CAAa,CAAC,EAE7CA,CAAAA,EAAgBC,CAAAA,EACfhL,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWa,CAAAA,CAAW,cAAA,EAAkB,EAAA,CACxC,MAAO,CACL,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,CAAA,CACL,MAAA,CAAQ,CAAA,CACR,KAAA,CAAO,MACP,eAAA,CAAiB,SAAA,CACjB,IAAA,CAAMmK,CAAAA,GAAiB,QAAA,CAAW,CAAA,CAAI,MAAA,CACtC,KAAA,CAAOA,IAAiB,OAAA,CAAU,CAAA,CAAI,MAAA,CACtC,aAAA,CAAe,MAAA,CACf,MAAA,CAAQ,EACV,CAAA,CACF,GAEJ,CAEJ","file":"index.cjs","sourcesContent":["import { useEffect, useRef, useState, useCallback } from 'react'\n\n/**\n * Custom hook to track the latest pointer/touch coordinate relative to the viewport during dragging.\n * This ensures boundary checking coordinates remain accurate even when DOM elements change layout/hidden state.\n */\nexport function useLatestPointer(activeId: string | null) {\n const latestPointerRef = useRef<{ x: number; y: number } | null>(null)\n\n useEffect(() => {\n if (!activeId) {\n latestPointerRef.current = null\n return\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n latestPointerRef.current = { x: e.clientX, y: e.clientY }\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0] || e.changedTouches[0]\n if (touch) {\n latestPointerRef.current = { x: touch.clientX, y: touch.clientY }\n }\n }\n\n window.addEventListener('pointermove', handlePointerMove, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('touchmove', handleTouchMove)\n }\n }, [activeId])\n\n return latestPointerRef\n}\n\n/**\n * Hook to override the body cursor style when drag/hover operations require a specific global cursor (e.g., not-allowed).\n */\nexport function useBodyCursorOverride(isOverLocked: boolean) {\n useEffect(() => {\n if (isOverLocked) {\n document.body.style.setProperty('cursor', 'not-allowed', 'important')\n } else {\n document.body.style.removeProperty('cursor')\n }\n return () => {\n document.body.style.removeProperty('cursor')\n }\n }, [isOverLocked])\n}\n\nexport function usePortalRegistry() {\n const [portalTargets, setPortalTargets] = useState<Record<string, HTMLDivElement | null>>({})\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const registerPortalTarget = useCallback((tabId: string, el: HTMLDivElement | null) => {\n if (!isMountedRef.current) return\n setPortalTargets((prev) => {\n if (prev[tabId] === el) return prev\n return { ...prev, [tabId]: el }\n })\n }, [])\n\n return { portalTargets, registerPortalTarget }\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 { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const newTabs = tree.tabs.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabs: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a pane by recursively splitting the rightmost/bottommost pane in the tree.\n */\nexport function addPane(\n tree: TreeNode | null,\n paneToAdd: string,\n metadata?: Record<string, unknown>,\n): TreeNode {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n }\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: {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n tabsMetadata: metadata ? { [paneToAdd]: metadata } : undefined,\n },\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage } as SplitNode\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabs.includes(tabId) ? tree : null\n }\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabs.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Update metadata on a specific tab node using an updater function.\n */\nexport function updateTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabs.includes(tabId)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[tabId]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[tabId]\n } else {\n newTabsMetadata[tabId] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: updateTabMetadata(tree.first, tabId, updater) ?? tree.first,\n second: updateTabMetadata(tree.second, tabId, updater) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Add a tab directly to a specific target pane node.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === targetPaneId) {\n const newTabs = [...tree.tabs]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = tree.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...tree.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...tree,\n tabs: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: addTab(tree.first, targetPaneId, tabId, metadata) || tree.first,\n second: addTab(tree.second, targetPaneId, tabId, metadata) || tree.second,\n }\n}\n\n/**\n * Update the locked status on a specific pane node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabs]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabs.includes(targetTabId)) {\n const newTabs = [...node.tabs]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabs: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n","export function safeJsonStringify(val: unknown): string {\n try {\n return JSON.stringify(val)\n } catch {\n return ''\n }\n}\n","import { useState, useRef, useEffect, useCallback, SetStateAction } from 'react'\nimport {\n TreeNode,\n SplitDirection,\n SplitNode,\n UseZeugmaOptions,\n ZeugmaController,\n} from '../../../shared'\nimport { DEFAULT_DRAG_ACTIVATION_DISTANCE, DEFAULT_SNAP_THRESHOLD } from '../../../shared/config'\nimport {\n removePane,\n addPane,\n addTab,\n splitPane,\n updateSplitPercentage,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n moveTab,\n removeTab,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n} from '../../../shared/lib/tree'\nimport { safeJsonStringify } from '../../../shared/lib/json'\n\nexport function useZeugma(options: UseZeugmaOptions): ZeugmaController {\n const {\n initialLayout,\n layout: controlledLayout,\n onChange,\n fullscreenPaneId: controlledFullscreenPaneId,\n onFullscreenChange,\n locked: initialLocked = false,\n dragActivationDistance = DEFAULT_DRAG_ACTIVATION_DISTANCE,\n snapThreshold = DEFAULT_SNAP_THRESHOLD,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n enableDragToDismiss = false,\n dismissThreshold = 60,\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n } = options\n\n const [layout, setLocalLayout] = useState<TreeNode | null>(() => {\n return controlledLayout !== undefined ? controlledLayout : (initialLayout ?? null)\n })\n const [prevControlledLayoutJson, setPrevControlledLayoutJson] = useState<string>(() => {\n return safeJsonStringify(controlledLayout !== undefined ? controlledLayout : null)\n })\n const [fullscreenPaneId, setLocalFullscreenPaneId] = useState<string | null>(\n controlledFullscreenPaneId || null,\n )\n const [locked, setLocked] = useState(initialLocked)\n\n const [activeId, setActiveId] = useState<string | null>(null)\n const [activeType, setActiveType] = useState<'pane' | 'tab' | null>(null)\n const [dismissIntentId, setDismissIntentId] = useState<string | null>(null)\n\n const containerRef = useRef<HTMLElement | null>(null)\n\n const setContainerRef = useCallback((element: HTMLElement | null) => {\n containerRef.current = element\n }, [])\n\n // Keep layout and callback refs in sync to make actions and queries completely stable\n const layoutRef = useRef<TreeNode | null>(layout)\n layoutRef.current = layout\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const onFullscreenChangeRef = useRef(onFullscreenChange)\n onFullscreenChangeRef.current = onFullscreenChange\n\n const setFullscreenPaneId = useCallback((paneId: string | null) => {\n setLocalFullscreenPaneId(paneId)\n onFullscreenChangeRef.current?.(paneId)\n }, [])\n\n // Sync state if options change\n useEffect(() => {\n setLocked(initialLocked)\n }, [initialLocked])\n\n useEffect(() => {\n if (controlledFullscreenPaneId !== undefined) {\n setLocalFullscreenPaneId(controlledFullscreenPaneId)\n }\n }, [controlledFullscreenPaneId])\n\n // Sync state if controlled layout changes from outside during render\n if (controlledLayout !== undefined) {\n const currentControlledLayoutJson = safeJsonStringify(controlledLayout)\n if (currentControlledLayoutJson !== prevControlledLayoutJson) {\n setPrevControlledLayoutJson(currentControlledLayoutJson)\n setLocalLayout(controlledLayout)\n }\n }\n\n // A wrapper that computes the layout mutation, updates state, and triggers onChange\n const wrapMutation = useCallback(\n <Args extends unknown[]>(\n mutationFn: (current: TreeNode | null, ...args: Args) => TreeNode | null,\n ) => {\n return (...args: Args) => {\n const prev = layoutRef.current\n const next = mutationFn(prev, ...args)\n\n if (safeJsonStringify(prev) !== safeJsonStringify(next)) {\n layoutRef.current = next\n setLocalLayout(next)\n onChangeRef.current?.(next)\n }\n }\n },\n [],\n )\n\n const handleSetLayout = useCallback(\n wrapMutation((prev, nextLayoutOrUpdater: SetStateAction<TreeNode | null>) => {\n return typeof nextLayoutOrUpdater === 'function'\n ? (nextLayoutOrUpdater as (prev: TreeNode | null) => TreeNode | null)(prev)\n : nextLayoutOrUpdater\n }),\n [wrapMutation],\n )\n\n const setLayout = handleSetLayout\n\n // Layout Modification Actions using wrapped mutation functions\n const handleRemovePane = useCallback(\n wrapMutation((prev, paneId: string) => removePane(prev, paneId)),\n [wrapMutation],\n )\n\n const handleAddPane = useCallback(\n wrapMutation((prev, paneId: string, metadata?: Record<string, unknown>) =>\n addPane(prev, paneId, metadata),\n ),\n [wrapMutation],\n )\n\n const handleAddTab = useCallback(\n wrapMutation(\n (prev, targetPaneId: string, tabId: string, metadata?: Record<string, unknown>) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n\n const sourcePane = findPaneContainingTab(prev, tabId)\n const isAlreadyInTarget = sourcePane && sourcePane.id === targetPane.id\n\n const cleanedPrev = isAlreadyInTarget ? prev : (removeTab(prev, tabId) ?? prev)\n return addTab(cleanedPrev, targetPane.id, tabId, metadata)\n },\n ),\n [wrapMutation],\n )\n\n const handleSplitPane = useCallback(\n wrapMutation(\n (\n prev,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string,\n ) => {\n const targetPane = findPaneById(prev, targetId) ?? findPaneContainingTab(prev, targetId)\n if (!targetPane) return prev\n\n const draggedPaneNode = findPaneById(prev, paneToAdd) ??\n findPaneContainingTab(prev, paneToAdd) ?? {\n type: 'pane',\n id: paneToAdd,\n tabs: [paneToAdd],\n activeTabId: paneToAdd,\n }\n const treeWithoutDragging = removePane(prev, paneToAdd)\n return splitPane(treeWithoutDragging, targetPane.id, direction, splitType, draggedPaneNode)\n },\n ),\n [wrapMutation],\n )\n\n const handleUpdateSplitPercentage = useCallback(\n wrapMutation((prev, currentNode: SplitNode, percentage: number) =>\n updateSplitPercentage(prev, currentNode, percentage),\n ),\n [wrapMutation],\n )\n\n const handleUpdateTabMetadata = useCallback(\n wrapMutation(\n (\n prev,\n tabId: string,\n updater: (\n current: Record<string, unknown> | undefined,\n ) => Record<string, unknown> | undefined,\n ) => updateTabMetadata(prev, tabId, updater),\n ),\n [wrapMutation],\n )\n\n const handleUpdatePaneLock = useCallback(\n wrapMutation((prev, paneId: string, isLocked: boolean) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return updatePaneLock(prev, targetPane.id, isLocked)\n }),\n [wrapMutation],\n )\n\n const handleSelectTab = useCallback(\n wrapMutation((prev, paneId: string, tabId: string) => {\n const targetPane = findPaneById(prev, paneId) ?? findPaneContainingTab(prev, paneId)\n if (!targetPane) return prev\n return selectTab(prev, targetPane.id, tabId)\n }),\n [wrapMutation],\n )\n\n const handleMergeTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetPaneId: string) => {\n const targetPane =\n findPaneById(prev, targetPaneId) ?? findPaneContainingTab(prev, targetPaneId)\n if (!targetPane) return prev\n return mergeTab(prev, draggedTabId, targetPane.id)\n }),\n [wrapMutation],\n )\n\n const handleMoveTab = useCallback(\n wrapMutation((prev, draggedTabId: string, targetTabId: string, position?: 'before' | 'after') =>\n moveTab(prev, draggedTabId, targetTabId, position),\n ),\n [wrapMutation],\n )\n\n const handleRemoveTab = useCallback(\n wrapMutation((prev, tabId: string) => removeTab(prev, tabId)),\n [wrapMutation],\n )\n\n const handleFindPaneById = useCallback(\n (paneId: string) => findPaneById(layoutRef.current, paneId),\n [],\n )\n\n const handleFindPaneContainingTab = useCallback(\n (tabId: string) => findPaneContainingTab(layoutRef.current, tabId),\n [],\n )\n\n const handleFindTabById = useCallback(\n (tabId: string) => findTabById(layoutRef.current, tabId),\n [],\n )\n\n return {\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n activeId,\n setActiveId,\n activeType,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n containerRef,\n setContainerRef,\n\n // Config options\n dragActivationDistance,\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onResizeStart,\n onResize,\n onResizeEnd,\n onDismissIntentChange,\n\n // Actions\n removePane: handleRemovePane,\n addPane: handleAddPane,\n addTab: handleAddTab,\n splitPane: handleSplitPane,\n updateSplitPercentage: handleUpdateSplitPercentage,\n updateTabMetadata: handleUpdateTabMetadata,\n updatePaneLock: handleUpdatePaneLock,\n selectTab: handleSelectTab,\n mergeTab: handleMergeTab,\n moveTab: handleMoveTab,\n removeTab: handleRemoveTab,\n\n // Queries\n findPaneById: handleFindPaneById,\n findPaneContainingTab: handleFindPaneContainingTab,\n findTabById: handleFindTabById,\n } as unknown as ZeugmaController\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 { createContext, useContext } from 'react'\nimport {\n ZeugmaStateValue,\n ZeugmaInternalStateValue,\n ZeugmaActionsValue,\n PortalRegistryValue,\n} from '../model/types'\n\nexport const ZeugmaStateContext = createContext<ZeugmaInternalStateValue | undefined>(undefined)\nexport const ZeugmaActionsContext = createContext<ZeugmaActionsValue | undefined>(undefined)\nexport const PortalRegistryContext = createContext<PortalRegistryValue | undefined>(undefined)\n\nexport const useZeugmaState = (): ZeugmaStateValue => {\n const state = useContext(ZeugmaStateContext)\n if (!state) {\n throw new Error('useZeugmaState must be used within a Zeugma provider')\n }\n return state\n}\n\nexport const useZeugmaActions = (): ZeugmaActionsValue => {\n const actions = useContext(ZeugmaActionsContext)\n if (!actions) {\n throw new Error('useZeugmaActions must be used within a Zeugma provider')\n }\n return actions\n}\n","import { useZeugmaState, useZeugmaActions, ZeugmaContextValue } from '../../../shared'\n\nexport const useZeugmaContext = (): ZeugmaContextValue => {\n const state = useZeugmaState()\n const actions = useZeugmaActions()\n return { ...state, ...actions }\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 { useState, useRef, useCallback, Dispatch, SetStateAction } from 'react'\nimport {\n useSensor,\n useSensors,\n DragStartEvent,\n DragMoveEvent,\n DragEndEvent,\n pointerWithin,\n closestCenter,\n CollisionDetection,\n DroppableContainer,\n} from '@dnd-kit/core'\nimport { SplitDirection, PaneNode, ZeugmaInternalController } from '../../../shared'\nimport {\n removePane as removePaneHelper,\n removeTab as removeTabHelper,\n splitPane as splitPaneHelper,\n findPaneById,\n findPaneContainingTab,\n generateUniqueId,\n} from '../../../shared/lib/tree'\nimport { SmartPointerSensor, SmartTouchSensor } from '../lib/sensors'\nimport { useLatestPointer, useBodyCursorOverride } from './hooks'\n\nfunction getPointerCoordinates(event: Event): { x: number; y: number } | null {\n if (event instanceof MouseEvent || event instanceof PointerEvent) {\n return { x: event.clientX, y: event.clientY }\n }\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\n const touch = event.touches[0] || event.changedTouches[0]\n if (touch) {\n return { x: touch.clientX, y: touch.clientY }\n }\n }\n return null\n}\n\ninterface UseZeugmaDndProps extends ZeugmaInternalController {\n setOverTabId: Dispatch<SetStateAction<string | null>>\n setOverTabPosition: Dispatch<SetStateAction<'before' | 'after' | null>>\n}\n\nexport function useZeugmaDnd(props: UseZeugmaDndProps) {\n const {\n layout,\n setLayout,\n activeId,\n setActiveId,\n setActiveType,\n dismissIntentId,\n setDismissIntentId,\n setOverTabId,\n setOverTabPosition,\n containerRef,\n\n // Config\n dragActivationDistance,\n enableDragToDismiss,\n dismissThreshold,\n\n // Callbacks\n onRemove,\n onDragStart,\n onDragEnd,\n onDismissIntentChange,\n\n // Actions\n removeTab,\n moveTab,\n selectTab,\n } = props\n\n const containerRectRef = useRef<DOMRect | null>(null)\n const latestPointerRef = useLatestPointer(activeId)\n\n const [isOverLocked, setIsOverLocked] = useState(false)\n useBodyCursorOverride(isOverLocked)\n\n const sensors = useSensors(\n useSensor(SmartPointerSensor, {\n activationConstraint: { distance: dragActivationDistance },\n }),\n useSensor(SmartTouchSensor, {\n activationConstraint: { delay: 250, tolerance: 5 },\n }),\n )\n\n const customCollisionDetection = useCallback<CollisionDetection>((args) => {\n const pointerCollisions = pointerWithin(args)\n if (pointerCollisions.length > 0) return pointerCollisions\n\n const activeIdStr = args.active.id.toString()\n if (activeIdStr.startsWith('tab-header-')) {\n const tabDroppables = args.droppableContainers.filter((container: DroppableContainer) =>\n container.id.toString().startsWith('tab-drop-'),\n )\n return closestCenter({ ...args, droppableContainers: tabDroppables })\n }\n return []\n }, [])\n\n const handleDragStart = (event: DragStartEvent) => {\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n setActiveId(draggingId)\n setActiveType(isTabDrag ? 'tab' : 'pane')\n setOverTabId(null)\n setOverTabPosition(null)\n\n const ae = event.activatorEvent\n latestPointerRef.current = getPointerCoordinates(ae)\n\n if (enableDragToDismiss && containerRef.current) {\n containerRectRef.current = containerRef.current.getBoundingClientRect()\n } else {\n containerRectRef.current = null\n }\n\n if (isTabDrag) {\n const parentPane = findPaneContainingTab(layout, draggingId)\n if (parentPane) {\n selectTab(parentPane.id, draggingId)\n }\n }\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 // Handle tab drop hover location\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch && over) {\n const [, targetTabId] = tabDropMatch\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n setOverTabId(targetTabId)\n setOverTabPosition(position)\n } else {\n setOverTabId(null)\n setOverTabPosition(null)\n }\n } else {\n setOverTabId(null)\n setOverTabPosition(null)\n }\n\n if (!enableDragToDismiss) return\n\n const rawId = event.active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n const containerRect = containerRectRef.current\n\n if (!containerRect) {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n return\n }\n\n const ae = event.activatorEvent\n let px: number | null = null\n let py: number | null = null\n\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n py = latestPointerRef.current.y\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n py = coords.y + event.delta.y\n }\n }\n\n let distance = 0\n if (px !== null && py !== null) {\n let dx = 0\n let dy = 0\n\n if (px < containerRect.left) {\n dx = containerRect.left - px\n } else if (px > containerRect.right) {\n dx = px - containerRect.right\n }\n\n if (py < containerRect.top) {\n dy = containerRect.top - py\n } else if (py > containerRect.bottom) {\n dy = py - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n } else {\n const activeRect = event.active.rect.current.translated\n if (activeRect) {\n const cx = activeRect.left + activeRect.width / 2\n const cy = activeRect.top + activeRect.height / 2\n let dx = 0\n let dy = 0\n\n if (cx < containerRect.left) {\n dx = containerRect.left - cx\n } else if (cx > containerRect.right) {\n dx = cx - containerRect.right\n }\n\n if (cy < containerRect.top) {\n dy = containerRect.top - cy\n } else if (cy > containerRect.bottom) {\n dy = cy - containerRect.bottom\n }\n\n distance = Math.sqrt(dx * dx + dy * dy)\n }\n }\n\n const isDismissIntent = distance > dismissThreshold\n if (isDismissIntent) {\n if (dismissIntentId !== draggingId) {\n setDismissIntentId(draggingId)\n onDismissIntentChange?.(draggingId)\n }\n } else {\n if (dismissIntentId !== null) {\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n }\n }\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n const { active, over } = event\n const rawId = active.id.toString()\n const isTabDrag = rawId.startsWith('tab-header-')\n const draggingId = isTabDrag ? rawId.substring(11) : rawId\n\n const wasDismissIntent = enableDragToDismiss && dismissIntentId === draggingId\n\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n\n if (wasDismissIntent) {\n if (onRemove) {\n onRemove(draggingId)\n } else {\n removeTab(draggingId)\n }\n\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n if (!over) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const overIdStr = over.id.toString()\n\n if (overIdStr.startsWith('drop-locked-')) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n // Check for tab reorder drop\n const tabDropMatch = overIdStr.match(/^tab-drop-(.+)$/)\n if (tabDropMatch) {\n const [, targetTabId] = tabDropMatch\n if (draggingId !== targetTabId) {\n let position: 'before' | 'after' = 'before'\n const overRect = over.rect\n const ae = event.activatorEvent\n let px: number | null = null\n if (latestPointerRef.current) {\n px = latestPointerRef.current.x\n } else {\n const coords = getPointerCoordinates(ae)\n if (coords) {\n px = coords.x + event.delta.x\n }\n }\n\n if (px !== null) {\n const center = overRect.left + overRect.width / 2\n if (px > center) {\n position = 'after'\n }\n }\n\n moveTab(draggingId, targetTabId, position)\n if (onDragEnd) {\n onDragEnd(draggingId, targetTabId, { type: 'move', position: 'center' })\n }\n } else {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n }\n return\n }\n\n // Check for edge (split) drop\n const match = overIdStr.match(/^drop-(left|right|top|bottom)-(.+)$/)\n if (!match) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const [, dropZone, targetId] = match\n const parentPane = isTabDrag\n ? findPaneContainingTab(layout, draggingId)\n : findPaneById(layout, draggingId)\n const isParentTarget = parentPane && parentPane.id === targetId\n const isOnlyTab = parentPane && parentPane.tabs.length === 1\n\n if (draggingId === targetId || (isParentTarget && isOnlyTab)) {\n if (onDragEnd) {\n onDragEnd(draggingId, null, null)\n }\n return\n }\n\n const direction: SplitDirection = dropZone === 'left' || dropZone === 'right' ? 'row' : 'column'\n\n let draggedPaneNode: PaneNode\n if (isTabDrag) {\n const originalPane = findPaneContainingTab(layout, draggingId)\n const sourceMetadata = originalPane?.tabsMetadata?.[draggingId]\n draggedPaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n tabsMetadata: sourceMetadata ? { [draggingId]: sourceMetadata } : undefined,\n }\n } else {\n draggedPaneNode = findPaneById(layout, draggingId) ?? {\n type: 'pane',\n id: generateUniqueId(),\n tabs: [draggingId],\n activeTabId: draggingId,\n }\n }\n\n const treeWithoutDragging = isTabDrag\n ? removeTabHelper(layout, draggingId)\n : removePaneHelper(layout, draggingId)\n\n const newLayout = splitPaneHelper(\n treeWithoutDragging,\n targetId,\n direction,\n dropZone as 'left' | 'right' | 'top' | 'bottom',\n draggedPaneNode,\n )\n setLayout(newLayout)\n if (onDragEnd) {\n onDragEnd(draggingId, targetId, {\n type: 'split',\n direction,\n position: dropZone as 'left' | 'right' | 'top' | 'bottom',\n })\n }\n }\n\n const handleDragCancel = () => {\n setActiveId(null)\n setActiveType(null)\n setIsOverLocked(false)\n setOverTabId(null)\n setOverTabPosition(null)\n setDismissIntentId(null)\n onDismissIntentChange?.(null)\n containerRectRef.current = null\n }\n\n return {\n sensors,\n collisionDetection: customCollisionDetection,\n onDragStart: handleDragStart,\n onDragMove: handleDragMove,\n onDragEnd: handleDragEnd,\n onDragCancel: handleDragCancel,\n }\n}\n","import React, { useEffect, useRef, ReactNode } from 'react'\n\nexport const CursorOverlay: React.FC<{\n activeId: string\n render: (id: string) => ReactNode\n className?: string\n}> = ({ activeId, render, className }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handleMove = (e: PointerEvent) => {\n if (ref.current) {\n ref.current.style.transform = `translate(${e.clientX + 12}px, ${e.clientY + 12}px)`\n }\n }\n document.addEventListener('pointermove', handleMove)\n return () => document.removeEventListener('pointermove', handleMove)\n }, [])\n\n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n >\n {render(activeId)}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface PortalHostItemProps {\n tabId: string\n target: HTMLDivElement | null\n renderWidget?: (tabId: string) => React.ReactNode\n}\n\nexport const PortalHostItem: React.FC<PortalHostItemProps> = ({ tabId, target, renderWidget }) => {\n const [mounted, setMounted] = useState(false)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // Move the stable wrapper in the DOM when the target pane element changes\n useEffect(() => {\n if (!mounted || !wrapperRef.current) return\n\n const wrapper = wrapperRef.current\n if (target) {\n target.appendChild(wrapper)\n } else {\n let hiddenContainer = document.getElementById('zeugma-hidden-portal-container')\n if (!hiddenContainer) {\n hiddenContainer = document.createElement('div')\n hiddenContainer.id = 'zeugma-hidden-portal-container'\n hiddenContainer.style.display = 'none'\n document.body.appendChild(hiddenContainer)\n }\n hiddenContainer.appendChild(wrapper)\n }\n }, [target, mounted])\n\n // Clean up the DOM element on unmount\n useEffect(() => {\n return () => {\n if (wrapperRef.current) {\n wrapperRef.current.remove()\n }\n }\n }, [])\n\n if (!mounted) return null\n\n if (!wrapperRef.current) {\n wrapperRef.current = document.createElement('div')\n wrapperRef.current.className = `zeugma-portal-wrapper-${tabId}`\n wrapperRef.current.style.width = '100%'\n wrapperRef.current.style.height = '100%'\n }\n\n const wrapper = wrapperRef.current\n\n if (!wrapper || !renderWidget) return null\n\n return createPortal(renderWidget(tabId), wrapper)\n}\n","import React, { useState, useMemo, useCallback } from 'react'\nimport { DndContext } from '@dnd-kit/core'\nimport {\n TreeNode,\n SplitNode,\n ZeugmaStateContext,\n ZeugmaActionsContext,\n PortalRegistryContext,\n ZeugmaProps,\n ZeugmaInternalController,\n} from '../../../shared'\nimport { usePortalRegistry, useZeugmaDnd } from '../model'\nimport { CursorOverlay } from './CursorOverlay'\nimport { PortalHostItem } from './PortalHostItem'\n\nexport const Zeugma: React.FC<ZeugmaProps> = (props) => {\n const internalProps = props as unknown as ZeugmaInternalController & ZeugmaProps\n const {\n renderPane,\n renderWidget,\n renderDragOverlay,\n classNames = {},\n children,\n\n // Controller state\n layout,\n setLayout,\n fullscreenPaneId,\n setFullscreenPaneId,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n activeId,\n activeType,\n dismissIntentId,\n setContainerRef,\n\n // Configuration settings\n snapThreshold,\n minSplitPercentage,\n maxSplitPercentage,\n\n // Callbacks\n onRemove,\n onResizeStart,\n onResize,\n onResizeEnd,\n\n // Actions\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n splitPane,\n updateSplitPercentage,\n moveTab,\n } = internalProps\n\n const { portalTargets, registerPortalTarget } = usePortalRegistry()\n\n const [overTabId, setOverTabId] = useState<string | null>(null)\n const [overTabPosition, setOverTabPosition] = useState<'before' | 'after' | null>(null)\n\n const dnd = useZeugmaDnd({\n ...internalProps,\n setOverTabId,\n setOverTabPosition,\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.dashboard,\n classNames.dashboardDismissActive,\n classNames.pane,\n classNames.paneLocked,\n classNames.dropPreview,\n classNames.dragOverlay,\n classNames.resizer,\n classNames.dismissPreview,\n classNames.dashboardLocked,\n classNames.lockedPreview,\n classNames.tabDropPreview,\n ],\n )\n\n const handleResizeEnd = useCallback(\n (currentNode: SplitNode, percentage: number) => {\n if (onResizeEnd) {\n onResizeEnd(currentNode, percentage)\n }\n },\n [onResizeEnd],\n )\n\n // State context — reactive values that change during runtime\n const stateValue = useMemo(\n () => ({\n layout,\n setLayout,\n renderPane: stableRenderPane,\n activeId,\n dismissIntentId,\n overTabId,\n overTabPosition,\n setContainerRef,\n fullscreenPaneId,\n classNames: stableClassNames,\n onRemove,\n onFullscreenChange: setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n onResizeEnd: handleResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n }),\n [\n layout,\n activeId,\n dismissIntentId,\n overTabId,\n overTabPosition,\n setContainerRef,\n fullscreenPaneId,\n stableClassNames,\n onRemove,\n setFullscreenPaneId,\n snapThreshold,\n onResizeStart,\n onResize,\n minSplitPercentage,\n maxSplitPercentage,\n setLayout,\n stableRenderPane,\n handleResizeEnd,\n locked,\n setLocked,\n findPaneById,\n findPaneContainingTab,\n findTabById,\n ],\n )\n\n // Actions context — stable dispatch functions that never change identity\n const actionsValue = useMemo(\n () => ({\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n }),\n [\n removePane,\n addPane,\n addTab,\n updateTabMetadata,\n updatePaneLock,\n selectTab,\n mergeTab,\n removeTab,\n setFullscreenPaneId,\n setLocked,\n splitPane,\n updateSplitPercentage,\n moveTab,\n ],\n )\n\n // Collect all tab IDs in the current layout tree\n const allTabIds = useMemo(() => {\n const ids: string[] = []\n function traverse(node: TreeNode | null) {\n if (!node) return\n if (node.type === 'pane') {\n ids.push(...node.tabs)\n } else {\n traverse(node.first)\n traverse(node.second)\n }\n }\n traverse(layout)\n return ids\n }, [layout])\n\n const portalRegistryValue = useMemo(\n () => ({\n registerPortalTarget,\n }),\n [registerPortalTarget],\n )\n\n return (\n <ZeugmaActionsContext.Provider value={actionsValue}>\n <ZeugmaStateContext.Provider value={stateValue}>\n <PortalRegistryContext.Provider value={portalRegistryValue}>\n <DndContext id=\"zeugma-dnd-context\" {...dnd}>\n {children}\n </DndContext>\n {activeId && activeType && renderDragOverlay && (\n <CursorOverlay\n activeId={activeId}\n render={(id) => renderDragOverlay(id, activeType!)}\n className={`${classNames.dragOverlay || ''} ${\n activeId === dismissIntentId ? classNames.dismissPreview || '' : ''\n }`.trim()}\n />\n )}\n {/* Transparent Portal Host to preserve widget state across pane drags */}\n <div id=\"zeugma-portal-host\" style={{ display: 'none' }}>\n {allTabIds.map((tabId) => (\n <PortalHostItem\n key={tabId}\n tabId={tabId}\n target={portalTargets[tabId] || null}\n renderWidget={renderWidget}\n />\n ))}\n </div>\n </PortalRegistryContext.Provider>\n </ZeugmaStateContext.Provider>\n </ZeugmaActionsContext.Provider>\n )\n}\n","import React, { useCallback } from 'react'\nimport {\n TreeNode,\n SplitNode,\n SplitDirection,\n useZeugmaState,\n ZeugmaInternalStateValue,\n} from '../../../shared'\nimport { updateSplitPercentage, computeLayout } from '../../../shared/lib/tree'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\ninterface UseResizerProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n isRow: boolean\n direction: SplitDirection\n splitPercentage: number\n resizerSize: number\n snapThreshold: number\n layout: TreeNode | null\n currentNode: SplitNode\n onLayoutChange: (newLayout: TreeNode | null, localOnly?: boolean) => void\n onResizeStart?: () => void\n onResizeEnd?: () => void\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n onResizeStart: localOnResizeStart,\n onResizeEnd: localOnResizeEnd,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n}: UseResizerProps) {\n const {\n onResizeStart: globalOnResizeStart,\n onResize: globalOnResize,\n onResizeEnd: globalOnResizeEnd,\n minSplitPercentage = 5,\n maxSplitPercentage = 95,\n locked = false,\n } = useZeugmaState() as ZeugmaInternalStateValue\n\n return useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (locked) return\n e.preventDefault()\n const container = containerRef.current\n if (!container) return\n\n if (localOnResizeStart) {\n localOnResizeStart()\n }\n if (globalOnResizeStart) {\n globalOnResizeStart(currentNode)\n }\n\n const rect = container.getBoundingClientRect()\n const startX = e.clientX\n const startY = e.clientY\n const startPercentage = splitPercentage\n const resizerEl = e.currentTarget\n\n // Compute the absolute bounds of the parent split area in pixels\n const splitAreaLeft = rect.left + rect.width * (parentLeft / 100)\n const splitAreaTop = rect.top + rect.height * (parentTop / 100)\n const splitAreaWidth = rect.width * (parentWidth / 100)\n const splitAreaHeight = rect.height * (parentHeight / 100)\n\n // Cache other resizers of the same direction once at drag-start to prevent layout thrashing on move\n const otherResizers = Array.from(\n document.querySelectorAll('div[role=\"separator\"][data-direction]'),\n ).filter((el) => el !== resizerEl && el.getAttribute('data-direction') === direction)\n\n const otherPositions = otherResizers.map((el) => {\n const r = el.getBoundingClientRect()\n return isRow ? r.left + r.width / 2 : r.top + r.height / 2\n })\n\n let currentPercentage = startPercentage\n\n createDragSession({\n cursor: isRow ? 'col-resize' : 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n const delta = isRow\n ? ((moveEvent.clientX - startX) / splitAreaWidth) * 100\n : ((moveEvent.clientY - startY) / splitAreaHeight) * 100\n const proposedPercentage = startPercentage + delta\n\n // Find physical position corresponding to proposed percentage\n const proposedPos = isRow\n ? splitAreaLeft +\n (splitAreaWidth - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n : splitAreaTop +\n (splitAreaHeight - resizerSize) * (proposedPercentage / 100) +\n resizerSize / 2\n\n let closestDistance = Infinity\n let bestTarget: number | null = null\n\n for (const pos of otherPositions) {\n const dist = Math.abs(proposedPos - pos)\n if (dist < snapThreshold && dist < closestDistance) {\n closestDistance = dist\n bestTarget = pos\n }\n }\n\n let snappedPercentage = proposedPercentage\n if (bestTarget !== null) {\n snappedPercentage = isRow\n ? ((bestTarget - resizerSize / 2 - splitAreaLeft) / (splitAreaWidth - resizerSize)) *\n 100\n : ((bestTarget - resizerSize / 2 - splitAreaTop) / (splitAreaHeight - resizerSize)) *\n 100\n }\n\n const finalPercentage = Math.max(\n minSplitPercentage,\n Math.min(maxSplitPercentage, snappedPercentage),\n )\n currentPercentage = finalPercentage\n\n // Update styles live on the DOM container via CSS Variables (avoiding React re-renders)\n const newLayout = updateSplitPercentage(layout, currentNode, finalPercentage)\n if (newLayout) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(newLayout)\n const container = containerRef.current\n if (container) {\n for (const pane of newPanes) {\n container.style.setProperty(`--pane-left-${pane.paneId}`, `${pane.left}%`)\n container.style.setProperty(`--pane-top-${pane.paneId}`, `${pane.top}%`)\n container.style.setProperty(`--pane-width-${pane.paneId}`, `${pane.width}%`)\n container.style.setProperty(`--pane-height-${pane.paneId}`, `${pane.height}%`)\n }\n for (const spl of newSplitters) {\n container.style.setProperty(\n `--splitter-pos-${spl.id}`,\n `${spl.direction === 'row' ? spl.left : spl.top}%`,\n )\n }\n }\n }\n\n if (globalOnResize) {\n globalOnResize(currentNode, finalPercentage)\n }\n },\n onEnd: () => {\n const finalLayout = updateSplitPercentage(layout, currentNode, currentPercentage)\n\n // Clean up CSS variables on resize end\n const container = containerRef.current\n if (container) {\n const { panes: newPanes, splitters: newSplitters } = computeLayout(finalLayout)\n for (const pane of newPanes) {\n container.style.removeProperty(`--pane-left-${pane.paneId}`)\n container.style.removeProperty(`--pane-top-${pane.paneId}`)\n container.style.removeProperty(`--pane-width-${pane.paneId}`)\n container.style.removeProperty(`--pane-height-${pane.paneId}`)\n }\n for (const spl of newSplitters) {\n container.style.removeProperty(`--splitter-pos-${spl.id}`)\n }\n }\n\n onLayoutChange(finalLayout)\n\n if (localOnResizeEnd) {\n localOnResizeEnd()\n }\n if (globalOnResizeEnd) {\n globalOnResizeEnd(currentNode, currentPercentage)\n }\n },\n })\n },\n [\n containerRef,\n isRow,\n direction,\n splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange,\n localOnResizeStart,\n localOnResizeEnd,\n globalOnResizeStart,\n globalOnResize,\n globalOnResizeEnd,\n minSplitPercentage,\n maxSplitPercentage,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n ],\n )\n}\n","import React, { useRef, useMemo, useState } from 'react'\nimport { useZeugmaState, ZeugmaInternalStateValue } from '../../../shared'\nimport { useResizer } from '../../../features/resize-pane'\nimport { TreeNode } from '../../../shared'\nimport { ComputedSplitter, computeLayout } from '../../../shared/lib/tree'\n\nexport interface PaneTreeProps {\n /** The layout subtree node to render. If not specified, defaults to the root layout tree from the Zeugma context. */\n tree?: TreeNode | null\n /** Size/thickness of the split handle resizer bars in pixels (default 4). */\n resizerSize?: number\n /** Threshold distance in pixels to snap layout resizers to adjacent edges (default 8). */\n snapThreshold?: number\n}\n\ninterface FlatSplitterProps {\n splitter: ComputedSplitter\n resizerSize: number\n snapThreshold: number\n containerRef: React.RefObject<HTMLDivElement | null>\n}\n\nconst FlatSplitter: React.FC<FlatSplitterProps> = ({\n splitter,\n resizerSize,\n snapThreshold,\n containerRef,\n}) => {\n const { layout, setLayout, classNames, locked } = useZeugmaState() as ZeugmaInternalStateValue\n const [isResizing, setIsResizing] = useState(false)\n\n const {\n currentNode,\n direction,\n left,\n top,\n width,\n height,\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n } = splitter\n\n const isRow = direction === 'row'\n\n const handlePointerDown = useResizer({\n containerRef,\n isRow,\n direction,\n splitPercentage: currentNode.splitPercentage,\n resizerSize,\n snapThreshold,\n layout,\n currentNode,\n onLayoutChange: setLayout,\n onResizeStart: () => setIsResizing(true),\n onResizeEnd: () => setIsResizing(false),\n parentLeft,\n parentTop,\n parentWidth,\n parentHeight,\n })\n\n const style: React.CSSProperties = isRow\n ? {\n position: 'absolute',\n left: `calc(var(--splitter-pos-${splitter.id}, ${left}%) - ${resizerSize / 2}px)`,\n top: `calc(${top}% + ${resizerSize / 2}px)`,\n width: `${resizerSize}px`,\n height: `calc(${height}% - ${resizerSize}px)`,\n cursor: locked ? 'default' : 'col-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n : {\n position: 'absolute',\n left: `calc(${left}% + ${resizerSize / 2}px)`,\n top: `calc(var(--splitter-pos-${splitter.id}, ${top}%) - ${resizerSize / 2}px)`,\n width: `calc(${width}% - ${resizerSize}px)`,\n height: `${resizerSize}px`,\n cursor: locked ? 'default' : 'row-resize',\n pointerEvents: locked ? 'none' : 'auto',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n }\n\n return (\n <div\n className={classNames.resizer || ''}\n data-direction={direction}\n data-resizing={isResizing || undefined}\n style={style}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-valuenow={currentNode.splitPercentage}\n aria-valuemin={5}\n aria-valuemax={95}\n />\n )\n}\n\nconst MemoizedPaneContent = React.memo(\n ({ paneId, renderPane }: { paneId: string; renderPane: (id: string) => React.ReactNode }) => {\n return <>{renderPane(paneId)}</>\n },\n (prev, next) => prev.paneId === next.paneId && prev.renderPane === next.renderPane,\n)\n\nexport const PaneTree: React.FC<PaneTreeProps> = ({\n tree,\n resizerSize = 4,\n snapThreshold: propSnapThreshold,\n}) => {\n const {\n layout,\n renderPane,\n activeId,\n dismissIntentId,\n setContainerRef,\n fullscreenPaneId,\n snapThreshold: contextSnapThreshold,\n locked,\n classNames,\n } = useZeugmaState() as ZeugmaInternalStateValue\n\n const snapThreshold =\n propSnapThreshold !== undefined ? propSnapThreshold : (contextSnapThreshold ?? 8)\n\n const currentNode = tree !== undefined ? tree : layout\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const { panes, splitters } = useMemo(() => {\n if (!currentNode) return { panes: [], splitters: [] }\n return computeLayout(currentNode)\n }, [currentNode])\n\n if (!currentNode) return null\n\n const renderContent = () => {\n return (\n <>\n {panes.map((pane) => {\n const isFullscreen = fullscreenPaneId === pane.paneId\n return (\n <div\n key={pane.paneId}\n style={{\n position: 'absolute',\n left: isFullscreen ? '0%' : `var(--pane-left-${pane.paneId}, ${pane.left}%)`,\n top: isFullscreen ? '0%' : `var(--pane-top-${pane.paneId}, ${pane.top}%)`,\n width: isFullscreen ? '100%' : `var(--pane-width-${pane.paneId}, ${pane.width}%)`,\n height: isFullscreen\n ? '100%'\n : `var(--pane-height-${pane.paneId}, ${pane.height}%)`,\n overflow: 'hidden',\n zIndex: isFullscreen ? 20 : 1,\n display: fullscreenPaneId && !isFullscreen ? 'none' : 'block',\n padding: isFullscreen ? '0px' : `${resizerSize / 2}px`,\n boxSizing: 'border-box',\n }}\n >\n <MemoizedPaneContent paneId={pane.paneId} renderPane={renderPane} />\n </div>\n )\n })}\n\n {!fullscreenPaneId &&\n splitters.map((splitter) => (\n <FlatSplitter\n key={splitter.id}\n splitter={splitter}\n resizerSize={resizerSize}\n snapThreshold={snapThreshold}\n containerRef={containerRef}\n />\n ))}\n </>\n )\n }\n\n // Only render RootDropZones at the top-level PaneTree (where tree is undefined)\n if (tree === undefined) {\n const isDismissActive = activeId !== null && activeId === dismissIntentId\n\n // Merge container refs\n const handleRef = (el: HTMLDivElement | null) => {\n setContainerRef(el)\n ;(containerRef as React.RefObject<HTMLDivElement | null>).current = el\n }\n\n const dashboardClass = `${classNames.dashboard || ''} ${\n isDismissActive ? classNames.dashboardDismissActive || '' : ''\n } ${locked ? classNames.dashboardLocked || '' : ''}`.trim()\n\n return (\n <div\n ref={handleRef}\n className={dashboardClass}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {renderContent()}\n </div>\n )\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createDragSession } from '../../../shared/lib/drag-session'\n\nconst STORAGE_PREFIX = 'zeugma-height:'\nconst DEFAULT_PERSIST_KEY = 'default-pane'\n\nexport interface ResizableContainerProps {\n children: React.ReactNode\n /** Whether the resizable container is active. When false, acts as a normal 100% height container. */\n active?: boolean\n /** Current height in pixels (controlled mode) or default/initial height */\n height?: number\n /** Called when the height changes during or after a drag */\n onHeightChange?: (height: number) => void\n /** Minimum height in pixels (default: 100) */\n minHeight?: number\n /** Maximum height in pixels (default: Infinity — bounded by parent) */\n maxHeight?: number\n /** Whether to persist height in localStorage */\n persist?: boolean\n /** Custom localStorage key to save the height under (default: 'default-pane') */\n localStorageKey?: string\n /** Height of the resizer handle in pixels (default: 6) */\n resizerHeight?: number\n /** CSS class applied to the outer container div */\n className?: string\n /** CSS class applied to the resizer handle */\n resizerClassName?: string\n}\n\nfunction readPersistedHeight(key: string): number | null {\n try {\n const raw = localStorage.getItem(STORAGE_PREFIX + key)\n if (raw !== null) {\n const parsed = Number(raw)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n } catch {\n // localStorage may be unavailable (SSR, private browsing, etc.)\n }\n return null\n}\n\nfunction writePersistedHeight(key: string, height: number): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, String(Math.round(height)))\n } catch {\n // Silently ignore storage errors\n }\n}\n\nexport const ResizableContainer: React.FC<ResizableContainerProps> = ({\n children,\n active = true,\n height: heightProp,\n onHeightChange,\n minHeight = 100,\n maxHeight = Infinity,\n persist,\n localStorageKey,\n resizerHeight = 6,\n className,\n resizerClassName,\n}) => {\n const storageKey = persist ? localStorageKey || DEFAULT_PERSIST_KEY : null\n\n const getInitialHeight = (): number => {\n const baseHeight = (storageKey ? readPersistedHeight(storageKey) : null) ?? heightProp ?? 400\n return clamp(baseHeight, minHeight, maxHeight)\n }\n\n const [internalHeight, setInternalHeight] = useState<number>(getInitialHeight)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Determine effective height: if persist is set, use internal state; otherwise use prop\n const effectiveHeight = storageKey ? internalHeight : (heightProp ?? internalHeight)\n\n const prevHeightPropRef = useRef<number | undefined>(heightProp)\n\n // Sync from controlled prop when changed\n useEffect(() => {\n if (heightProp !== undefined && heightProp !== prevHeightPropRef.current) {\n const clamped = clamp(heightProp, minHeight, maxHeight)\n setInternalHeight(clamped)\n if (storageKey) {\n writePersistedHeight(storageKey, clamped)\n }\n }\n prevHeightPropRef.current = heightProp\n }, [heightProp, minHeight, maxHeight, storageKey])\n\n // Resolve maxHeight\n const resolveMaxHeight = useCallback((): number => {\n return maxHeight\n }, [maxHeight])\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault()\n\n const startY = e.clientY\n const startHeight = effectiveHeight\n const resolvedMaxHeight = resolveMaxHeight()\n const resizerEl = e.currentTarget\n\n const scrollParent = getScrollParent(containerRef.current)\n const startScrollTop = scrollParent ? scrollParent.scrollTop : 0\n\n let lastClientY = startY\n let animationFrameId: number | null = null\n\n const updateHeight = (clientY: number, currentScrollTop: number) => {\n const scrollDelta = currentScrollTop - startScrollTop\n const mouseDelta = clientY - startY\n const totalDelta = mouseDelta + scrollDelta\n const newHeight = clamp(startHeight + totalDelta, minHeight, resolvedMaxHeight)\n\n if (containerRef.current) {\n containerRef.current.style.height = `${newHeight}px`\n }\n return newHeight\n }\n\n const scrollLoop = () => {\n if (!scrollParent) return\n\n const parentRect =\n scrollParent === document.documentElement || scrollParent === document.body\n ? { top: 0, bottom: window.innerHeight, left: 0, right: window.innerWidth }\n : scrollParent.getBoundingClientRect()\n\n const threshold = 40\n const maxSpeed = 10\n\n let scrollDelta = 0\n if (lastClientY > parentRect.bottom - threshold) {\n const intensity = Math.min(1, (lastClientY - (parentRect.bottom - threshold)) / threshold)\n scrollDelta = intensity * maxSpeed\n } else if (lastClientY < parentRect.top + threshold) {\n const intensity = Math.min(1, (parentRect.top + threshold - lastClientY) / threshold)\n scrollDelta = -intensity * maxSpeed\n }\n\n if (scrollDelta !== 0) {\n scrollParent.scrollTop += scrollDelta\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n\n animationFrameId = requestAnimationFrame(scrollLoop)\n }\n\n // Start the auto-scroll animation loop\n animationFrameId = requestAnimationFrame(scrollLoop)\n\n createDragSession({\n cursor: 'row-resize',\n resizerEl,\n onMove: (moveEvent: PointerEvent) => {\n lastClientY = moveEvent.clientY\n if (scrollParent) {\n updateHeight(lastClientY, scrollParent.scrollTop)\n }\n },\n onEnd: () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId)\n }\n\n // Read the final height from the DOM\n let finalHeight = startHeight\n if (containerRef.current) {\n finalHeight = containerRef.current.getBoundingClientRect().height\n }\n finalHeight = clamp(finalHeight, minHeight, resolvedMaxHeight)\n\n // Commit to React state\n setInternalHeight(finalHeight)\n\n if (onHeightChange) {\n onHeightChange(finalHeight)\n }\n if (storageKey) {\n writePersistedHeight(storageKey, finalHeight)\n }\n },\n })\n },\n [effectiveHeight, minHeight, resolveMaxHeight, onHeightChange, storageKey],\n )\n\n if (!active) {\n return (\n <div\n className={`zeugma-resizable-container disabled ${className || ''}`.trim()}\n style={{\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ height: '100%', overflow: 'hidden' }}>{children}</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={`zeugma-resizable-container ${className || ''}`.trim()}\n style={{\n height: `${effectiveHeight}px`,\n position: 'relative',\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n {/* Content area fills entire container minus the resizer */}\n <div\n style={{\n height: `calc(100% - ${resizerHeight}px)`,\n overflow: 'hidden',\n }}\n >\n {children}\n </div>\n\n {/* Resizer handle */}\n <div\n className={`zeugma-resizable-handle ${resizerClassName || ''}`.trim()}\n style={{\n height: `${resizerHeight}px`,\n cursor: 'row-resize',\n position: 'relative',\n zIndex: 10,\n userSelect: 'none',\n touchAction: 'none',\n boxSizing: 'border-box',\n flexShrink: 0,\n }}\n onPointerDown={handlePointerDown}\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-valuenow={Math.round(effectiveHeight)}\n aria-valuemin={minHeight}\n aria-valuemax={maxHeight === Infinity ? undefined : maxHeight}\n />\n </div>\n )\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction getScrollParent(node: HTMLElement | null): HTMLElement | null {\n if (typeof window === 'undefined' || !node) {\n return null\n }\n\n const parent = node.parentElement\n if (!parent) {\n return document.documentElement\n }\n\n const style = window.getComputedStyle(parent)\n const overflowY = style.overflowY\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll'\n\n if (isScrollable) {\n return parent\n }\n\n return getScrollParent(parent)\n}\n","import React, { createContext } from 'react'\n\nexport interface DragListenersCtxValue extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean\n}\n\nexport const DragListenersCtx = createContext<DragListenersCtxValue | null>(null)\n","import React, { useMemo, useCallback, useEffect, useContext, useRef } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport {\n useZeugmaState,\n useZeugmaActions,\n PortalRegistryContext,\n ZeugmaInternalStateValue,\n} from '../../../shared'\nimport { DragListenersCtx } from '../model/context'\nimport { PaneRenderProps } from '../model/types'\nimport { findPaneById } from '../../../shared/lib/tree'\n\ninterface DropZoneProps {\n id: string\n position: 'top' | 'bottom' | 'left' | 'right' | 'full' | 'top-header'\n activeClassName?: string\n}\n\nconst activationPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: '25%',\n width: '50%',\n height: '25%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n left: {\n position: 'absolute',\n top: '25%',\n left: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n right: {\n position: 'absolute',\n top: '25%',\n right: 0,\n width: '25%',\n height: '50%',\n zIndex: 20,\n pointerEvents: 'auto',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 20,\n pointerEvents: 'auto',\n cursor: 'not-allowed',\n },\n}\n\nconst previewPositions: Record<string, React.CSSProperties> = {\n top: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n bottom: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n left: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n right: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '50%',\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n full: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 21,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n },\n}\n\nconst DropZone: React.FC<DropZoneProps> = ({ id, position, activeClassName }) => {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <>\n <div ref={setNodeRef} style={activationPositions[position]} />\n {isOver && <div className={activeClassName} style={previewPositions[position]} />}\n </>\n )\n}\n\nexport interface PaneProps {\n /** The unique ID of the pane, matching a `paneId` in the layout tree schema. */\n id: string\n /** Render prop function providing pane state (isDragging, isFullscreen, etc.) and handlers. */\n children: (props: PaneRenderProps) => React.ReactNode\n /** Optional inline CSS styles applied to the pane outer container. */\n style?: React.CSSProperties\n /** Optional override to lock this specific pane. */\n locked?: boolean\n}\n\nexport const Pane: React.FC<PaneProps> = ({ id, children, style, locked: propLocked = false }) => {\n const targetRef = useRef<HTMLDivElement | null>(null)\n const {\n layout,\n activeId,\n classNames,\n fullscreenPaneId,\n onFullscreenChange,\n locked: globalLocked,\n } = useZeugmaState() as ZeugmaInternalStateValue\n const { removePane, updateTabMetadata, selectTab, removeTab } = useZeugmaActions()\n const portalRegistry = useContext(PortalRegistryContext)\n if (!portalRegistry) {\n throw new Error('Pane must be used within a Zeugma provider')\n }\n const { registerPortalTarget } = portalRegistry\n\n const paneNode = useMemo(() => findPaneById(layout, id), [layout, id])\n const paneContainerId = paneNode?.id ?? id\n const tabs = paneNode?.tabs ?? [id]\n const activeTabId = paneNode?.activeTabId ?? id\n const tabsMetadata = paneNode?.tabsMetadata\n\n const metadata = tabsMetadata?.[id]\n const localLocked = paneNode?.locked ?? false\n\n const isPaneLocked = propLocked || localLocked\n const isDraggableDisabled = globalLocked || isPaneLocked\n const isDroppableDisabled = globalLocked || isPaneLocked\n\n const showDropZones =\n activeId !== null &&\n activeId !== id &&\n (!tabs.includes(activeId) || tabs.length > 1) &&\n !isDroppableDisabled\n\n const { attributes, listeners, setNodeRef } = useDraggable({\n id,\n disabled: isDraggableDisabled,\n })\n\n const dragging = activeId !== null && tabs.includes(activeId)\n const isFullscreen = fullscreenPaneId === id\n\n const renderActiveTab = useCallback(() => {\n return (\n <div\n ref={targetRef}\n id={`zeugma-tab-target-${activeTabId}`}\n className=\"zeugma-tab-content-wrapper\"\n style={{\n height: '100%',\n width: '100%',\n }}\n />\n )\n }, [activeTabId])\n\n // Register portal targets using targetRef to avoid race conditions during drag & layout changes\n useEffect(() => {\n const el = targetRef.current\n registerPortalTarget(activeTabId, el)\n return () => {\n registerPortalTarget(activeTabId, null)\n }\n }, [activeTabId, registerPortalTarget])\n\n const renderProps: PaneRenderProps = useMemo(\n () => ({\n isDragging: dragging,\n isFullscreen,\n toggleFullscreen: () => onFullscreenChange?.(isFullscreen ? null : id),\n remove: () => {\n if (isFullscreen) {\n onFullscreenChange?.(null)\n }\n removePane(paneContainerId)\n },\n metadata,\n updateMetadata: (updater) => {\n updateTabMetadata(id, updater)\n },\n locked: isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab: (tabId) => selectTab(paneContainerId, tabId),\n removeTab: (tabId) => {\n if (isFullscreen && tabId === activeTabId) {\n onFullscreenChange?.(null)\n }\n removeTab(tabId)\n },\n tabsMetadata,\n updateTabMetadata: (tabId, updater) => {\n updateTabMetadata(tabId, updater)\n },\n renderActiveTab,\n }),\n [\n dragging,\n isFullscreen,\n onFullscreenChange,\n id,\n removeTab,\n metadata,\n updateTabMetadata,\n isDraggableDisabled,\n tabs,\n activeTabId,\n selectTab,\n paneContainerId,\n tabsMetadata,\n renderActiveTab,\n ],\n )\n\n // Best practice: Memoize drag context value to prevent unnecessary re-renders of the drag handle.\n const contextValue = useMemo(() => {\n if (isDraggableDisabled) {\n return { disabled: true }\n }\n return {\n ...listeners,\n ...attributes,\n }\n }, [listeners, attributes, isDraggableDisabled])\n\n const paneClass = `${classNames.pane || ''} ${\n isPaneLocked ? classNames.paneLocked || '' : ''\n }`.trim()\n\n return (\n <DragListenersCtx.Provider value={contextValue}>\n <div\n ref={setNodeRef}\n className={paneClass}\n style={{ position: 'relative', width: '100%', height: '100%', ...style }}\n >\n {children(renderProps)}\n\n {showDropZones && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n {(['top', 'bottom', 'left', 'right'] as const).map((pos) => (\n <DropZone\n key={pos}\n id={`drop-${pos}-${id}`}\n position={pos}\n activeClassName={classNames.dropPreview}\n />\n ))}\n </div>\n )}\n\n {activeId !== null && activeId !== id && isDroppableDisabled && (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 15,\n pointerEvents: 'none',\n }}\n >\n <DropZone\n id={`drop-locked-${id}`}\n position=\"full\"\n activeClassName={classNames.lockedPreview || ''}\n />\n </div>\n )}\n </div>\n </DragListenersCtx.Provider>\n )\n}\n","import React, { useContext } from 'react'\nimport { DragListenersCtx } from '../model/context'\n\nexport interface DragHandleProps {\n /** The children elements that will trigger dragging when held and dragged. */\n children?: React.ReactNode\n /** Custom CSS class applied to the drag handle element. */\n className?: string\n /** Optional inline CSS styles applied to the drag handle. */\n style?: React.CSSProperties\n}\n\nexport const DragHandle: React.FC<DragHandleProps> = ({ children, className, style }) => {\n const dragProps = useContext(DragListenersCtx)\n if (!dragProps) {\n throw new Error('<DragHandle> must be used inside a <Pane>')\n }\n const { disabled, ...rest } = dragProps\n\n return (\n <div\n className={className}\n style={{\n cursor: disabled ? 'default' : 'grab',\n userSelect: disabled ? 'auto' : 'none',\n touchAction: disabled ? 'auto' : 'none',\n ...style,\n }}\n {...(disabled ? {} : rest)}\n >\n {children}\n </div>\n )\n}\n","import React from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport { useZeugmaState, ZeugmaInternalStateValue } from '../../../shared'\n\nexport interface TabRenderProps {\n isDragging: boolean\n isOver: boolean\n}\n\nexport interface TabProps {\n /** The unique ID of the tab, which corresponds to the pane/widget ID. */\n id: string\n /** Whether dragging is locked on this tab. */\n locked?: boolean\n /** Render prop child function. */\n children: (props: TabRenderProps) => React.ReactNode\n /** Custom CSS class applied to the tab wrapper. */\n className?: string\n /** Custom inline CSS style applied to the tab wrapper. */\n style?: React.CSSProperties\n}\n\nexport const Tab: React.FC<TabProps> = ({ id, locked = false, children, className, style }) => {\n const {\n locked: globalLocked,\n classNames = {},\n overTabId,\n overTabPosition,\n } = useZeugmaState() as ZeugmaInternalStateValue\n const isLocked = locked || globalLocked\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n isDragging,\n } = useDraggable({\n id: `tab-header-${id}`,\n disabled: isLocked,\n })\n\n const { setNodeRef: setDropRef, isOver } = useDroppable({\n id: `tab-drop-${id}`,\n disabled: isLocked,\n })\n\n const handleRef = (el: HTMLDivElement | null) => {\n setDragRef(el)\n setDropRef(el)\n }\n\n const isTargetOver = isOver && overTabId === id\n const dropPosition = isTargetOver ? overTabPosition : null\n\n return (\n <div\n ref={handleRef}\n className={className}\n style={{\n display: 'inline-flex',\n position: 'relative',\n cursor: isLocked ? 'default' : 'grab',\n ...style,\n }}\n {...(isLocked ? {} : listeners)}\n {...(isLocked ? {} : attributes)}\n >\n {children({ isDragging, isOver: isTargetOver })}\n\n {isTargetOver && dropPosition && (\n <div\n className={classNames.tabDropPreview || ''}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '2px',\n backgroundColor: '#6366f1',\n left: dropPosition === 'before' ? 0 : undefined,\n right: dropPosition === 'after' ? 0 : undefined,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n />\n )}\n </div>\n )\n}\n"]}
|