{"version":3,"file":"react-resizable-panels.cjs","sources":["../lib/utils/assert.ts","../lib/global/dom/calculateAvailableGroupSize.ts","../lib/components/group/sortByElementOffset.ts","../lib/utils/isHTMLElement.ts","../lib/global/utils/getDistanceBetweenPointAndRect.ts","../lib/global/utils/findClosestRect.ts","../lib/global/dom/calculateHitRegions.ts","../lib/global/styles/convertEmToPixels.ts","../lib/global/styles/convertRemToPixels.ts","../lib/global/styles/convertVhToPixels.ts","../lib/global/styles/convertVwToPixels.ts","../lib/global/styles/parseSizeAndUnit.ts","../lib/global/styles/sizeStyleToPixels.ts","../lib/global/utils/formatLayoutNumber.ts","../lib/global/dom/calculatePanelConstraints.ts","../lib/utils/EventEmitter.ts","../lib/global/utils/layoutNumbersEqual.ts","../lib/global/mutableState.ts","../lib/utils/isArrayEqual.ts","../lib/global/utils/compareLayoutNumbers.ts","../lib/global/utils/validatePanelSize.ts","../lib/global/utils/adjustLayoutByDelta.ts","../lib/global/utils/findSeparatorGroup.ts","../lib/global/utils/layoutsEqual.ts","../lib/global/utils/validatePanelGroupLayout.ts","../lib/global/utils/getImperativeGroupMethods.ts","../lib/global/utils/getMountedGroup.ts","../lib/global/utils/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onDocumentKeyDown.ts","../lib/constants.ts","../lib/global/utils/findClosetHitRegion.ts","../lib/global/utils/isCoarsePointer.ts","../lib/utils/isShadowRoot.ts","../lib/vendor/stacking-order.ts","../lib/global/utils/doRectsIntersect.ts","../lib/global/utils/isViableHitTarget.ts","../lib/global/utils/findMatchingHitRegions.ts","../lib/global/event-handlers/onDocumentPointerDown.ts","../lib/global/cursor/getCursorStyle.ts","../lib/global/cursor/updateCursorStyle.ts","../lib/global/utils/updateActiveHitRegion.ts","../lib/global/event-handlers/onDocumentPointerLeave.ts","../lib/global/event-handlers/onDocumentPointerMove.ts","../lib/global/event-handlers/onDocumentPointerUp.ts","../lib/global/utils/calculateDefaultLayout.ts","../lib/global/utils/notifyPanelOnResize.ts","../lib/global/utils/objectsEqual.ts","../lib/global/utils/validateLayoutKeys.ts","../lib/global/mountGroup.ts","../lib/hooks/useForceUpdate.ts","../lib/hooks/useId.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/hooks/useStableCallback.ts","../lib/hooks/useMergedRefs.ts","../lib/hooks/useStableObject.ts","../lib/components/panel/constants.ts","../lib/components/group/getPanelSizeCssPropertyName.ts","../lib/components/group/GroupContext.ts","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/Group.tsx","../lib/utils/debounce.ts","../lib/components/group/auto-save/getStorageKey.ts","../lib/components/group/useDefaultLayout.ts","../lib/components/group/useGroupCallbackRef.ts","../lib/components/group/useGroupRef.ts","../lib/components/group/useGroupContext.ts","../lib/global/utils/getImperativePanelMethods.ts","../lib/components/panel/usePanelImperativeHandle.ts","../lib/components/panel/Panel.tsx","../lib/components/panel/usePanelCallbackRef.ts","../lib/components/panel/usePanelRef.ts","../lib/global/utils/calculateSeparatorAriaValues.ts","../lib/components/separator/Separator.tsx"],"sourcesContent":["export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n throw Error(message);\n }\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\n\nexport function calculateAvailableGroupSize({\n group\n}: {\n group: RegisteredGroup;\n}) {\n const { orientation, panels } = group;\n\n return panels.reduce((totalSize, panel) => {\n totalSize +=\n orientation === \"horizontal\"\n ? panel.element.offsetWidth\n : panel.element.offsetHeight;\n return totalSize;\n }, 0);\n}\n","import type { Orientation } from \"./types\";\n\nexport function sortByElementOffset<\n Type extends { element: HTMLElement },\n ReturnType extends Type[]\n>(orientation: Orientation, panelsOrSeparators: Type[]): ReturnType {\n return panelsOrSeparators.sort(\n orientation === \"horizontal\" ? horizontalSort : verticalSort\n ) as ReturnType;\n}\n\nfunction horizontalSort(\n a: Type,\n b: Type\n) {\n const delta = a.element.offsetLeft - b.element.offsetLeft;\n if (delta !== 0) {\n return delta;\n }\n return a.element.offsetWidth - b.element.offsetWidth;\n}\n\nfunction verticalSort(a: Type, b: Type) {\n const delta = a.element.offsetTop - b.element.offsetTop;\n if (delta !== 0) {\n return delta;\n }\n return a.element.offsetHeight - b.element.offsetHeight;\n}\n","// Detects HTMLElement without requiring instanceof and browser globals\nexport function isHTMLElement(value: unknown): value is HTMLElement {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"nodeType\" in value &&\n value.nodeType === Node.ELEMENT_NODE\n );\n}\n","import type { Point } from \"../../types\";\n\nexport function getDistanceBetweenPointAndRect(\n point: Point,\n rect: DOMRectReadOnly\n) {\n return {\n x:\n point.x >= rect.left && point.x <= rect.right\n ? 0\n : Math.min(\n Math.abs(point.x - rect.left),\n Math.abs(point.x - rect.right)\n ),\n y:\n point.y >= rect.top && point.y <= rect.bottom\n ? 0\n : Math.min(\n Math.abs(point.y - rect.top),\n Math.abs(point.y - rect.bottom)\n )\n };\n}\n","import type { Orientation } from \"../../components/group/types\";\nimport { assert } from \"../../utils/assert\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosestRect({\n orientation,\n rects,\n targetRect\n}: {\n orientation: Orientation;\n rects: DOMRectReadOnly[];\n targetRect: DOMRectReadOnly;\n}): DOMRectReadOnly {\n const centerPoint = {\n x: targetRect.x + targetRect.width / 2,\n y: targetRect.y + targetRect.height / 2\n };\n\n let closestRect: DOMRectReadOnly | undefined = undefined;\n let minDistance = Number.MAX_VALUE;\n\n for (const rect of rects) {\n const { x, y } = getDistanceBetweenPointAndRect(centerPoint, rect);\n\n const distance = orientation === \"horizontal\" ? x : y;\n\n if (distance < minDistance) {\n minDistance = distance;\n closestRect = rect;\n }\n }\n\n assert(closestRect, \"No rect found\");\n\n return closestRect;\n}\n","import { sortByElementOffset } from \"../../components/group/sortByElementOffset\";\nimport type { RegisteredGroup } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\nimport type { RegisteredSeparator } from \"../../components/separator/types\";\nimport { isHTMLElement } from \"../../utils/isHTMLElement\";\nimport { findClosestRect } from \"../utils/findClosestRect\";\nimport { calculateAvailableGroupSize } from \"./calculateAvailableGroupSize\";\n\ntype PanelsTuple = [panel: RegisteredPanel, panel: RegisteredPanel];\n\nexport type HitRegion = {\n group: RegisteredGroup;\n groupSize: number;\n panels: PanelsTuple;\n rect: DOMRect;\n separator?: RegisteredSeparator | undefined;\n};\n\n/**\n * Determines hit regions for a Group; a hit region is either:\n * - 1: An explicit Separator element\n * - 2: The edge of a Panel element that has another Panel beside it\n *\n * This method determines bounding rects of all regions for the particular group.\n */\nexport function calculateHitRegions(group: RegisteredGroup) {\n const { element: groupElement, orientation, panels, separators } = group;\n\n // Sort elements by offset before traversing\n const sortedChildElements: HTMLElement[] = sortByElementOffset(\n orientation,\n Array.from(groupElement.children)\n .filter(isHTMLElement)\n .map((element) => ({ element: element as HTMLElement }))\n ).map(({ element }) => element);\n\n const hitRegions: HitRegion[] = [];\n\n let hasInterleavedStaticContent = false;\n let prevPanel: RegisteredPanel | undefined = undefined;\n let pendingSeparators: RegisteredSeparator[] = [];\n\n for (const childElement of sortedChildElements) {\n if (childElement.hasAttribute(\"data-panel\")) {\n const panelData = panels.find(\n (current) => current.element === childElement\n );\n if (panelData) {\n if (prevPanel) {\n const prevRect = prevPanel.element.getBoundingClientRect();\n const rect = childElement.getBoundingClientRect();\n\n let pendingRectsOrSeparators: (DOMRect | RegisteredSeparator)[];\n\n // If an explicit Separator has been rendered, always watch it\n // Otherwise watch the entire space between the panels\n // The one caveat is when there are non-interactive element(s) between panels,\n // in which case we may need to watch individual panel edges\n if (hasInterleavedStaticContent) {\n const firstPanelEdgeRect =\n orientation === \"horizontal\"\n ? new DOMRect(prevRect.right, prevRect.top, 0, prevRect.height)\n : new DOMRect(\n prevRect.left,\n prevRect.bottom,\n prevRect.width,\n 0\n );\n const secondPanelEdgeRect =\n orientation === \"horizontal\"\n ? new DOMRect(rect.left, rect.top, 0, rect.height)\n : new DOMRect(rect.left, rect.top, rect.width, 0);\n\n switch (pendingSeparators.length) {\n case 0: {\n pendingRectsOrSeparators = [\n firstPanelEdgeRect,\n secondPanelEdgeRect\n ];\n break;\n }\n case 1: {\n const separator = pendingSeparators[0];\n const closestRect = findClosestRect({\n orientation,\n rects: [prevRect, rect],\n targetRect: separator.element.getBoundingClientRect()\n });\n\n pendingRectsOrSeparators = [\n separator,\n closestRect === prevRect\n ? secondPanelEdgeRect\n : firstPanelEdgeRect\n ];\n break;\n }\n default: {\n pendingRectsOrSeparators = pendingSeparators;\n break;\n }\n }\n } else {\n if (pendingSeparators.length) {\n pendingRectsOrSeparators = pendingSeparators;\n } else {\n pendingRectsOrSeparators = [\n orientation === \"horizontal\"\n ? new DOMRect(\n prevRect.right,\n rect.top,\n rect.left - prevRect.right,\n rect.height\n )\n : new DOMRect(\n rect.left,\n prevRect.bottom,\n rect.width,\n rect.top - prevRect.bottom\n )\n ];\n }\n }\n\n for (const rectOrSeparator of pendingRectsOrSeparators) {\n hitRegions.push({\n group,\n groupSize: calculateAvailableGroupSize({ group }),\n panels: [prevPanel, panelData],\n separator:\n \"width\" in rectOrSeparator ? undefined : rectOrSeparator,\n rect:\n \"width\" in rectOrSeparator\n ? rectOrSeparator\n : rectOrSeparator.element.getBoundingClientRect()\n });\n }\n }\n\n hasInterleavedStaticContent = false;\n prevPanel = panelData;\n pendingSeparators = [];\n }\n } else if (childElement.hasAttribute(\"data-separator\")) {\n const separatorData = separators.find(\n (current) => current.element === childElement\n );\n if (separatorData) {\n // Separators will be included implicitly in the area between the previous and next panel\n // It's important to track them though, to handle the scenario of non-interactive group content\n pendingSeparators.push(separatorData);\n } else {\n prevPanel = undefined;\n pendingSeparators = [];\n }\n } else {\n hasInterleavedStaticContent = true;\n }\n }\n\n return hitRegions;\n}\n","export function convertEmToPixels(element: Element, value: number) {\n const style = getComputedStyle(element);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertRemToPixels(element: Element, value: number) {\n const style = getComputedStyle(element.ownerDocument.body);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertVhToPixels(value: number) {\n return (value / 100) * window.innerHeight;\n}\n","export function convertVwToPixels(value: number) {\n return (value / 100) * window.innerWidth;\n}\n","import type { SizeUnit } from \"../../components/panel/types\";\n\nexport function parseSizeAndUnit(\n size: number | string\n): [numeric: number, size: SizeUnit] {\n switch (typeof size) {\n case \"number\": {\n return [size, \"px\"];\n }\n case \"string\": {\n const numeric = parseFloat(size);\n\n if (size.endsWith(\"%\")) {\n return [numeric, \"%\"];\n } else if (size.endsWith(\"px\")) {\n return [numeric, \"px\"];\n } else if (size.endsWith(\"rem\")) {\n return [numeric, \"rem\"];\n } else if (size.endsWith(\"em\")) {\n return [numeric, \"em\"];\n } else if (size.endsWith(\"vh\")) {\n return [numeric, \"vh\"];\n } else if (size.endsWith(\"vw\")) {\n return [numeric, \"vw\"];\n }\n\n return [numeric, \"%\"];\n }\n }\n}\n","import { convertEmToPixels } from \"./convertEmToPixels\";\nimport { convertRemToPixels } from \"./convertRemToPixels\";\nimport { convertVhToPixels } from \"./convertVhToPixels\";\nimport { convertVwToPixels } from \"./convertVwToPixels\";\nimport { parseSizeAndUnit } from \"./parseSizeAndUnit\";\n\nexport function sizeStyleToPixels({\n groupSize,\n panelElement,\n styleProp\n}: {\n groupSize: number;\n panelElement: HTMLElement;\n styleProp: number | string;\n}) {\n let pixels: number | undefined = undefined;\n\n const [size, unit] = parseSizeAndUnit(styleProp);\n\n switch (unit) {\n case \"%\": {\n pixels = (size / 100) * groupSize;\n break;\n }\n case \"px\": {\n pixels = size;\n break;\n }\n case \"rem\": {\n pixels = convertRemToPixels(panelElement, size);\n break;\n }\n case \"em\": {\n pixels = convertEmToPixels(panelElement, size);\n break;\n }\n case \"vh\": {\n pixels = convertVhToPixels(size);\n break;\n }\n case \"vw\": {\n pixels = convertVwToPixels(size);\n break;\n }\n }\n\n return pixels;\n}\n","export function formatLayoutNumber(number: number) {\n return parseFloat(number.toFixed(3));\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\nimport { formatLayoutNumber } from \"../utils/formatLayoutNumber\";\nimport { calculateAvailableGroupSize } from \"./calculateAvailableGroupSize\";\n\nexport function calculatePanelConstraints(group: RegisteredGroup) {\n const { panels } = group;\n\n const groupSize = calculateAvailableGroupSize({ group });\n if (groupSize === 0) {\n // Can't calculate anything meaningful if the group has a width/height of 0\n // (This could indicate that it's within a hidden subtree)\n return panels.map((current) => ({\n collapsedSize: 0,\n collapsible: current.panelConstraints.collapsible === true,\n defaultSize: undefined,\n minSize: 0,\n maxSize: 100,\n panelId: current.id\n }));\n }\n\n return panels.map((panel) => {\n const { element, panelConstraints } = panel;\n\n let collapsedSize = 0;\n if (panelConstraints.collapsedSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.collapsedSize\n });\n\n collapsedSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let defaultSize: number | undefined = undefined;\n if (panelConstraints.defaultSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.defaultSize\n });\n\n defaultSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let minSize = 0;\n if (panelConstraints.minSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.minSize\n });\n\n minSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let maxSize = 100;\n if (panelConstraints.maxSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.maxSize\n });\n\n maxSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n return {\n collapsedSize,\n collapsible: panelConstraints.collapsible === true,\n defaultSize,\n minSize,\n maxSize,\n panelId: panel.id\n };\n });\n}\n","export type EventMap = {\n [key: string]: unknown;\n};\n\nexport type EventListener = (data: Data) => void;\n\nexport class EventEmitter {\n #listenerMap: {\n [Key in keyof Events]?: EventListener[];\n } = {};\n\n addListener(\n type: Type,\n listener: EventListener\n ) {\n const listeners = this.#listenerMap[type];\n if (listeners === undefined) {\n this.#listenerMap[type] = [listener];\n } else {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n }\n\n return () => {\n this.removeListener(type, listener);\n };\n }\n\n emit(type: Type, data: Events[Type]) {\n const listeners = this.#listenerMap[type];\n if (listeners !== undefined) {\n if (listeners.length === 1) {\n const listener = listeners[0];\n listener.call(null, data);\n } else {\n let didThrow = false;\n let caughtError = null;\n\n // Clone the current listeners before calling\n // in case calling triggers listeners to be added or removed\n const clonedListeners = Array.from(listeners);\n for (let i = 0; i < clonedListeners.length; i++) {\n const listener = clonedListeners[i];\n try {\n listener.call(null, data);\n } catch (error) {\n if (caughtError === null) {\n didThrow = true;\n caughtError = error;\n }\n }\n }\n\n if (didThrow) {\n throw caughtError;\n }\n }\n }\n }\n\n removeAllListeners() {\n this.#listenerMap = {};\n }\n\n removeListener(\n type: Type,\n listener: EventListener\n ) {\n const listeners = this.#listenerMap[type];\n if (listeners !== undefined) {\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n }\n}\n","import { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function layoutNumbersEqual(\n actual: number,\n expected: number,\n minimumDelta = 0\n) {\n return (\n Math.abs(formatLayoutNumber(actual) - formatLayoutNumber(expected)) <=\n minimumDelta\n );\n}\n","import type { Layout, RegisteredGroup } from \"../components/group/types\";\nimport type {\n PanelConstraints,\n RegisteredPanel\n} from \"../components/panel/types\";\nimport type { RegisteredSeparator } from \"../components/separator/types\";\nimport { EventEmitter } from \"../utils/EventEmitter\";\nimport type { InteractionState } from \"./types\";\nimport { layoutNumbersEqual } from \"./utils/layoutNumbersEqual\";\n\ntype UpdaterFunction = (prevState: State) => Partial;\n\nexport type SeparatorToPanelsMap = Map<\n RegisteredSeparator,\n [primaryPanel: RegisteredPanel, secondaryPanel: RegisteredPanel]\n>;\n\nexport type MountedGroupMap = Map<\n RegisteredGroup,\n {\n defaultLayoutDeferred: boolean;\n derivedPanelConstraints: PanelConstraints[];\n layout: Layout;\n separatorToPanels: SeparatorToPanelsMap;\n }\n>;\n\ntype Events = {\n cursorFlagsChange: number;\n interactionStateChange: InteractionState;\n mountedGroupsChange: MountedGroupMap;\n};\n\ntype State = {\n cursorFlags: number;\n interactionState: InteractionState;\n mountedGroups: MountedGroupMap;\n};\n\nlet state: State = {\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n },\n mountedGroups: new Map()\n};\n\nexport const eventEmitter = new EventEmitter();\n\nexport function read(): State {\n return state;\n}\n\nexport function update(value: Partial | UpdaterFunction) {\n const partialState = typeof value === \"function\" ? value(state) : value;\n if (state === partialState) {\n return state;\n }\n\n const prevState = state;\n\n state = {\n ...state,\n ...partialState\n };\n\n if (partialState.cursorFlags !== undefined) {\n eventEmitter.emit(\"cursorFlagsChange\", state.cursorFlags);\n }\n\n if (partialState.interactionState !== undefined) {\n eventEmitter.emit(\"interactionStateChange\", state.interactionState);\n }\n\n if (partialState.mountedGroups !== undefined) {\n // If any collapsible Panels have been collapsed by this size change, record their previous sizes\n state.mountedGroups.forEach((value, group) => {\n value.derivedPanelConstraints.forEach((constraints) => {\n if (constraints.collapsible) {\n const { layout: prevLayout } =\n prevState.mountedGroups.get(group) ?? {};\n if (prevLayout) {\n const isCollapsed = layoutNumbersEqual(\n constraints.collapsedSize,\n value.layout[constraints.panelId]\n );\n const wasCollapsed = layoutNumbersEqual(\n constraints.collapsedSize,\n prevLayout[constraints.panelId]\n );\n if (isCollapsed && !wasCollapsed) {\n group.inMemoryLastExpandedPanelSizes[constraints.panelId] =\n prevLayout[constraints.panelId];\n }\n }\n }\n });\n });\n\n eventEmitter.emit(\"mountedGroupsChange\", state.mountedGroups);\n }\n\n return state;\n}\n","export function isArrayEqual(a: number[], b: number[]) {\n if (a.length !== b.length) {\n return false;\n } else {\n for (let index = 0; index < a.length; index++) {\n if (a[index] != b[index]) {\n return false;\n }\n }\n }\n return true;\n}\n","import { layoutNumbersEqual } from \"./layoutNumbersEqual\";\n\nexport function compareLayoutNumbers(actual: number, expected: number) {\n if (layoutNumbersEqual(actual, expected)) {\n return 0;\n } else {\n return actual > expected ? 1 : -1;\n }\n}\n","import type { PanelConstraints } from \"../../components/panel/types\";\nimport { compareLayoutNumbers } from \"./compareLayoutNumbers\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\n// Panel size must be in percentages; pixel values should be pre-converted\nexport function validatePanelSize({\n panelConstraints,\n size\n}: {\n panelConstraints: PanelConstraints;\n size: number;\n}) {\n const {\n collapsedSize = 0,\n collapsible,\n maxSize = 100,\n minSize = 0\n } = panelConstraints;\n\n if (compareLayoutNumbers(size, minSize) < 0) {\n if (collapsible) {\n // Collapsible panels should snap closed or open only once they cross the halfway point between collapsed and min size.\n const halfwayPoint = (collapsedSize + minSize) / 2;\n if (compareLayoutNumbers(size, halfwayPoint) < 0) {\n size = collapsedSize;\n } else {\n size = minSize;\n }\n } else {\n size = minSize;\n }\n }\n\n size = Math.min(maxSize, size);\n size = formatLayoutNumber(size);\n\n return size;\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { assert } from \"../../utils/assert\";\nimport { isArrayEqual } from \"../../utils/isArrayEqual\";\nimport { compareLayoutNumbers } from \"../utils/compareLayoutNumbers\";\nimport { layoutNumbersEqual } from \"../utils/layoutNumbersEqual\";\nimport { validatePanelSize } from \"../utils/validatePanelSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function adjustLayoutByDelta({\n delta,\n initialLayout: initialLayoutProp,\n panelConstraints: panelConstraintsArray,\n pivotIndices,\n prevLayout: prevLayoutProp,\n trigger\n}: {\n delta: number;\n initialLayout: Layout;\n panelConstraints: PanelConstraints[];\n pivotIndices: number[];\n prevLayout: Layout;\n trigger: \"imperative-api\" | \"keyboard\" | \"mouse-or-touch\";\n}): Layout {\n if (layoutNumbersEqual(delta, 0)) {\n return initialLayoutProp;\n }\n\n const initialLayout = Object.values(initialLayoutProp);\n const prevLayout = Object.values(prevLayoutProp);\n const nextLayout = [...initialLayout];\n\n const [firstPivotIndex, secondPivotIndex] = pivotIndices;\n assert(firstPivotIndex != null, \"Invalid first pivot index\");\n assert(secondPivotIndex != null, \"Invalid second pivot index\");\n\n let deltaApplied = 0;\n\n // const DEBUG = [];\n // DEBUG.push(`adjustLayoutByDelta()`);\n // DEBUG.push(` initialLayout: ${initialLayout.join(\", \")}`);\n // DEBUG.push(` prevLayout: ${prevLayout.join(\", \")}`);\n // DEBUG.push(` delta: ${delta}`);\n // DEBUG.push(` pivotIndices: ${pivotIndices.join(\", \")}`);\n // DEBUG.push(` trigger: ${trigger}`);\n // DEBUG.push(\"\");\n\n // A resizing panel affects the panels before or after it.\n //\n // A negative delta means the panel(s) immediately after the separator should grow/expand by decreasing its offset.\n // Other panels may also need to shrink/contract (and shift) to make room, depending on the min weights.\n //\n // A positive delta means the panel(s) immediately before the separator should \"expand\".\n // This is accomplished by shrinking/contracting (and shifting) one or more of the panels after the separator.\n\n {\n // If this is a resize triggered by a keyboard event, our logic for expanding/collapsing is different.\n // We no longer check the halfway threshold because this may prevent the panel from expanding at all.\n if (trigger === \"keyboard\") {\n {\n // Check if we should expand a collapsed panel\n const index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 1: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, collapsedSize)) {\n const localDelta = minSize - prevSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n\n {\n // Check if we should collapse a panel at its minimum size\n const index = delta < 0 ? firstPivotIndex : secondPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `No panel constraints found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 2: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, minSize)) {\n const localDelta = prevSize - collapsedSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n }\n // DEBUG.push(\"\");\n }\n\n {\n // Pre-calculate max available delta in the opposite direction of our pivot.\n // This will be the maximum amount we're allowed to expand/contract the panels in the primary direction.\n // If this amount is less than the requested delta, adjust the requested delta.\n // If this amount is greater than the requested delta, that's useful information too–\n // as an expanding panel might change from collapsed to min size.\n\n const increment = delta < 0 ? 1 : -1;\n\n let index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let maxAvailableDelta = 0;\n\n // DEBUG.push(\"pre calc...\");\n while (true) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const maxSafeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: 100\n });\n const delta = maxSafeSize - prevSize;\n // DEBUG.push(` ${index}: ${prevSize} -> ${maxSafeSize}`);\n\n maxAvailableDelta += delta;\n index += increment;\n\n if (index < 0 || index >= panelConstraintsArray.length) {\n break;\n }\n }\n\n // DEBUG.push(` -> max available delta: ${maxAvailableDelta}`);\n const minAbsDelta = Math.min(Math.abs(delta), Math.abs(maxAvailableDelta));\n delta = delta < 0 ? 0 - minAbsDelta : minAbsDelta;\n // DEBUG.push(` -> adjusted delta: ${delta}`);\n // DEBUG.push(\"\");\n }\n\n {\n // Delta added to a panel needs to be subtracted from other panels (within the constraints that those panels allow).\n\n const pivotIndex = delta < 0 ? firstPivotIndex : secondPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const deltaRemaining = Math.abs(delta) - Math.abs(deltaApplied);\n\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize - deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaApplied += prevSize - safeSize;\n\n nextLayout[index] = safeSize;\n\n if (\n deltaApplied\n .toFixed(3)\n .localeCompare(Math.abs(delta).toFixed(3), undefined, {\n numeric: true\n }) >= 0\n ) {\n break;\n }\n }\n\n if (delta < 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n // DEBUG.push(`after 1: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n // If we were unable to resize any of the panels panels, return the previous state.\n // This will essentially bailout and ignore e.g. drags past a panel's boundaries\n if (isArrayEqual(prevLayout, nextLayout)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n {\n // Now distribute the applied delta to the panels in the other direction\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n\n const prevSize = initialLayout[pivotIndex];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${pivotIndex}`\n );\n\n const unsafeSize = prevSize + deltaApplied;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[pivotIndex],\n size: unsafeSize\n });\n\n // Adjust the pivot panel before, but only by the amount that surrounding panels were able to shrink/contract.\n nextLayout[pivotIndex] = safeSize;\n\n // Edge case where expanding or contracting one panel caused another one to change collapsed state\n if (!layoutNumbersEqual(safeSize, unsafeSize)) {\n let deltaRemaining = unsafeSize - safeSize;\n\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const prevSize = nextLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize + deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaRemaining -= safeSize - prevSize;\n\n nextLayout[index] = safeSize;\n }\n\n if (layoutNumbersEqual(deltaRemaining, 0)) {\n break;\n }\n\n if (delta > 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n }\n // DEBUG.push(`after 2: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n const totalSize = Object.values(nextLayout).reduce(\n (total, size) => size + total,\n 0\n );\n // DEBUG.push(`total size: ${totalSize}`);\n\n // If our new layout doesn't add up to 100%, that means the requested delta can't be applied\n // In that case, fall back to our most recent valid layout\n // Allow for a small rounding difference, else e.g. 3 panel layouts may never be considered valid\n if (!layoutNumbersEqual(totalSize, 100, 0.1)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n const prevLayoutKeys = Object.keys(prevLayoutProp);\n\n // console.log(DEBUG.join(\"\\n\"));\n return nextLayout.reduce((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\n}\n","import { assert } from \"../../utils/assert\";\nimport { read } from \"../mutableState\";\n\nexport function findSeparatorGroup(separatorElement: HTMLElement) {\n const groupElement = separatorElement.parentElement;\n assert(groupElement, \"Parent group element not found\");\n\n const { mountedGroups } = read();\n\n for (const [group] of mountedGroups) {\n if (group.element === groupElement) {\n return group;\n }\n }\n\n throw Error(\"Could not find parent Group for separator element\");\n}\n","import type { Layout } from \"../../components/group/types\";\nimport { compareLayoutNumbers } from \"./compareLayoutNumbers\";\n\nexport function layoutsEqual(a: Layout, b: Layout): boolean {\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const id in a) {\n // Edge case: Panel id has been changed\n if (b[id] === undefined || compareLayoutNumbers(a[id], b[id]) !== 0) {\n return false;\n }\n }\n\n return true;\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { assert } from \"../../utils/assert\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { validatePanelSize } from \"./validatePanelSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function validatePanelGroupLayout({\n layout,\n panelConstraints\n}: {\n layout: Layout;\n panelConstraints: PanelConstraints[];\n}): Layout {\n const prevLayout = Object.values(layout);\n const nextLayout = [...prevLayout];\n\n const nextLayoutTotalSize = nextLayout.reduce(\n (accumulated, current) => accumulated + current,\n 0\n );\n\n // Validate layout expectations\n if (nextLayout.length !== panelConstraints.length) {\n throw Error(\n `Invalid ${panelConstraints.length} panel layout: ${nextLayout\n .map((size) => `${size}%`)\n .join(\", \")}`\n );\n } else if (\n !layoutNumbersEqual(nextLayoutTotalSize, 100) &&\n nextLayout.length > 0\n ) {\n for (let index = 0; index < panelConstraints.length; index++) {\n const unsafeSize = nextLayout[index];\n assert(unsafeSize != null, `No layout data found for index ${index}`);\n const safeSize = (100 / nextLayoutTotalSize) * unsafeSize;\n nextLayout[index] = safeSize;\n }\n }\n\n let remainingSize = 0;\n\n // First pass: Validate the proposed layout given each panel's constraints\n for (let index = 0; index < panelConstraints.length; index++) {\n const unsafeSize = nextLayout[index];\n assert(unsafeSize != null, `No layout data found for index ${index}`);\n\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraints[index],\n size: unsafeSize\n });\n\n if (unsafeSize != safeSize) {\n remainingSize += unsafeSize - safeSize;\n\n nextLayout[index] = safeSize;\n }\n }\n\n // If there is additional, left over space, assign it to any panel(s) that permits it\n // (It's not worth taking multiple additional passes to evenly distribute)\n if (!layoutNumbersEqual(remainingSize, 0)) {\n for (let index = 0; index < panelConstraints.length; index++) {\n const prevSize = nextLayout[index];\n assert(prevSize != null, `No layout data found for index ${index}`);\n const unsafeSize = prevSize + remainingSize;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraints[index],\n size: unsafeSize\n });\n\n if (prevSize !== safeSize) {\n remainingSize -= safeSize - prevSize;\n nextLayout[index] = safeSize;\n\n // Once we've used up the remainder, bail\n if (layoutNumbersEqual(remainingSize, 0)) {\n break;\n }\n }\n }\n }\n\n const prevLayoutKeys = Object.keys(layout);\n\n return nextLayout.reduce((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\n}\n","import type {\n GroupImperativeHandle,\n Layout\n} from \"../../components/group/types\";\nimport { read, update } from \"../mutableState\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function getImperativeGroupMethods({\n groupId\n}: {\n groupId: string;\n}): GroupImperativeHandle {\n const find = () => {\n const { mountedGroups } = read();\n for (const [group, value] of mountedGroups) {\n if (group.id === groupId) {\n return { group, ...value };\n }\n }\n\n throw Error(`Could not find Group with id \"${groupId}\"`);\n };\n\n return {\n getLayout() {\n const { defaultLayoutDeferred, layout } = find();\n\n if (defaultLayoutDeferred) {\n // This indicates that the Group has not finished mounting yet\n // Likely because it has been rendered inside of a hidden DOM subtree\n // Any layout value will not have been validated and so it should not be returned\n return {};\n }\n\n return layout;\n },\n setLayout(unsafeLayout: Layout) {\n const {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n group,\n layout: prevLayout,\n separatorToPanels\n } = find();\n\n const nextLayout = validatePanelGroupLayout({\n layout: unsafeLayout,\n panelConstraints: derivedPanelConstraints\n });\n\n if (defaultLayoutDeferred) {\n // This indicates that the Group has not finished mounting yet\n // Likely because it has been rendered inside of a hidden DOM subtree\n // In this case we cannot fully validate the layout, so we shouldn't apply it\n // It's okay to run the validate function above though,\n // it will still warn about certain types of errors (e.g. wrong number of panels)\n return prevLayout;\n }\n\n if (!layoutsEqual(prevLayout, nextLayout)) {\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels\n })\n }));\n }\n\n return nextLayout;\n }\n };\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\nimport { assert } from \"../../utils/assert\";\nimport { read } from \"../mutableState\";\n\nexport function getMountedGroup(group: RegisteredGroup) {\n const { mountedGroups } = read();\n\n const mountedGroup = mountedGroups.get(group);\n assert(mountedGroup, `Mounted Group ${group.id} not found`);\n\n return mountedGroup;\n}\n","import { assert } from \"../../utils/assert\";\nimport { update } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { findSeparatorGroup } from \"./findSeparatorGroup\";\nimport { getImperativeGroupMethods } from \"./getImperativeGroupMethods\";\nimport { getMountedGroup } from \"./getMountedGroup\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function adjustLayoutForSeparator(\n separatorElement: HTMLElement,\n delta: number\n) {\n const group = findSeparatorGroup(separatorElement);\n const mountedGroup = getMountedGroup(group);\n\n const separator = group.separators.find(\n (current) => current.element === separatorElement\n );\n assert(separator, \"Matching separator not found\");\n\n const panels = mountedGroup.separatorToPanels.get(separator);\n assert(panels, \"Matching panels not found\");\n\n const pivotIndices = panels.map((panel) => group.panels.indexOf(panel));\n\n const groupAPI = getImperativeGroupMethods({ groupId: group.id });\n const prevLayout = groupAPI.getLayout();\n\n const unsafeLayout = adjustLayoutByDelta({\n delta,\n initialLayout: prevLayout,\n panelConstraints: mountedGroup.derivedPanelConstraints,\n pivotIndices,\n prevLayout,\n trigger: \"keyboard\"\n });\n const nextLayout = validatePanelGroupLayout({\n layout: unsafeLayout,\n panelConstraints: mountedGroup.derivedPanelConstraints\n });\n\n if (!layoutsEqual(prevLayout, nextLayout)) {\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n defaultLayoutDeferred: mountedGroup.defaultLayoutDeferred,\n derivedPanelConstraints: mountedGroup.derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels: mountedGroup.separatorToPanels\n })\n }));\n }\n}\n","import { assert } from \"../../utils/assert\";\nimport { adjustLayoutForSeparator } from \"../utils/adjustLayoutForSeparator\";\nimport { findSeparatorGroup } from \"../utils/findSeparatorGroup\";\nimport { getMountedGroup } from \"../utils/getMountedGroup\";\n\nexport function onDocumentKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const separatorElement = event.currentTarget as HTMLElement;\n\n const group = findSeparatorGroup(separatorElement);\n if (group.disabled) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n\n if (group.orientation === \"vertical\") {\n adjustLayoutForSeparator(separatorElement, 5);\n }\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n\n if (group.orientation === \"horizontal\") {\n adjustLayoutForSeparator(separatorElement, -5);\n }\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n\n if (group.orientation === \"horizontal\") {\n adjustLayoutForSeparator(separatorElement, 5);\n }\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n\n if (group.orientation === \"vertical\") {\n adjustLayoutForSeparator(separatorElement, -5);\n }\n break;\n }\n case \"End\": {\n event.preventDefault();\n\n // Moves splitter to the position that gives the primary pane its largest allowed size.\n // This may completely collapse the secondary pane.\n\n adjustLayoutForSeparator(separatorElement, 100);\n break;\n }\n case \"Enter\": {\n event.preventDefault();\n\n // If the primary pane is not collapsed, collapses the pane.\n // If the pane is collapsed, restores the splitter to its previous position.\n\n const group = findSeparatorGroup(separatorElement);\n const { derivedPanelConstraints, layout, separatorToPanels } =\n getMountedGroup(group);\n\n const separator = group.separators.find(\n (current) => current.element === separatorElement\n );\n assert(separator, \"Matching separator not found\");\n\n const panels = separatorToPanels.get(separator);\n assert(panels, \"Matching panels not found\");\n\n const primaryPanel = panels[0];\n const constraints = derivedPanelConstraints.find(\n (current) => current.panelId === primaryPanel.id\n );\n assert(constraints, \"Panel metadata not found\");\n\n if (constraints.collapsible) {\n const prevSize = layout[primaryPanel.id];\n\n const nextSize =\n constraints.collapsedSize === prevSize\n ? (group.inMemoryLastExpandedPanelSizes[primaryPanel.id] ??\n constraints.minSize)\n : constraints.collapsedSize;\n\n adjustLayoutForSeparator(separatorElement, nextSize - prevSize);\n }\n break;\n }\n case \"F6\": {\n event.preventDefault();\n\n // Cycle through window panes.\n\n const group = findSeparatorGroup(separatorElement);\n\n const separatorElements = group.separators.map(\n (separator) => separator.element\n );\n\n const index = Array.from(separatorElements).findIndex(\n (current) => current === event.currentTarget\n );\n assert(index !== null, \"Index not found\");\n\n const nextIndex = event.shiftKey\n ? index > 0\n ? index - 1\n : separatorElements.length - 1\n : index + 1 < separatorElements.length\n ? index + 1\n : 0;\n\n const nextSeparatorElement = separatorElements[nextIndex] as HTMLElement;\n nextSeparatorElement.focus();\n break;\n }\n case \"Home\": {\n event.preventDefault();\n\n // Moves splitter to the position that gives the primary pane its smallest allowed size.\n // This may completely collapse the primary pane.\n\n adjustLayoutForSeparator(separatorElement, -100);\n break;\n }\n }\n}\n","// Constants used for memoization\nexport const EMPTY_ARRAY: unknown[] = [];\nexport const EMPTY_DOM_RECT: DOMRectReadOnly = {\n bottom: 0,\n height: 0,\n left: 0,\n right: 0,\n toJSON: () => {},\n top: 0,\n width: 0,\n x: 0,\n y: 0\n};\nexport const EMPTY_OBJECT = {};\nexport const EMPTY_POINT = { x: 0, y: 0 };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const IDENTITY_FUNCTION = (value: any) => value;\nexport const NOOP_FUNCTION = () => {};\n\n// Cursor flags\nexport const CURSOR_FLAG_HORIZONTAL_MIN = 0b0001;\nexport const CURSOR_FLAG_HORIZONTAL_MAX = 0b0010;\nexport const CURSOR_FLAG_VERTICAL_MIN = 0b0100;\nexport const CURSOR_FLAG_VERTICAL_MAX = 0b1000;\n\n// Misc. shared values\nexport const DEFAULT_POINTER_PRECISION = {\n coarse: 10,\n precise: 5\n};\n","import type { Orientation } from \"../../components/group/types\";\nimport type { Point } from \"../../types\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosetHitRegion(\n orientation: Orientation,\n hitRegions: HitRegion[],\n point: Point\n) {\n let closestHitRegion: HitRegion | undefined = undefined;\n let minDistance = {\n x: Infinity,\n y: Infinity\n };\n\n for (const hitRegion of hitRegions) {\n const data = getDistanceBetweenPointAndRect(point, hitRegion.rect);\n switch (orientation) {\n case \"horizontal\": {\n if (data.x <= minDistance.x) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n case \"vertical\": {\n if (data.y <= minDistance.y) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n }\n }\n\n return closestHitRegion\n ? {\n distance: minDistance,\n hitRegion: closestHitRegion\n }\n : undefined;\n}\n","let cached: boolean | undefined = undefined;\n\nexport function isCoarsePointer(): boolean {\n if (cached === undefined) {\n if (typeof matchMedia === \"function\") {\n cached = !!matchMedia(\"(pointer:coarse)\").matches;\n } else {\n cached = false;\n }\n }\n\n return cached;\n}\n","// Detects ShadowRoot without requiring instanceof and browser globals\nexport function isShadowRoot(value: unknown): value is ShadowRoot {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"nodeType\" in value &&\n value.nodeType === Node.DOCUMENT_FRAGMENT_NODE\n );\n}\n","// Forked from NPM stacking-order@2.0.0\n// - github.com/Rich-Harris/stacking-order/issues/3\n// - github.com/Rich-Harris/stacking-order/issues/6\n\nimport { assert } from \"../utils/assert\";\nimport { isShadowRoot } from \"../utils/isShadowRoot\";\n\n/**\n * Determine which of two nodes appears in front of the other —\n * if `a` is in front, returns 1, otherwise returns -1\n * @param {HTMLElement | SVGElement} a\n * @param {HTMLElement | SVGElement} b\n */\nexport function compare(\n a: HTMLElement | SVGElement,\n b: HTMLElement | SVGElement\n): number {\n if (a === b) throw new Error(\"Cannot compare node with itself\");\n\n const ancestors = {\n a: get_ancestors(a),\n b: get_ancestors(b)\n };\n\n let common_ancestor;\n\n // remove shared ancestors\n while (ancestors.a.at(-1) === ancestors.b.at(-1)) {\n a = ancestors.a.pop() as HTMLElement;\n b = ancestors.b.pop() as HTMLElement;\n\n common_ancestor = a;\n }\n\n assert(\n common_ancestor,\n \"Stacking order can only be calculated for elements with a common ancestor\"\n );\n\n const z_indexes = {\n a: get_z_index(find_stacking_context(ancestors.a)),\n b: get_z_index(find_stacking_context(ancestors.b))\n };\n\n if (z_indexes.a === z_indexes.b) {\n const children = common_ancestor.childNodes;\n\n const furthest_ancestors = {\n a: ancestors.a.at(-1),\n b: ancestors.b.at(-1)\n };\n\n let i = children.length;\n while (i--) {\n const child = children[i];\n if (child === furthest_ancestors.a) return 1;\n if (child === furthest_ancestors.b) return -1;\n }\n }\n\n return Math.sign(z_indexes.a - z_indexes.b);\n}\n\nconst props =\n /\\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\\b/;\n\n/** @param {HTMLElement | SVGElement} node */\nfunction is_flex_item(node: HTMLElement | SVGElement) {\n // @ts-expect-error ParentNode vs Element\n const display = getComputedStyle(get_parent(node) ?? node).display;\n return display === \"flex\" || display === \"inline-flex\";\n}\n\n/** @param {HTMLElement | SVGElement} node */\nfunction creates_stacking_context(node: HTMLElement | SVGElement) {\n const style = getComputedStyle(node);\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n if (style.position === \"fixed\") return true;\n // Forked to fix upstream bug https://github.com/Rich-Harris/stacking-order/issues/3\n // if (\n // (style.zIndex !== \"auto\" && style.position !== \"static\") ||\n // is_flex_item(node)\n // )\n if (\n style.zIndex !== \"auto\" &&\n (style.position !== \"static\" || is_flex_item(node))\n )\n return true;\n if (+style.opacity < 1) return true;\n if (\"transform\" in style && style.transform !== \"none\") return true;\n if (\"webkitTransform\" in style && style.webkitTransform !== \"none\")\n return true;\n if (\"mixBlendMode\" in style && style.mixBlendMode !== \"normal\") return true;\n if (\"filter\" in style && style.filter !== \"none\") return true;\n if (\"webkitFilter\" in style && style.webkitFilter !== \"none\") return true;\n if (\"isolation\" in style && style.isolation === \"isolate\") return true;\n if (props.test(style.willChange)) return true;\n // @ts-expect-error Unrecognized prop\n if (style.webkitOverflowScrolling === \"touch\") return true;\n\n return false;\n}\n\n/** @param {(HTMLElement| SVGElement)[]} nodes */\nfunction find_stacking_context(nodes: (HTMLElement | SVGElement)[]) {\n let i = nodes.length;\n\n while (i--) {\n const node = nodes[i];\n assert(node, \"Missing node\");\n if (creates_stacking_context(node)) return node;\n }\n\n return null;\n}\n\n/** @param {HTMLElement | SVGElement} node */\nfunction get_z_index(node: HTMLElement | SVGElement | null) {\n return (node && Number(getComputedStyle(node).zIndex)) || 0;\n}\n\n/** @param {HTMLElement} node */\nfunction get_ancestors(node: HTMLElement | SVGElement | null) {\n const ancestors = [];\n\n while (node) {\n ancestors.push(node);\n // @ts-expect-error ParentNode vs Element\n node = get_parent(node);\n }\n\n return ancestors; // [ node, ... , , document ]\n}\n\n/** @param {HTMLElement} node */\nfunction get_parent(node: HTMLElement) {\n const { parentNode } = node;\n if (isShadowRoot(parentNode)) {\n return parentNode.host;\n }\n return parentNode;\n}\n","import type { Rect } from \"../../types\";\n\nexport function doRectsIntersect(a: Rect, b: Rect): boolean {\n return (\n a.x < b.x + b.width &&\n a.x + a.width > b.x &&\n a.y < b.y + b.height &&\n a.y + a.height > b.y\n );\n}\n","import { isHTMLElement } from \"../../utils/isHTMLElement\";\nimport { compare } from \"../../vendor/stacking-order\";\nimport { doRectsIntersect } from \"./doRectsIntersect\";\n\n// This library adds pointer event handlers to the Window for two reasons:\n// 1. It allows detecting when the pointer is \"near\" to a panel border or separator element,\n// (which can be particularly helpful on touch devices)\n// 2. It allows detecting pointer interactions that apply to multiple, nearby panels/separators\n// (in the event of e.g. nested groups)\n//\n// Because events are handled at the Window, it's important to detect when another element is \"above\" a separator (e.g. a modal)\n// as this should prevent the separator element from being clicked.\n// This function does that determination.\nexport function isViableHitTarget({\n groupElement,\n hitRegion,\n pointerEventTarget\n}: {\n groupElement: HTMLElement;\n hitRegion: DOMRect;\n pointerEventTarget: EventTarget | null;\n}) {\n if (\n !isHTMLElement(pointerEventTarget) ||\n pointerEventTarget.contains(groupElement) ||\n groupElement.contains(pointerEventTarget)\n ) {\n // Calculating stacking order has a cost;\n // If either group or element contain the other, the click is safe and we can skip calculating the indices\n return true;\n }\n\n if (compare(pointerEventTarget, groupElement) > 0) {\n // If the pointer target is above the separator, check for overlap\n // If they are near each other, but not overlapping, then the separator is still a viable target\n //\n // Note that it's not sufficient to compare only the target\n // The target might be a small element inside of a larger container\n // (For example, a SPAN or a DIV inside of a larger modal dialog)\n let currentElement: HTMLElement | SVGElement | null = pointerEventTarget;\n while (currentElement) {\n if (currentElement.contains(groupElement)) {\n return true;\n } else if (\n doRectsIntersect(currentElement.getBoundingClientRect(), hitRegion)\n ) {\n return false;\n }\n\n currentElement = currentElement.parentElement;\n }\n }\n\n return true;\n}\n","import { DEFAULT_POINTER_PRECISION } from \"../../constants\";\nimport type { MountedGroupMap } from \"../mutableState\";\nimport {\n calculateHitRegions,\n type HitRegion\n} from \"../dom/calculateHitRegions\";\nimport { findClosetHitRegion } from \"./findClosetHitRegion\";\nimport { isCoarsePointer } from \"./isCoarsePointer\";\nimport { isViableHitTarget } from \"./isViableHitTarget\";\n\nexport function findMatchingHitRegions(\n event: PointerEvent,\n mountedGroups: MountedGroupMap\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedGroups.forEach((_, groupData) => {\n if (groupData.disabled) {\n return;\n }\n\n const maxDistance = isCoarsePointer()\n ? DEFAULT_POINTER_PRECISION.coarse\n : DEFAULT_POINTER_PRECISION.precise;\n\n const hitRegions = calculateHitRegions(groupData);\n const match = findClosetHitRegion(groupData.orientation, hitRegions, {\n x: event.clientX,\n y: event.clientY\n });\n\n if (\n match &&\n match.distance.x <= maxDistance &&\n match.distance.y <= maxDistance &&\n isViableHitTarget({\n groupElement: groupData.element,\n hitRegion: match.hitRegion.rect,\n pointerEventTarget: event.target\n })\n ) {\n matchingHitRegions.push(match.hitRegion);\n }\n });\n\n return matchingHitRegions;\n}\n","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\nimport type { RegisteredSeparator } from \"../../components/separator/types\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\n\nexport function onDocumentPointerDown(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n const groups = new Set();\n const panels = new Set();\n const separators = new Set();\n const initialLayoutMap = new Map();\n\n let didChangeFocus = false;\n\n hitRegions.forEach((current) => {\n groups.add(current.group);\n current.panels.forEach((panel) => {\n panels.add(panel);\n });\n\n if (current.separator) {\n separators.add(current.separator);\n\n if (!didChangeFocus) {\n didChangeFocus = true;\n\n current.separator.element.focus();\n }\n }\n\n const match = mountedGroups.get(current.group);\n if (match) {\n initialLayoutMap.set(current.group, match.layout);\n }\n });\n\n update({\n interactionState: {\n hitRegions,\n initialLayoutMap,\n pointerDownAtPoint: { x: event.clientX, y: event.clientY },\n state: \"active\"\n }\n });\n\n if (hitRegions.length) {\n event.preventDefault();\n }\n}\n","import type { Properties } from \"csstype\";\nimport type { RegisteredGroup } from \"../../components/group/types\";\nimport {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport type { InteractionState } from \"../types\";\n\nexport function getCursorStyle({\n cursorFlags,\n groups,\n state\n}: {\n cursorFlags: number;\n groups: RegisteredGroup[];\n state: InteractionState[\"state\"];\n}): Properties[\"cursor\"] | null {\n let horizontalCount = 0;\n let verticalCount = 0;\n\n switch (state) {\n case \"active\":\n case \"hover\": {\n groups.forEach((group) => {\n if (group.disableCursor) {\n return;\n }\n\n switch (group.orientation) {\n case \"horizontal\": {\n horizontalCount++;\n break;\n }\n case \"vertical\": {\n verticalCount++;\n break;\n }\n }\n });\n }\n }\n\n if (horizontalCount === 0 && verticalCount === 0) {\n return null;\n }\n\n switch (state) {\n case \"active\": {\n const horizontalMin = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MIN) !== 0;\n const horizontalMax = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MAX) !== 0;\n const verticalMin = (cursorFlags & CURSOR_FLAG_VERTICAL_MIN) !== 0;\n const verticalMax = (cursorFlags & CURSOR_FLAG_VERTICAL_MAX) !== 0;\n\n if (cursorFlags) {\n if (horizontalMin) {\n if (verticalMin) {\n return \"se-resize\";\n } else if (verticalMax) {\n return \"ne-resize\";\n } else {\n return \"e-resize\";\n }\n } else if (horizontalMax) {\n if (verticalMin) {\n return \"sw-resize\";\n } else if (verticalMax) {\n return \"nw-resize\";\n } else {\n return \"w-resize\";\n }\n } else if (verticalMin) {\n return \"s-resize\";\n } else if (verticalMax) {\n return \"n-resize\";\n }\n }\n break;\n }\n }\n\n if (horizontalCount > 0 && verticalCount > 0) {\n return \"move\";\n } else if (horizontalCount > 0) {\n return \"ew-resize\";\n } else {\n return \"ns-resize\";\n }\n}\n","import { read } from \"../mutableState\";\nimport { getCursorStyle } from \"./getCursorStyle\";\n\nconst documentToStyleMap = new WeakMap<\n Document,\n {\n prevStyle: string | undefined;\n styleSheet: CSSStyleSheet;\n }\n>();\n\nexport function updateCursorStyle(ownerDocument: Document) {\n // NOTE undefined is not technically a valid value but it has been reported that it is present in some environments (Vite HMR?)\n // See github.com/bvaughn/react-resizable-panels/issues/559\n if (\n ownerDocument.defaultView === null ||\n ownerDocument.defaultView === undefined\n ) {\n return;\n }\n\n let { prevStyle, styleSheet } = documentToStyleMap.get(ownerDocument) ?? {};\n\n if (styleSheet === undefined) {\n styleSheet = new ownerDocument.defaultView.CSSStyleSheet();\n\n ownerDocument.adoptedStyleSheets = [styleSheet];\n }\n\n const { cursorFlags, interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\":\n case \"hover\": {\n const cursorStyle = getCursorStyle({\n cursorFlags,\n groups: interactionState.hitRegions.map((current) => current.group),\n state: interactionState.state\n });\n\n const nextStyle = `*{cursor: ${cursorStyle} !important; ${interactionState.state === \"active\" ? \"touch-action: none;\" : \"\"} }`;\n if (prevStyle === nextStyle) {\n return;\n }\n\n prevStyle = nextStyle;\n\n if (cursorStyle) {\n if (styleSheet.cssRules.length === 0) {\n styleSheet.insertRule(nextStyle);\n } else {\n styleSheet.replaceSync(nextStyle);\n }\n } else if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n case \"inactive\": {\n prevStyle = undefined;\n\n if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n }\n\n documentToStyleMap.set(ownerDocument, {\n prevStyle,\n styleSheet\n });\n}\n","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport type { Point } from \"../../types\";\nimport { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { update, type MountedGroupMap } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { layoutsEqual } from \"./layoutsEqual\";\n\nexport function updateActiveHitRegions({\n document,\n event,\n hitRegions,\n initialLayoutMap,\n mountedGroups,\n pointerDownAtPoint\n}: {\n document: Document;\n event: {\n clientX: number;\n clientY: number;\n };\n hitRegions: HitRegion[];\n initialLayoutMap: Map;\n mountedGroups: MountedGroupMap;\n pointerDownAtPoint?: Point;\n}) {\n let cursorFlags = 0;\n const nextMountedGroups = new Map(mountedGroups);\n\n // Note that HitRegions are frozen once a drag has started\n // Modify the Group layouts for all matching HitRegions though\n hitRegions.forEach((current) => {\n const { group, groupSize } = current;\n const { disableCursor, orientation, panels } = group;\n\n let deltaAsPercentage = 0;\n if (pointerDownAtPoint) {\n if (orientation === \"horizontal\") {\n deltaAsPercentage =\n ((event.clientX - pointerDownAtPoint.x) / groupSize) * 100;\n } else {\n deltaAsPercentage =\n ((event.clientY - pointerDownAtPoint.y) / groupSize) * 100;\n }\n } else {\n if (orientation === \"horizontal\") {\n deltaAsPercentage = event.clientX < 0 ? -100 : 100;\n } else {\n deltaAsPercentage = event.clientY < 0 ? -100 : 100;\n }\n }\n\n const initialLayout = initialLayoutMap.get(group);\n\n const {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout: prevLayout,\n separatorToPanels\n } = mountedGroups.get(group) ?? { defaultLayoutDeferred: false };\n if (\n derivedPanelConstraints &&\n initialLayout &&\n prevLayout &&\n separatorToPanels\n ) {\n const nextLayout = adjustLayoutByDelta({\n delta: deltaAsPercentage,\n initialLayout,\n panelConstraints: derivedPanelConstraints,\n pivotIndices: current.panels.map((panel) => panels.indexOf(panel)),\n prevLayout,\n trigger: \"mouse-or-touch\"\n });\n\n if (layoutsEqual(nextLayout, prevLayout)) {\n if (deltaAsPercentage !== 0 && !disableCursor) {\n // An unchanged means the cursor has exceeded the allowed bounds\n switch (orientation) {\n case \"horizontal\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_HORIZONTAL_MIN\n : CURSOR_FLAG_HORIZONTAL_MAX;\n break;\n }\n case \"vertical\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_VERTICAL_MIN\n : CURSOR_FLAG_VERTICAL_MAX;\n break;\n }\n }\n }\n } else {\n nextMountedGroups.set(current.group, {\n defaultLayoutDeferred,\n derivedPanelConstraints: derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels\n });\n\n // Save the most recent layout for this group of panels in-memory\n // so that layouts will be remembered between different sets of conditionally rendered panels\n const panelIdsKey = current.group.panels.map(({ id }) => id).join(\",\");\n current.group.inMemoryLayouts[panelIdsKey] = nextLayout;\n }\n }\n });\n\n update({\n cursorFlags,\n mountedGroups: nextMountedGroups\n });\n\n updateCursorStyle(document);\n}\n","import { read } from \"../mutableState\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onDocumentPointerLeave(event: PointerEvent) {\n const { interactionState, mountedGroups } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n updateActiveHitRegions({\n document: event.currentTarget as Document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedGroups\n });\n }\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onDocumentPointerMove(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { interactionState, mountedGroups } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n // Edge case (see #340)\n // Detect when the pointer has been released outside an iframe on a different domain\n if (\n // Skip this check for \"pointerleave\" events, else Firefox triggers a false positive (see #514)\n event.buttons === 0\n ) {\n update((prevState) =>\n prevState.interactionState.state === \"inactive\"\n ? prevState\n : {\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n }\n );\n\n return;\n }\n\n updateActiveHitRegions({\n document: event.currentTarget as Document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedGroups,\n pointerDownAtPoint: interactionState.pointerDownAtPoint\n });\n break;\n }\n default: {\n // Update HitRegions if a drag has not been started\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n if (hitRegions.length === 0) {\n if (interactionState.state !== \"inactive\") {\n update({\n interactionState: { state: \"inactive\" }\n });\n }\n } else {\n update({\n interactionState: {\n hitRegions,\n state: \"hover\"\n }\n });\n }\n\n updateCursorStyle(event.currentTarget as Document);\n break;\n }\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\n\nexport function onDocumentPointerUp(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n event.preventDefault();\n\n const { interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n update({\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n });\n\n updateCursorStyle(event.currentTarget as Document);\n }\n }\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function calculateDefaultLayout(\n derivedPanelConstraints: PanelConstraints[]\n): Layout {\n let explicitCount = 0;\n let total = 0;\n\n const layout: Layout = {};\n\n for (const current of derivedPanelConstraints) {\n if (current.defaultSize !== undefined) {\n explicitCount++;\n\n const size = formatLayoutNumber(current.defaultSize);\n\n total += size;\n layout[current.panelId] = size;\n } else {\n // @ts-expect-error Add panel keys in order to simplify traversal elsewhere; we'll fill them in in the loop below\n layout[current.panelId] = undefined;\n }\n }\n\n const remainingPanelCount = derivedPanelConstraints.length - explicitCount;\n if (remainingPanelCount !== 0) {\n const size = formatLayoutNumber((100 - total) / remainingPanelCount);\n\n for (const current of derivedPanelConstraints) {\n if (current.defaultSize === undefined) {\n layout[current.panelId] = size;\n }\n }\n }\n\n return layout;\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\nimport { calculateAvailableGroupSize } from \"../dom/calculateAvailableGroupSize\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function notifyPanelOnResize(\n group: RegisteredGroup,\n element: HTMLElement,\n borderBoxSize: readonly ResizeObserverSize[]\n) {\n const resizeObserverSize = borderBoxSize[0];\n if (!resizeObserverSize) {\n return;\n }\n\n const panel = group.panels.find((current) => current.element === element);\n if (!panel || !panel.onResize) {\n return;\n }\n\n const groupSize = calculateAvailableGroupSize({ group });\n\n const prevSize = panel.mutableValues.prevSize;\n const nextSize = {\n asPercentage: formatLayoutNumber(\n (resizeObserverSize.inlineSize / groupSize) * 100\n ),\n inPixels: resizeObserverSize.inlineSize\n };\n panel.mutableValues.prevSize = nextSize;\n\n panel.onResize(nextSize, panel.id, prevSize);\n}\n","export function objectsEqual(a: object, b: object) {\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (a[key as keyof typeof a] !== b[key as keyof typeof b]) {\n return false;\n }\n }\n\n return true;\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\n\nexport function validateLayoutKeys(panels: RegisteredPanel[], layout: Layout) {\n const panelIds = panels.map((panel) => panel.id);\n const layoutKeys = Object.keys(layout);\n\n if (panelIds.length !== layoutKeys.length) {\n return false;\n }\n\n for (const panelId of panelIds) {\n if (!layoutKeys.includes(panelId)) {\n return false;\n }\n }\n\n return true;\n}\n","import type { Layout, RegisteredGroup } from \"../components/group/types\";\nimport { assert } from \"../utils/assert\";\nimport { calculateAvailableGroupSize } from \"./dom/calculateAvailableGroupSize\";\nimport { calculateHitRegions } from \"./dom/calculateHitRegions\";\nimport { calculatePanelConstraints } from \"./dom/calculatePanelConstraints\";\nimport { onDocumentKeyDown } from \"./event-handlers/onDocumentKeyDown\";\nimport { onDocumentPointerDown } from \"./event-handlers/onDocumentPointerDown\";\nimport { onDocumentPointerLeave } from \"./event-handlers/onDocumentPointerLeave\";\nimport { onDocumentPointerMove } from \"./event-handlers/onDocumentPointerMove\";\nimport { onDocumentPointerUp } from \"./event-handlers/onDocumentPointerUp\";\nimport { update, type SeparatorToPanelsMap } from \"./mutableState\";\nimport { calculateDefaultLayout } from \"./utils/calculateDefaultLayout\";\nimport { layoutsEqual } from \"./utils/layoutsEqual\";\nimport { notifyPanelOnResize } from \"./utils/notifyPanelOnResize\";\nimport { objectsEqual } from \"./utils/objectsEqual\";\nimport { validateLayoutKeys } from \"./utils/validateLayoutKeys\";\nimport { validatePanelGroupLayout } from \"./utils/validatePanelGroupLayout\";\n\nconst ownerDocumentReferenceCounts = new Map();\n\nexport function mountGroup(group: RegisteredGroup) {\n let isMounted = true;\n\n assert(\n group.element.ownerDocument.defaultView,\n \"Cannot register an unmounted Group\"\n );\n\n const ResizeObserver = group.element.ownerDocument.defaultView.ResizeObserver;\n\n const panelIds = new Set();\n const separatorIds = new Set();\n\n // Add Panels with onResize callbacks to ResizeObserver\n // Add Group to ResizeObserver also in order to sync % based constraints\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { borderBoxSize, target } = entry;\n if (target === group.element) {\n if (isMounted) {\n const groupSize = calculateAvailableGroupSize({ group });\n if (groupSize === 0) {\n // Can't calculate anything meaningful if the group has a width/height of 0\n // (This could indicate that it's within a hidden subtree)\n return;\n }\n\n update((prevState) => {\n const match = prevState.mountedGroups.get(group);\n if (match) {\n // Update non-percentage based constraints\n const nextDerivedPanelConstraints =\n calculatePanelConstraints(group);\n\n // Revalidate layout in case constraints have changed\n const prevLayout = match.defaultLayoutDeferred\n ? calculateDefaultLayout(nextDerivedPanelConstraints)\n : match.layout;\n const nextLayout = validatePanelGroupLayout({\n layout: prevLayout,\n panelConstraints: nextDerivedPanelConstraints\n });\n\n if (\n !match.defaultLayoutDeferred &&\n layoutsEqual(prevLayout, nextLayout) &&\n objectsEqual(\n match.derivedPanelConstraints,\n nextDerivedPanelConstraints\n )\n ) {\n return prevState;\n }\n\n return {\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n defaultLayoutDeferred: false,\n derivedPanelConstraints: nextDerivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels: match.separatorToPanels\n })\n };\n }\n\n return prevState;\n });\n }\n } else {\n notifyPanelOnResize(group, target as HTMLElement, borderBoxSize);\n }\n }\n });\n resizeObserver.observe(group.element);\n group.panels.forEach((panel) => {\n assert(\n !panelIds.has(panel.id),\n `Panel ids must be unique; id \"${panel.id}\" was used more than once`\n );\n\n panelIds.add(panel.id);\n\n if (panel.onResize) {\n resizeObserver.observe(panel.element);\n }\n });\n\n const groupSize = calculateAvailableGroupSize({ group });\n\n // Calculate initial layout for the new Panel configuration\n const derivedPanelConstraints = calculatePanelConstraints(group);\n const panelIdsKey = group.panels.map(({ id }) => id).join(\",\");\n\n // Gracefully handle an invalid default layout\n // This could happen when e.g. useDefaultLayout is combined with dynamic Panels\n // In this case the best we can do is ignore the incoming layout\n let defaultLayout: Layout | undefined = group.defaultLayout;\n if (defaultLayout) {\n if (!validateLayoutKeys(group.panels, defaultLayout)) {\n defaultLayout = undefined;\n }\n }\n\n const defaultLayoutUnsafe: Layout =\n group.inMemoryLayouts[panelIdsKey] ??\n defaultLayout ??\n calculateDefaultLayout(derivedPanelConstraints);\n const defaultLayoutSafe = validatePanelGroupLayout({\n layout: defaultLayoutUnsafe,\n panelConstraints: derivedPanelConstraints\n });\n\n const hitRegions = calculateHitRegions(group);\n\n const ownerDocument = group.element.ownerDocument;\n\n update((prevState) => {\n const separatorToPanels: SeparatorToPanelsMap = new Map();\n\n ownerDocumentReferenceCounts.set(\n ownerDocument,\n (ownerDocumentReferenceCounts.get(ownerDocument) ?? 0) + 1\n );\n\n hitRegions.forEach((hitRegion) => {\n if (hitRegion.separator) {\n separatorToPanels.set(hitRegion.separator, hitRegion.panels);\n }\n });\n\n return {\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n defaultLayoutDeferred: groupSize === 0,\n derivedPanelConstraints,\n layout: defaultLayoutSafe,\n separatorToPanels\n })\n };\n });\n\n group.separators.forEach((separator) => {\n assert(\n !separatorIds.has(separator.id),\n `Separator ids must be unique; id \"${separator.id}\" was used more than once`\n );\n\n separatorIds.add(separator.id);\n\n separator.element.addEventListener(\"keydown\", onDocumentKeyDown);\n });\n\n // If this is the first group to be mounted, initialize event handlers\n if (ownerDocumentReferenceCounts.get(ownerDocument) === 1) {\n ownerDocument.addEventListener(\"pointerdown\", onDocumentPointerDown);\n ownerDocument.addEventListener(\"pointerleave\", onDocumentPointerLeave);\n ownerDocument.addEventListener(\"pointermove\", onDocumentPointerMove);\n ownerDocument.addEventListener(\"pointerup\", onDocumentPointerUp);\n }\n\n return function unmountGroup() {\n isMounted = false;\n\n ownerDocumentReferenceCounts.set(\n ownerDocument,\n Math.max(0, (ownerDocumentReferenceCounts.get(ownerDocument) ?? 0) - 1)\n );\n\n update((prevState) => {\n const mountedGroups = new Map(prevState.mountedGroups);\n mountedGroups.delete(group);\n\n return { mountedGroups };\n });\n\n group.separators.forEach((separator) => {\n separator.element.removeEventListener(\"keydown\", onDocumentKeyDown);\n });\n\n // If this was the last group to be mounted, tear down event handlers\n if (!ownerDocumentReferenceCounts.get(ownerDocument)) {\n ownerDocument.removeEventListener(\"pointerdown\", onDocumentPointerDown);\n ownerDocument.removeEventListener(\"pointerleave\", onDocumentPointerLeave);\n ownerDocument.removeEventListener(\"pointermove\", onDocumentPointerMove);\n ownerDocument.removeEventListener(\"pointerup\", onDocumentPointerUp);\n }\n\n resizeObserver.disconnect();\n };\n}\n","import { useCallback, useState } from \"react\";\n\nexport function useForceUpdate() {\n const [sigil, setSigil] = useState({});\n\n const forceUpdate = useCallback(() => setSigil({}), []);\n\n return [sigil as unknown, forceUpdate] as const;\n}\n","import { useId as useIdReact } from \"react\";\n\nexport function useId(stableId: number | string | undefined) {\n const dynamicId = useIdReact();\n\n return `${stableId ?? dynamicId}`;\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function useStableCallback(\n fn: Callback\n): Callback {\n const ref = useRef(fn);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback(\n (...args: unknown[]) => ref.current?.(...args),\n [ref]\n ) as unknown as Callback;\n}\n","import { type Ref } from \"react\";\nimport { useStableCallback } from \"./useStableCallback\";\n\ntype PossibleRef = Ref | undefined;\n\nexport function useMergedRefs(...refs: PossibleRef[]) {\n return useStableCallback((value: Type | null) => {\n refs.forEach((ref) => {\n if (ref) {\n switch (typeof ref) {\n case \"function\": {\n ref(value);\n break;\n }\n case \"object\": {\n ref.current = value;\n break;\n }\n }\n }\n });\n });\n}\n","import { useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useStableObject(\n unstableObject: Type\n): Type {\n const ref = useRef({ ...unstableObject });\n\n useIsomorphicLayoutEffect(() => {\n for (const key in unstableObject) {\n ref.current[key] = unstableObject[key];\n }\n }, [unstableObject]);\n\n return ref.current;\n}\n","export const POINTER_EVENTS_CSS_PROPERTY_NAME =\n \"--react-resizable-panels--panel--pointer-events\";\n","export function getPanelSizeCssPropertyName(groupId: string, panelId: string) {\n const groupIdEscaped = groupId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n const panelIdEscaped = panelId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n\n return `--react-resizable-panels--${groupIdEscaped}--${panelIdEscaped}`;\n}\n","import { createContext } from \"react\";\nimport type { GroupContextType } from \"./types\";\n\nexport const GroupContext = createContext(null);\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { IDENTITY_FUNCTION } from \"../../constants\";\nimport { getImperativeGroupMethods } from \"../../global/utils/getImperativeGroupMethods\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { GroupImperativeHandle } from \"./types\";\n\nexport function useGroupImperativeHandle(\n groupId: string,\n groupRef: Ref | undefined\n) {\n const imperativeGroupRef = useRef({\n getLayout: () => ({}),\n setLayout: IDENTITY_FUNCTION\n });\n\n useImperativeHandle(groupRef, () => imperativeGroupRef.current, []);\n\n useIsomorphicLayoutEffect(() => {\n Object.assign(\n imperativeGroupRef.current,\n getImperativeGroupMethods({ groupId })\n );\n });\n}\n","\"use client\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { mountGroup } from \"../../global/mountGroup\";\nimport { eventEmitter, read } from \"../../global/mutableState\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { useForceUpdate } from \"../../hooks/useForceUpdate\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { useStableObject } from \"../../hooks/useStableObject\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"../panel/constants\";\nimport type { RegisteredPanel } from \"../panel/types\";\nimport type { RegisteredSeparator } from \"../separator/types\";\nimport { getPanelSizeCssPropertyName } from \"./getPanelSizeCssPropertyName\";\nimport { GroupContext } from \"./GroupContext\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type { GroupProps, Layout, RegisteredGroup } from \"./types\";\nimport { useGroupImperativeHandle } from \"./useGroupImperativeHandle\";\n\n/**\n * A Group wraps a set of resizable Panel components.\n * Group content can be resized _horizontally_ or _vertically_.\n *\n * Group elements always include the following attributes:\n *\n * ```html\n *
\n * ```\n *\n * ℹ️ [Test id](https://testing-library.com/docs/queries/bytestid/) can be used to narrow selection when unit testing.\n */\nexport function Group({\n children,\n className,\n defaultLayout,\n disableCursor,\n disabled,\n elementRef: elementRefProp,\n groupRef,\n id: idProp,\n onLayoutChange: onLayoutChangeUnstable,\n orientation = \"horizontal\",\n style,\n ...rest\n}: GroupProps) {\n const prevLayoutRef = useRef({});\n\n const onLayoutChangeStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current = layout;\n onLayoutChangeUnstable?.(layout);\n });\n\n const id = useId(idProp);\n\n const elementRef = useRef(null);\n\n const [dragActive, setDragActive] = useState(false);\n const [layout, setLayout] = useState(defaultLayout ?? {});\n const [panelOrSeparatorChangeSigil, forceUpdate] = useForceUpdate();\n\n const inMemoryValuesRef = useRef<{\n lastExpandedPanelSizes: { [panelIds: string]: number };\n layouts: { [panelIds: string]: Layout };\n panels: RegisteredPanel[];\n separators: RegisteredSeparator[];\n }>({\n lastExpandedPanelSizes: {},\n layouts: {},\n panels: [],\n separators: []\n });\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n useGroupImperativeHandle(id, groupRef);\n\n const context = useMemo(\n () => ({\n id,\n orientation,\n registerPanel: (panel: RegisteredPanel) => {\n const inMemoryValues = inMemoryValuesRef.current;\n inMemoryValues.panels = sortByElementOffset(orientation, [\n ...inMemoryValues.panels,\n panel\n ]);\n\n forceUpdate();\n\n return () => {\n inMemoryValues.panels = inMemoryValues.panels.filter(\n (current) => current !== panel\n );\n\n forceUpdate();\n };\n },\n registerSeparator: (separator: RegisteredSeparator) => {\n const inMemoryValues = inMemoryValuesRef.current;\n inMemoryValues.separators = sortByElementOffset(orientation, [\n ...inMemoryValues.separators,\n separator\n ]);\n\n forceUpdate();\n\n return () => {\n inMemoryValues.separators = inMemoryValues.separators.filter(\n (current) => current !== separator\n );\n\n forceUpdate();\n };\n }\n }),\n [id, forceUpdate, orientation]\n );\n\n const stableProps = useStableObject({\n defaultLayout,\n disableCursor\n });\n\n const registeredGroupRef = useRef(null);\n\n // Register Group and child Panels/Separators with global state\n // Listen to global state for drag state related to this Group\n useIsomorphicLayoutEffect(() => {\n const element = elementRef.current;\n if (element === null) {\n return;\n }\n\n const inMemoryValues = inMemoryValuesRef.current;\n\n const group: RegisteredGroup = {\n defaultLayout: stableProps.defaultLayout,\n disableCursor: !!stableProps.disableCursor,\n disabled: !!disabled,\n element,\n id,\n inMemoryLastExpandedPanelSizes:\n inMemoryValuesRef.current.lastExpandedPanelSizes,\n inMemoryLayouts: inMemoryValuesRef.current.layouts,\n orientation,\n panels: inMemoryValues.panels,\n separators: inMemoryValues.separators\n };\n\n registeredGroupRef.current = group;\n\n const unmountGroup = mountGroup(group);\n\n const globalState = read();\n const match = globalState.mountedGroups.get(group);\n if (match) {\n const { defaultLayoutDeferred, derivedPanelConstraints, layout } = match;\n\n if (!defaultLayoutDeferred && derivedPanelConstraints.length > 0) {\n setLayout(layout);\n\n onLayoutChangeStable?.(layout);\n }\n }\n\n const removeInteractionStateChangeListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n switch (interactionState.state) {\n case \"active\": {\n setDragActive(\n interactionState.hitRegions.some(\n (current) => current.group === group\n )\n );\n break;\n }\n default: {\n setDragActive(false);\n break;\n }\n }\n }\n );\n\n const removeMountedGroupsChangeEventListener = eventEmitter.addListener(\n \"mountedGroupsChange\",\n (mountedGroups) => {\n const match = mountedGroups.get(group);\n if (match) {\n const { defaultLayoutDeferred, derivedPanelConstraints, layout } =\n match;\n\n if (defaultLayoutDeferred || derivedPanelConstraints.length === 0) {\n // This indicates that the Group has not finished mounting yet\n // Likely because it has been rendered inside of a hidden DOM subtree\n // Ignore layouts in this case because they will not have been validated\n return;\n }\n\n setLayout(layout);\n\n onLayoutChangeStable?.(layout);\n }\n }\n );\n\n return () => {\n registeredGroupRef.current = null;\n\n unmountGroup();\n removeInteractionStateChangeListener();\n removeMountedGroupsChangeEventListener();\n };\n }, [\n disabled,\n id,\n onLayoutChangeStable,\n orientation,\n panelOrSeparatorChangeSigil,\n stableProps\n ]);\n\n // Not all props require re-registering the group;\n // Some can be updated after the group has been registered\n useEffect(() => {\n const registeredGroup = registeredGroupRef.current;\n if (registeredGroup) {\n registeredGroup.defaultLayout = defaultLayout;\n registeredGroup.disableCursor = !!disableCursor;\n }\n });\n\n // Panel layouts and Group dragging state are shared via CSS variables\n const cssVariables: { [key: string]: number | string | undefined } = {\n [POINTER_EVENTS_CSS_PROPERTY_NAME]: dragActive ? \"none\" : undefined\n };\n for (const panelId in layout) {\n const propertyName = getPanelSizeCssPropertyName(id, panelId);\n const flexGrow = layout[panelId];\n cssVariables[propertyName] = flexGrow;\n }\n\n return (\n \n \n {children}\n
\n \n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nGroup.displayName = \"Group\";\n","export function debounce(fn: () => void, durationMs?: number): () => void;\nexport function debounce(\n fn: (args: Args) => void,\n durationMs?: number\n): (args: Args) => void;\nexport function debounce(\n fn: (args: Args) => void,\n durationMs: number = 10\n): (args: Args) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (args: Args) => {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n fn(args);\n }, durationMs);\n };\n}\n","export function getStorageKey(id: string, panelIds: string[]): string {\n return `react-resizable-panels:${[id, ...panelIds].join(\":\")}`;\n}\n","import { useMemo, useSyncExternalStore } from \"react\";\nimport { debounce } from \"../../utils/debounce\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\nimport type { Layout, LayoutStorage, OnGroupLayoutChange } from \"./types\";\n\n/**\n * Saves and restores group layouts between page loads.\n * It can be configured to store values using `localStorage`, `sessionStorage`, cookies, or any other persistence layer that makes sense for your application.\n */\nexport function useDefaultLayout({\n debounceSaveMs = 100,\n panelIds,\n storage = localStorage,\n ...rest\n}: {\n /**\n * Debounce save operation by the specified number of milliseconds; defaults to 100ms\n */\n debounceSaveMs?: number;\n\n /**\n * For Groups that contain conditionally-rendered Panels, this prop can be used to save and restore multiple layouts.\n *\n * ℹ️ This prevents layout shift for server-rendered apps.\n *\n * ⚠️ Panel ids must match the Panels rendered within the Group during mount or the initial layout will be incorrect.\n */\n panelIds?: string[] | undefined;\n\n /**\n * Storage implementation; supports localStorage, sessionStorage, and custom implementations\n * Refer to documentation site for example integrations.\n *\n */\n storage?: LayoutStorage;\n} & (\n | {\n /**\n * Group id; must be unique in order for layouts to be saved separately.\n * @deprecated Use the {@link id} param instead\n */\n groupId: string;\n }\n | {\n /**\n * Uniquely identifies a specific group/layout.\n */\n id: string;\n }\n)) {\n const hasPanelIds = panelIds !== undefined;\n const id = \"id\" in rest ? rest.id : rest.groupId;\n\n const readStorageKey = getStorageKey(id, panelIds ?? []);\n\n // In the event that a client-only storage API is provided,\n // useSyncExternalStore prevents server/client hydration mismatch warning\n // This is not ideal; if possible a server-friendly storage API should be used\n const defaultLayoutString = useSyncExternalStore(\n subscribe,\n () => storage.getItem(readStorageKey),\n () => storage.getItem(readStorageKey)\n );\n\n const defaultLayout = useMemo(\n () =>\n defaultLayoutString\n ? (JSON.parse(defaultLayoutString) as Layout)\n : undefined,\n [defaultLayoutString]\n );\n\n const onLayoutChange = useMemo>(() => {\n const saveLayout = (layout: Layout) => {\n let writeStorageKey: string;\n if (hasPanelIds) {\n writeStorageKey = getStorageKey(id, Object.keys(layout));\n } else {\n writeStorageKey = getStorageKey(id, []);\n }\n\n try {\n storage.setItem(writeStorageKey, JSON.stringify(layout));\n } catch (error) {\n console.error(error);\n }\n };\n\n return debounceSaveMs > 0\n ? debounce(saveLayout, debounceSaveMs)\n : saveLayout;\n }, [debounceSaveMs, hasPanelIds, id, storage]);\n\n return {\n defaultLayout,\n onLayoutChange\n };\n}\n\nfunction subscribe() {\n return function unsubscribe() {};\n}\n","import { useState } from \"react\";\nimport type { GroupImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Group component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function useGroupCallbackRef() {\n return useState(null);\n}\n","import { useRef } from \"react\";\nimport type { GroupImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Group component.\n */\nexport function useGroupRef() {\n return useRef(null);\n}\n","import { useContext } from \"react\";\nimport { assert } from \"../../utils/assert\";\nimport { GroupContext } from \"./GroupContext\";\n\nexport function useGroupContext() {\n const context = useContext(GroupContext);\n assert(\n context,\n \"Group Context not found; did you render a Panel or Separator outside of a Group?\"\n );\n\n return context;\n}\n","import type { PanelImperativeHandle } from \"../../components/panel/types\";\nimport { calculateAvailableGroupSize } from \"../dom/calculateAvailableGroupSize\";\nimport { read, update } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function getImperativePanelMethods({\n groupId,\n panelId\n}: {\n groupId: string;\n panelId: string;\n}): PanelImperativeHandle {\n const find = () => {\n const { mountedGroups } = read();\n for (const [\n group,\n {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout,\n separatorToPanels\n }\n ] of mountedGroups) {\n if (group.id === groupId) {\n return {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n group,\n layout,\n separatorToPanels\n };\n }\n }\n\n throw Error(`Group ${groupId} not found`);\n };\n\n const getPanelConstraints = () => {\n const match = find().derivedPanelConstraints.find(\n (current) => current.panelId === panelId\n );\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Panel constraints not found for Panel ${panelId}`);\n };\n\n const getPanel = () => {\n const match = find().group.panels.find((current) => current.id === panelId);\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${panelId}`);\n };\n\n const getPanelSize = () => {\n const match = find().layout[panelId];\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${panelId}`);\n };\n\n const setPanelSize = (nextSize: number) => {\n const prevSize = getPanelSize();\n if (nextSize === prevSize) {\n return;\n }\n\n const {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n group,\n layout: prevLayout,\n separatorToPanels\n } = find();\n\n const index = group.panels.findIndex((current) => current.id === panelId);\n const isLastPanel = index === group.panels.length - 1;\n\n const unsafeLayout = adjustLayoutByDelta({\n delta: isLastPanel ? prevSize - nextSize : nextSize - prevSize,\n initialLayout: prevLayout,\n panelConstraints: derivedPanelConstraints,\n pivotIndices: isLastPanel ? [index - 1, index] : [index, index + 1],\n prevLayout,\n trigger: \"imperative-api\"\n });\n\n const nextLayout = validatePanelGroupLayout({\n layout: unsafeLayout,\n panelConstraints: derivedPanelConstraints\n });\n if (!layoutsEqual(prevLayout, nextLayout)) {\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels\n })\n }));\n }\n };\n\n return {\n collapse: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const { mutableValues } = getPanel();\n const size = getPanelSize();\n\n if (collapsible && size !== collapsedSize) {\n // Store previous size in to restore if expand() is called\n mutableValues.expandToSize = size;\n\n setPanelSize(collapsedSize);\n }\n },\n expand: () => {\n const { collapsible, collapsedSize, minSize } = getPanelConstraints();\n const { mutableValues } = getPanel();\n const size = getPanelSize();\n\n if (collapsible && size === collapsedSize) {\n // Restore pre-collapse size, fallback to minSize\n let nextSize = mutableValues.expandToSize ?? minSize;\n\n // Edge case: if minSize is 0, pick something meaningful to expand the panel to\n if (nextSize === 0) {\n nextSize = 1;\n }\n\n setPanelSize(nextSize);\n }\n },\n getSize: () => {\n const { group } = find();\n const asPercentage = getPanelSize();\n const { element } = getPanel();\n\n const inPixels =\n group.orientation === \"horizontal\"\n ? element.offsetWidth\n : element.offsetHeight;\n\n return {\n asPercentage,\n inPixels\n };\n },\n isCollapsed: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const size = getPanelSize();\n\n return collapsible && layoutNumbersEqual(collapsedSize, size);\n },\n resize: (size: number | string) => {\n const prevSize = getPanelSize();\n if (prevSize !== size) {\n let asPercentage;\n switch (typeof size) {\n case \"number\": {\n const { group } = find();\n const groupSize = calculateAvailableGroupSize({ group });\n asPercentage = formatLayoutNumber((size / groupSize) * 100);\n break;\n }\n case \"string\": {\n asPercentage = parseFloat(size);\n break;\n }\n }\n\n setPanelSize(asPercentage);\n }\n }\n } satisfies PanelImperativeHandle;\n}\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { NOOP_FUNCTION } from \"../../constants\";\nimport { getImperativePanelMethods } from \"../../global/utils/getImperativePanelMethods\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { PanelImperativeHandle } from \"./types\";\n\nexport function usePanelImperativeHandle(\n panelId: string,\n panelRef: Ref | undefined\n) {\n const { id: groupId } = useGroupContext();\n\n const imperativePanelRef = useRef({\n collapse: NOOP_FUNCTION,\n expand: NOOP_FUNCTION,\n getSize: () => ({\n asPercentage: 0,\n inPixels: 0\n }),\n isCollapsed: () => false,\n resize: NOOP_FUNCTION\n });\n\n useImperativeHandle(panelRef, () => imperativePanelRef.current, []);\n\n useIsomorphicLayoutEffect(() => {\n Object.assign(\n imperativePanelRef.current,\n getImperativePanelMethods({ groupId, panelId })\n );\n });\n}\n","\"use client\";\n\nimport type { Property } from \"csstype\";\nimport { useRef, type CSSProperties } from \"react\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { getPanelSizeCssPropertyName } from \"../group/getPanelSizeCssPropertyName\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"./constants\";\nimport type { PanelProps, PanelSize } from \"./types\";\nimport { usePanelImperativeHandle } from \"./usePanelImperativeHandle\";\n\n/**\n * A Panel wraps resizable content and can be configured with min/max size constraints and collapsible behavior.\n *\n * Panel size props can be in the following formats:\n * - Percentage of the parent Group (0..100)\n * - Pixels\n * - Relative font units (em, rem)\n * - Viewport relative units (vh, vw)\n *\n * ℹ️ Numeric values are assumed to be pixels.\n * Strings without explicit units are assumed to be percentages (0%..100%).\n * Percentages may also be specified as strings ending with \"%\" (e.g. \"33%\")\n * Pixels may also be specified as strings ending with the unit \"px\".\n * Other units should be specified as strings ending with their CSS property units (e.g. 1rem, 50vh)\n *\n * Panel elements always include the following attributes:\n *\n * ```html\n *
\n * ```\n *\n * ℹ️ [Test id](https://testing-library.com/docs/queries/bytestid/) can be used to narrow selection when unit testing.\n */\nexport function Panel({\n children,\n className,\n collapsedSize = \"0%\",\n collapsible = false,\n defaultSize,\n elementRef: elementRefProp,\n id: idProp,\n maxSize = \"100%\",\n minSize = \"0%\",\n onResize: onResizeUnstable,\n panelRef,\n style,\n ...rest\n}: PanelProps) {\n const idIsStable = !!idProp;\n\n const id = useId(idProp);\n\n const elementRef = useRef(null);\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const { id: groupId, registerPanel } = useGroupContext();\n\n const hasOnResize = onResizeUnstable !== null;\n const onResizeStable = useStableCallback(\n (\n panelSize: PanelSize,\n _: string | number | undefined,\n prevPanelSize: PanelSize | undefined\n ) => {\n onResizeUnstable?.(panelSize, idProp, prevPanelSize);\n }\n );\n\n // Register Panel with parent Group\n useIsomorphicLayoutEffect(() => {\n const element = elementRef.current;\n if (element !== null) {\n return registerPanel({\n element,\n id,\n idIsStable,\n mutableValues: {\n expandToSize: undefined,\n prevSize: undefined\n },\n onResize: hasOnResize ? onResizeStable : undefined,\n panelConstraints: {\n collapsedSize,\n collapsible,\n defaultSize,\n maxSize,\n minSize\n }\n });\n }\n }, [\n collapsedSize,\n collapsible,\n defaultSize,\n hasOnResize,\n id,\n idIsStable,\n maxSize,\n minSize,\n onResizeStable,\n registerPanel\n ]);\n\n usePanelImperativeHandle(id, panelRef);\n\n const flexGrowVar = getPanelSizeCssPropertyName(groupId, id);\n\n return (\n \n \n {children}\n
\n \n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nPanel.displayName = \"Panel\";\n\nconst PROHIBITED_CSS_PROPERTIES: CSSProperties = {\n minHeight: \"unset\",\n maxHeight: \"unset\",\n height: \"unset\",\n\n minWidth: \"unset\",\n maxWidth: \"unset\",\n width: \"unset\",\n\n flex: \"unset\",\n flexBasis: \"unset\",\n flexShrink: \"unset\",\n flexGrow: \"unset\",\n\n border: \"unset\",\n borderWidth: \"unset\",\n padding: \"unset\",\n margin: \"unset\"\n};\n","import { useState } from \"react\";\nimport type { PanelImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Panel component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function usePanelCallbackRef() {\n return useState(null);\n}\n","import { useRef } from \"react\";\nimport type { PanelImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Panel component.\n */\nexport function usePanelRef() {\n return useRef(null);\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function calculateSeparatorAriaValues({\n layout,\n panelConstraints,\n panelId,\n panelIndex\n}: {\n layout: Layout;\n panelConstraints: PanelConstraints[];\n panelId: string;\n panelIndex: number;\n}): {\n valueControls: string | undefined;\n valueMax: number | undefined;\n valueMin: number | undefined;\n valueNow: number | undefined;\n} {\n let valueMax: number | undefined = undefined;\n let valueMin: number | undefined = undefined;\n\n const panelSize = layout[panelId];\n\n const constraints = panelConstraints.find(\n (current) => current.panelId === panelId\n );\n if (constraints) {\n const maxSize = constraints.maxSize;\n const minSize = (valueMin = constraints.collapsible\n ? constraints.collapsedSize\n : constraints.minSize);\n\n const pivotIndices = [panelIndex, panelIndex + 1];\n\n const minSizeLayout = validatePanelGroupLayout({\n layout: adjustLayoutByDelta({\n delta: minSize - panelSize,\n initialLayout: layout,\n panelConstraints,\n pivotIndices,\n prevLayout: layout,\n trigger: \"keyboard\"\n }),\n panelConstraints\n });\n\n valueMin = minSizeLayout[panelId];\n\n const maxSizeLayout = validatePanelGroupLayout({\n layout: adjustLayoutByDelta({\n delta: maxSize - panelSize,\n initialLayout: layout,\n panelConstraints,\n pivotIndices,\n prevLayout: layout,\n trigger: \"keyboard\"\n }),\n panelConstraints\n });\n\n valueMax = maxSizeLayout[panelId];\n }\n\n return {\n valueControls: panelId,\n valueMax,\n valueMin,\n valueNow: panelSize\n };\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\nimport { eventEmitter } from \"../../global/mutableState\";\nimport type { InteractionState } from \"../../global/types\";\nimport { calculateSeparatorAriaValues } from \"../../global/utils/calculateSeparatorAriaValues\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { RegisteredSeparator, SeparatorProps } from \"./types\";\n\n/**\n * Separators are not _required_ but they are _recommended_ as they improve keyboard accessibility.\n *\n * Separators should be rendered as the direct child of a Group component.\n *\n * Separator elements always include the following attributes:\n *\n * ```html\n *
\n * ```\n *\n * ℹ️ [Test id](https://testing-library.com/docs/queries/bytestid/) can be used to narrow selection when unit testing.\n *\n * ℹ️ In addition to the attributes shown above, separator also renders all required [WAI-ARIA properties](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/separator_role#associated_wai-aria_roles_states_and_properties).\n */\nexport function Separator({\n children,\n className,\n elementRef: elementRefProp,\n id: idProp,\n style,\n ...rest\n}: SeparatorProps) {\n const id = useId(idProp);\n\n const [aria, setAria] = useState<{\n valueControls?: string | undefined;\n valueMin?: number | undefined;\n valueMax?: number | undefined;\n valueNow?: number | undefined;\n }>({});\n\n const [dragState, setDragState] =\n useState(\"inactive\");\n\n const elementRef = useRef(null);\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const {\n id: groupId,\n orientation: groupOrientation,\n registerSeparator\n } = useGroupContext();\n\n const orientation =\n groupOrientation === \"horizontal\" ? \"vertical\" : \"horizontal\";\n\n // Register Separator with parent Group\n // Listen to global state for drag state related to this Separator\n useIsomorphicLayoutEffect(() => {\n const element = elementRef.current;\n if (element !== null) {\n const separator: RegisteredSeparator = {\n element,\n id\n };\n\n const unregisterSeparator = registerSeparator(separator);\n\n const removeInteractionStateChangeListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n setDragState(\n interactionState.state !== \"inactive\" &&\n interactionState.hitRegions.some(\n (hitRegion) => hitRegion.separator === separator\n )\n ? interactionState.state\n : \"inactive\"\n );\n }\n );\n\n const removeMountedGroupsChangeListener = eventEmitter.addListener(\n \"mountedGroupsChange\",\n (mountedGroups) => {\n mountedGroups.forEach(\n (\n { derivedPanelConstraints, layout, separatorToPanels },\n mountedGroup\n ) => {\n if (mountedGroup.id === groupId) {\n const panels = separatorToPanels.get(separator);\n if (panels) {\n const primaryPanel = panels[0];\n const panelIndex = mountedGroup.panels.indexOf(primaryPanel);\n\n setAria(\n calculateSeparatorAriaValues({\n layout,\n panelConstraints: derivedPanelConstraints,\n panelId: primaryPanel.id,\n panelIndex\n })\n );\n }\n }\n }\n );\n }\n );\n\n return () => {\n removeInteractionStateChangeListener();\n removeMountedGroupsChangeListener();\n unregisterSeparator();\n };\n }\n }, [groupId, id, registerSeparator]);\n\n return (\n \n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nSeparator.displayName = \"Separator\";\n"],"names":["assert","expectedCondition","message","calculateAvailableGroupSize","group","orientation","panels","totalSize","panel","sortByElementOffset","panelsOrSeparators","horizontalSort","verticalSort","a","b","delta","isHTMLElement","value","getDistanceBetweenPointAndRect","point","rect","findClosestRect","rects","targetRect","centerPoint","closestRect","minDistance","x","y","distance","calculateHitRegions","groupElement","separators","sortedChildElements","element","hitRegions","hasInterleavedStaticContent","prevPanel","pendingSeparators","childElement","panelData","current","prevRect","pendingRectsOrSeparators","firstPanelEdgeRect","secondPanelEdgeRect","separator","rectOrSeparator","separatorData","convertEmToPixels","style","fontSize","convertRemToPixels","convertVhToPixels","convertVwToPixels","parseSizeAndUnit","size","numeric","sizeStyleToPixels","groupSize","panelElement","styleProp","pixels","unit","formatLayoutNumber","number","calculatePanelConstraints","panelConstraints","collapsedSize","defaultSize","minSize","maxSize","EventEmitter","#listenerMap","type","listener","listeners","data","didThrow","caughtError","clonedListeners","i","error","index","layoutNumbersEqual","actual","expected","minimumDelta","state","eventEmitter","read","update","partialState","prevState","constraints","prevLayout","isCollapsed","wasCollapsed","isArrayEqual","compareLayoutNumbers","validatePanelSize","collapsible","halfwayPoint","adjustLayoutByDelta","initialLayoutProp","panelConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","prevSize","localDelta","increment","maxAvailableDelta","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","total","prevLayoutKeys","accumulated","findSeparatorGroup","separatorElement","mountedGroups","layoutsEqual","id","validatePanelGroupLayout","layout","nextLayoutTotalSize","remainingSize","getImperativeGroupMethods","groupId","find","defaultLayoutDeferred","unsafeLayout","derivedPanelConstraints","separatorToPanels","getMountedGroup","mountedGroup","adjustLayoutForSeparator","onDocumentKeyDown","event","primaryPanel","nextSize","separatorElements","nextIndex","IDENTITY_FUNCTION","NOOP_FUNCTION","CURSOR_FLAG_HORIZONTAL_MIN","CURSOR_FLAG_HORIZONTAL_MAX","CURSOR_FLAG_VERTICAL_MIN","CURSOR_FLAG_VERTICAL_MAX","DEFAULT_POINTER_PRECISION","findClosetHitRegion","closestHitRegion","hitRegion","cached","isCoarsePointer","isShadowRoot","compare","ancestors","get_ancestors","common_ancestor","z_indexes","get_z_index","find_stacking_context","children","furthest_ancestors","child","props","is_flex_item","node","display","get_parent","creates_stacking_context","nodes","parentNode","doRectsIntersect","isViableHitTarget","pointerEventTarget","currentElement","findMatchingHitRegions","matchingHitRegions","_","groupData","maxDistance","match","onDocumentPointerDown","groups","initialLayoutMap","didChangeFocus","getCursorStyle","cursorFlags","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","documentToStyleMap","updateCursorStyle","ownerDocument","prevStyle","styleSheet","interactionState","cursorStyle","nextStyle","updateActiveHitRegions","document","pointerDownAtPoint","nextMountedGroups","disableCursor","deltaAsPercentage","panelIdsKey","onDocumentPointerLeave","onDocumentPointerMove","onDocumentPointerUp","calculateDefaultLayout","explicitCount","remainingPanelCount","notifyPanelOnResize","borderBoxSize","resizeObserverSize","objectsEqual","key","validateLayoutKeys","panelIds","layoutKeys","panelId","ownerDocumentReferenceCounts","mountGroup","isMounted","ResizeObserver","separatorIds","resizeObserver","entries","entry","target","nextDerivedPanelConstraints","defaultLayout","defaultLayoutUnsafe","defaultLayoutSafe","useForceUpdate","sigil","setSigil","useState","forceUpdate","useCallback","useId","stableId","dynamicId","useIdReact","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useStableCallback","fn","ref","useRef","args","useMergedRefs","refs","useStableObject","unstableObject","POINTER_EVENTS_CSS_PROPERTY_NAME","getPanelSizeCssPropertyName","groupIdEscaped","panelIdEscaped","GroupContext","createContext","useGroupImperativeHandle","groupRef","imperativeGroupRef","useImperativeHandle","Group","className","disabled","elementRefProp","idProp","onLayoutChangeUnstable","rest","prevLayoutRef","onLayoutChangeStable","elementRef","dragActive","setDragActive","setLayout","panelOrSeparatorChangeSigil","inMemoryValuesRef","mergedRef","context","useMemo","inMemoryValues","stableProps","registeredGroupRef","unmountGroup","removeInteractionStateChangeListener","removeMountedGroupsChangeEventListener","registeredGroup","cssVariables","propertyName","flexGrow","jsx","debounce","durationMs","timeout","getStorageKey","useDefaultLayout","debounceSaveMs","storage","hasPanelIds","readStorageKey","defaultLayoutString","useSyncExternalStore","subscribe","onLayoutChange","saveLayout","writeStorageKey","useGroupCallbackRef","useGroupRef","useGroupContext","useContext","getImperativePanelMethods","getPanelConstraints","getPanel","getPanelSize","setPanelSize","isLastPanel","mutableValues","asPercentage","inPixels","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","onResizeUnstable","idIsStable","registerPanel","hasOnResize","onResizeStable","panelSize","prevPanelSize","flexGrowVar","PROHIBITED_CSS_PROPERTIES","usePanelCallbackRef","usePanelRef","calculateSeparatorAriaValues","panelIndex","valueMax","valueMin","Separator","aria","setAria","dragState","setDragState","groupOrientation","registerSeparator","unregisterSeparator","removeMountedGroupsChangeListener"],"mappings":"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"}