react-resizable-panels 4.5.4 → 4.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-resizable-panels.js","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/utils/isCoarsePointer.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/global/utils/findClosestHitRegion.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/utils/isArrayEqual.ts","../lib/global/utils/compareLayoutNumbers.ts","../lib/global/utils/validatePanelSize.ts","../lib/global/utils/adjustLayoutByDelta.ts","../lib/global/utils/layoutsEqual.ts","../lib/global/utils/validatePanelGroupLayout.ts","../lib/global/utils/getImperativePanelMethods.ts","../lib/global/event-handlers/onDocumentDoubleClick.ts","../lib/global/utils/findSeparatorGroup.ts","../lib/global/utils/getImperativeGroupMethods.ts","../lib/global/utils/getMountedGroup.ts","../lib/global/utils/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onDocumentKeyDown.ts","../lib/global/event-handlers/onDocumentPointerDown.ts","../lib/constants.ts","../lib/global/cursor/supportsAdvancedCursorStyles.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/group/GroupContext.ts","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/Group.tsx","../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/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 Array.from(panelsOrSeparators).sort(\n orientation === \"horizontal\" ? horizontalSort : verticalSort\n ) as ReturnType;\n}\n\nfunction horizontalSort<Type extends { element: HTMLElement }>(\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<Type extends { element: HTMLElement }>(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","let cached: boolean | undefined = undefined;\n\n/**\n * Caches and returns matchMedia()'s computed value for \"pointer:coarse\"\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","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 { isCoarsePointer } from \"../utils/isCoarsePointer\";\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 let rect =\n \"width\" in rectOrSeparator\n ? rectOrSeparator\n : rectOrSeparator.element.getBoundingClientRect();\n\n const minHitTargetSize = isCoarsePointer()\n ? group.resizeTargetMinimumSize.coarse\n : group.resizeTargetMinimumSize.fine;\n if (rect.width < minHitTargetSize) {\n const delta = minHitTargetSize - rect.width;\n rect = new DOMRect(\n rect.x - delta / 2,\n rect.y,\n rect.width + delta,\n rect.height\n );\n }\n if (rect.height < minHitTargetSize) {\n const delta = minHitTargetSize - rect.height;\n rect = new DOMRect(\n rect.x,\n rect.y - delta / 2,\n rect.width,\n rect.height + delta\n );\n }\n\n hitRegions.push({\n group,\n groupSize: calculateAvailableGroupSize({ group }),\n panels: [prevPanel, panelData],\n separator:\n \"width\" in rectOrSeparator ? undefined : rectOrSeparator,\n rect\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<PanelConstraints>((panel) => {\n const { element, panelConstraints } = panel;\n\n let collapsedSize = 0;\n if (panelConstraints.collapsedSize !== undefined) {\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 !== undefined) {\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 !== undefined) {\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 !== undefined) {\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: Data) => void;\n\nexport class EventEmitter<Events extends EventMap> {\n #listenerMap: {\n [Key in keyof Events]?: EventListener<Events[Key]>[];\n } = {};\n\n addListener<Type extends keyof Events>(\n type: Type,\n listener: EventListener<Events[Type]>\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 extends keyof Events>(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<Type extends keyof Events>(\n type: Type,\n listener: EventListener<Events[Type]>\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<State>;\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<Events>();\n\nexport function read(): State {\n return state;\n}\n\nexport function update(value: Partial<State> | 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","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 findClosestHitRegion(\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","// 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 common_ancestor = ancestors.a.pop() as HTMLElement;\n ancestors.b.pop();\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, ... <body>, <html>, 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 {\n calculateHitRegions,\n type HitRegion\n} from \"../dom/calculateHitRegions\";\nimport type { MountedGroupMap } from \"../mutableState\";\nimport { findClosestHitRegion } from \"./findClosestHitRegion\";\nimport { isViableHitTarget } from \"./isViableHitTarget\";\n\nexport function findMatchingHitRegions(\n event: {\n clientX: number;\n clientY: number;\n target: EventTarget | null;\n },\n mountedGroups: MountedGroupMap\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedGroups.forEach((_, groupData) => {\n if (groupData.disabled) {\n return;\n }\n\n const hitRegions = calculateHitRegions(groupData);\n const match = findClosestHitRegion(groupData.orientation, hitRegions, {\n x: event.clientX,\n y: event.clientY\n });\n if (\n match &&\n match.distance.x <= 0 &&\n match.distance.y <= 0 &&\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","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 switch (trigger) {\n case \"keyboard\": {\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 {\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 break;\n }\n default: {\n // If we're starting from a collapsed state, dragging past the halfway point should cause the panel to expand\n // This can happen for positive or negative drags, and panels on either side of the separator can be collapsible\n // The easiest way to support this is to detect this scenario and pre-adjust the delta before applying the rest of the layout algorithm\n // DEBUG.push(`edge case check 3: collapsible panels`);\n\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 { collapsible, collapsedSize, minSize } = panelConstraints;\n if (collapsible) {\n // DEBUG.push(` -> collapsible panel`);\n // DEBUG.push(` -> halfway point: ${halfwayPoint}`);\n if (delta > 0) {\n const gapSize = minSize - collapsedSize;\n const halfwayPoint = gapSize / 2;\n\n if (compareLayoutNumbers(delta, minSize) < 0) {\n delta =\n compareLayoutNumbers(delta, halfwayPoint) <= 0 ? 0 : gapSize;\n // DEBUG.push(` -> adjusting delta for collapse: ${delta}`);\n }\n } else {\n const gapSize = minSize - collapsedSize;\n const halfwayPoint = 100 - gapSize / 2;\n\n if (compareLayoutNumbers(100 + delta, minSize) > 0) {\n delta =\n compareLayoutNumbers(100 + delta, halfwayPoint) > 0\n ? 0\n : -gapSize;\n // DEBUG.push(` -> adjusting delta for collapse: ${delta}`);\n }\n }\n }\n break;\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<Layout>((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\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<Layout>((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\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 { read } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { getImperativePanelMethods } from \"../utils/getImperativePanelMethods\";\n\nexport function onDocumentDoubleClick(event: MouseEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n hitRegions.forEach((current) => {\n if (current.separator) {\n const panelWithDefaultSize = current.panels.find(\n (panel) => panel.panelConstraints.defaultSize !== undefined\n );\n if (panelWithDefaultSize) {\n const defaultSize = panelWithDefaultSize.panelConstraints.defaultSize;\n const api = getImperativePanelMethods({\n groupId: current.group.id,\n panelId: panelWithDefaultSize.id\n });\n if (api && defaultSize !== undefined) {\n api.resize(defaultSize);\n\n event.preventDefault();\n }\n }\n }\n });\n}\n","import { read } from \"../mutableState\";\n\nexport function findSeparatorGroup(separatorElement: HTMLElement) {\n const { mountedGroups } = read();\n\n for (const [group] of mountedGroups) {\n if (\n group.separators.some(\n (separator) => separator.element === separatorElement\n )\n ) {\n return group;\n }\n }\n\n throw Error(\"Could not find parent Group for separator element\");\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","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\n\nexport function onDocumentPointerDown(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n } else if (event.pointerType === \"mouse\" && event.button > 0) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n const initialLayoutMap = new Map<RegisteredGroup, Layout>();\n\n let didChangeFocus = false;\n\n hitRegions.forEach((current) => {\n if (current.separator) {\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","// 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;\nexport const CURSOR_FLAGS_HORIZONTAL = 0b0011;\nexport const CURSOR_FLAGS_VERTICAL = 0b1100;\n","let cached: boolean | undefined = undefined;\n\nexport function overrideSupportsAdvancedCursorStylesForTesting(\n override: boolean\n) {\n cached = override;\n}\n\n/**\n * Caches and returns if advanced cursor CSS styles are supported.\n */\nexport function supportsAdvancedCursorStyles(): boolean {\n if (cached === undefined) {\n cached = false;\n\n if (typeof window !== \"undefined\") {\n if (\n window.navigator.userAgent.includes(\"Chrome\") ||\n window.navigator.userAgent.includes(\"Firefox\")\n ) {\n cached = true;\n }\n }\n }\n\n return cached;\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\";\nimport { supportsAdvancedCursorStyles } from \"./supportsAdvancedCursorStyles\";\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 if (cursorFlags) {\n if (supportsAdvancedCursorStyles()) {\n const horizontalMin =\n (cursorFlags & CURSOR_FLAG_HORIZONTAL_MIN) !== 0;\n const horizontalMax =\n (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 (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 }\n break;\n }\n }\n\n if (supportsAdvancedCursorStyles()) {\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 } else {\n if (horizontalCount > 0 && verticalCount > 0) {\n return \"grab\";\n } else if (horizontalCount > 0) {\n return \"col-resize\";\n } else {\n return \"row-resize\";\n }\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.push(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 = `*, *:hover {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 CURSOR_FLAGS_HORIZONTAL,\n CURSOR_FLAGS_VERTICAL\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 prevCursorFlags\n}: {\n document: Document;\n event: {\n clientX: number;\n clientY: number;\n movementX: number;\n movementY: number;\n };\n hitRegions: HitRegion[];\n initialLayoutMap: Map<RegisteredGroup, Layout>;\n mountedGroups: MountedGroupMap;\n pointerDownAtPoint?: Point;\n prevCursorFlags: number;\n}) {\n let nextCursorFlags = 0;\n\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 nextCursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_HORIZONTAL_MIN\n : CURSOR_FLAG_HORIZONTAL_MAX;\n break;\n }\n case \"vertical\": {\n nextCursorFlags |=\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 // Edge case\n // Re-use previous horizontal/vertical cursor flags if there's been no movement since the last event\n // This accounts for edge cases in browsers like Firefox that sometimes round clientX/clientY values\n let cursorFlags = 0;\n if (event.movementX === 0) {\n cursorFlags |= prevCursorFlags & CURSOR_FLAGS_HORIZONTAL;\n } else {\n cursorFlags |= nextCursorFlags & CURSOR_FLAGS_HORIZONTAL;\n }\n if (event.movementY === 0) {\n cursorFlags |= prevCursorFlags & CURSOR_FLAGS_VERTICAL;\n } else {\n cursorFlags |= nextCursorFlags & CURSOR_FLAGS_VERTICAL;\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 { cursorFlags, 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 prevCursorFlags: cursorFlags\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 { cursorFlags, 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: { state: \"inactive\" }\n }\n );\n\n // Dispatch one more \"change\" event after the interaction state has been reset\n // Groups use this as a signal to call onLayoutChanged\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups)\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 prevCursorFlags: cursorFlags\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: {\n state: \"inactive\"\n }\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 } else if (event.pointerType === \"mouse\" && event.button > 0) {\n return;\n }\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 if (interactionState.hitRegions.length > 0) {\n updateCursorStyle(event.currentTarget as Document);\n\n // Dispatch one more \"change\" event after the interaction state has been reset\n // Groups use this as a signal to call onLayoutChanged\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups)\n }));\n\n event.preventDefault();\n }\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 panelSize =\n group.orientation === \"horizontal\"\n ? panel.element.offsetWidth\n : panel.element.offsetHeight;\n\n const prevSize = panel.mutableValues.prevSize;\n const nextSize = {\n asPercentage: formatLayoutNumber((panelSize / groupSize) * 100),\n inPixels: panelSize\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 { onDocumentDoubleClick } from \"./event-handlers/onDocumentDoubleClick\";\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<Document, number>();\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<string>();\n const separatorIds = new Set<string>();\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(\"dblclick\", onDocumentDoubleClick, true);\n ownerDocument.addEventListener(\"pointerdown\", onDocumentPointerDown, true);\n ownerDocument.addEventListener(\"pointerleave\", onDocumentPointerLeave);\n ownerDocument.addEventListener(\"pointermove\", onDocumentPointerMove);\n ownerDocument.addEventListener(\"pointerup\", onDocumentPointerUp, true);\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(\n \"dblclick\",\n onDocumentDoubleClick,\n true\n );\n ownerDocument.removeEventListener(\n \"pointerdown\",\n onDocumentPointerDown,\n true\n );\n ownerDocument.removeEventListener(\"pointerleave\", onDocumentPointerLeave);\n ownerDocument.removeEventListener(\"pointermove\", onDocumentPointerMove);\n ownerDocument.removeEventListener(\"pointerup\", onDocumentPointerUp, true);\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<Callback extends Function>(\n fn: Callback\n): Callback {\n const ref = useRef<Callback>(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<Type> = Ref<Type> | undefined;\n\nexport function useMergedRefs<Type>(...refs: PossibleRef<Type>[]) {\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<Type extends object>(\n unstableObject: Type\n): Type {\n const ref = useRef<Type>({ ...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","import { createContext } from \"react\";\nimport type { GroupContextType } from \"./types\";\n\nexport const GroupContext = createContext<GroupContextType | null>(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<GroupImperativeHandle> | undefined\n) {\n const imperativeGroupRef = useRef<GroupImperativeHandle>({\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\";\n\nimport { useEffect, useMemo, useRef, type CSSProperties } 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 type { RegisteredPanel } from \"../panel/types\";\nimport type { RegisteredSeparator } from \"../separator/types\";\nimport { GroupContext } from \"./GroupContext\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type {\n GroupProps,\n Layout,\n RegisteredGroup,\n ResizeTargetMinimumSize\n} 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 * <div data-group data-testid=\"group-id-prop\" id=\"group-id-prop\">\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 onLayoutChanged: onLayoutChangedUnstable,\n orientation = \"horizontal\",\n resizeTargetMinimumSize = {\n coarse: 20,\n fine: 10\n },\n style,\n ...rest\n}: GroupProps) {\n const prevLayoutRef = useRef<{\n onLayoutChange: Layout;\n onLayoutChanged: Layout;\n }>({\n onLayoutChange: {},\n onLayoutChanged: {}\n });\n\n const onLayoutChangeStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current.onLayoutChange, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChange = layout;\n onLayoutChangeUnstable?.(layout);\n });\n\n const onLayoutChangedStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current.onLayoutChanged, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChanged = layout;\n onLayoutChangedUnstable?.(layout);\n });\n\n const id = useId(idProp);\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n\n const [panelOrSeparatorChangeSigil, forceUpdate] = useForceUpdate();\n\n const inMemoryValuesRef = useRef<{\n lastExpandedPanelSizes: { [panelIds: string]: number };\n layouts: { [panelIds: string]: Layout };\n panels: RegisteredPanel[];\n resizeTargetMinimumSize: ResizeTargetMinimumSize;\n separators: RegisteredSeparator[];\n }>({\n lastExpandedPanelSizes: {},\n layouts: {},\n panels: [],\n resizeTargetMinimumSize,\n separators: []\n });\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n useGroupImperativeHandle(id, groupRef);\n\n // TRICKY Don't read for state; it will always lag behind by one tick\n const getPanelStyles = useStableCallback(\n (groupId: string, panelId: string) => {\n const { interactionState, mountedGroups } = read();\n\n for (const group of mountedGroups.keys()) {\n if (group.id === groupId) {\n const match = mountedGroups.get(group);\n if (match) {\n let dragActive = false;\n switch (interactionState.state) {\n case \"active\": {\n dragActive = interactionState.hitRegions.some(\n (current) => current.group === group\n );\n break;\n }\n }\n\n return {\n flexGrow: match.layout[panelId] ?? 1,\n pointerEvents: dragActive ? \"none\" : undefined\n } satisfies CSSProperties;\n }\n }\n }\n\n // This is unexpected except for the initial mount (before the group has registered with the global store)\n return {\n flexGrow: defaultLayout?.[panelId] ?? 1\n } satisfies CSSProperties;\n }\n );\n\n const context = useMemo(\n () => ({\n getPanelStyles,\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 [getPanelStyles, id, forceUpdate, orientation]\n );\n\n const stableProps = useStableObject({\n defaultLayout,\n disableCursor\n });\n\n const registeredGroupRef = useRef<RegisteredGroup | null>(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 resizeTargetMinimumSize: inMemoryValues.resizeTargetMinimumSize,\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 onLayoutChangeStable(layout);\n onLayoutChangedStable(layout);\n\n inMemoryValues.panels.forEach((panel) => {\n panel.scheduleUpdate();\n });\n }\n }\n\n let prevInteractionStateActive = false;\n\n const removeInteractionStateChangeListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n const nextInteractionStateActive = interactionState.state === \"active\";\n if (prevInteractionStateActive !== nextInteractionStateActive) {\n prevInteractionStateActive = nextInteractionStateActive;\n\n // The only reason to schedule a re-render in response to this event type\n // is to disable pointer-events within a Panel while a drag is in progress\n // (This is done to prevent text from being selected, etc)\n // Unnecessary updates should be very fast in this case but we can still avoid them\n inMemoryValues.panels.forEach((panel) => {\n panel.scheduleUpdate();\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 const { interactionState } = read();\n const isCompleted = interactionState.state !== \"active\";\n\n onLayoutChangeStable(layout);\n if (isCompleted) {\n onLayoutChangedStable(layout);\n }\n\n inMemoryValues.panels.forEach((panel) => {\n panel.scheduleUpdate();\n });\n }\n }\n );\n\n return () => {\n registeredGroupRef.current = null;\n\n unmountGroup();\n removeInteractionStateChangeListener();\n removeMountedGroupsChangeEventListener();\n };\n }, [\n disabled,\n id,\n onLayoutChangedStable,\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 return (\n <GroupContext.Provider value={context}>\n <div\n {...rest}\n aria-orientation={orientation}\n className={className}\n data-group\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n height: \"100%\",\n width: \"100%\",\n overflow: \"hidden\",\n ...style,\n display: \"flex\",\n flexDirection: orientation === \"horizontal\" ? \"row\" : \"column\",\n flexWrap: \"nowrap\"\n }}\n >\n {children}\n </div>\n </GroupContext.Provider>\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 getStorageKey(id: string, panelIds: string[]): string {\n return `react-resizable-panels:${[id, ...panelIds].join(\":\")}`;\n}\n","import {\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore\n} from \"react\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\nimport type {\n Layout,\n LayoutStorage,\n OnGroupLayoutChange,\n OnGroupLayoutChanged\n} 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 * @deprecated Use the {@link onLayoutChanged} callback instead; it does not require debouncing\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 timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const clearPendingTimeout = useCallback(() => {\n const timeout = timeoutRef.current;\n if (timeout) {\n timeoutRef.current = null;\n\n clearTimeout(timeout);\n }\n }, []);\n\n useLayoutEffect(() => {\n return () => {\n clearPendingTimeout();\n };\n }, [clearPendingTimeout]);\n\n const onLayoutChanged = useCallback<NonNullable<OnGroupLayoutChanged>>(\n (layout: Layout) => {\n clearPendingTimeout();\n\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 [clearPendingTimeout, hasPanelIds, id, storage]\n );\n\n // TODO Deprecated; remove this in the future release\n const onLayoutChange = useCallback<NonNullable<OnGroupLayoutChange>>(\n (layout: Layout) => {\n clearPendingTimeout();\n\n if (debounceSaveMs === 0) {\n onLayoutChanged(layout);\n } else {\n timeoutRef.current = setTimeout(() => {\n onLayoutChanged(layout);\n }, debounceSaveMs);\n }\n },\n [clearPendingTimeout, debounceSaveMs, onLayoutChanged]\n );\n\n return {\n /**\n * Pass this value to `Group` as the `defaultLayout` prop.\n */\n defaultLayout,\n\n /**\n * Attach this callback on the `Group` as the `onLayoutChange` prop.\n *\n * @deprecated Use the {@link onLayoutChanged} prop instead.\n */\n onLayoutChange,\n\n /**\n * Attach this callback on the `Group` as the `onLayoutChanged` prop.\n */\n onLayoutChanged\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<GroupImperativeHandle | null>(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<GroupImperativeHandle | null>(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 { 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<PanelImperativeHandle> | undefined\n) {\n const { id: groupId } = useGroupContext();\n\n const imperativePanelRef = useRef<PanelImperativeHandle>({\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 { useRef, type CSSProperties } from \"react\";\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 { useGroupContext } from \"../group/useGroupContext\";\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 * <div data-panel data-testid=\"panel-id-prop\" id=\"panel-id-prop\">\n * ```\n *\n * ℹ️ [Test id](https://testing-library.com/docs/queries/bytestid/) can be used to narrow selection when unit testing.\n *\n * ⚠️ Panel elements must be direct DOM children of their parent Group elements.\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<HTMLDivElement | null>(null);\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const [, forceUpdate] = useForceUpdate();\n\n const { getPanelStyles, 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 scheduleUpdate: forceUpdate\n });\n }\n }, [\n collapsedSize,\n collapsible,\n defaultSize,\n forceUpdate,\n hasOnResize,\n id,\n idIsStable,\n maxSize,\n minSize,\n onResizeStable,\n registerPanel\n ]);\n\n usePanelImperativeHandle(id, panelRef);\n\n const panelStyles = getPanelStyles(groupId, id);\n\n return (\n <div\n {...rest}\n data-panel\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n ...PROHIBITED_CSS_PROPERTIES,\n\n display: \"flex\",\n flexBasis: 0,\n flexShrink: 1,\n\n // Prevent Panel content from interfering with panel size\n overflow: \"hidden\",\n\n ...panelStyles\n }}\n >\n <div\n className={className}\n style={{\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n flexGrow: 1,\n\n ...style\n }}\n >\n {children}\n </div>\n </div>\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: 0,\n maxHeight: \"100%\",\n height: \"auto\",\n\n minWidth: 0,\n maxWidth: \"100%\",\n width: \"auto\",\n\n border: \"none\",\n borderWidth: 0,\n padding: 0,\n margin: 0\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<PanelImperativeHandle | null>(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<PanelImperativeHandle | null>(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 = 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 }),\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 }),\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 * ⚠️ Separator elements must be direct DOM children of their parent Group elements.\n *\n * Separator elements always include the following attributes:\n *\n * ```html\n * <div data-separator data-testid=\"separator-id-prop\" id=\"separator-id-prop\" role=\"separator\">\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<InteractionState[\"state\"]>(\"inactive\");\n\n const elementRef = useRef<HTMLDivElement | null>(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 <div\n {...rest}\n aria-controls={aria.valueControls}\n aria-orientation={orientation}\n aria-valuemax={aria.valueMax}\n aria-valuemin={aria.valueMin}\n aria-valuenow={aria.valueNow}\n children={children}\n className={className}\n data-separator={dragState}\n data-testid={id}\n id={id}\n ref={mergedRef}\n role=\"separator\"\n style={{\n flexBasis: \"auto\",\n ...style,\n flexGrow: 0,\n flexShrink: 0\n }}\n tabIndex={0}\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","cached","isCoarsePointer","calculateHitRegions","groupElement","separators","sortedChildElements","element","hitRegions","hasInterleavedStaticContent","prevPanel","pendingSeparators","childElement","panelData","current","prevRect","pendingRectsOrSeparators","firstPanelEdgeRect","secondPanelEdgeRect","separator","rectOrSeparator","minHitTargetSize","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","findClosestHitRegion","closestHitRegion","hitRegion","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","event","mountedGroups","matchingHitRegions","_","groupData","match","isArrayEqual","compareLayoutNumbers","validatePanelSize","collapsible","halfwayPoint","adjustLayoutByDelta","initialLayoutProp","panelConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","prevSize","localDelta","gapSize","increment","maxAvailableDelta","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","total","prevLayoutKeys","accumulated","layoutsEqual","id","validatePanelGroupLayout","layout","nextLayoutTotalSize","remainingSize","getImperativePanelMethods","groupId","panelId","find","defaultLayoutDeferred","derivedPanelConstraints","separatorToPanels","getPanelConstraints","getPanel","getPanelSize","setPanelSize","nextSize","isLastPanel","unsafeLayout","mutableValues","asPercentage","inPixels","onDocumentDoubleClick","panelWithDefaultSize","api","findSeparatorGroup","separatorElement","getImperativeGroupMethods","getMountedGroup","mountedGroup","adjustLayoutForSeparator","onDocumentKeyDown","primaryPanel","separatorElements","nextIndex","onDocumentPointerDown","initialLayoutMap","didChangeFocus","IDENTITY_FUNCTION","NOOP_FUNCTION","CURSOR_FLAG_HORIZONTAL_MIN","CURSOR_FLAG_HORIZONTAL_MAX","CURSOR_FLAG_VERTICAL_MIN","CURSOR_FLAG_VERTICAL_MAX","CURSOR_FLAGS_HORIZONTAL","CURSOR_FLAGS_VERTICAL","supportsAdvancedCursorStyles","getCursorStyle","cursorFlags","groups","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","documentToStyleMap","updateCursorStyle","ownerDocument","prevStyle","styleSheet","interactionState","cursorStyle","nextStyle","updateActiveHitRegions","document","pointerDownAtPoint","prevCursorFlags","nextCursorFlags","nextMountedGroups","disableCursor","deltaAsPercentage","panelIdsKey","onDocumentPointerLeave","onDocumentPointerMove","onDocumentPointerUp","calculateDefaultLayout","explicitCount","remainingPanelCount","notifyPanelOnResize","borderBoxSize","panelSize","objectsEqual","key","validateLayoutKeys","panelIds","layoutKeys","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","GroupContext","createContext","useGroupImperativeHandle","groupRef","imperativeGroupRef","useImperativeHandle","Group","className","disabled","elementRefProp","idProp","onLayoutChangeUnstable","onLayoutChangedUnstable","resizeTargetMinimumSize","rest","prevLayoutRef","onLayoutChangeStable","onLayoutChangedStable","elementRef","panelOrSeparatorChangeSigil","inMemoryValuesRef","mergedRef","getPanelStyles","dragActive","context","useMemo","inMemoryValues","stableProps","registeredGroupRef","unmountGroup","prevInteractionStateActive","removeInteractionStateChangeListener","nextInteractionStateActive","removeMountedGroupsChangeEventListener","isCompleted","registeredGroup","jsx","getStorageKey","useDefaultLayout","debounceSaveMs","storage","hasPanelIds","readStorageKey","defaultLayoutString","useSyncExternalStore","subscribe","timeoutRef","clearPendingTimeout","timeout","onLayoutChanged","writeStorageKey","onLayoutChange","useGroupCallbackRef","useGroupRef","useGroupContext","useContext","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","onResizeUnstable","idIsStable","registerPanel","hasOnResize","onResizeStable","prevPanelSize","panelStyles","PROHIBITED_CSS_PROPERTIES","usePanelCallbackRef","usePanelRef","calculateSeparatorAriaValues","panelIndex","valueMax","valueMin","Separator","aria","setAria","dragState","setDragState","groupOrientation","registerSeparator","unregisterSeparator","removeMountedGroupsChangeListener"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-resizable-panels.js","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/utils/isCoarsePointer.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/global/utils/findClosestHitRegion.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/utils/isArrayEqual.ts","../lib/global/utils/compareLayoutNumbers.ts","../lib/global/utils/validatePanelSize.ts","../lib/global/utils/adjustLayoutByDelta.ts","../lib/global/utils/layoutsEqual.ts","../lib/global/utils/validatePanelGroupLayout.ts","../lib/global/utils/getImperativePanelMethods.ts","../lib/global/event-handlers/onDocumentDoubleClick.ts","../lib/global/utils/findSeparatorGroup.ts","../lib/global/utils/getImperativeGroupMethods.ts","../lib/global/utils/getMountedGroup.ts","../lib/global/utils/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onDocumentKeyDown.ts","../lib/global/event-handlers/onDocumentPointerDown.ts","../lib/constants.ts","../lib/global/cursor/supportsAdvancedCursorStyles.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/group/GroupContext.ts","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/Group.tsx","../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/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 Array.from(panelsOrSeparators).sort(\n orientation === \"horizontal\" ? horizontalSort : verticalSort\n ) as ReturnType;\n}\n\nfunction horizontalSort<Type extends { element: HTMLElement }>(\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<Type extends { element: HTMLElement }>(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","let cached: boolean | undefined = undefined;\n\n/**\n * Caches and returns matchMedia()'s computed value for \"pointer:coarse\"\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","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 { isCoarsePointer } from \"../utils/isCoarsePointer\";\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 let rect =\n \"width\" in rectOrSeparator\n ? rectOrSeparator\n : rectOrSeparator.element.getBoundingClientRect();\n\n const minHitTargetSize = isCoarsePointer()\n ? group.resizeTargetMinimumSize.coarse\n : group.resizeTargetMinimumSize.fine;\n if (rect.width < minHitTargetSize) {\n const delta = minHitTargetSize - rect.width;\n rect = new DOMRect(\n rect.x - delta / 2,\n rect.y,\n rect.width + delta,\n rect.height\n );\n }\n if (rect.height < minHitTargetSize) {\n const delta = minHitTargetSize - rect.height;\n rect = new DOMRect(\n rect.x,\n rect.y - delta / 2,\n rect.width,\n rect.height + delta\n );\n }\n\n hitRegions.push({\n group,\n groupSize: calculateAvailableGroupSize({ group }),\n panels: [prevPanel, panelData],\n separator:\n \"width\" in rectOrSeparator ? undefined : rectOrSeparator,\n rect\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<PanelConstraints>((panel) => {\n const { element, panelConstraints } = panel;\n\n let collapsedSize = 0;\n if (panelConstraints.collapsedSize !== undefined) {\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 !== undefined) {\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 !== undefined) {\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 !== undefined) {\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: Data) => void;\n\nexport class EventEmitter<Events extends EventMap> {\n #listenerMap: {\n [Key in keyof Events]?: EventListener<Events[Key]>[];\n } = {};\n\n addListener<Type extends keyof Events>(\n type: Type,\n listener: EventListener<Events[Type]>\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 extends keyof Events>(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<Type extends keyof Events>(\n type: Type,\n listener: EventListener<Events[Type]>\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<State>;\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<Events>();\n\nexport function read(): State {\n return state;\n}\n\nexport function update(value: Partial<State> | 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","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 findClosestHitRegion(\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","// 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 common_ancestor = ancestors.a.pop() as HTMLElement;\n ancestors.b.pop();\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, ... <body>, <html>, 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 {\n calculateHitRegions,\n type HitRegion\n} from \"../dom/calculateHitRegions\";\nimport type { MountedGroupMap } from \"../mutableState\";\nimport { findClosestHitRegion } from \"./findClosestHitRegion\";\nimport { isViableHitTarget } from \"./isViableHitTarget\";\n\nexport function findMatchingHitRegions(\n event: {\n clientX: number;\n clientY: number;\n target: EventTarget | null;\n },\n mountedGroups: MountedGroupMap\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedGroups.forEach((_, groupData) => {\n if (groupData.disabled) {\n return;\n }\n\n const hitRegions = calculateHitRegions(groupData);\n const match = findClosestHitRegion(groupData.orientation, hitRegions, {\n x: event.clientX,\n y: event.clientY\n });\n if (\n match &&\n match.distance.x <= 0 &&\n match.distance.y <= 0 &&\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","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 switch (trigger) {\n case \"keyboard\": {\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 {\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 break;\n }\n default: {\n // If we're starting from a collapsed state, dragging past the halfway point should cause the panel to expand\n // This can happen for positive or negative drags, and panels on either side of the separator can be collapsible\n // The easiest way to support this is to detect this scenario and pre-adjust the delta before applying the rest of the layout algorithm\n // DEBUG.push(`edge case check 3: collapsible panels`);\n\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 { collapsible, collapsedSize, minSize } = panelConstraints;\n if (collapsible) {\n const isSecondPanel = index === secondPivotIndex;\n\n // DEBUG.push(` -> collapsible ${isSecondPanel ? \"2nd\" : \"1st\"} panel`);\n if (delta > 0) {\n const gapSize = minSize - collapsedSize;\n const halfwayPoint = gapSize / 2;\n // DEBUG.push(` -> halfway point: ${halfwayPoint}`);\n // DEBUG.push(` -> between collapsed: ${collapsedSize}`);\n // DEBUG.push(` -> and min: ${minSize}`);\n\n if (compareLayoutNumbers(delta, minSize) < 0) {\n // DEBUG.push(` -> adjusting delta from: ${delta}`);\n delta =\n compareLayoutNumbers(delta, halfwayPoint) <= 0 ? 0 : gapSize;\n // DEBUG.push(` -> adjusting delta to: ${delta}`);\n }\n } else {\n const gapSize = minSize - collapsedSize;\n const halfwayPoint = 100 - gapSize / 2;\n // DEBUG.push(` -> halfway point: ${halfwayPoint}`);\n // DEBUG.push(` -> between collapsed: ${100 - collapsedSize}`);\n // DEBUG.push(` -> and min: ${100 - minSize}`);\n\n if (isSecondPanel) {\n if (compareLayoutNumbers(Math.abs(delta), minSize) < 0) {\n // DEBUG.push(` -> adjusting delta from: ${delta}`);\n delta =\n compareLayoutNumbers(100 + delta, halfwayPoint) > 0\n ? 0\n : -gapSize;\n // DEBUG.push(` -> adjusting delta to: ${delta}`);\n }\n } else {\n if (compareLayoutNumbers(100 + delta, minSize) < 0) {\n // DEBUG.push(` -> adjusting delta from: ${delta}`);\n delta =\n compareLayoutNumbers(100 + delta, halfwayPoint) > 0\n ? 0\n : -gapSize;\n // DEBUG.push(` -> adjusting delta to: ${delta}`);\n }\n }\n }\n }\n break;\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<Layout>((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\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<Layout>((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\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 { read } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { getImperativePanelMethods } from \"../utils/getImperativePanelMethods\";\n\nexport function onDocumentDoubleClick(event: MouseEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n hitRegions.forEach((current) => {\n if (current.separator) {\n const panelWithDefaultSize = current.panels.find(\n (panel) => panel.panelConstraints.defaultSize !== undefined\n );\n if (panelWithDefaultSize) {\n const defaultSize = panelWithDefaultSize.panelConstraints.defaultSize;\n const api = getImperativePanelMethods({\n groupId: current.group.id,\n panelId: panelWithDefaultSize.id\n });\n if (api && defaultSize !== undefined) {\n api.resize(defaultSize);\n\n event.preventDefault();\n }\n }\n }\n });\n}\n","import { read } from \"../mutableState\";\n\nexport function findSeparatorGroup(separatorElement: HTMLElement) {\n const { mountedGroups } = read();\n\n for (const [group] of mountedGroups) {\n if (\n group.separators.some(\n (separator) => separator.element === separatorElement\n )\n ) {\n return group;\n }\n }\n\n throw Error(\"Could not find parent Group for separator element\");\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","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\n\nexport function onDocumentPointerDown(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n } else if (event.pointerType === \"mouse\" && event.button > 0) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n const initialLayoutMap = new Map<RegisteredGroup, Layout>();\n\n let didChangeFocus = false;\n\n hitRegions.forEach((current) => {\n if (current.separator) {\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","// 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;\nexport const CURSOR_FLAGS_HORIZONTAL = 0b0011;\nexport const CURSOR_FLAGS_VERTICAL = 0b1100;\n","let cached: boolean | undefined = undefined;\n\nexport function overrideSupportsAdvancedCursorStylesForTesting(\n override: boolean\n) {\n cached = override;\n}\n\n/**\n * Caches and returns if advanced cursor CSS styles are supported.\n */\nexport function supportsAdvancedCursorStyles(): boolean {\n if (cached === undefined) {\n cached = false;\n\n if (typeof window !== \"undefined\") {\n if (\n window.navigator.userAgent.includes(\"Chrome\") ||\n window.navigator.userAgent.includes(\"Firefox\")\n ) {\n cached = true;\n }\n }\n }\n\n return cached;\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\";\nimport { supportsAdvancedCursorStyles } from \"./supportsAdvancedCursorStyles\";\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 if (cursorFlags) {\n if (supportsAdvancedCursorStyles()) {\n const horizontalMin =\n (cursorFlags & CURSOR_FLAG_HORIZONTAL_MIN) !== 0;\n const horizontalMax =\n (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 (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 }\n break;\n }\n }\n\n if (supportsAdvancedCursorStyles()) {\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 } else {\n if (horizontalCount > 0 && verticalCount > 0) {\n return \"grab\";\n } else if (horizontalCount > 0) {\n return \"col-resize\";\n } else {\n return \"row-resize\";\n }\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.push(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 = `*, *:hover {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 CURSOR_FLAGS_HORIZONTAL,\n CURSOR_FLAGS_VERTICAL\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 prevCursorFlags\n}: {\n document: Document;\n event: {\n clientX: number;\n clientY: number;\n movementX: number;\n movementY: number;\n };\n hitRegions: HitRegion[];\n initialLayoutMap: Map<RegisteredGroup, Layout>;\n mountedGroups: MountedGroupMap;\n pointerDownAtPoint?: Point;\n prevCursorFlags: number;\n}) {\n let nextCursorFlags = 0;\n\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 nextCursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_HORIZONTAL_MIN\n : CURSOR_FLAG_HORIZONTAL_MAX;\n break;\n }\n case \"vertical\": {\n nextCursorFlags |=\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 // Edge case\n // Re-use previous horizontal/vertical cursor flags if there's been no movement since the last event\n // This accounts for edge cases in browsers like Firefox that sometimes round clientX/clientY values\n let cursorFlags = 0;\n if (event.movementX === 0) {\n cursorFlags |= prevCursorFlags & CURSOR_FLAGS_HORIZONTAL;\n } else {\n cursorFlags |= nextCursorFlags & CURSOR_FLAGS_HORIZONTAL;\n }\n if (event.movementY === 0) {\n cursorFlags |= prevCursorFlags & CURSOR_FLAGS_VERTICAL;\n } else {\n cursorFlags |= nextCursorFlags & CURSOR_FLAGS_VERTICAL;\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 { cursorFlags, 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 prevCursorFlags: cursorFlags\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 { cursorFlags, 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: { state: \"inactive\" }\n }\n );\n\n // Dispatch one more \"change\" event after the interaction state has been reset\n // Groups use this as a signal to call onLayoutChanged\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups)\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 prevCursorFlags: cursorFlags\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: {\n state: \"inactive\"\n }\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 } else if (event.pointerType === \"mouse\" && event.button > 0) {\n return;\n }\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 if (interactionState.hitRegions.length > 0) {\n updateCursorStyle(event.currentTarget as Document);\n\n // Dispatch one more \"change\" event after the interaction state has been reset\n // Groups use this as a signal to call onLayoutChanged\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups)\n }));\n\n event.preventDefault();\n }\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 panelSize =\n group.orientation === \"horizontal\"\n ? panel.element.offsetWidth\n : panel.element.offsetHeight;\n\n const prevSize = panel.mutableValues.prevSize;\n const nextSize = {\n asPercentage: formatLayoutNumber((panelSize / groupSize) * 100),\n inPixels: panelSize\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 { onDocumentDoubleClick } from \"./event-handlers/onDocumentDoubleClick\";\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<Document, number>();\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<string>();\n const separatorIds = new Set<string>();\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(\"dblclick\", onDocumentDoubleClick, true);\n ownerDocument.addEventListener(\"pointerdown\", onDocumentPointerDown, true);\n ownerDocument.addEventListener(\"pointerleave\", onDocumentPointerLeave);\n ownerDocument.addEventListener(\"pointermove\", onDocumentPointerMove);\n ownerDocument.addEventListener(\"pointerup\", onDocumentPointerUp, true);\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(\n \"dblclick\",\n onDocumentDoubleClick,\n true\n );\n ownerDocument.removeEventListener(\n \"pointerdown\",\n onDocumentPointerDown,\n true\n );\n ownerDocument.removeEventListener(\"pointerleave\", onDocumentPointerLeave);\n ownerDocument.removeEventListener(\"pointermove\", onDocumentPointerMove);\n ownerDocument.removeEventListener(\"pointerup\", onDocumentPointerUp, true);\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<Callback extends Function>(\n fn: Callback\n): Callback {\n const ref = useRef<Callback>(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<Type> = Ref<Type> | undefined;\n\nexport function useMergedRefs<Type>(...refs: PossibleRef<Type>[]) {\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<Type extends object>(\n unstableObject: Type\n): Type {\n const ref = useRef<Type>({ ...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","import { createContext } from \"react\";\nimport type { GroupContextType } from \"./types\";\n\nexport const GroupContext = createContext<GroupContextType | null>(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<GroupImperativeHandle> | undefined\n) {\n const imperativeGroupRef = useRef<GroupImperativeHandle>({\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\";\n\nimport { useEffect, useMemo, useRef, type CSSProperties } 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 type { RegisteredPanel } from \"../panel/types\";\nimport type { RegisteredSeparator } from \"../separator/types\";\nimport { GroupContext } from \"./GroupContext\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type {\n GroupProps,\n Layout,\n RegisteredGroup,\n ResizeTargetMinimumSize\n} 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 * <div data-group data-testid=\"group-id-prop\" id=\"group-id-prop\">\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 onLayoutChanged: onLayoutChangedUnstable,\n orientation = \"horizontal\",\n resizeTargetMinimumSize = {\n coarse: 20,\n fine: 10\n },\n style,\n ...rest\n}: GroupProps) {\n const prevLayoutRef = useRef<{\n onLayoutChange: Layout;\n onLayoutChanged: Layout;\n }>({\n onLayoutChange: {},\n onLayoutChanged: {}\n });\n\n const onLayoutChangeStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current.onLayoutChange, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChange = layout;\n onLayoutChangeUnstable?.(layout);\n });\n\n const onLayoutChangedStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current.onLayoutChanged, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChanged = layout;\n onLayoutChangedUnstable?.(layout);\n });\n\n const id = useId(idProp);\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n\n const [panelOrSeparatorChangeSigil, forceUpdate] = useForceUpdate();\n\n const inMemoryValuesRef = useRef<{\n lastExpandedPanelSizes: { [panelIds: string]: number };\n layouts: { [panelIds: string]: Layout };\n panels: RegisteredPanel[];\n resizeTargetMinimumSize: ResizeTargetMinimumSize;\n separators: RegisteredSeparator[];\n }>({\n lastExpandedPanelSizes: {},\n layouts: {},\n panels: [],\n resizeTargetMinimumSize,\n separators: []\n });\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n useGroupImperativeHandle(id, groupRef);\n\n // TRICKY Don't read for state; it will always lag behind by one tick\n const getPanelStyles = useStableCallback(\n (groupId: string, panelId: string) => {\n const { interactionState, mountedGroups } = read();\n\n for (const group of mountedGroups.keys()) {\n if (group.id === groupId) {\n const match = mountedGroups.get(group);\n if (match) {\n let dragActive = false;\n switch (interactionState.state) {\n case \"active\": {\n dragActive = interactionState.hitRegions.some(\n (current) => current.group === group\n );\n break;\n }\n }\n\n return {\n flexGrow: match.layout[panelId] ?? 1,\n pointerEvents: dragActive ? \"none\" : undefined\n } satisfies CSSProperties;\n }\n }\n }\n\n // This is unexpected except for the initial mount (before the group has registered with the global store)\n return {\n flexGrow: defaultLayout?.[panelId] ?? 1\n } satisfies CSSProperties;\n }\n );\n\n const context = useMemo(\n () => ({\n getPanelStyles,\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 [getPanelStyles, id, forceUpdate, orientation]\n );\n\n const stableProps = useStableObject({\n defaultLayout,\n disableCursor\n });\n\n const registeredGroupRef = useRef<RegisteredGroup | null>(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 resizeTargetMinimumSize: inMemoryValues.resizeTargetMinimumSize,\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 onLayoutChangeStable(layout);\n onLayoutChangedStable(layout);\n\n inMemoryValues.panels.forEach((panel) => {\n panel.scheduleUpdate();\n });\n }\n }\n\n let prevInteractionStateActive = false;\n\n const removeInteractionStateChangeListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n const nextInteractionStateActive = interactionState.state === \"active\";\n if (prevInteractionStateActive !== nextInteractionStateActive) {\n prevInteractionStateActive = nextInteractionStateActive;\n\n // The only reason to schedule a re-render in response to this event type\n // is to disable pointer-events within a Panel while a drag is in progress\n // (This is done to prevent text from being selected, etc)\n // Unnecessary updates should be very fast in this case but we can still avoid them\n inMemoryValues.panels.forEach((panel) => {\n panel.scheduleUpdate();\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 const { interactionState } = read();\n const isCompleted = interactionState.state !== \"active\";\n\n onLayoutChangeStable(layout);\n if (isCompleted) {\n onLayoutChangedStable(layout);\n }\n\n inMemoryValues.panels.forEach((panel) => {\n panel.scheduleUpdate();\n });\n }\n }\n );\n\n return () => {\n registeredGroupRef.current = null;\n\n unmountGroup();\n removeInteractionStateChangeListener();\n removeMountedGroupsChangeEventListener();\n };\n }, [\n disabled,\n id,\n onLayoutChangedStable,\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 return (\n <GroupContext.Provider value={context}>\n <div\n {...rest}\n className={className}\n data-group\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n height: \"100%\",\n width: \"100%\",\n overflow: \"hidden\",\n ...style,\n display: \"flex\",\n flexDirection: orientation === \"horizontal\" ? \"row\" : \"column\",\n flexWrap: \"nowrap\"\n }}\n >\n {children}\n </div>\n </GroupContext.Provider>\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 getStorageKey(id: string, panelIds: string[]): string {\n return `react-resizable-panels:${[id, ...panelIds].join(\":\")}`;\n}\n","import {\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore\n} from \"react\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\nimport type {\n Layout,\n LayoutStorage,\n OnGroupLayoutChange,\n OnGroupLayoutChanged\n} 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 * @deprecated Use the {@link onLayoutChanged} callback instead; it does not require debouncing\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 timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const clearPendingTimeout = useCallback(() => {\n const timeout = timeoutRef.current;\n if (timeout) {\n timeoutRef.current = null;\n\n clearTimeout(timeout);\n }\n }, []);\n\n useLayoutEffect(() => {\n return () => {\n clearPendingTimeout();\n };\n }, [clearPendingTimeout]);\n\n const onLayoutChanged = useCallback<NonNullable<OnGroupLayoutChanged>>(\n (layout: Layout) => {\n clearPendingTimeout();\n\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 [clearPendingTimeout, hasPanelIds, id, storage]\n );\n\n // TODO Deprecated; remove this in the future release\n const onLayoutChange = useCallback<NonNullable<OnGroupLayoutChange>>(\n (layout: Layout) => {\n clearPendingTimeout();\n\n if (debounceSaveMs === 0) {\n onLayoutChanged(layout);\n } else {\n timeoutRef.current = setTimeout(() => {\n onLayoutChanged(layout);\n }, debounceSaveMs);\n }\n },\n [clearPendingTimeout, debounceSaveMs, onLayoutChanged]\n );\n\n return {\n /**\n * Pass this value to `Group` as the `defaultLayout` prop.\n */\n defaultLayout,\n\n /**\n * Attach this callback on the `Group` as the `onLayoutChange` prop.\n *\n * @deprecated Use the {@link onLayoutChanged} prop instead.\n */\n onLayoutChange,\n\n /**\n * Attach this callback on the `Group` as the `onLayoutChanged` prop.\n */\n onLayoutChanged\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<GroupImperativeHandle | null>(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<GroupImperativeHandle | null>(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 { 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<PanelImperativeHandle> | undefined\n) {\n const { id: groupId } = useGroupContext();\n\n const imperativePanelRef = useRef<PanelImperativeHandle>({\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 { useRef, type CSSProperties } from \"react\";\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 { useGroupContext } from \"../group/useGroupContext\";\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 * <div data-panel data-testid=\"panel-id-prop\" id=\"panel-id-prop\">\n * ```\n *\n * ℹ️ [Test id](https://testing-library.com/docs/queries/bytestid/) can be used to narrow selection when unit testing.\n *\n * ⚠️ Panel elements must be direct DOM children of their parent Group elements.\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<HTMLDivElement | null>(null);\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const [, forceUpdate] = useForceUpdate();\n\n const { getPanelStyles, 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 scheduleUpdate: forceUpdate\n });\n }\n }, [\n collapsedSize,\n collapsible,\n defaultSize,\n forceUpdate,\n hasOnResize,\n id,\n idIsStable,\n maxSize,\n minSize,\n onResizeStable,\n registerPanel\n ]);\n\n usePanelImperativeHandle(id, panelRef);\n\n const panelStyles = getPanelStyles(groupId, id);\n\n return (\n <div\n {...rest}\n data-panel\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n ...PROHIBITED_CSS_PROPERTIES,\n\n display: \"flex\",\n flexBasis: 0,\n flexShrink: 1,\n\n // Prevent Panel content from interfering with panel size\n overflow: \"hidden\",\n\n ...panelStyles\n }}\n >\n <div\n className={className}\n style={{\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n flexGrow: 1,\n\n ...style\n }}\n >\n {children}\n </div>\n </div>\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: 0,\n maxHeight: \"100%\",\n height: \"auto\",\n\n minWidth: 0,\n maxWidth: \"100%\",\n width: \"auto\",\n\n border: \"none\",\n borderWidth: 0,\n padding: 0,\n margin: 0\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<PanelImperativeHandle | null>(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<PanelImperativeHandle | null>(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 = 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 }),\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 }),\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 * ⚠️ Separator elements must be direct DOM children of their parent Group elements.\n *\n * Separator elements always include the following attributes:\n *\n * ```html\n * <div data-separator data-testid=\"separator-id-prop\" id=\"separator-id-prop\" role=\"separator\">\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<InteractionState[\"state\"]>(\"inactive\");\n\n const elementRef = useRef<HTMLDivElement | null>(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 <div\n {...rest}\n aria-controls={aria.valueControls}\n aria-orientation={orientation}\n aria-valuemax={aria.valueMax}\n aria-valuemin={aria.valueMin}\n aria-valuenow={aria.valueNow}\n children={children}\n className={className}\n data-separator={dragState}\n data-testid={id}\n id={id}\n ref={mergedRef}\n role=\"separator\"\n style={{\n flexBasis: \"auto\",\n ...style,\n flexGrow: 0,\n flexShrink: 0\n }}\n tabIndex={0}\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","cached","isCoarsePointer","calculateHitRegions","groupElement","separators","sortedChildElements","element","hitRegions","hasInterleavedStaticContent","prevPanel","pendingSeparators","childElement","panelData","current","prevRect","pendingRectsOrSeparators","firstPanelEdgeRect","secondPanelEdgeRect","separator","rectOrSeparator","minHitTargetSize","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","findClosestHitRegion","closestHitRegion","hitRegion","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","event","mountedGroups","matchingHitRegions","_","groupData","match","isArrayEqual","compareLayoutNumbers","validatePanelSize","collapsible","halfwayPoint","adjustLayoutByDelta","initialLayoutProp","panelConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","prevSize","localDelta","isSecondPanel","gapSize","increment","maxAvailableDelta","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","total","prevLayoutKeys","accumulated","layoutsEqual","id","validatePanelGroupLayout","layout","nextLayoutTotalSize","remainingSize","getImperativePanelMethods","groupId","panelId","find","defaultLayoutDeferred","derivedPanelConstraints","separatorToPanels","getPanelConstraints","getPanel","getPanelSize","setPanelSize","nextSize","isLastPanel","unsafeLayout","mutableValues","asPercentage","inPixels","onDocumentDoubleClick","panelWithDefaultSize","api","findSeparatorGroup","separatorElement","getImperativeGroupMethods","getMountedGroup","mountedGroup","adjustLayoutForSeparator","onDocumentKeyDown","primaryPanel","separatorElements","nextIndex","onDocumentPointerDown","initialLayoutMap","didChangeFocus","IDENTITY_FUNCTION","NOOP_FUNCTION","CURSOR_FLAG_HORIZONTAL_MIN","CURSOR_FLAG_HORIZONTAL_MAX","CURSOR_FLAG_VERTICAL_MIN","CURSOR_FLAG_VERTICAL_MAX","CURSOR_FLAGS_HORIZONTAL","CURSOR_FLAGS_VERTICAL","supportsAdvancedCursorStyles","getCursorStyle","cursorFlags","groups","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","documentToStyleMap","updateCursorStyle","ownerDocument","prevStyle","styleSheet","interactionState","cursorStyle","nextStyle","updateActiveHitRegions","document","pointerDownAtPoint","prevCursorFlags","nextCursorFlags","nextMountedGroups","disableCursor","deltaAsPercentage","panelIdsKey","onDocumentPointerLeave","onDocumentPointerMove","onDocumentPointerUp","calculateDefaultLayout","explicitCount","remainingPanelCount","notifyPanelOnResize","borderBoxSize","panelSize","objectsEqual","key","validateLayoutKeys","panelIds","layoutKeys","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","GroupContext","createContext","useGroupImperativeHandle","groupRef","imperativeGroupRef","useImperativeHandle","Group","className","disabled","elementRefProp","idProp","onLayoutChangeUnstable","onLayoutChangedUnstable","resizeTargetMinimumSize","rest","prevLayoutRef","onLayoutChangeStable","onLayoutChangedStable","elementRef","panelOrSeparatorChangeSigil","inMemoryValuesRef","mergedRef","getPanelStyles","dragActive","context","useMemo","inMemoryValues","stableProps","registeredGroupRef","unmountGroup","prevInteractionStateActive","removeInteractionStateChangeListener","nextInteractionStateActive","removeMountedGroupsChangeEventListener","isCompleted","registeredGroup","jsx","getStorageKey","useDefaultLayout","debounceSaveMs","storage","hasPanelIds","readStorageKey","defaultLayoutString","useSyncExternalStore","subscribe","timeoutRef","clearPendingTimeout","timeout","onLayoutChanged","writeStorageKey","onLayoutChange","useGroupCallbackRef","useGroupRef","useGroupContext","useContext","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","onResizeUnstable","idIsStable","registerPanel","hasOnResize","onResizeStable","prevPanelSize","panelStyles","PROHIBITED_CSS_PROPERTIES","usePanelCallbackRef","usePanelRef","calculateSeparatorAriaValues","panelIndex","valueMax","valueMin","Separator","aria","setAria","dragState","setDragState","groupOrientation","registerSeparator","unregisterSeparator","removeMountedGroupsChangeListener"],"mappings":"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"}
|