react-resizable-panels 4.0.12 → 4.0.13
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/global/utils/getDistanceBetweenPointAndRect.ts","../lib/global/utils/findClosestRect.ts","../lib/global/dom/calculateHitRegions.ts","../lib/global/styles/convertEmToPixels.ts","../lib/global/styles/convertRemToPixels.ts","../lib/global/styles/convertVhToPixels.ts","../lib/global/styles/convertVwToPixels.ts","../lib/global/styles/parseSizeAndUnit.ts","../lib/global/styles/sizeStyleToPixels.ts","../lib/global/utils/formatLayoutNumber.ts","../lib/global/dom/calculatePanelConstraints.ts","../lib/utils/EventEmitter.ts","../lib/global/utils/layoutNumbersEqual.ts","../lib/global/mutableState.ts","../lib/constants.ts","../lib/global/cursor/getCursorStyle.ts","../lib/global/cursor/updateCursorStyle.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/updateActiveHitRegion.ts","../lib/global/event-handlers/onGroupPointerLeave.ts","../lib/global/utils/findSeparatorGroup.ts","../lib/global/utils/validatePanelGroupLayout.ts","../lib/global/utils/getImperativeGroupMethods.ts","../lib/global/utils/getMountedGroup.ts","../lib/global/utils/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onWindowKeyDown.ts","../lib/global/utils/findClosetHitRegion.ts","../lib/global/utils/isCoarsePointer.ts","../lib/vendor/stacking-order.ts","../lib/global/utils/doRectsIntersect.ts","../lib/global/utils/isViableHitTarget.ts","../lib/global/utils/findMatchingHitRegions.ts","../lib/global/event-handlers/onWindowPointerDown.ts","../lib/global/event-handlers/onWindowPointerMove.ts","../lib/global/event-handlers/onWindowPointerUp.ts","../lib/global/utils/calculateDefaultLayout.ts","../lib/global/utils/notifyPanelOnResize.ts","../lib/global/utils/objectsEqual.ts","../lib/global/mountGroup.ts","../lib/hooks/useId.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/hooks/useStableCallback.ts","../lib/hooks/useMergedRefs.ts","../lib/hooks/useStableObject.ts","../lib/components/panel/constants.ts","../lib/components/group/getPanelSizeCssPropertyName.ts","../lib/components/group/GroupContext.ts","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/Group.tsx","../lib/utils/debounce.ts","../lib/components/group/auto-save/getStorageKey.ts","../lib/components/group/useDefaultLayout.ts","../lib/components/group/useGroupCallbackRef.ts","../lib/components/group/useGroupRef.ts","../lib/components/group/useGroupContext.ts","../lib/global/utils/getImperativePanelMethods.ts","../lib/components/panel/usePanelImperativeHandle.ts","../lib/components/panel/Panel.tsx","../lib/components/panel/usePanelCallbackRef.ts","../lib/components/panel/usePanelRef.ts","../lib/global/utils/calculateSeparatorAriaValues.ts","../lib/components/separator/Separator.tsx"],"sourcesContent":["export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n throw Error(message);\n }\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\n\nexport function calculateAvailableGroupSize({\n group\n}: {\n group: RegisteredGroup;\n}) {\n const { orientation, panels } = group;\n\n return panels.reduce((totalSize, panel) => {\n totalSize +=\n orientation === \"horizontal\"\n ? panel.element.offsetWidth\n : panel.element.offsetHeight;\n return totalSize;\n }, 0);\n}\n","import type { Orientation } from \"./types\";\n\nexport function sortByElementOffset<\n Type extends { element: HTMLElement },\n ReturnType extends Type[]\n>(orientation: Orientation, panelsOrSeparators: Type[]): ReturnType {\n return panelsOrSeparators.sort(\n orientation === \"horizontal\" ? horizontalSort : verticalSort\n ) as ReturnType;\n}\n\nfunction horizontalSort<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","import type { Point } from \"../../types\";\n\nexport function getDistanceBetweenPointAndRect(\n point: Point,\n rect: DOMRectReadOnly\n) {\n return {\n x:\n point.x >= rect.left && point.x <= rect.right\n ? 0\n : Math.min(\n Math.abs(point.x - rect.left),\n Math.abs(point.x - rect.right)\n ),\n y:\n point.y >= rect.top && point.y <= rect.bottom\n ? 0\n : Math.min(\n Math.abs(point.y - rect.top),\n Math.abs(point.y - rect.bottom)\n )\n };\n}\n","import type { Orientation } from \"../../components/group/types\";\nimport { assert } from \"../../utils/assert\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosestRect({\n orientation,\n rects,\n targetRect\n}: {\n orientation: Orientation;\n rects: DOMRectReadOnly[];\n targetRect: DOMRectReadOnly;\n}): DOMRectReadOnly {\n const centerPoint = {\n x: targetRect.x + targetRect.width / 2,\n y: targetRect.y + targetRect.height / 2\n };\n\n let closestRect: DOMRectReadOnly | undefined = undefined;\n let minDistance = Number.MAX_VALUE;\n\n for (const rect of rects) {\n const { x, y } = getDistanceBetweenPointAndRect(centerPoint, rect);\n\n const distance = orientation === \"horizontal\" ? x : y;\n\n if (distance < minDistance) {\n minDistance = distance;\n closestRect = rect;\n }\n }\n\n assert(closestRect, \"No rect found\");\n\n return closestRect;\n}\n","import { sortByElementOffset } from \"../../components/group/sortByElementOffset\";\nimport type { RegisteredGroup } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\nimport type { RegisteredSeparator } from \"../../components/separator/types\";\nimport { findClosestRect } from \"../utils/findClosestRect\";\nimport { calculateAvailableGroupSize } from \"./calculateAvailableGroupSize\";\n\ntype PanelsTuple = [panel: RegisteredPanel, panel: RegisteredPanel];\n\nexport type HitRegion = {\n group: RegisteredGroup;\n groupSize: number;\n panels: PanelsTuple;\n rect: DOMRect;\n separator?: RegisteredSeparator | undefined;\n};\n\n/**\n * Determines hit regions for a Group; a hit region is either:\n * - 1: An explicit Separator element\n * - 2: The edge of a Panel element that has another Panel beside it\n *\n * This method determines bounding rects of all regions for the particular group.\n */\nexport function calculateHitRegions(group: RegisteredGroup) {\n const { element: groupElement, orientation, panels, separators } = group;\n\n // Sort elements by offset before traversing\n const sortedChildElements: HTMLElement[] = sortByElementOffset(\n orientation,\n Array.from(groupElement.children)\n .filter((child) => child instanceof HTMLElement)\n .map((element) => ({ element }))\n ).map(({ element }) => element);\n\n const hitRegions: HitRegion[] = [];\n\n let hasInterleavedStaticContent = false;\n let prevPanel: RegisteredPanel | undefined = undefined;\n let pendingSeparators: RegisteredSeparator[] = [];\n\n for (const childElement of sortedChildElements) {\n if (childElement.hasAttribute(\"data-panel\")) {\n const panelData = panels.find(\n (current) => current.element === childElement\n );\n if (panelData) {\n if (prevPanel) {\n const prevRect = prevPanel.element.getBoundingClientRect();\n const rect = childElement.getBoundingClientRect();\n\n let pendingRectsOrSeparators: (DOMRect | RegisteredSeparator)[];\n\n // If an explicit Separator has been rendered, always watch it\n // Otherwise watch the entire space between the panels\n // The one caveat is when there are non-interactive element(s) between panels,\n // in which case we may need to watch individual panel edges\n if (hasInterleavedStaticContent) {\n const firstPanelEdgeRect =\n orientation === \"horizontal\"\n ? new DOMRect(prevRect.right, prevRect.top, 0, prevRect.height)\n : new DOMRect(\n prevRect.left,\n prevRect.bottom,\n prevRect.width,\n 0\n );\n const secondPanelEdgeRect =\n orientation === \"horizontal\"\n ? new DOMRect(rect.left, rect.top, 0, rect.height)\n : new DOMRect(rect.left, rect.top, rect.width, 0);\n\n switch (pendingSeparators.length) {\n case 0: {\n pendingRectsOrSeparators = [\n firstPanelEdgeRect,\n secondPanelEdgeRect\n ];\n break;\n }\n case 1: {\n const separator = pendingSeparators[0];\n const closestRect = findClosestRect({\n orientation,\n rects: [prevRect, rect],\n targetRect: separator.element.getBoundingClientRect()\n });\n\n pendingRectsOrSeparators = [\n separator,\n closestRect === prevRect\n ? secondPanelEdgeRect\n : firstPanelEdgeRect\n ];\n break;\n }\n default: {\n pendingRectsOrSeparators = pendingSeparators;\n break;\n }\n }\n } else {\n if (pendingSeparators.length) {\n pendingRectsOrSeparators = pendingSeparators;\n } else {\n pendingRectsOrSeparators = [\n orientation === \"horizontal\"\n ? new DOMRect(\n prevRect.right,\n rect.top,\n rect.left - prevRect.right,\n rect.height\n )\n : new DOMRect(\n rect.left,\n prevRect.bottom,\n rect.width,\n rect.top - prevRect.bottom\n )\n ];\n }\n }\n\n for (const rectOrSeparator of pendingRectsOrSeparators) {\n hitRegions.push({\n group,\n groupSize: calculateAvailableGroupSize({ group }),\n panels: [prevPanel, panelData],\n separator:\n \"width\" in rectOrSeparator ? undefined : rectOrSeparator,\n rect:\n \"width\" in rectOrSeparator\n ? rectOrSeparator\n : rectOrSeparator.element.getBoundingClientRect()\n });\n }\n }\n\n hasInterleavedStaticContent = false;\n prevPanel = panelData;\n pendingSeparators = [];\n }\n } else if (childElement.hasAttribute(\"data-separator\")) {\n const separatorData = separators.find(\n (current) => current.element === childElement\n );\n if (separatorData) {\n // Separators will be included implicitly in the area between the previous and next panel\n // It's important to track them though, to handle the scenario of non-interactive group content\n pendingSeparators.push(separatorData);\n } else {\n prevPanel = undefined;\n pendingSeparators = [];\n }\n } else {\n hasInterleavedStaticContent = true;\n }\n }\n\n return hitRegions;\n}\n","export function convertEmToPixels(element: Element, value: number) {\n const style = getComputedStyle(element);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertRemToPixels(element: Element, value: number) {\n const style = getComputedStyle(element.ownerDocument.body);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertVhToPixels(value: number) {\n return (value / 100) * window.innerHeight;\n}\n","export function convertVwToPixels(value: number) {\n return (value / 100) * window.innerWidth;\n}\n","import type { SizeUnit } from \"../../components/panel/types\";\n\nexport function parseSizeAndUnit(\n size: number | string\n): [numeric: number, size: SizeUnit] {\n switch (typeof size) {\n case \"number\": {\n return [size, \"px\"];\n }\n case \"string\": {\n const numeric = parseFloat(size);\n\n if (size.endsWith(\"%\")) {\n return [numeric, \"%\"];\n } else if (size.endsWith(\"px\")) {\n return [numeric, \"px\"];\n } else if (size.endsWith(\"rem\")) {\n return [numeric, \"rem\"];\n } else if (size.endsWith(\"em\")) {\n return [numeric, \"em\"];\n } else if (size.endsWith(\"vh\")) {\n return [numeric, \"vh\"];\n } else if (size.endsWith(\"vw\")) {\n return [numeric, \"vw\"];\n }\n\n return [numeric, \"%\"];\n }\n }\n}\n","import { convertEmToPixels } from \"./convertEmToPixels\";\nimport { convertRemToPixels } from \"./convertRemToPixels\";\nimport { convertVhToPixels } from \"./convertVhToPixels\";\nimport { convertVwToPixels } from \"./convertVwToPixels\";\nimport { parseSizeAndUnit } from \"./parseSizeAndUnit\";\n\nexport function sizeStyleToPixels({\n groupSize,\n panelElement,\n styleProp\n}: {\n groupSize: number;\n panelElement: HTMLElement;\n styleProp: number | string;\n}) {\n let pixels: number | undefined = undefined;\n\n const [size, unit] = parseSizeAndUnit(styleProp);\n\n switch (unit) {\n case \"%\": {\n pixels = (size / 100) * groupSize;\n break;\n }\n case \"px\": {\n pixels = size;\n break;\n }\n case \"rem\": {\n pixels = convertRemToPixels(panelElement, size);\n break;\n }\n case \"em\": {\n pixels = convertEmToPixels(panelElement, size);\n break;\n }\n case \"vh\": {\n pixels = convertVhToPixels(size);\n break;\n }\n case \"vw\": {\n pixels = convertVwToPixels(size);\n break;\n }\n }\n\n return pixels;\n}\n","export function formatLayoutNumber(number: number) {\n return parseFloat(number.toFixed(3));\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\nimport { formatLayoutNumber } from \"../utils/formatLayoutNumber\";\nimport { calculateAvailableGroupSize } from \"./calculateAvailableGroupSize\";\n\nexport function calculatePanelConstraints(group: RegisteredGroup) {\n const { panels } = group;\n\n const groupSize = calculateAvailableGroupSize({ group });\n if (groupSize === 0) {\n // Can't calculate anything meaningful if the group has a width/height of 0\n // (This could indicate that it's within a hidden subtree)\n return panels.map((current) => ({\n collapsedSize: 0,\n collapsible: current.panelConstraints.collapsible === true,\n defaultSize: undefined,\n minSize: 0,\n maxSize: 100,\n panelId: current.id\n }));\n }\n\n return panels.map<PanelConstraints>((panel) => {\n const { element, panelConstraints } = panel;\n\n let collapsedSize = 0;\n if (panelConstraints.collapsedSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.collapsedSize\n });\n\n collapsedSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let defaultSize: number | undefined = undefined;\n if (panelConstraints.defaultSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.defaultSize\n });\n\n defaultSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let minSize = 0;\n if (panelConstraints.minSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.minSize\n });\n\n minSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let maxSize = 100;\n if (panelConstraints.maxSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.maxSize\n });\n\n maxSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n return {\n collapsedSize,\n collapsible: panelConstraints.collapsible === true,\n defaultSize,\n minSize,\n maxSize,\n panelId: panel.id\n };\n });\n}\n","export type EventMap = {\n [key: string]: unknown;\n};\n\nexport type EventListener<Data> = (data: 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","// Constants used for memoization\nexport const EMPTY_ARRAY: unknown[] = [];\nexport const EMPTY_DOM_RECT: DOMRectReadOnly = {\n bottom: 0,\n height: 0,\n left: 0,\n right: 0,\n toJSON: () => {},\n top: 0,\n width: 0,\n x: 0,\n y: 0\n};\nexport const EMPTY_OBJECT = {};\nexport const EMPTY_POINT = { x: 0, y: 0 };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const IDENTITY_FUNCTION = (value: any) => value;\nexport const NOOP_FUNCTION = () => {};\n\n// Cursor flags\nexport const CURSOR_FLAG_HORIZONTAL_MIN = 0b0001;\nexport const CURSOR_FLAG_HORIZONTAL_MAX = 0b0010;\nexport const CURSOR_FLAG_VERTICAL_MIN = 0b0100;\nexport const CURSOR_FLAG_VERTICAL_MAX = 0b1000;\n\n// Misc. shared values\nexport const DEFAULT_POINTER_PRECISION = {\n coarse: 10,\n precise: 5\n};\n","import type { Properties } from \"csstype\";\nimport type { RegisteredGroup } from \"../../components/group/types\";\nimport {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport type { InteractionState } from \"../types\";\n\nexport function getCursorStyle({\n cursorFlags,\n groups,\n state\n}: {\n cursorFlags: number;\n groups: RegisteredGroup[];\n state: InteractionState[\"state\"];\n}): Properties[\"cursor\"] | null {\n let horizontalCount = 0;\n let verticalCount = 0;\n\n switch (state) {\n case \"active\":\n case \"hover\": {\n groups.forEach((group) => {\n if (group.disableCursor) {\n return;\n }\n\n switch (group.orientation) {\n case \"horizontal\": {\n horizontalCount++;\n break;\n }\n case \"vertical\": {\n verticalCount++;\n break;\n }\n }\n });\n }\n }\n\n if (horizontalCount === 0 && verticalCount === 0) {\n return null;\n }\n\n switch (state) {\n case \"active\": {\n const horizontalMin = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MIN) !== 0;\n const horizontalMax = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MAX) !== 0;\n const verticalMin = (cursorFlags & CURSOR_FLAG_VERTICAL_MIN) !== 0;\n const verticalMax = (cursorFlags & CURSOR_FLAG_VERTICAL_MAX) !== 0;\n\n if (cursorFlags) {\n if (horizontalMin) {\n if (verticalMin) {\n return \"se-resize\";\n } else if (verticalMax) {\n return \"ne-resize\";\n } else {\n return \"e-resize\";\n }\n } else if (horizontalMax) {\n if (verticalMin) {\n return \"sw-resize\";\n } else if (verticalMax) {\n return \"nw-resize\";\n } else {\n return \"w-resize\";\n }\n } else if (verticalMin) {\n return \"s-resize\";\n } else if (verticalMax) {\n return \"n-resize\";\n }\n }\n break;\n }\n }\n\n if (horizontalCount > 0 && verticalCount > 0) {\n return \"move\";\n } else if (horizontalCount > 0) {\n return \"ew-resize\";\n } else {\n return \"ns-resize\";\n }\n}\n","import { read } from \"../mutableState\";\nimport { getCursorStyle } from \"./getCursorStyle\";\n\nlet prevStyle: string | undefined = undefined;\nlet styleSheet: CSSStyleSheet | undefined = undefined;\n\nexport function updateCursorStyle() {\n if (styleSheet === undefined) {\n styleSheet = new CSSStyleSheet();\n\n document.adoptedStyleSheets = [styleSheet];\n }\n\n const { cursorFlags, interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\":\n case \"hover\": {\n const cursorStyle = getCursorStyle({\n cursorFlags,\n groups: interactionState.hitRegions.map((current) => current.group),\n state: interactionState.state\n });\n\n const nextStyle = `*{cursor: ${cursorStyle} !important; ${interactionState.state === \"active\" ? \"touch-action: none;\" : \"\"} }`;\n if (prevStyle === nextStyle) {\n return;\n }\n\n prevStyle = nextStyle;\n\n if (cursorStyle) {\n if (styleSheet.cssRules.length === 0) {\n styleSheet.insertRule(nextStyle);\n } else {\n styleSheet.replaceSync(nextStyle);\n }\n } else if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n case \"inactive\": {\n prevStyle = undefined;\n\n if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n }\n}\n","export function isArrayEqual(a: number[], b: number[]) {\n if (a.length !== b.length) {\n return false;\n } else {\n for (let index = 0; index < a.length; index++) {\n if (a[index] != b[index]) {\n return false;\n }\n }\n }\n return true;\n}\n","import { layoutNumbersEqual } from \"./layoutNumbersEqual\";\n\nexport function compareLayoutNumbers(actual: number, expected: number) {\n if (layoutNumbersEqual(actual, expected)) {\n return 0;\n } else {\n return actual > expected ? 1 : -1;\n }\n}\n","import type { PanelConstraints } from \"../../components/panel/types\";\nimport { compareLayoutNumbers } from \"./compareLayoutNumbers\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\n// Panel size must be in percentages; pixel values should be pre-converted\nexport function validatePanelSize({\n panelConstraints,\n size\n}: {\n panelConstraints: PanelConstraints;\n size: number;\n}) {\n const {\n collapsedSize = 0,\n collapsible,\n maxSize = 100,\n minSize = 0\n } = panelConstraints;\n\n if (compareLayoutNumbers(size, minSize) < 0) {\n if (collapsible) {\n // Collapsible panels should snap closed or open only once they cross the halfway point between collapsed and min size.\n const halfwayPoint = (collapsedSize + minSize) / 2;\n if (compareLayoutNumbers(size, halfwayPoint) < 0) {\n size = collapsedSize;\n } else {\n size = minSize;\n }\n } else {\n size = minSize;\n }\n }\n\n size = Math.min(maxSize, size);\n size = formatLayoutNumber(size);\n\n return size;\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { assert } from \"../../utils/assert\";\nimport { isArrayEqual } from \"../../utils/isArrayEqual\";\nimport { compareLayoutNumbers } from \"../utils/compareLayoutNumbers\";\nimport { layoutNumbersEqual } from \"../utils/layoutNumbersEqual\";\nimport { validatePanelSize } from \"../utils/validatePanelSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function adjustLayoutByDelta({\n delta,\n initialLayout: initialLayoutProp,\n panelConstraints: panelConstraintsArray,\n pivotIndices,\n prevLayout: prevLayoutProp,\n trigger\n}: {\n delta: number;\n initialLayout: Layout;\n panelConstraints: PanelConstraints[];\n pivotIndices: number[];\n prevLayout: Layout;\n trigger: \"imperative-api\" | \"keyboard\" | \"mouse-or-touch\";\n}): Layout {\n if (layoutNumbersEqual(delta, 0)) {\n return initialLayoutProp;\n }\n\n const initialLayout = Object.values(initialLayoutProp);\n const prevLayout = Object.values(prevLayoutProp);\n const nextLayout = [...initialLayout];\n\n const [firstPivotIndex, secondPivotIndex] = pivotIndices;\n assert(firstPivotIndex != null, \"Invalid first pivot index\");\n assert(secondPivotIndex != null, \"Invalid second pivot index\");\n\n let deltaApplied = 0;\n\n // const DEBUG = [];\n // DEBUG.push(`adjustLayoutByDelta()`);\n // DEBUG.push(` initialLayout: ${initialLayout.join(\", \")}`);\n // DEBUG.push(` prevLayout: ${prevLayout.join(\", \")}`);\n // DEBUG.push(` delta: ${delta}`);\n // DEBUG.push(` pivotIndices: ${pivotIndices.join(\", \")}`);\n // DEBUG.push(` trigger: ${trigger}`);\n // DEBUG.push(\"\");\n\n // A resizing panel affects the panels before or after it.\n //\n // A negative delta means the panel(s) immediately after the separator should grow/expand by decreasing its offset.\n // Other panels may also need to shrink/contract (and shift) to make room, depending on the min weights.\n //\n // A positive delta means the panel(s) immediately before the separator should \"expand\".\n // This is accomplished by shrinking/contracting (and shifting) one or more of the panels after the separator.\n\n {\n // If this is a resize triggered by a keyboard event, our logic for expanding/collapsing is different.\n // We no longer check the halfway threshold because this may prevent the panel from expanding at all.\n if (trigger === \"keyboard\") {\n {\n // Check if we should expand a collapsed panel\n const index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 1: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, collapsedSize)) {\n const localDelta = minSize - prevSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n\n {\n // Check if we should collapse a panel at its minimum size\n const index = delta < 0 ? firstPivotIndex : secondPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `No panel constraints found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 2: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, minSize)) {\n const localDelta = prevSize - collapsedSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n }\n // DEBUG.push(\"\");\n }\n\n {\n // Pre-calculate max available delta in the opposite direction of our pivot.\n // This will be the maximum amount we're allowed to expand/contract the panels in the primary direction.\n // If this amount is less than the requested delta, adjust the requested delta.\n // If this amount is greater than the requested delta, that's useful information too–\n // as an expanding panel might change from collapsed to min size.\n\n const increment = delta < 0 ? 1 : -1;\n\n let index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let maxAvailableDelta = 0;\n\n // DEBUG.push(\"pre calc...\");\n while (true) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const maxSafeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: 100\n });\n const delta = maxSafeSize - prevSize;\n // DEBUG.push(` ${index}: ${prevSize} -> ${maxSafeSize}`);\n\n maxAvailableDelta += delta;\n index += increment;\n\n if (index < 0 || index >= panelConstraintsArray.length) {\n break;\n }\n }\n\n // DEBUG.push(` -> max available delta: ${maxAvailableDelta}`);\n const minAbsDelta = Math.min(Math.abs(delta), Math.abs(maxAvailableDelta));\n delta = delta < 0 ? 0 - minAbsDelta : minAbsDelta;\n // DEBUG.push(` -> adjusted delta: ${delta}`);\n // DEBUG.push(\"\");\n }\n\n {\n // Delta added to a panel needs to be subtracted from other panels (within the constraints that those panels allow).\n\n const pivotIndex = delta < 0 ? firstPivotIndex : secondPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const deltaRemaining = Math.abs(delta) - Math.abs(deltaApplied);\n\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize - deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaApplied += prevSize - safeSize;\n\n nextLayout[index] = safeSize;\n\n if (\n deltaApplied\n .toFixed(3)\n .localeCompare(Math.abs(delta).toFixed(3), undefined, {\n numeric: true\n }) >= 0\n ) {\n break;\n }\n }\n\n if (delta < 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n // DEBUG.push(`after 1: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n // If we were unable to resize any of the panels panels, return the previous state.\n // This will essentially bailout and ignore e.g. drags past a panel's boundaries\n if (isArrayEqual(prevLayout, nextLayout)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n {\n // Now distribute the applied delta to the panels in the other direction\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n\n const prevSize = initialLayout[pivotIndex];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${pivotIndex}`\n );\n\n const unsafeSize = prevSize + deltaApplied;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[pivotIndex],\n size: unsafeSize\n });\n\n // Adjust the pivot panel before, but only by the amount that surrounding panels were able to shrink/contract.\n nextLayout[pivotIndex] = safeSize;\n\n // Edge case where expanding or contracting one panel caused another one to change collapsed state\n if (!layoutNumbersEqual(safeSize, unsafeSize)) {\n let deltaRemaining = unsafeSize - safeSize;\n\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const prevSize = nextLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize + deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaRemaining -= safeSize - prevSize;\n\n nextLayout[index] = safeSize;\n }\n\n if (layoutNumbersEqual(deltaRemaining, 0)) {\n break;\n }\n\n if (delta > 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n }\n // DEBUG.push(`after 2: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n const totalSize = Object.values(nextLayout).reduce(\n (total, size) => size + total,\n 0\n );\n // DEBUG.push(`total size: ${totalSize}`);\n\n // If our new layout doesn't add up to 100%, that means the requested delta can't be applied\n // In that case, fall back to our most recent valid layout\n // Allow for a small rounding difference, else e.g. 3 panel layouts may never be considered valid\n if (!layoutNumbersEqual(totalSize, 100, 0.1)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n const prevLayoutKeys = Object.keys(prevLayoutProp);\n\n // console.log(DEBUG.join(\"\\n\"));\n return nextLayout.reduce<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, RegisteredGroup } from \"../../components/group/types\";\nimport {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport type { Point } from \"../../types\";\nimport { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { update, type MountedGroupMap } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { layoutsEqual } from \"./layoutsEqual\";\n\nexport function updateActiveHitRegions({\n event,\n hitRegions,\n initialLayoutMap,\n mountedGroups,\n pointerDownAtPoint\n}: {\n event: {\n clientX: number;\n clientY: number;\n };\n hitRegions: HitRegion[];\n initialLayoutMap: Map<RegisteredGroup, Layout>;\n mountedGroups: MountedGroupMap;\n pointerDownAtPoint?: Point;\n}) {\n let cursorFlags = 0;\n const nextMountedGroups = new Map(mountedGroups);\n\n // Note that HitRegions are frozen once a drag has started\n // Modify the Group layouts for all matching HitRegions though\n hitRegions.forEach((current) => {\n const { group, groupSize } = current;\n const { disableCursor, orientation, panels } = group;\n\n let deltaAsPercentage = 0;\n if (pointerDownAtPoint) {\n if (orientation === \"horizontal\") {\n deltaAsPercentage =\n ((event.clientX - pointerDownAtPoint.x) / groupSize) * 100;\n } else {\n deltaAsPercentage =\n ((event.clientY - pointerDownAtPoint.y) / groupSize) * 100;\n }\n } else {\n if (orientation === \"horizontal\") {\n deltaAsPercentage = event.clientX < 0 ? -100 : 100;\n } else {\n deltaAsPercentage = event.clientY < 0 ? -100 : 100;\n }\n }\n\n const initialLayout = initialLayoutMap.get(group);\n\n const {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout: prevLayout,\n separatorToPanels\n } = mountedGroups.get(group) ?? { defaultLayoutDeferred: false };\n if (\n derivedPanelConstraints &&\n initialLayout &&\n prevLayout &&\n separatorToPanels\n ) {\n const nextLayout = adjustLayoutByDelta({\n delta: deltaAsPercentage,\n initialLayout,\n panelConstraints: derivedPanelConstraints,\n pivotIndices: current.panels.map((panel) => panels.indexOf(panel)),\n prevLayout,\n trigger: \"mouse-or-touch\"\n });\n\n if (layoutsEqual(nextLayout, prevLayout)) {\n if (deltaAsPercentage !== 0 && !disableCursor) {\n // An unchanged means the cursor has exceeded the allowed bounds\n switch (orientation) {\n case \"horizontal\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_HORIZONTAL_MIN\n : CURSOR_FLAG_HORIZONTAL_MAX;\n break;\n }\n case \"vertical\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_VERTICAL_MIN\n : CURSOR_FLAG_VERTICAL_MAX;\n break;\n }\n }\n }\n } else {\n nextMountedGroups.set(current.group, {\n defaultLayoutDeferred,\n derivedPanelConstraints: derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels\n });\n\n // Save the most recent layout for this group of panels in-memory\n // so that layouts will be remembered between different sets of conditionally rendered panels\n const panelIdsKey = current.group.panels.map(({ id }) => id).join(\",\");\n current.group.inMemoryLayouts[panelIdsKey] = nextLayout;\n }\n }\n });\n\n update({\n cursorFlags,\n mountedGroups: nextMountedGroups\n });\n\n updateCursorStyle();\n}\n","import { read } from \"../mutableState\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onGroupPointerLeave(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n } else if (event.relatedTarget !== null) {\n return;\n } else if (event.clientX === 0 && event.clientY === 0) {\n // Edge case iOS Safari bug; coordinates are seemingly nonsensical which would break the drag event\n return;\n }\n\n const { interactionState, mountedGroups } = read();\n\n // The \"pointerleave\" event is not reliably triggered when the pointer exits a window or iframe\n // To account for this, we listen for \"pointerleave\" events on the Group element itself\n switch (interactionState.state) {\n case \"active\": {\n interactionState.hitRegions.forEach((hitRegion) => {\n if (event.currentTarget === hitRegion.group.element) {\n updateActiveHitRegions({\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedGroups\n });\n }\n });\n }\n }\n}\n","import { assert } from \"../../utils/assert\";\nimport { read } from \"../mutableState\";\n\nexport function findSeparatorGroup(separatorElement: HTMLElement) {\n const groupElement = separatorElement.parentElement;\n assert(groupElement, \"Parent group element not found\");\n\n const { mountedGroups } = read();\n\n for (const [group] of mountedGroups) {\n if (group.element === groupElement) {\n return group;\n }\n }\n\n throw Error(\"Could not find parent Group for separator element\");\n}\n","import type { Layout } from \"../../components/group/types\";\nimport 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 {\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 onWindowKeyDown(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 { Orientation } from \"../../components/group/types\";\nimport type { Point } from \"../../types\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosetHitRegion(\n orientation: Orientation,\n hitRegions: HitRegion[],\n point: Point\n) {\n let closestHitRegion: HitRegion | undefined = undefined;\n let minDistance = {\n x: Infinity,\n y: Infinity\n };\n\n for (const hitRegion of hitRegions) {\n const data = getDistanceBetweenPointAndRect(point, hitRegion.rect);\n switch (orientation) {\n case \"horizontal\": {\n if (data.x <= minDistance.x) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n case \"vertical\": {\n if (data.y <= minDistance.y) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n }\n }\n\n return closestHitRegion\n ? {\n distance: minDistance,\n hitRegion: closestHitRegion\n }\n : undefined;\n}\n","let cached: boolean | undefined = undefined;\n\nexport function isCoarsePointer(): boolean {\n if (cached === undefined) {\n if (typeof matchMedia === \"function\") {\n cached = !!matchMedia(\"(pointer:coarse)\").matches;\n } else {\n cached = false;\n }\n }\n\n return cached;\n}\n","// 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\";\n\n/**\n * Determine which of two nodes appears in front of the other —\n * if `a` is in front, returns 1, otherwise returns -1\n * @param {HTMLElement | SVGElement} a\n * @param {HTMLElement | SVGElement} b\n */\nexport function compare(\n a: HTMLElement | SVGElement,\n b: HTMLElement | SVGElement\n): number {\n if (a === b) throw new Error(\"Cannot compare node with itself\");\n\n const ancestors = {\n a: get_ancestors(a),\n b: get_ancestors(b)\n };\n\n let common_ancestor;\n\n // remove shared ancestors\n while (ancestors.a.at(-1) === ancestors.b.at(-1)) {\n a = ancestors.a.pop() as HTMLElement;\n b = ancestors.b.pop() as HTMLElement;\n\n common_ancestor = a;\n }\n\n assert(\n common_ancestor,\n \"Stacking order can only be calculated for elements with a common ancestor\"\n );\n\n const z_indexes = {\n a: get_z_index(find_stacking_context(ancestors.a)),\n b: get_z_index(find_stacking_context(ancestors.b))\n };\n\n if (z_indexes.a === z_indexes.b) {\n const children = common_ancestor.childNodes;\n\n const furthest_ancestors = {\n a: ancestors.a.at(-1),\n b: ancestors.b.at(-1)\n };\n\n let i = children.length;\n while (i--) {\n const child = children[i];\n if (child === furthest_ancestors.a) return 1;\n if (child === furthest_ancestors.b) return -1;\n }\n }\n\n return Math.sign(z_indexes.a - z_indexes.b);\n}\n\nconst props =\n /\\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\\b/;\n\n/** @param {HTMLElement | SVGElement} node */\nfunction is_flex_item(node: HTMLElement | SVGElement) {\n // @ts-expect-error ParentNode vs Element\n const display = getComputedStyle(get_parent(node) ?? node).display;\n return display === \"flex\" || display === \"inline-flex\";\n}\n\n/** @param {HTMLElement | SVGElement} node */\nfunction creates_stacking_context(node: HTMLElement | SVGElement) {\n const style = getComputedStyle(node);\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n if (style.position === \"fixed\") return true;\n // Forked to fix upstream bug https://github.com/Rich-Harris/stacking-order/issues/3\n // if (\n // (style.zIndex !== \"auto\" && style.position !== \"static\") ||\n // is_flex_item(node)\n // )\n if (\n style.zIndex !== \"auto\" &&\n (style.position !== \"static\" || is_flex_item(node))\n )\n return true;\n if (+style.opacity < 1) return true;\n if (\"transform\" in style && style.transform !== \"none\") return true;\n if (\"webkitTransform\" in style && style.webkitTransform !== \"none\")\n return true;\n if (\"mixBlendMode\" in style && style.mixBlendMode !== \"normal\") return true;\n if (\"filter\" in style && style.filter !== \"none\") return true;\n if (\"webkitFilter\" in style && style.webkitFilter !== \"none\") return true;\n if (\"isolation\" in style && style.isolation === \"isolate\") return true;\n if (props.test(style.willChange)) return true;\n // @ts-expect-error Unrecognized prop\n if (style.webkitOverflowScrolling === \"touch\") return true;\n\n return false;\n}\n\n/** @param {(HTMLElement| SVGElement)[]} nodes */\nfunction find_stacking_context(nodes: (HTMLElement | SVGElement)[]) {\n let i = nodes.length;\n\n while (i--) {\n const node = nodes[i];\n assert(node, \"Missing node\");\n if (creates_stacking_context(node)) return node;\n }\n\n return null;\n}\n\n/** @param {HTMLElement | SVGElement} node */\nfunction get_z_index(node: HTMLElement | SVGElement | null) {\n return (node && Number(getComputedStyle(node).zIndex)) || 0;\n}\n\n/** @param {HTMLElement} node */\nfunction get_ancestors(node: HTMLElement | SVGElement | null) {\n const ancestors = [];\n\n while (node) {\n ancestors.push(node);\n // @ts-expect-error ParentNode vs Element\n node = get_parent(node);\n }\n\n return ancestors; // [ node, ... <body>, <html>, document ]\n}\n\n/** @param {HTMLElement} node */\nfunction get_parent(node: HTMLElement) {\n const { parentNode } = node;\n if (parentNode && parentNode instanceof ShadowRoot) {\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 { 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 !(pointerEventTarget instanceof HTMLElement) ||\n pointerEventTarget.contains(groupElement) ||\n groupElement.contains(pointerEventTarget)\n ) {\n // Calculating stacking order has a cost;\n // If either group or element contain the other, the click is safe and we can skip calculating the indices\n return true;\n }\n\n if (compare(pointerEventTarget, groupElement) > 0) {\n // If the pointer target is above the separator, check for overlap\n // If they are near each other, but not overlapping, then the separator is still a viable target\n //\n // Note that it's not sufficient to compare only the target\n // The target might be a small element inside of a larger container\n // (For example, a SPAN or a DIV inside of a larger modal dialog)\n let currentElement: HTMLElement | SVGElement | null = pointerEventTarget;\n while (currentElement) {\n if (currentElement.contains(groupElement)) {\n return true;\n } else if (\n doRectsIntersect(currentElement.getBoundingClientRect(), hitRegion)\n ) {\n return false;\n }\n\n currentElement = currentElement.parentElement;\n }\n }\n\n return true;\n}\n","import { DEFAULT_POINTER_PRECISION } from \"../../constants\";\nimport type { MountedGroupMap } from \"../mutableState\";\nimport {\n calculateHitRegions,\n type HitRegion\n} from \"../dom/calculateHitRegions\";\nimport { findClosetHitRegion } from \"./findClosetHitRegion\";\nimport { isCoarsePointer } from \"./isCoarsePointer\";\nimport { isViableHitTarget } from \"./isViableHitTarget\";\n\nexport function findMatchingHitRegions(\n event: PointerEvent,\n mountedGroups: MountedGroupMap\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedGroups.forEach((_, groupData) => {\n if (groupData.disabled) {\n return;\n }\n\n const maxDistance = isCoarsePointer()\n ? DEFAULT_POINTER_PRECISION.coarse\n : DEFAULT_POINTER_PRECISION.precise;\n\n const hitRegions = calculateHitRegions(groupData);\n const match = findClosetHitRegion(groupData.orientation, hitRegions, {\n x: event.clientX,\n y: event.clientY\n });\n\n if (\n match &&\n match.distance.x <= maxDistance &&\n match.distance.y <= maxDistance &&\n isViableHitTarget({\n groupElement: groupData.element,\n hitRegion: match.hitRegion.rect,\n pointerEventTarget: event.target\n })\n ) {\n matchingHitRegions.push(match.hitRegion);\n }\n });\n\n return matchingHitRegions;\n}\n","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\nimport type { RegisteredSeparator } from \"../../components/separator/types\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\n\nexport function onWindowPointerDown(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n const groups = new Set<RegisteredGroup>();\n const panels = new Set<RegisteredPanel>();\n const separators = new Set<RegisteredSeparator>();\n const initialLayoutMap = new Map<RegisteredGroup, Layout>();\n\n let didChangeFocus = false;\n\n hitRegions.forEach((current) => {\n groups.add(current.group);\n current.panels.forEach((panel) => {\n panels.add(panel);\n });\n\n if (current.separator) {\n separators.add(current.separator);\n\n if (!didChangeFocus) {\n didChangeFocus = true;\n\n current.separator.element.focus();\n }\n }\n\n const match = mountedGroups.get(current.group);\n if (match) {\n initialLayoutMap.set(current.group, match.layout);\n }\n });\n\n update({\n interactionState: {\n hitRegions,\n initialLayoutMap,\n pointerDownAtPoint: { x: event.clientX, y: event.clientY },\n state: \"active\"\n }\n });\n\n if (hitRegions.length) {\n event.preventDefault();\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onWindowPointerMove(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { interactionState, mountedGroups } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n // Edge case (see #340)\n // Detect when the pointer has been released outside an iframe on a different domain\n if (\n // Skip this check for \"pointerleave\" events, else Firefox triggers a false positive (see #514)\n event.type !== \"pointerleave\" &&\n event.buttons === 0\n ) {\n update((prevState) =>\n prevState.interactionState.state === \"inactive\"\n ? prevState\n : {\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n }\n );\n\n return;\n }\n\n updateActiveHitRegions({\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedGroups,\n pointerDownAtPoint: interactionState.pointerDownAtPoint\n });\n break;\n }\n default: {\n // Update HitRegions if a drag has not been started\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n if (hitRegions.length === 0) {\n if (interactionState.state !== \"inactive\") {\n update({\n interactionState: { state: \"inactive\" }\n });\n }\n } else {\n update({\n interactionState: {\n hitRegions,\n state: \"hover\"\n }\n });\n }\n\n updateCursorStyle();\n break;\n }\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\n\nexport function onWindowPointerUp(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n event.preventDefault();\n\n const { interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n update({\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n });\n\n updateCursorStyle();\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 panel.onResize(\n {\n asPercentage: formatLayoutNumber(\n (resizeObserverSize.inlineSize / groupSize) * 100\n ),\n inPixels: resizeObserverSize.inlineSize\n },\n panel.id\n );\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, 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 { onGroupPointerLeave } from \"./event-handlers/onGroupPointerLeave\";\nimport { onWindowKeyDown } from \"./event-handlers/onWindowKeyDown\";\nimport { onWindowPointerDown } from \"./event-handlers/onWindowPointerDown\";\nimport { onWindowPointerMove } from \"./event-handlers/onWindowPointerMove\";\nimport { onWindowPointerUp } from \"./event-handlers/onWindowPointerUp\";\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 { validatePanelGroupLayout } from \"./utils/validatePanelGroupLayout\";\n\nexport function mountGroup(group: RegisteredGroup) {\n let isMounted = true;\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 (group.panels.length !== Object.keys(defaultLayout).length) {\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 nextState = update((prevState) => {\n const separatorToPanels: SeparatorToPanelsMap = new Map();\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 // The \"pointerleave\" event is not reliably triggered when the pointer exits a window or iframe\n // To account for this, we listen for \"pointerleave\" events on the Group element itself\n // TODO Could I listen to document.body instead of this?\n group.element.addEventListener(\"pointerleave\", onGroupPointerLeave);\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\", onWindowKeyDown);\n });\n\n // If this is the first group to be mounted, initialize event handlers\n if (nextState.mountedGroups.size === 1) {\n window.addEventListener(\"pointerdown\", onWindowPointerDown);\n window.addEventListener(\"pointermove\", onWindowPointerMove);\n window.addEventListener(\"pointerup\", onWindowPointerUp);\n }\n\n return function unmountGroup() {\n isMounted = false;\n\n const nextState = update((prevState) => {\n const mountedGroups = new Map(prevState.mountedGroups);\n mountedGroups.delete(group);\n\n return { mountedGroups };\n });\n\n group.element.removeEventListener(\"pointerleave\", onGroupPointerLeave);\n\n group.separators.forEach((separator) => {\n separator.element.removeEventListener(\"keydown\", onWindowKeyDown);\n });\n\n // If this was the last group to be mounted, tear down event handlers\n if (nextState.mountedGroups.size === 0) {\n window.removeEventListener(\"pointerdown\", onWindowPointerDown);\n window.removeEventListener(\"pointermove\", onWindowPointerMove);\n window.removeEventListener(\"pointerup\", onWindowPointerUp);\n }\n\n resizeObserver.disconnect();\n };\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)\nexport function useStableCallback<Return>(fn: () => Return): () => Return;\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return;\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(fn);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\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","export const POINTER_EVENTS_CSS_PROPERTY_NAME =\n \"--react-resizable-panels--panel--pointer-events\";\n","export function getPanelSizeCssPropertyName(groupId: string, panelId: string) {\n const groupIdEscaped = groupId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n const panelIdEscaped = panelId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n\n return `--react-resizable-panels--${groupIdEscaped}--${panelIdEscaped}`;\n}\n","import { createContext } from \"react\";\nimport type { GroupContextType } from \"./types\";\n\nexport const GroupContext = createContext<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\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { mountGroup } from \"../../global/mountGroup\";\nimport { eventEmitter, read } from \"../../global/mutableState\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { useStableObject } from \"../../hooks/useStableObject\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"../panel/constants\";\nimport type { RegisteredPanel } from \"../panel/types\";\nimport type { RegisteredSeparator } from \"../separator/types\";\nimport { getPanelSizeCssPropertyName } from \"./getPanelSizeCssPropertyName\";\nimport { GroupContext } from \"./GroupContext\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type { GroupProps, Layout, RegisteredGroup } from \"./types\";\nimport { useGroupImperativeHandle } from \"./useGroupImperativeHandle\";\n\n/**\n * A Group wraps a set of resizable Panel components.\n * Group content can be resized _horizontally_ or _vertically_.\n *\n * Group elements always include the following attributes:\n *\n * ```html\n * <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,\n groupRef,\n id: idProp,\n onLayoutChange: onLayoutChangeUnstable,\n orientation = \"horizontal\",\n style,\n ...rest\n}: GroupProps) {\n const prevLayoutRef = useRef<Layout>({});\n\n const onLayoutChangeStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current = layout;\n onLayoutChangeUnstable?.(layout);\n });\n\n const id = useId(idProp);\n\n const [dragActive, setDragActive] = useState(false);\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n const [layout, setLayout] = useState<Layout>(defaultLayout ?? {});\n const [panels, setPanels] = useState<RegisteredPanel[]>([]);\n const [separators, setSeparators] = useState<RegisteredSeparator[]>([]);\n\n const inMemoryValuesRef = useRef<{\n lastExpandedPanelSizes: { [panelIds: string]: number };\n layouts: { [panelIds: string]: Layout };\n }>({\n lastExpandedPanelSizes: {},\n layouts: {}\n });\n\n const mergedRef = useMergedRefs(setElement, elementRef);\n\n useGroupImperativeHandle(id, groupRef);\n\n const context = useMemo(\n () => ({\n id,\n orientation,\n registerPanel: (panel: RegisteredPanel) => {\n setPanels((prev) => sortByElementOffset(orientation, [...prev, panel]));\n return () => {\n setPanels((prev) => prev.filter((current) => current !== panel));\n };\n },\n registerSeparator: (separator: RegisteredSeparator) => {\n setSeparators((prev) =>\n sortByElementOffset(orientation, [...prev, separator])\n );\n return () => {\n setSeparators((prev) =>\n prev.filter((current) => current !== separator)\n );\n };\n }\n }),\n [id, 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 if (element === null) {\n return;\n }\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,\n 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 // 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 setLayout(layout);\n onLayoutChangeStable?.(layout);\n }\n }\n\n const removeInteractionStateChangeListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n switch (interactionState.state) {\n case \"active\": {\n setDragActive(\n interactionState.hitRegions.some(\n (current) => current.group === group\n )\n );\n break;\n }\n default: {\n setDragActive(false);\n break;\n }\n }\n }\n );\n\n const removeMountedGroupsChangeEventListener = eventEmitter.addListener(\n \"mountedGroupsChange\",\n (mountedGroups) => {\n const match = mountedGroups.get(group);\n if (match) {\n const { defaultLayoutDeferred, derivedPanelConstraints, layout } =\n match;\n\n if (defaultLayoutDeferred || derivedPanelConstraints.length === 0) {\n // This indicates that the Group has not finished mounting yet\n // Likely because it has been rendered inside of a hidden DOM subtree\n // Ignore layouts in this case because they will not have been validated\n return;\n }\n\n setLayout(layout);\n onLayoutChangeStable?.(layout);\n }\n }\n );\n\n return () => {\n registeredGroupRef.current = null;\n\n unmountGroup();\n removeInteractionStateChangeListener();\n removeMountedGroupsChangeEventListener();\n };\n }, [\n disabled,\n element,\n id,\n onLayoutChangeStable,\n orientation,\n panels,\n separators,\n stableProps\n ]);\n\n // Not all props require re-registering the group;\n // Some can be updated after the group has been registered\n useEffect(() => {\n const registeredGroup = registeredGroupRef.current;\n if (registeredGroup) {\n registeredGroup.defaultLayout = defaultLayout;\n registeredGroup.disableCursor = !!disableCursor;\n }\n });\n\n // Panel layouts and Group dragging state are shared via CSS variables\n const cssVariables: { [key: string]: number | string | undefined } = {\n [POINTER_EVENTS_CSS_PROPERTY_NAME]: dragActive ? \"none\" : undefined\n };\n for (const panelId in layout) {\n const propertyName = getPanelSizeCssPropertyName(id, panelId);\n const flexGrow = layout[panelId];\n cssVariables[propertyName] = flexGrow;\n }\n\n return (\n <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 ...style,\n ...cssVariables,\n display: \"flex\",\n flexDirection: orientation === \"horizontal\" ? \"row\" : \"column\",\n flexWrap: \"nowrap\"\n }}\n >\n {children}\n </div>\n </GroupContext.Provider>\n );\n}\n","export function debounce(fn: () => void, durationMs?: number): () => void;\nexport function debounce<Args>(\n fn: (args: Args) => void,\n durationMs?: number\n): (args: Args) => void;\nexport function debounce<Args>(\n fn: (args: Args) => void,\n durationMs: number = 10\n): (args: Args) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (args: Args) => {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n fn(args);\n }, durationMs);\n };\n}\n","export function getStorageKey(id: string): string {\n return `react-resizable-panels:${id}`;\n}\n","import { useMemo, useSyncExternalStore } from \"react\";\nimport { debounce } from \"../../utils/debounce\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\nimport type { Layout, LayoutStorage, OnGroupLayoutChange } from \"./types\";\n\nexport function useDefaultLayout({\n debounceSaveMs = 100,\n groupId,\n storage\n}: {\n /**\n * Debounce save operation by the specified number of milliseconds; defaults to 100ms\n */\n debounceSaveMs?: number;\n\n /**\n * Group id; must be unique in order for layouts to be saved separately.\n */\n groupId: string;\n\n /**\n * Storage implementation; supports localStorage, sessionStorage, and custom implementations\n * Refer to documentation site for example integrations.\n */\n storage: LayoutStorage;\n}) {\n const storageKey = getStorageKey(groupId);\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(storageKey),\n () => storage.getItem(storageKey)\n );\n\n const defaultLayout = useMemo(\n () =>\n defaultLayoutString\n ? (JSON.parse(defaultLayoutString) as Layout)\n : undefined,\n [defaultLayoutString]\n );\n\n const onLayoutChange = useMemo<NonNullable<OnGroupLayoutChange>>(() => {\n const saveLayout = (layout: Layout) => {\n try {\n storage.setItem(storageKey, JSON.stringify(layout));\n } catch (error) {\n console.error(error);\n }\n };\n\n return debounceSaveMs > 0\n ? debounce(saveLayout, debounceSaveMs)\n : saveLayout;\n }, [debounceSaveMs, storage, storageKey]);\n\n return {\n defaultLayout,\n onLayoutChange\n };\n}\n\nfunction subscribe() {\n return function unsubscribe() {};\n}\n","import { useState } from \"react\";\nimport type { GroupImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Group component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function useGroupCallbackRef() {\n return useState<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);\n}\n","import { useContext } from \"react\";\nimport { assert } from \"../../utils/assert\";\nimport { GroupContext } from \"./GroupContext\";\n\nexport function useGroupContext() {\n const context = useContext(GroupContext);\n assert(\n context,\n \"Group Context not found; did you render a Panel or Separator outside of a Group?\"\n );\n\n return context;\n}\n","import type { PanelImperativeHandle } from \"../../components/panel/types\";\nimport { calculateAvailableGroupSize } from \"../dom/calculateAvailableGroupSize\";\nimport { read, update } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function getImperativePanelMethods({\n groupId,\n panelId\n}: {\n groupId: string;\n panelId: string;\n}): PanelImperativeHandle {\n const find = () => {\n const { mountedGroups } = read();\n for (const [\n group,\n {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout,\n separatorToPanels\n }\n ] of mountedGroups) {\n if (group.id === groupId) {\n return {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n group,\n layout,\n separatorToPanels\n };\n }\n }\n\n throw Error(`Group ${groupId} not found`);\n };\n\n const getPanelConstraints = () => {\n const match = find().derivedPanelConstraints.find(\n (current) => current.panelId === panelId\n );\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Panel constraints not found for Panel ${panelId}`);\n };\n\n const getPanel = () => {\n const match = find().group.panels.find((current) => current.id === panelId);\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${panelId}`);\n };\n\n const getPanelSize = () => {\n const match = find().layout[panelId];\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${panelId}`);\n };\n\n const setPanelSize = (nextSize: number) => {\n const prevSize = getPanelSize();\n if (nextSize === prevSize) {\n return;\n }\n\n const {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n group,\n layout: prevLayout,\n separatorToPanels\n } = find();\n\n const index = group.panels.findIndex((current) => current.id === panelId);\n const isLastPanel = index === group.panels.length - 1;\n\n const unsafeLayout = adjustLayoutByDelta({\n delta: isLastPanel ? prevSize - nextSize : nextSize - prevSize,\n initialLayout: prevLayout,\n panelConstraints: derivedPanelConstraints,\n pivotIndices: isLastPanel ? [index - 1, index] : [index, index + 1],\n prevLayout,\n trigger: \"imperative-api\"\n });\n\n const nextLayout = validatePanelGroupLayout({\n layout: unsafeLayout,\n panelConstraints: derivedPanelConstraints\n });\n if (!layoutsEqual(prevLayout, nextLayout)) {\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels\n })\n }));\n }\n };\n\n return {\n collapse: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const size = getPanelSize();\n\n if (collapsible && size !== collapsedSize) {\n setPanelSize(collapsedSize);\n }\n },\n expand: () => {\n const { collapsible, collapsedSize, minSize } = getPanelConstraints();\n const size = getPanelSize();\n\n if (collapsible && size === collapsedSize) {\n setPanelSize(minSize);\n }\n },\n getSize: () => {\n const { group } = find();\n const asPercentage = getPanelSize();\n const { element } = getPanel();\n\n const inPixels =\n group.orientation === \"horizontal\"\n ? element.offsetWidth\n : element.offsetHeight;\n\n return {\n asPercentage,\n inPixels\n };\n },\n isCollapsed: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const size = getPanelSize();\n\n return collapsible && layoutNumbersEqual(collapsedSize, size);\n },\n resize: (size: number | string) => {\n const prevSize = getPanelSize();\n if (prevSize !== size) {\n let asPercentage;\n switch (typeof size) {\n case \"number\": {\n const { group } = find();\n const groupSize = calculateAvailableGroupSize({ group });\n asPercentage = formatLayoutNumber((size / groupSize) * 100);\n break;\n }\n case \"string\": {\n asPercentage = parseFloat(size);\n break;\n }\n }\n\n setPanelSize(asPercentage);\n }\n }\n } satisfies PanelImperativeHandle;\n}\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { NOOP_FUNCTION } from \"../../constants\";\nimport { getImperativePanelMethods } from \"../../global/utils/getImperativePanelMethods\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { PanelImperativeHandle } from \"./types\";\n\nexport function usePanelImperativeHandle(\n panelId: string,\n panelRef: Ref<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 type { Property } from \"csstype\";\nimport { useState, type CSSProperties } from \"react\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { getPanelSizeCssPropertyName } from \"../group/getPanelSizeCssPropertyName\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"./constants\";\nimport type { PanelProps, PanelSize } from \"./types\";\nimport { usePanelImperativeHandle } from \"./usePanelImperativeHandle\";\n\n/**\n * A Panel wraps resizable content and can be configured with min/max size constraints and collapsible behavior.\n *\n * Panel size props can be in the following formats:\n * - Percentage of the parent Group (0..100)\n * - Pixels\n * - Relative font units (em, rem)\n * - Viewport relative units (vh, vw)\n *\n * ℹ️ Numeric values are assumed to be pixels.\n * Strings without explicit units are assumed to be percentages (0%..100%).\n * Percentages may also be specified as strings ending with \"%\" (e.g. \"33%\")\n * Pixels may also be specified as strings ending with the unit \"px\".\n * Other units should be specified as strings ending with their CSS property units (e.g. 1rem, 50vh)\n *\n * Panel elements always include the following attributes:\n *\n * ```html\n * <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 */\nexport function Panel({\n children,\n className,\n collapsedSize = \"0%\",\n collapsible = false,\n defaultSize,\n elementRef,\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 [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const mergedRef = useMergedRefs(setElement, elementRef);\n\n const { id: groupId, registerPanel } = useGroupContext();\n\n const hasOnResize = onResizeUnstable !== null;\n const onResizeStable = useStableCallback((panelSize: PanelSize) => {\n onResizeUnstable?.(panelSize, idProp);\n });\n\n // Register Panel with parent Group\n useIsomorphicLayoutEffect(() => {\n if (element !== null) {\n return registerPanel({\n element,\n id,\n idIsStable,\n onResize: hasOnResize ? onResizeStable : undefined,\n panelConstraints: {\n collapsedSize,\n collapsible,\n defaultSize,\n maxSize,\n minSize\n }\n });\n }\n }, [\n collapsedSize,\n collapsible,\n defaultSize,\n element,\n hasOnResize,\n id,\n idIsStable,\n maxSize,\n minSize,\n onResizeStable,\n registerPanel\n ]);\n\n usePanelImperativeHandle(id, panelRef);\n\n const flexGrowVar = getPanelSizeCssPropertyName(groupId, id);\n\n return (\n <div\n {...rest}\n data-panel\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n ...PROHIBITED_CSS_PROPERTIES,\n\n flexBasis: 0,\n flexGrow: `var(${flexGrowVar}, 1)`,\n flexShrink: 1,\n\n // Prevent Panel content from interfering with panel size\n overflow: \"hidden\",\n\n // Disable pointer events inside of a panel during resize\n // This avoid edge cases like nested iframes\n pointerEvents:\n `var(${POINTER_EVENTS_CSS_PROPERTY_NAME})` as Property.PointerEvents\n }}\n >\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n ...style\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nconst PROHIBITED_CSS_PROPERTIES: CSSProperties = {\n minHeight: \"unset\",\n maxHeight: \"unset\",\n height: \"unset\",\n\n minWidth: \"unset\",\n maxWidth: \"unset\",\n width: \"unset\",\n\n flex: \"unset\",\n flexBasis: \"unset\",\n flexShrink: \"unset\",\n flexGrow: \"unset\",\n\n border: \"unset\",\n borderWidth: \"unset\",\n padding: \"unset\",\n margin: \"unset\"\n};\n","import { useState } from \"react\";\nimport type { PanelImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Panel component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function usePanelCallbackRef() {\n return useState<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);\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function calculateSeparatorAriaValues({\n layout,\n panelConstraints,\n panelId,\n panelIndex\n}: {\n layout: Layout;\n panelConstraints: PanelConstraints[];\n panelId: string;\n panelIndex: number;\n}): {\n valueControls: string | undefined;\n valueMax: number | undefined;\n valueMin: number | undefined;\n valueNow: number | undefined;\n} {\n let valueMax: number | undefined = undefined;\n let valueMin: number | undefined = undefined;\n\n const panelSize = layout[panelId];\n\n const constraints = panelConstraints.find(\n (current) => current.panelId === panelId\n );\n if (constraints) {\n const maxSize = constraints.maxSize;\n const minSize = (valueMin = constraints.collapsible\n ? constraints.collapsedSize\n : constraints.minSize);\n\n const pivotIndices = [panelIndex, panelIndex + 1];\n\n const minSizeLayout = validatePanelGroupLayout({\n layout: adjustLayoutByDelta({\n delta: minSize - panelSize,\n initialLayout: layout,\n panelConstraints,\n pivotIndices,\n prevLayout: layout,\n trigger: \"keyboard\"\n }),\n panelConstraints\n });\n\n valueMin = minSizeLayout[panelId];\n\n const maxSizeLayout = validatePanelGroupLayout({\n layout: adjustLayoutByDelta({\n delta: maxSize - panelSize,\n initialLayout: layout,\n panelConstraints,\n pivotIndices,\n prevLayout: layout,\n trigger: \"keyboard\"\n }),\n panelConstraints\n });\n\n valueMax = maxSizeLayout[panelId];\n }\n\n return {\n valueControls: panelId,\n valueMax,\n valueMin,\n valueNow: panelSize\n };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { eventEmitter } from \"../../global/mutableState\";\nimport type { InteractionState } from \"../../global/types\";\nimport { calculateSeparatorAriaValues } from \"../../global/utils/calculateSeparatorAriaValues\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { RegisteredSeparator, SeparatorProps } from \"./types\";\n\n/**\n * Separators are not _required_ but they are _recommended_ as they improve keyboard accessibility.\n *\n * Separators should be rendered as the direct child of a Group component.\n *\n * Separator elements always include the following attributes:\n *\n * ```html\n * <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,\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 const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const mergedRef = useMergedRefs(setElement, elementRef);\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 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 }, [element, 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"],"names":["assert","expectedCondition","message","calculateAvailableGroupSize","group","orientation","panels","totalSize","panel","sortByElementOffset","panelsOrSeparators","horizontalSort","verticalSort","a","b","delta","getDistanceBetweenPointAndRect","point","rect","findClosestRect","rects","targetRect","centerPoint","closestRect","minDistance","x","y","distance","calculateHitRegions","groupElement","separators","sortedChildElements","child","element","hitRegions","hasInterleavedStaticContent","prevPanel","pendingSeparators","childElement","panelData","current","prevRect","pendingRectsOrSeparators","firstPanelEdgeRect","secondPanelEdgeRect","separator","rectOrSeparator","separatorData","convertEmToPixels","value","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","error","index","layoutNumbersEqual","actual","expected","minimumDelta","state","eventEmitter","read","update","partialState","prevState","constraints","prevLayout","isCollapsed","wasCollapsed","IDENTITY_FUNCTION","NOOP_FUNCTION","CURSOR_FLAG_HORIZONTAL_MIN","CURSOR_FLAG_HORIZONTAL_MAX","CURSOR_FLAG_VERTICAL_MIN","CURSOR_FLAG_VERTICAL_MAX","DEFAULT_POINTER_PRECISION","getCursorStyle","cursorFlags","groups","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","prevStyle","styleSheet","updateCursorStyle","interactionState","cursorStyle","nextStyle","isArrayEqual","compareLayoutNumbers","validatePanelSize","collapsible","halfwayPoint","adjustLayoutByDelta","initialLayoutProp","panelConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","prevSize","localDelta","increment","maxAvailableDelta","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","total","prevLayoutKeys","accumulated","layoutsEqual","id","updateActiveHitRegions","event","initialLayoutMap","mountedGroups","pointerDownAtPoint","nextMountedGroups","disableCursor","deltaAsPercentage","defaultLayoutDeferred","derivedPanelConstraints","separatorToPanels","panelIdsKey","onGroupPointerLeave","hitRegion","findSeparatorGroup","separatorElement","validatePanelGroupLayout","layout","nextLayoutTotalSize","remainingSize","getImperativeGroupMethods","groupId","find","unsafeLayout","getMountedGroup","mountedGroup","adjustLayoutForSeparator","onWindowKeyDown","primaryPanel","nextSize","separatorElements","nextIndex","findClosetHitRegion","closestHitRegion","cached","isCoarsePointer","compare","ancestors","get_ancestors","common_ancestor","z_indexes","get_z_index","find_stacking_context","children","furthest_ancestors","props","is_flex_item","node","display","get_parent","creates_stacking_context","nodes","i","parentNode","doRectsIntersect","isViableHitTarget","pointerEventTarget","currentElement","findMatchingHitRegions","matchingHitRegions","_","groupData","maxDistance","match","onWindowPointerDown","didChangeFocus","onWindowPointerMove","onWindowPointerUp","calculateDefaultLayout","explicitCount","remainingPanelCount","notifyPanelOnResize","borderBoxSize","resizeObserverSize","objectsEqual","key","mountGroup","isMounted","panelIds","separatorIds","resizeObserver","entries","entry","target","nextDerivedPanelConstraints","defaultLayout","defaultLayoutUnsafe","defaultLayoutSafe","nextState","useId","stableId","dynamicId","useIdReact","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useStableCallback","fn","ref","useRef","useCallback","args","useMergedRefs","refs","useStableObject","unstableObject","POINTER_EVENTS_CSS_PROPERTY_NAME","getPanelSizeCssPropertyName","panelId","groupIdEscaped","panelIdEscaped","GroupContext","createContext","useGroupImperativeHandle","groupRef","imperativeGroupRef","useImperativeHandle","Group","className","disabled","elementRef","idProp","onLayoutChangeUnstable","rest","prevLayoutRef","onLayoutChangeStable","dragActive","setDragActive","useState","setElement","setLayout","setPanels","setSeparators","inMemoryValuesRef","mergedRef","context","useMemo","prev","stableProps","registeredGroupRef","unmountGroup","removeInteractionStateChangeListener","removeMountedGroupsChangeEventListener","registeredGroup","cssVariables","propertyName","flexGrow","jsx","debounce","durationMs","timeout","getStorageKey","useDefaultLayout","debounceSaveMs","storage","storageKey","defaultLayoutString","useSyncExternalStore","subscribe","onLayoutChange","saveLayout","useGroupCallbackRef","useGroupRef","useGroupContext","useContext","getImperativePanelMethods","getPanelConstraints","getPanel","getPanelSize","setPanelSize","isLastPanel","asPercentage","inPixels","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","onResizeUnstable","idIsStable","registerPanel","hasOnResize","onResizeStable","panelSize","flexGrowVar","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/global/utils/getDistanceBetweenPointAndRect.ts","../lib/global/utils/findClosestRect.ts","../lib/global/dom/calculateHitRegions.ts","../lib/global/styles/convertEmToPixels.ts","../lib/global/styles/convertRemToPixels.ts","../lib/global/styles/convertVhToPixels.ts","../lib/global/styles/convertVwToPixels.ts","../lib/global/styles/parseSizeAndUnit.ts","../lib/global/styles/sizeStyleToPixels.ts","../lib/global/utils/formatLayoutNumber.ts","../lib/global/dom/calculatePanelConstraints.ts","../lib/utils/EventEmitter.ts","../lib/global/utils/layoutNumbersEqual.ts","../lib/global/mutableState.ts","../lib/constants.ts","../lib/global/cursor/getCursorStyle.ts","../lib/global/cursor/updateCursorStyle.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/updateActiveHitRegion.ts","../lib/global/event-handlers/onGroupPointerLeave.ts","../lib/global/utils/findSeparatorGroup.ts","../lib/global/utils/validatePanelGroupLayout.ts","../lib/global/utils/getImperativeGroupMethods.ts","../lib/global/utils/getMountedGroup.ts","../lib/global/utils/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onWindowKeyDown.ts","../lib/global/utils/findClosetHitRegion.ts","../lib/global/utils/isCoarsePointer.ts","../lib/vendor/stacking-order.ts","../lib/global/utils/doRectsIntersect.ts","../lib/global/utils/isViableHitTarget.ts","../lib/global/utils/findMatchingHitRegions.ts","../lib/global/event-handlers/onWindowPointerDown.ts","../lib/global/event-handlers/onWindowPointerMove.ts","../lib/global/event-handlers/onWindowPointerUp.ts","../lib/global/utils/calculateDefaultLayout.ts","../lib/global/utils/notifyPanelOnResize.ts","../lib/global/utils/objectsEqual.ts","../lib/global/mountGroup.ts","../lib/hooks/useId.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/hooks/useStableCallback.ts","../lib/hooks/useMergedRefs.ts","../lib/hooks/useStableObject.ts","../lib/components/panel/constants.ts","../lib/components/group/getPanelSizeCssPropertyName.ts","../lib/components/group/GroupContext.ts","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/Group.tsx","../lib/utils/debounce.ts","../lib/components/group/auto-save/getStorageKey.ts","../lib/components/group/useDefaultLayout.ts","../lib/components/group/useGroupCallbackRef.ts","../lib/components/group/useGroupRef.ts","../lib/components/group/useGroupContext.ts","../lib/global/utils/getImperativePanelMethods.ts","../lib/components/panel/usePanelImperativeHandle.ts","../lib/components/panel/Panel.tsx","../lib/components/panel/usePanelCallbackRef.ts","../lib/components/panel/usePanelRef.ts","../lib/global/utils/calculateSeparatorAriaValues.ts","../lib/components/separator/Separator.tsx"],"sourcesContent":["export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n throw Error(message);\n }\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\n\nexport function calculateAvailableGroupSize({\n group\n}: {\n group: RegisteredGroup;\n}) {\n const { orientation, panels } = group;\n\n return panels.reduce((totalSize, panel) => {\n totalSize +=\n orientation === \"horizontal\"\n ? panel.element.offsetWidth\n : panel.element.offsetHeight;\n return totalSize;\n }, 0);\n}\n","import type { Orientation } from \"./types\";\n\nexport function sortByElementOffset<\n Type extends { element: HTMLElement },\n ReturnType extends Type[]\n>(orientation: Orientation, panelsOrSeparators: Type[]): ReturnType {\n return panelsOrSeparators.sort(\n orientation === \"horizontal\" ? horizontalSort : verticalSort\n ) as ReturnType;\n}\n\nfunction horizontalSort<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","import type { Point } from \"../../types\";\n\nexport function getDistanceBetweenPointAndRect(\n point: Point,\n rect: DOMRectReadOnly\n) {\n return {\n x:\n point.x >= rect.left && point.x <= rect.right\n ? 0\n : Math.min(\n Math.abs(point.x - rect.left),\n Math.abs(point.x - rect.right)\n ),\n y:\n point.y >= rect.top && point.y <= rect.bottom\n ? 0\n : Math.min(\n Math.abs(point.y - rect.top),\n Math.abs(point.y - rect.bottom)\n )\n };\n}\n","import type { Orientation } from \"../../components/group/types\";\nimport { assert } from \"../../utils/assert\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosestRect({\n orientation,\n rects,\n targetRect\n}: {\n orientation: Orientation;\n rects: DOMRectReadOnly[];\n targetRect: DOMRectReadOnly;\n}): DOMRectReadOnly {\n const centerPoint = {\n x: targetRect.x + targetRect.width / 2,\n y: targetRect.y + targetRect.height / 2\n };\n\n let closestRect: DOMRectReadOnly | undefined = undefined;\n let minDistance = Number.MAX_VALUE;\n\n for (const rect of rects) {\n const { x, y } = getDistanceBetweenPointAndRect(centerPoint, rect);\n\n const distance = orientation === \"horizontal\" ? x : y;\n\n if (distance < minDistance) {\n minDistance = distance;\n closestRect = rect;\n }\n }\n\n assert(closestRect, \"No rect found\");\n\n return closestRect;\n}\n","import { sortByElementOffset } from \"../../components/group/sortByElementOffset\";\nimport type { RegisteredGroup } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\nimport type { RegisteredSeparator } from \"../../components/separator/types\";\nimport { findClosestRect } from \"../utils/findClosestRect\";\nimport { calculateAvailableGroupSize } from \"./calculateAvailableGroupSize\";\n\ntype PanelsTuple = [panel: RegisteredPanel, panel: RegisteredPanel];\n\nexport type HitRegion = {\n group: RegisteredGroup;\n groupSize: number;\n panels: PanelsTuple;\n rect: DOMRect;\n separator?: RegisteredSeparator | undefined;\n};\n\n/**\n * Determines hit regions for a Group; a hit region is either:\n * - 1: An explicit Separator element\n * - 2: The edge of a Panel element that has another Panel beside it\n *\n * This method determines bounding rects of all regions for the particular group.\n */\nexport function calculateHitRegions(group: RegisteredGroup) {\n const { element: groupElement, orientation, panels, separators } = group;\n\n // Sort elements by offset before traversing\n const sortedChildElements: HTMLElement[] = sortByElementOffset(\n orientation,\n Array.from(groupElement.children)\n .filter((child) => child instanceof HTMLElement)\n .map((element) => ({ element }))\n ).map(({ element }) => element);\n\n const hitRegions: HitRegion[] = [];\n\n let hasInterleavedStaticContent = false;\n let prevPanel: RegisteredPanel | undefined = undefined;\n let pendingSeparators: RegisteredSeparator[] = [];\n\n for (const childElement of sortedChildElements) {\n if (childElement.hasAttribute(\"data-panel\")) {\n const panelData = panels.find(\n (current) => current.element === childElement\n );\n if (panelData) {\n if (prevPanel) {\n const prevRect = prevPanel.element.getBoundingClientRect();\n const rect = childElement.getBoundingClientRect();\n\n let pendingRectsOrSeparators: (DOMRect | RegisteredSeparator)[];\n\n // If an explicit Separator has been rendered, always watch it\n // Otherwise watch the entire space between the panels\n // The one caveat is when there are non-interactive element(s) between panels,\n // in which case we may need to watch individual panel edges\n if (hasInterleavedStaticContent) {\n const firstPanelEdgeRect =\n orientation === \"horizontal\"\n ? new DOMRect(prevRect.right, prevRect.top, 0, prevRect.height)\n : new DOMRect(\n prevRect.left,\n prevRect.bottom,\n prevRect.width,\n 0\n );\n const secondPanelEdgeRect =\n orientation === \"horizontal\"\n ? new DOMRect(rect.left, rect.top, 0, rect.height)\n : new DOMRect(rect.left, rect.top, rect.width, 0);\n\n switch (pendingSeparators.length) {\n case 0: {\n pendingRectsOrSeparators = [\n firstPanelEdgeRect,\n secondPanelEdgeRect\n ];\n break;\n }\n case 1: {\n const separator = pendingSeparators[0];\n const closestRect = findClosestRect({\n orientation,\n rects: [prevRect, rect],\n targetRect: separator.element.getBoundingClientRect()\n });\n\n pendingRectsOrSeparators = [\n separator,\n closestRect === prevRect\n ? secondPanelEdgeRect\n : firstPanelEdgeRect\n ];\n break;\n }\n default: {\n pendingRectsOrSeparators = pendingSeparators;\n break;\n }\n }\n } else {\n if (pendingSeparators.length) {\n pendingRectsOrSeparators = pendingSeparators;\n } else {\n pendingRectsOrSeparators = [\n orientation === \"horizontal\"\n ? new DOMRect(\n prevRect.right,\n rect.top,\n rect.left - prevRect.right,\n rect.height\n )\n : new DOMRect(\n rect.left,\n prevRect.bottom,\n rect.width,\n rect.top - prevRect.bottom\n )\n ];\n }\n }\n\n for (const rectOrSeparator of pendingRectsOrSeparators) {\n hitRegions.push({\n group,\n groupSize: calculateAvailableGroupSize({ group }),\n panels: [prevPanel, panelData],\n separator:\n \"width\" in rectOrSeparator ? undefined : rectOrSeparator,\n rect:\n \"width\" in rectOrSeparator\n ? rectOrSeparator\n : rectOrSeparator.element.getBoundingClientRect()\n });\n }\n }\n\n hasInterleavedStaticContent = false;\n prevPanel = panelData;\n pendingSeparators = [];\n }\n } else if (childElement.hasAttribute(\"data-separator\")) {\n const separatorData = separators.find(\n (current) => current.element === childElement\n );\n if (separatorData) {\n // Separators will be included implicitly in the area between the previous and next panel\n // It's important to track them though, to handle the scenario of non-interactive group content\n pendingSeparators.push(separatorData);\n } else {\n prevPanel = undefined;\n pendingSeparators = [];\n }\n } else {\n hasInterleavedStaticContent = true;\n }\n }\n\n return hitRegions;\n}\n","export function convertEmToPixels(element: Element, value: number) {\n const style = getComputedStyle(element);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertRemToPixels(element: Element, value: number) {\n const style = getComputedStyle(element.ownerDocument.body);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertVhToPixels(value: number) {\n return (value / 100) * window.innerHeight;\n}\n","export function convertVwToPixels(value: number) {\n return (value / 100) * window.innerWidth;\n}\n","import type { SizeUnit } from \"../../components/panel/types\";\n\nexport function parseSizeAndUnit(\n size: number | string\n): [numeric: number, size: SizeUnit] {\n switch (typeof size) {\n case \"number\": {\n return [size, \"px\"];\n }\n case \"string\": {\n const numeric = parseFloat(size);\n\n if (size.endsWith(\"%\")) {\n return [numeric, \"%\"];\n } else if (size.endsWith(\"px\")) {\n return [numeric, \"px\"];\n } else if (size.endsWith(\"rem\")) {\n return [numeric, \"rem\"];\n } else if (size.endsWith(\"em\")) {\n return [numeric, \"em\"];\n } else if (size.endsWith(\"vh\")) {\n return [numeric, \"vh\"];\n } else if (size.endsWith(\"vw\")) {\n return [numeric, \"vw\"];\n }\n\n return [numeric, \"%\"];\n }\n }\n}\n","import { convertEmToPixels } from \"./convertEmToPixels\";\nimport { convertRemToPixels } from \"./convertRemToPixels\";\nimport { convertVhToPixels } from \"./convertVhToPixels\";\nimport { convertVwToPixels } from \"./convertVwToPixels\";\nimport { parseSizeAndUnit } from \"./parseSizeAndUnit\";\n\nexport function sizeStyleToPixels({\n groupSize,\n panelElement,\n styleProp\n}: {\n groupSize: number;\n panelElement: HTMLElement;\n styleProp: number | string;\n}) {\n let pixels: number | undefined = undefined;\n\n const [size, unit] = parseSizeAndUnit(styleProp);\n\n switch (unit) {\n case \"%\": {\n pixels = (size / 100) * groupSize;\n break;\n }\n case \"px\": {\n pixels = size;\n break;\n }\n case \"rem\": {\n pixels = convertRemToPixels(panelElement, size);\n break;\n }\n case \"em\": {\n pixels = convertEmToPixels(panelElement, size);\n break;\n }\n case \"vh\": {\n pixels = convertVhToPixels(size);\n break;\n }\n case \"vw\": {\n pixels = convertVwToPixels(size);\n break;\n }\n }\n\n return pixels;\n}\n","export function formatLayoutNumber(number: number) {\n return parseFloat(number.toFixed(3));\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\nimport { formatLayoutNumber } from \"../utils/formatLayoutNumber\";\nimport { calculateAvailableGroupSize } from \"./calculateAvailableGroupSize\";\n\nexport function calculatePanelConstraints(group: RegisteredGroup) {\n const { panels } = group;\n\n const groupSize = calculateAvailableGroupSize({ group });\n if (groupSize === 0) {\n // Can't calculate anything meaningful if the group has a width/height of 0\n // (This could indicate that it's within a hidden subtree)\n return panels.map((current) => ({\n collapsedSize: 0,\n collapsible: current.panelConstraints.collapsible === true,\n defaultSize: undefined,\n minSize: 0,\n maxSize: 100,\n panelId: current.id\n }));\n }\n\n return panels.map<PanelConstraints>((panel) => {\n const { element, panelConstraints } = panel;\n\n let collapsedSize = 0;\n if (panelConstraints.collapsedSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.collapsedSize\n });\n\n collapsedSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let defaultSize: number | undefined = undefined;\n if (panelConstraints.defaultSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.defaultSize\n });\n\n defaultSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let minSize = 0;\n if (panelConstraints.minSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.minSize\n });\n\n minSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let maxSize = 100;\n if (panelConstraints.maxSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.maxSize\n });\n\n maxSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n return {\n collapsedSize,\n collapsible: panelConstraints.collapsible === true,\n defaultSize,\n minSize,\n maxSize,\n panelId: panel.id\n };\n });\n}\n","export type EventMap = {\n [key: string]: unknown;\n};\n\nexport type EventListener<Data> = (data: 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","// Constants used for memoization\nexport const EMPTY_ARRAY: unknown[] = [];\nexport const EMPTY_DOM_RECT: DOMRectReadOnly = {\n bottom: 0,\n height: 0,\n left: 0,\n right: 0,\n toJSON: () => {},\n top: 0,\n width: 0,\n x: 0,\n y: 0\n};\nexport const EMPTY_OBJECT = {};\nexport const EMPTY_POINT = { x: 0, y: 0 };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const IDENTITY_FUNCTION = (value: any) => value;\nexport const NOOP_FUNCTION = () => {};\n\n// Cursor flags\nexport const CURSOR_FLAG_HORIZONTAL_MIN = 0b0001;\nexport const CURSOR_FLAG_HORIZONTAL_MAX = 0b0010;\nexport const CURSOR_FLAG_VERTICAL_MIN = 0b0100;\nexport const CURSOR_FLAG_VERTICAL_MAX = 0b1000;\n\n// Misc. shared values\nexport const DEFAULT_POINTER_PRECISION = {\n coarse: 10,\n precise: 5\n};\n","import type { Properties } from \"csstype\";\nimport type { RegisteredGroup } from \"../../components/group/types\";\nimport {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport type { InteractionState } from \"../types\";\n\nexport function getCursorStyle({\n cursorFlags,\n groups,\n state\n}: {\n cursorFlags: number;\n groups: RegisteredGroup[];\n state: InteractionState[\"state\"];\n}): Properties[\"cursor\"] | null {\n let horizontalCount = 0;\n let verticalCount = 0;\n\n switch (state) {\n case \"active\":\n case \"hover\": {\n groups.forEach((group) => {\n if (group.disableCursor) {\n return;\n }\n\n switch (group.orientation) {\n case \"horizontal\": {\n horizontalCount++;\n break;\n }\n case \"vertical\": {\n verticalCount++;\n break;\n }\n }\n });\n }\n }\n\n if (horizontalCount === 0 && verticalCount === 0) {\n return null;\n }\n\n switch (state) {\n case \"active\": {\n const horizontalMin = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MIN) !== 0;\n const horizontalMax = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MAX) !== 0;\n const verticalMin = (cursorFlags & CURSOR_FLAG_VERTICAL_MIN) !== 0;\n const verticalMax = (cursorFlags & CURSOR_FLAG_VERTICAL_MAX) !== 0;\n\n if (cursorFlags) {\n if (horizontalMin) {\n if (verticalMin) {\n return \"se-resize\";\n } else if (verticalMax) {\n return \"ne-resize\";\n } else {\n return \"e-resize\";\n }\n } else if (horizontalMax) {\n if (verticalMin) {\n return \"sw-resize\";\n } else if (verticalMax) {\n return \"nw-resize\";\n } else {\n return \"w-resize\";\n }\n } else if (verticalMin) {\n return \"s-resize\";\n } else if (verticalMax) {\n return \"n-resize\";\n }\n }\n break;\n }\n }\n\n if (horizontalCount > 0 && verticalCount > 0) {\n return \"move\";\n } else if (horizontalCount > 0) {\n return \"ew-resize\";\n } else {\n return \"ns-resize\";\n }\n}\n","import { read } from \"../mutableState\";\nimport { getCursorStyle } from \"./getCursorStyle\";\n\nlet prevStyle: string | undefined = undefined;\nlet styleSheet: CSSStyleSheet | undefined = undefined;\n\nexport function updateCursorStyle() {\n if (styleSheet === undefined) {\n styleSheet = new CSSStyleSheet();\n\n document.adoptedStyleSheets = [styleSheet];\n }\n\n const { cursorFlags, interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\":\n case \"hover\": {\n const cursorStyle = getCursorStyle({\n cursorFlags,\n groups: interactionState.hitRegions.map((current) => current.group),\n state: interactionState.state\n });\n\n const nextStyle = `*{cursor: ${cursorStyle} !important; ${interactionState.state === \"active\" ? \"touch-action: none;\" : \"\"} }`;\n if (prevStyle === nextStyle) {\n return;\n }\n\n prevStyle = nextStyle;\n\n if (cursorStyle) {\n if (styleSheet.cssRules.length === 0) {\n styleSheet.insertRule(nextStyle);\n } else {\n styleSheet.replaceSync(nextStyle);\n }\n } else if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n case \"inactive\": {\n prevStyle = undefined;\n\n if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n }\n}\n","export function isArrayEqual(a: number[], b: number[]) {\n if (a.length !== b.length) {\n return false;\n } else {\n for (let index = 0; index < a.length; index++) {\n if (a[index] != b[index]) {\n return false;\n }\n }\n }\n return true;\n}\n","import { layoutNumbersEqual } from \"./layoutNumbersEqual\";\n\nexport function compareLayoutNumbers(actual: number, expected: number) {\n if (layoutNumbersEqual(actual, expected)) {\n return 0;\n } else {\n return actual > expected ? 1 : -1;\n }\n}\n","import type { PanelConstraints } from \"../../components/panel/types\";\nimport { compareLayoutNumbers } from \"./compareLayoutNumbers\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\n// Panel size must be in percentages; pixel values should be pre-converted\nexport function validatePanelSize({\n panelConstraints,\n size\n}: {\n panelConstraints: PanelConstraints;\n size: number;\n}) {\n const {\n collapsedSize = 0,\n collapsible,\n maxSize = 100,\n minSize = 0\n } = panelConstraints;\n\n if (compareLayoutNumbers(size, minSize) < 0) {\n if (collapsible) {\n // Collapsible panels should snap closed or open only once they cross the halfway point between collapsed and min size.\n const halfwayPoint = (collapsedSize + minSize) / 2;\n if (compareLayoutNumbers(size, halfwayPoint) < 0) {\n size = collapsedSize;\n } else {\n size = minSize;\n }\n } else {\n size = minSize;\n }\n }\n\n size = Math.min(maxSize, size);\n size = formatLayoutNumber(size);\n\n return size;\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { assert } from \"../../utils/assert\";\nimport { isArrayEqual } from \"../../utils/isArrayEqual\";\nimport { compareLayoutNumbers } from \"../utils/compareLayoutNumbers\";\nimport { layoutNumbersEqual } from \"../utils/layoutNumbersEqual\";\nimport { validatePanelSize } from \"../utils/validatePanelSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function adjustLayoutByDelta({\n delta,\n initialLayout: initialLayoutProp,\n panelConstraints: panelConstraintsArray,\n pivotIndices,\n prevLayout: prevLayoutProp,\n trigger\n}: {\n delta: number;\n initialLayout: Layout;\n panelConstraints: PanelConstraints[];\n pivotIndices: number[];\n prevLayout: Layout;\n trigger: \"imperative-api\" | \"keyboard\" | \"mouse-or-touch\";\n}): Layout {\n if (layoutNumbersEqual(delta, 0)) {\n return initialLayoutProp;\n }\n\n const initialLayout = Object.values(initialLayoutProp);\n const prevLayout = Object.values(prevLayoutProp);\n const nextLayout = [...initialLayout];\n\n const [firstPivotIndex, secondPivotIndex] = pivotIndices;\n assert(firstPivotIndex != null, \"Invalid first pivot index\");\n assert(secondPivotIndex != null, \"Invalid second pivot index\");\n\n let deltaApplied = 0;\n\n // const DEBUG = [];\n // DEBUG.push(`adjustLayoutByDelta()`);\n // DEBUG.push(` initialLayout: ${initialLayout.join(\", \")}`);\n // DEBUG.push(` prevLayout: ${prevLayout.join(\", \")}`);\n // DEBUG.push(` delta: ${delta}`);\n // DEBUG.push(` pivotIndices: ${pivotIndices.join(\", \")}`);\n // DEBUG.push(` trigger: ${trigger}`);\n // DEBUG.push(\"\");\n\n // A resizing panel affects the panels before or after it.\n //\n // A negative delta means the panel(s) immediately after the separator should grow/expand by decreasing its offset.\n // Other panels may also need to shrink/contract (and shift) to make room, depending on the min weights.\n //\n // A positive delta means the panel(s) immediately before the separator should \"expand\".\n // This is accomplished by shrinking/contracting (and shifting) one or more of the panels after the separator.\n\n {\n // If this is a resize triggered by a keyboard event, our logic for expanding/collapsing is different.\n // We no longer check the halfway threshold because this may prevent the panel from expanding at all.\n if (trigger === \"keyboard\") {\n {\n // Check if we should expand a collapsed panel\n const index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 1: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, collapsedSize)) {\n const localDelta = minSize - prevSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n\n {\n // Check if we should collapse a panel at its minimum size\n const index = delta < 0 ? firstPivotIndex : secondPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `No panel constraints found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 2: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, minSize)) {\n const localDelta = prevSize - collapsedSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n }\n // DEBUG.push(\"\");\n }\n\n {\n // Pre-calculate max available delta in the opposite direction of our pivot.\n // This will be the maximum amount we're allowed to expand/contract the panels in the primary direction.\n // If this amount is less than the requested delta, adjust the requested delta.\n // If this amount is greater than the requested delta, that's useful information too–\n // as an expanding panel might change from collapsed to min size.\n\n const increment = delta < 0 ? 1 : -1;\n\n let index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let maxAvailableDelta = 0;\n\n // DEBUG.push(\"pre calc...\");\n while (true) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const maxSafeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: 100\n });\n const delta = maxSafeSize - prevSize;\n // DEBUG.push(` ${index}: ${prevSize} -> ${maxSafeSize}`);\n\n maxAvailableDelta += delta;\n index += increment;\n\n if (index < 0 || index >= panelConstraintsArray.length) {\n break;\n }\n }\n\n // DEBUG.push(` -> max available delta: ${maxAvailableDelta}`);\n const minAbsDelta = Math.min(Math.abs(delta), Math.abs(maxAvailableDelta));\n delta = delta < 0 ? 0 - minAbsDelta : minAbsDelta;\n // DEBUG.push(` -> adjusted delta: ${delta}`);\n // DEBUG.push(\"\");\n }\n\n {\n // Delta added to a panel needs to be subtracted from other panels (within the constraints that those panels allow).\n\n const pivotIndex = delta < 0 ? firstPivotIndex : secondPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const deltaRemaining = Math.abs(delta) - Math.abs(deltaApplied);\n\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize - deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaApplied += prevSize - safeSize;\n\n nextLayout[index] = safeSize;\n\n if (\n deltaApplied\n .toFixed(3)\n .localeCompare(Math.abs(delta).toFixed(3), undefined, {\n numeric: true\n }) >= 0\n ) {\n break;\n }\n }\n\n if (delta < 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n // DEBUG.push(`after 1: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n // If we were unable to resize any of the panels panels, return the previous state.\n // This will essentially bailout and ignore e.g. drags past a panel's boundaries\n if (isArrayEqual(prevLayout, nextLayout)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n {\n // Now distribute the applied delta to the panels in the other direction\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n\n const prevSize = initialLayout[pivotIndex];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${pivotIndex}`\n );\n\n const unsafeSize = prevSize + deltaApplied;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[pivotIndex],\n size: unsafeSize\n });\n\n // Adjust the pivot panel before, but only by the amount that surrounding panels were able to shrink/contract.\n nextLayout[pivotIndex] = safeSize;\n\n // Edge case where expanding or contracting one panel caused another one to change collapsed state\n if (!layoutNumbersEqual(safeSize, unsafeSize)) {\n let deltaRemaining = unsafeSize - safeSize;\n\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const prevSize = nextLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize + deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaRemaining -= safeSize - prevSize;\n\n nextLayout[index] = safeSize;\n }\n\n if (layoutNumbersEqual(deltaRemaining, 0)) {\n break;\n }\n\n if (delta > 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n }\n // DEBUG.push(`after 2: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n const totalSize = Object.values(nextLayout).reduce(\n (total, size) => size + total,\n 0\n );\n // DEBUG.push(`total size: ${totalSize}`);\n\n // If our new layout doesn't add up to 100%, that means the requested delta can't be applied\n // In that case, fall back to our most recent valid layout\n // Allow for a small rounding difference, else e.g. 3 panel layouts may never be considered valid\n if (!layoutNumbersEqual(totalSize, 100, 0.1)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n const prevLayoutKeys = Object.keys(prevLayoutProp);\n\n // console.log(DEBUG.join(\"\\n\"));\n return nextLayout.reduce<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, RegisteredGroup } from \"../../components/group/types\";\nimport {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport type { Point } from \"../../types\";\nimport { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { update, type MountedGroupMap } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { layoutsEqual } from \"./layoutsEqual\";\n\nexport function updateActiveHitRegions({\n event,\n hitRegions,\n initialLayoutMap,\n mountedGroups,\n pointerDownAtPoint\n}: {\n event: {\n clientX: number;\n clientY: number;\n };\n hitRegions: HitRegion[];\n initialLayoutMap: Map<RegisteredGroup, Layout>;\n mountedGroups: MountedGroupMap;\n pointerDownAtPoint?: Point;\n}) {\n let cursorFlags = 0;\n const nextMountedGroups = new Map(mountedGroups);\n\n // Note that HitRegions are frozen once a drag has started\n // Modify the Group layouts for all matching HitRegions though\n hitRegions.forEach((current) => {\n const { group, groupSize } = current;\n const { disableCursor, orientation, panels } = group;\n\n let deltaAsPercentage = 0;\n if (pointerDownAtPoint) {\n if (orientation === \"horizontal\") {\n deltaAsPercentage =\n ((event.clientX - pointerDownAtPoint.x) / groupSize) * 100;\n } else {\n deltaAsPercentage =\n ((event.clientY - pointerDownAtPoint.y) / groupSize) * 100;\n }\n } else {\n if (orientation === \"horizontal\") {\n deltaAsPercentage = event.clientX < 0 ? -100 : 100;\n } else {\n deltaAsPercentage = event.clientY < 0 ? -100 : 100;\n }\n }\n\n const initialLayout = initialLayoutMap.get(group);\n\n const {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout: prevLayout,\n separatorToPanels\n } = mountedGroups.get(group) ?? { defaultLayoutDeferred: false };\n if (\n derivedPanelConstraints &&\n initialLayout &&\n prevLayout &&\n separatorToPanels\n ) {\n const nextLayout = adjustLayoutByDelta({\n delta: deltaAsPercentage,\n initialLayout,\n panelConstraints: derivedPanelConstraints,\n pivotIndices: current.panels.map((panel) => panels.indexOf(panel)),\n prevLayout,\n trigger: \"mouse-or-touch\"\n });\n\n if (layoutsEqual(nextLayout, prevLayout)) {\n if (deltaAsPercentage !== 0 && !disableCursor) {\n // An unchanged means the cursor has exceeded the allowed bounds\n switch (orientation) {\n case \"horizontal\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_HORIZONTAL_MIN\n : CURSOR_FLAG_HORIZONTAL_MAX;\n break;\n }\n case \"vertical\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_VERTICAL_MIN\n : CURSOR_FLAG_VERTICAL_MAX;\n break;\n }\n }\n }\n } else {\n nextMountedGroups.set(current.group, {\n defaultLayoutDeferred,\n derivedPanelConstraints: derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels\n });\n\n // Save the most recent layout for this group of panels in-memory\n // so that layouts will be remembered between different sets of conditionally rendered panels\n const panelIdsKey = current.group.panels.map(({ id }) => id).join(\",\");\n current.group.inMemoryLayouts[panelIdsKey] = nextLayout;\n }\n }\n });\n\n update({\n cursorFlags,\n mountedGroups: nextMountedGroups\n });\n\n updateCursorStyle();\n}\n","import { read } from \"../mutableState\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onGroupPointerLeave(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n } else if (event.relatedTarget !== null) {\n return;\n } else if (event.clientX === 0 && event.clientY === 0) {\n // Edge case iOS Safari bug; coordinates are seemingly nonsensical which would break the drag event\n return;\n }\n\n const { interactionState, mountedGroups } = read();\n\n // The \"pointerleave\" event is not reliably triggered when the pointer exits a window or iframe\n // To account for this, we listen for \"pointerleave\" events on the Group element itself\n switch (interactionState.state) {\n case \"active\": {\n interactionState.hitRegions.forEach((hitRegion) => {\n if (event.currentTarget === hitRegion.group.element) {\n updateActiveHitRegions({\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedGroups\n });\n }\n });\n }\n }\n}\n","import { assert } from \"../../utils/assert\";\nimport { read } from \"../mutableState\";\n\nexport function findSeparatorGroup(separatorElement: HTMLElement) {\n const groupElement = separatorElement.parentElement;\n assert(groupElement, \"Parent group element not found\");\n\n const { mountedGroups } = read();\n\n for (const [group] of mountedGroups) {\n if (group.element === groupElement) {\n return group;\n }\n }\n\n throw Error(\"Could not find parent Group for separator element\");\n}\n","import type { Layout } from \"../../components/group/types\";\nimport 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 {\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 onWindowKeyDown(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 { Orientation } from \"../../components/group/types\";\nimport type { Point } from \"../../types\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosetHitRegion(\n orientation: Orientation,\n hitRegions: HitRegion[],\n point: Point\n) {\n let closestHitRegion: HitRegion | undefined = undefined;\n let minDistance = {\n x: Infinity,\n y: Infinity\n };\n\n for (const hitRegion of hitRegions) {\n const data = getDistanceBetweenPointAndRect(point, hitRegion.rect);\n switch (orientation) {\n case \"horizontal\": {\n if (data.x <= minDistance.x) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n case \"vertical\": {\n if (data.y <= minDistance.y) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n }\n }\n\n return closestHitRegion\n ? {\n distance: minDistance,\n hitRegion: closestHitRegion\n }\n : undefined;\n}\n","let cached: boolean | undefined = undefined;\n\nexport function isCoarsePointer(): boolean {\n if (cached === undefined) {\n if (typeof matchMedia === \"function\") {\n cached = !!matchMedia(\"(pointer:coarse)\").matches;\n } else {\n cached = false;\n }\n }\n\n return cached;\n}\n","// 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\";\n\n/**\n * Determine which of two nodes appears in front of the other —\n * if `a` is in front, returns 1, otherwise returns -1\n * @param {HTMLElement | SVGElement} a\n * @param {HTMLElement | SVGElement} b\n */\nexport function compare(\n a: HTMLElement | SVGElement,\n b: HTMLElement | SVGElement\n): number {\n if (a === b) throw new Error(\"Cannot compare node with itself\");\n\n const ancestors = {\n a: get_ancestors(a),\n b: get_ancestors(b)\n };\n\n let common_ancestor;\n\n // remove shared ancestors\n while (ancestors.a.at(-1) === ancestors.b.at(-1)) {\n a = ancestors.a.pop() as HTMLElement;\n b = ancestors.b.pop() as HTMLElement;\n\n common_ancestor = a;\n }\n\n assert(\n common_ancestor,\n \"Stacking order can only be calculated for elements with a common ancestor\"\n );\n\n const z_indexes = {\n a: get_z_index(find_stacking_context(ancestors.a)),\n b: get_z_index(find_stacking_context(ancestors.b))\n };\n\n if (z_indexes.a === z_indexes.b) {\n const children = common_ancestor.childNodes;\n\n const furthest_ancestors = {\n a: ancestors.a.at(-1),\n b: ancestors.b.at(-1)\n };\n\n let i = children.length;\n while (i--) {\n const child = children[i];\n if (child === furthest_ancestors.a) return 1;\n if (child === furthest_ancestors.b) return -1;\n }\n }\n\n return Math.sign(z_indexes.a - z_indexes.b);\n}\n\nconst props =\n /\\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\\b/;\n\n/** @param {HTMLElement | SVGElement} node */\nfunction is_flex_item(node: HTMLElement | SVGElement) {\n // @ts-expect-error ParentNode vs Element\n const display = getComputedStyle(get_parent(node) ?? node).display;\n return display === \"flex\" || display === \"inline-flex\";\n}\n\n/** @param {HTMLElement | SVGElement} node */\nfunction creates_stacking_context(node: HTMLElement | SVGElement) {\n const style = getComputedStyle(node);\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n if (style.position === \"fixed\") return true;\n // Forked to fix upstream bug https://github.com/Rich-Harris/stacking-order/issues/3\n // if (\n // (style.zIndex !== \"auto\" && style.position !== \"static\") ||\n // is_flex_item(node)\n // )\n if (\n style.zIndex !== \"auto\" &&\n (style.position !== \"static\" || is_flex_item(node))\n )\n return true;\n if (+style.opacity < 1) return true;\n if (\"transform\" in style && style.transform !== \"none\") return true;\n if (\"webkitTransform\" in style && style.webkitTransform !== \"none\")\n return true;\n if (\"mixBlendMode\" in style && style.mixBlendMode !== \"normal\") return true;\n if (\"filter\" in style && style.filter !== \"none\") return true;\n if (\"webkitFilter\" in style && style.webkitFilter !== \"none\") return true;\n if (\"isolation\" in style && style.isolation === \"isolate\") return true;\n if (props.test(style.willChange)) return true;\n // @ts-expect-error Unrecognized prop\n if (style.webkitOverflowScrolling === \"touch\") return true;\n\n return false;\n}\n\n/** @param {(HTMLElement| SVGElement)[]} nodes */\nfunction find_stacking_context(nodes: (HTMLElement | SVGElement)[]) {\n let i = nodes.length;\n\n while (i--) {\n const node = nodes[i];\n assert(node, \"Missing node\");\n if (creates_stacking_context(node)) return node;\n }\n\n return null;\n}\n\n/** @param {HTMLElement | SVGElement} node */\nfunction get_z_index(node: HTMLElement | SVGElement | null) {\n return (node && Number(getComputedStyle(node).zIndex)) || 0;\n}\n\n/** @param {HTMLElement} node */\nfunction get_ancestors(node: HTMLElement | SVGElement | null) {\n const ancestors = [];\n\n while (node) {\n ancestors.push(node);\n // @ts-expect-error ParentNode vs Element\n node = get_parent(node);\n }\n\n return ancestors; // [ node, ... <body>, <html>, document ]\n}\n\n/** @param {HTMLElement} node */\nfunction get_parent(node: HTMLElement) {\n const { parentNode } = node;\n if (parentNode && parentNode instanceof ShadowRoot) {\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 { 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 !(pointerEventTarget instanceof HTMLElement) ||\n pointerEventTarget.contains(groupElement) ||\n groupElement.contains(pointerEventTarget)\n ) {\n // Calculating stacking order has a cost;\n // If either group or element contain the other, the click is safe and we can skip calculating the indices\n return true;\n }\n\n if (compare(pointerEventTarget, groupElement) > 0) {\n // If the pointer target is above the separator, check for overlap\n // If they are near each other, but not overlapping, then the separator is still a viable target\n //\n // Note that it's not sufficient to compare only the target\n // The target might be a small element inside of a larger container\n // (For example, a SPAN or a DIV inside of a larger modal dialog)\n let currentElement: HTMLElement | SVGElement | null = pointerEventTarget;\n while (currentElement) {\n if (currentElement.contains(groupElement)) {\n return true;\n } else if (\n doRectsIntersect(currentElement.getBoundingClientRect(), hitRegion)\n ) {\n return false;\n }\n\n currentElement = currentElement.parentElement;\n }\n }\n\n return true;\n}\n","import { DEFAULT_POINTER_PRECISION } from \"../../constants\";\nimport type { MountedGroupMap } from \"../mutableState\";\nimport {\n calculateHitRegions,\n type HitRegion\n} from \"../dom/calculateHitRegions\";\nimport { findClosetHitRegion } from \"./findClosetHitRegion\";\nimport { isCoarsePointer } from \"./isCoarsePointer\";\nimport { isViableHitTarget } from \"./isViableHitTarget\";\n\nexport function findMatchingHitRegions(\n event: PointerEvent,\n mountedGroups: MountedGroupMap\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedGroups.forEach((_, groupData) => {\n if (groupData.disabled) {\n return;\n }\n\n const maxDistance = isCoarsePointer()\n ? DEFAULT_POINTER_PRECISION.coarse\n : DEFAULT_POINTER_PRECISION.precise;\n\n const hitRegions = calculateHitRegions(groupData);\n const match = findClosetHitRegion(groupData.orientation, hitRegions, {\n x: event.clientX,\n y: event.clientY\n });\n\n if (\n match &&\n match.distance.x <= maxDistance &&\n match.distance.y <= maxDistance &&\n isViableHitTarget({\n groupElement: groupData.element,\n hitRegion: match.hitRegion.rect,\n pointerEventTarget: event.target\n })\n ) {\n matchingHitRegions.push(match.hitRegion);\n }\n });\n\n return matchingHitRegions;\n}\n","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\nimport type { RegisteredSeparator } from \"../../components/separator/types\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\n\nexport function onWindowPointerDown(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n const groups = new Set<RegisteredGroup>();\n const panels = new Set<RegisteredPanel>();\n const separators = new Set<RegisteredSeparator>();\n const initialLayoutMap = new Map<RegisteredGroup, Layout>();\n\n let didChangeFocus = false;\n\n hitRegions.forEach((current) => {\n groups.add(current.group);\n current.panels.forEach((panel) => {\n panels.add(panel);\n });\n\n if (current.separator) {\n separators.add(current.separator);\n\n if (!didChangeFocus) {\n didChangeFocus = true;\n\n current.separator.element.focus();\n }\n }\n\n const match = mountedGroups.get(current.group);\n if (match) {\n initialLayoutMap.set(current.group, match.layout);\n }\n });\n\n update({\n interactionState: {\n hitRegions,\n initialLayoutMap,\n pointerDownAtPoint: { x: event.clientX, y: event.clientY },\n state: \"active\"\n }\n });\n\n if (hitRegions.length) {\n event.preventDefault();\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onWindowPointerMove(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { interactionState, mountedGroups } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n // Edge case (see #340)\n // Detect when the pointer has been released outside an iframe on a different domain\n if (\n // Skip this check for \"pointerleave\" events, else Firefox triggers a false positive (see #514)\n event.type !== \"pointerleave\" &&\n event.buttons === 0\n ) {\n update((prevState) =>\n prevState.interactionState.state === \"inactive\"\n ? prevState\n : {\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n }\n );\n\n return;\n }\n\n updateActiveHitRegions({\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedGroups,\n pointerDownAtPoint: interactionState.pointerDownAtPoint\n });\n break;\n }\n default: {\n // Update HitRegions if a drag has not been started\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n if (hitRegions.length === 0) {\n if (interactionState.state !== \"inactive\") {\n update({\n interactionState: { state: \"inactive\" }\n });\n }\n } else {\n update({\n interactionState: {\n hitRegions,\n state: \"hover\"\n }\n });\n }\n\n updateCursorStyle();\n break;\n }\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\n\nexport function onWindowPointerUp(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n event.preventDefault();\n\n const { interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n update({\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n });\n\n updateCursorStyle();\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 panel.onResize(\n {\n asPercentage: formatLayoutNumber(\n (resizeObserverSize.inlineSize / groupSize) * 100\n ),\n inPixels: resizeObserverSize.inlineSize\n },\n panel.id\n );\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, 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 { onGroupPointerLeave } from \"./event-handlers/onGroupPointerLeave\";\nimport { onWindowKeyDown } from \"./event-handlers/onWindowKeyDown\";\nimport { onWindowPointerDown } from \"./event-handlers/onWindowPointerDown\";\nimport { onWindowPointerMove } from \"./event-handlers/onWindowPointerMove\";\nimport { onWindowPointerUp } from \"./event-handlers/onWindowPointerUp\";\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 { validatePanelGroupLayout } from \"./utils/validatePanelGroupLayout\";\n\nexport function mountGroup(group: RegisteredGroup) {\n let isMounted = true;\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 (group.panels.length !== Object.keys(defaultLayout).length) {\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 nextState = update((prevState) => {\n const separatorToPanels: SeparatorToPanelsMap = new Map();\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 // The \"pointerleave\" event is not reliably triggered when the pointer exits a window or iframe\n // To account for this, we listen for \"pointerleave\" events on the Group element itself\n // TODO Could I listen to document.body instead of this?\n group.element.addEventListener(\"pointerleave\", onGroupPointerLeave);\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\", onWindowKeyDown);\n });\n\n // If this is the first group to be mounted, initialize event handlers\n if (nextState.mountedGroups.size === 1) {\n window.addEventListener(\"pointerdown\", onWindowPointerDown);\n window.addEventListener(\"pointermove\", onWindowPointerMove);\n window.addEventListener(\"pointerup\", onWindowPointerUp);\n }\n\n return function unmountGroup() {\n isMounted = false;\n\n const nextState = update((prevState) => {\n const mountedGroups = new Map(prevState.mountedGroups);\n mountedGroups.delete(group);\n\n return { mountedGroups };\n });\n\n group.element.removeEventListener(\"pointerleave\", onGroupPointerLeave);\n\n group.separators.forEach((separator) => {\n separator.element.removeEventListener(\"keydown\", onWindowKeyDown);\n });\n\n // If this was the last group to be mounted, tear down event handlers\n if (nextState.mountedGroups.size === 0) {\n window.removeEventListener(\"pointerdown\", onWindowPointerDown);\n window.removeEventListener(\"pointermove\", onWindowPointerMove);\n window.removeEventListener(\"pointerup\", onWindowPointerUp);\n }\n\n resizeObserver.disconnect();\n };\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)\nexport function useStableCallback<Return>(fn: () => Return): () => Return;\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return;\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(fn);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\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","export const POINTER_EVENTS_CSS_PROPERTY_NAME =\n \"--react-resizable-panels--panel--pointer-events\";\n","export function getPanelSizeCssPropertyName(groupId: string, panelId: string) {\n const groupIdEscaped = groupId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n const panelIdEscaped = panelId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n\n return `--react-resizable-panels--${groupIdEscaped}--${panelIdEscaped}`;\n}\n","import { createContext } from \"react\";\nimport type { GroupContextType } from \"./types\";\n\nexport const GroupContext = createContext<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\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { mountGroup } from \"../../global/mountGroup\";\nimport { eventEmitter, read } from \"../../global/mutableState\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { useStableObject } from \"../../hooks/useStableObject\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"../panel/constants\";\nimport type { RegisteredPanel } from \"../panel/types\";\nimport type { RegisteredSeparator } from \"../separator/types\";\nimport { getPanelSizeCssPropertyName } from \"./getPanelSizeCssPropertyName\";\nimport { GroupContext } from \"./GroupContext\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type { GroupProps, Layout, RegisteredGroup } from \"./types\";\nimport { useGroupImperativeHandle } from \"./useGroupImperativeHandle\";\n\n/**\n * A Group wraps a set of resizable Panel components.\n * Group content can be resized _horizontally_ or _vertically_.\n *\n * Group elements always include the following attributes:\n *\n * ```html\n * <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,\n groupRef,\n id: idProp,\n onLayoutChange: onLayoutChangeUnstable,\n orientation = \"horizontal\",\n style,\n ...rest\n}: GroupProps) {\n const prevLayoutRef = useRef<Layout>({});\n\n const onLayoutChangeStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current = layout;\n onLayoutChangeUnstable?.(layout);\n });\n\n const id = useId(idProp);\n\n const [dragActive, setDragActive] = useState(false);\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n const [layout, setLayout] = useState<Layout>(defaultLayout ?? {});\n const [panels, setPanels] = useState<RegisteredPanel[]>([]);\n const [separators, setSeparators] = useState<RegisteredSeparator[]>([]);\n\n const inMemoryValuesRef = useRef<{\n lastExpandedPanelSizes: { [panelIds: string]: number };\n layouts: { [panelIds: string]: Layout };\n }>({\n lastExpandedPanelSizes: {},\n layouts: {}\n });\n\n const mergedRef = useMergedRefs(setElement, elementRef);\n\n useGroupImperativeHandle(id, groupRef);\n\n const context = useMemo(\n () => ({\n id,\n orientation,\n registerPanel: (panel: RegisteredPanel) => {\n setPanels((prev) => sortByElementOffset(orientation, [...prev, panel]));\n return () => {\n setPanels((prev) => prev.filter((current) => current !== panel));\n };\n },\n registerSeparator: (separator: RegisteredSeparator) => {\n setSeparators((prev) =>\n sortByElementOffset(orientation, [...prev, separator])\n );\n return () => {\n setSeparators((prev) =>\n prev.filter((current) => current !== separator)\n );\n };\n }\n }),\n [id, 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 if (element === null) {\n return;\n }\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,\n 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 // 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 setLayout(layout);\n onLayoutChangeStable?.(layout);\n }\n }\n\n const removeInteractionStateChangeListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n switch (interactionState.state) {\n case \"active\": {\n setDragActive(\n interactionState.hitRegions.some(\n (current) => current.group === group\n )\n );\n break;\n }\n default: {\n setDragActive(false);\n break;\n }\n }\n }\n );\n\n const removeMountedGroupsChangeEventListener = eventEmitter.addListener(\n \"mountedGroupsChange\",\n (mountedGroups) => {\n const match = mountedGroups.get(group);\n if (match) {\n const { defaultLayoutDeferred, derivedPanelConstraints, layout } =\n match;\n\n if (defaultLayoutDeferred || derivedPanelConstraints.length === 0) {\n // This indicates that the Group has not finished mounting yet\n // Likely because it has been rendered inside of a hidden DOM subtree\n // Ignore layouts in this case because they will not have been validated\n return;\n }\n\n setLayout(layout);\n onLayoutChangeStable?.(layout);\n }\n }\n );\n\n return () => {\n registeredGroupRef.current = null;\n\n unmountGroup();\n removeInteractionStateChangeListener();\n removeMountedGroupsChangeEventListener();\n };\n }, [\n disabled,\n element,\n id,\n onLayoutChangeStable,\n orientation,\n panels,\n separators,\n stableProps\n ]);\n\n // Not all props require re-registering the group;\n // Some can be updated after the group has been registered\n useEffect(() => {\n const registeredGroup = registeredGroupRef.current;\n if (registeredGroup) {\n registeredGroup.defaultLayout = defaultLayout;\n registeredGroup.disableCursor = !!disableCursor;\n }\n });\n\n // Panel layouts and Group dragging state are shared via CSS variables\n const cssVariables: { [key: string]: number | string | undefined } = {\n [POINTER_EVENTS_CSS_PROPERTY_NAME]: dragActive ? \"none\" : undefined\n };\n for (const panelId in layout) {\n const propertyName = getPanelSizeCssPropertyName(id, panelId);\n const flexGrow = layout[panelId];\n cssVariables[propertyName] = flexGrow;\n }\n\n return (\n <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 ...style,\n ...cssVariables,\n display: \"flex\",\n flexDirection: orientation === \"horizontal\" ? \"row\" : \"column\",\n flexWrap: \"nowrap\"\n }}\n >\n {children}\n </div>\n </GroupContext.Provider>\n );\n}\n","export function debounce(fn: () => void, durationMs?: number): () => void;\nexport function debounce<Args>(\n fn: (args: Args) => void,\n durationMs?: number\n): (args: Args) => void;\nexport function debounce<Args>(\n fn: (args: Args) => void,\n durationMs: number = 10\n): (args: Args) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (args: Args) => {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n fn(args);\n }, durationMs);\n };\n}\n","export function getStorageKey(id: string): string {\n return `react-resizable-panels:${id}`;\n}\n","import { useMemo, useSyncExternalStore } from \"react\";\nimport { debounce } from \"../../utils/debounce\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\nimport type { Layout, LayoutStorage, OnGroupLayoutChange } from \"./types\";\n\nexport function useDefaultLayout({\n debounceSaveMs = 100,\n storage,\n ...rest\n}: {\n /**\n * Debounce save operation by the specified number of milliseconds; defaults to 100ms\n */\n debounceSaveMs?: number;\n\n /**\n * Storage implementation; supports localStorage, sessionStorage, and custom implementations\n * Refer to documentation site for example integrations.\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 * Unique layout identifier.\n */\n id: string;\n }\n)) {\n const id = \"id\" in rest ? rest.id : rest.groupId;\n\n const storageKey = getStorageKey(id);\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(storageKey),\n () => storage.getItem(storageKey)\n );\n\n const defaultLayout = useMemo(\n () =>\n defaultLayoutString\n ? (JSON.parse(defaultLayoutString) as Layout)\n : undefined,\n [defaultLayoutString]\n );\n\n const onLayoutChange = useMemo<NonNullable<OnGroupLayoutChange>>(() => {\n const saveLayout = (layout: Layout) => {\n try {\n storage.setItem(storageKey, JSON.stringify(layout));\n } catch (error) {\n console.error(error);\n }\n };\n\n return debounceSaveMs > 0\n ? debounce(saveLayout, debounceSaveMs)\n : saveLayout;\n }, [debounceSaveMs, storage, storageKey]);\n\n return {\n defaultLayout,\n onLayoutChange\n };\n}\n\nfunction subscribe() {\n return function unsubscribe() {};\n}\n","import { useState } from \"react\";\nimport type { GroupImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Group component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function useGroupCallbackRef() {\n return useState<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);\n}\n","import { useContext } from \"react\";\nimport { assert } from \"../../utils/assert\";\nimport { GroupContext } from \"./GroupContext\";\n\nexport function useGroupContext() {\n const context = useContext(GroupContext);\n assert(\n context,\n \"Group Context not found; did you render a Panel or Separator outside of a Group?\"\n );\n\n return context;\n}\n","import type { PanelImperativeHandle } from \"../../components/panel/types\";\nimport { calculateAvailableGroupSize } from \"../dom/calculateAvailableGroupSize\";\nimport { read, update } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function getImperativePanelMethods({\n groupId,\n panelId\n}: {\n groupId: string;\n panelId: string;\n}): PanelImperativeHandle {\n const find = () => {\n const { mountedGroups } = read();\n for (const [\n group,\n {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout,\n separatorToPanels\n }\n ] of mountedGroups) {\n if (group.id === groupId) {\n return {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n group,\n layout,\n separatorToPanels\n };\n }\n }\n\n throw Error(`Group ${groupId} not found`);\n };\n\n const getPanelConstraints = () => {\n const match = find().derivedPanelConstraints.find(\n (current) => current.panelId === panelId\n );\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Panel constraints not found for Panel ${panelId}`);\n };\n\n const getPanel = () => {\n const match = find().group.panels.find((current) => current.id === panelId);\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${panelId}`);\n };\n\n const getPanelSize = () => {\n const match = find().layout[panelId];\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${panelId}`);\n };\n\n const setPanelSize = (nextSize: number) => {\n const prevSize = getPanelSize();\n if (nextSize === prevSize) {\n return;\n }\n\n const {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n group,\n layout: prevLayout,\n separatorToPanels\n } = find();\n\n const index = group.panels.findIndex((current) => current.id === panelId);\n const isLastPanel = index === group.panels.length - 1;\n\n const unsafeLayout = adjustLayoutByDelta({\n delta: isLastPanel ? prevSize - nextSize : nextSize - prevSize,\n initialLayout: prevLayout,\n panelConstraints: derivedPanelConstraints,\n pivotIndices: isLastPanel ? [index - 1, index] : [index, index + 1],\n prevLayout,\n trigger: \"imperative-api\"\n });\n\n const nextLayout = validatePanelGroupLayout({\n layout: unsafeLayout,\n panelConstraints: derivedPanelConstraints\n });\n if (!layoutsEqual(prevLayout, nextLayout)) {\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n defaultLayoutDeferred,\n derivedPanelConstraints,\n layout: nextLayout,\n separatorToPanels\n })\n }));\n }\n };\n\n return {\n collapse: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const size = getPanelSize();\n\n if (collapsible && size !== collapsedSize) {\n setPanelSize(collapsedSize);\n }\n },\n expand: () => {\n const { collapsible, collapsedSize, minSize } = getPanelConstraints();\n const size = getPanelSize();\n\n if (collapsible && size === collapsedSize) {\n setPanelSize(minSize);\n }\n },\n getSize: () => {\n const { group } = find();\n const asPercentage = getPanelSize();\n const { element } = getPanel();\n\n const inPixels =\n group.orientation === \"horizontal\"\n ? element.offsetWidth\n : element.offsetHeight;\n\n return {\n asPercentage,\n inPixels\n };\n },\n isCollapsed: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const size = getPanelSize();\n\n return collapsible && layoutNumbersEqual(collapsedSize, size);\n },\n resize: (size: number | string) => {\n const prevSize = getPanelSize();\n if (prevSize !== size) {\n let asPercentage;\n switch (typeof size) {\n case \"number\": {\n const { group } = find();\n const groupSize = calculateAvailableGroupSize({ group });\n asPercentage = formatLayoutNumber((size / groupSize) * 100);\n break;\n }\n case \"string\": {\n asPercentage = parseFloat(size);\n break;\n }\n }\n\n setPanelSize(asPercentage);\n }\n }\n } satisfies PanelImperativeHandle;\n}\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { NOOP_FUNCTION } from \"../../constants\";\nimport { getImperativePanelMethods } from \"../../global/utils/getImperativePanelMethods\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { PanelImperativeHandle } from \"./types\";\n\nexport function usePanelImperativeHandle(\n panelId: string,\n panelRef: Ref<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 type { Property } from \"csstype\";\nimport { useState, type CSSProperties } from \"react\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { getPanelSizeCssPropertyName } from \"../group/getPanelSizeCssPropertyName\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"./constants\";\nimport type { PanelProps, PanelSize } from \"./types\";\nimport { usePanelImperativeHandle } from \"./usePanelImperativeHandle\";\n\n/**\n * A Panel wraps resizable content and can be configured with min/max size constraints and collapsible behavior.\n *\n * Panel size props can be in the following formats:\n * - Percentage of the parent Group (0..100)\n * - Pixels\n * - Relative font units (em, rem)\n * - Viewport relative units (vh, vw)\n *\n * ℹ️ Numeric values are assumed to be pixels.\n * Strings without explicit units are assumed to be percentages (0%..100%).\n * Percentages may also be specified as strings ending with \"%\" (e.g. \"33%\")\n * Pixels may also be specified as strings ending with the unit \"px\".\n * Other units should be specified as strings ending with their CSS property units (e.g. 1rem, 50vh)\n *\n * Panel elements always include the following attributes:\n *\n * ```html\n * <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 */\nexport function Panel({\n children,\n className,\n collapsedSize = \"0%\",\n collapsible = false,\n defaultSize,\n elementRef,\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 [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const mergedRef = useMergedRefs(setElement, elementRef);\n\n const { id: groupId, registerPanel } = useGroupContext();\n\n const hasOnResize = onResizeUnstable !== null;\n const onResizeStable = useStableCallback((panelSize: PanelSize) => {\n onResizeUnstable?.(panelSize, idProp);\n });\n\n // Register Panel with parent Group\n useIsomorphicLayoutEffect(() => {\n if (element !== null) {\n return registerPanel({\n element,\n id,\n idIsStable,\n onResize: hasOnResize ? onResizeStable : undefined,\n panelConstraints: {\n collapsedSize,\n collapsible,\n defaultSize,\n maxSize,\n minSize\n }\n });\n }\n }, [\n collapsedSize,\n collapsible,\n defaultSize,\n element,\n hasOnResize,\n id,\n idIsStable,\n maxSize,\n minSize,\n onResizeStable,\n registerPanel\n ]);\n\n usePanelImperativeHandle(id, panelRef);\n\n const flexGrowVar = getPanelSizeCssPropertyName(groupId, id);\n\n return (\n <div\n {...rest}\n data-panel\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n ...PROHIBITED_CSS_PROPERTIES,\n\n flexBasis: 0,\n flexGrow: `var(${flexGrowVar}, 1)`,\n flexShrink: 1,\n\n // Prevent Panel content from interfering with panel size\n overflow: \"hidden\",\n\n // Disable pointer events inside of a panel during resize\n // This avoid edge cases like nested iframes\n pointerEvents:\n `var(${POINTER_EVENTS_CSS_PROPERTY_NAME})` as Property.PointerEvents\n }}\n >\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n ...style\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nconst PROHIBITED_CSS_PROPERTIES: CSSProperties = {\n minHeight: \"unset\",\n maxHeight: \"unset\",\n height: \"unset\",\n\n minWidth: \"unset\",\n maxWidth: \"unset\",\n width: \"unset\",\n\n flex: \"unset\",\n flexBasis: \"unset\",\n flexShrink: \"unset\",\n flexGrow: \"unset\",\n\n border: \"unset\",\n borderWidth: \"unset\",\n padding: \"unset\",\n margin: \"unset\"\n};\n","import { useState } from \"react\";\nimport type { PanelImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Panel component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function usePanelCallbackRef() {\n return useState<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);\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function calculateSeparatorAriaValues({\n layout,\n panelConstraints,\n panelId,\n panelIndex\n}: {\n layout: Layout;\n panelConstraints: PanelConstraints[];\n panelId: string;\n panelIndex: number;\n}): {\n valueControls: string | undefined;\n valueMax: number | undefined;\n valueMin: number | undefined;\n valueNow: number | undefined;\n} {\n let valueMax: number | undefined = undefined;\n let valueMin: number | undefined = undefined;\n\n const panelSize = layout[panelId];\n\n const constraints = panelConstraints.find(\n (current) => current.panelId === panelId\n );\n if (constraints) {\n const maxSize = constraints.maxSize;\n const minSize = (valueMin = constraints.collapsible\n ? constraints.collapsedSize\n : constraints.minSize);\n\n const pivotIndices = [panelIndex, panelIndex + 1];\n\n const minSizeLayout = validatePanelGroupLayout({\n layout: adjustLayoutByDelta({\n delta: minSize - panelSize,\n initialLayout: layout,\n panelConstraints,\n pivotIndices,\n prevLayout: layout,\n trigger: \"keyboard\"\n }),\n panelConstraints\n });\n\n valueMin = minSizeLayout[panelId];\n\n const maxSizeLayout = validatePanelGroupLayout({\n layout: adjustLayoutByDelta({\n delta: maxSize - panelSize,\n initialLayout: layout,\n panelConstraints,\n pivotIndices,\n prevLayout: layout,\n trigger: \"keyboard\"\n }),\n panelConstraints\n });\n\n valueMax = maxSizeLayout[panelId];\n }\n\n return {\n valueControls: panelId,\n valueMax,\n valueMin,\n valueNow: panelSize\n };\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { eventEmitter } from \"../../global/mutableState\";\nimport type { InteractionState } from \"../../global/types\";\nimport { calculateSeparatorAriaValues } from \"../../global/utils/calculateSeparatorAriaValues\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { RegisteredSeparator, SeparatorProps } from \"./types\";\n\n/**\n * Separators are not _required_ but they are _recommended_ as they improve keyboard accessibility.\n *\n * Separators should be rendered as the direct child of a Group component.\n *\n * Separator elements always include the following attributes:\n *\n * ```html\n * <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,\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 const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const mergedRef = useMergedRefs(setElement, elementRef);\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 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 }, [element, 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"],"names":["assert","expectedCondition","message","calculateAvailableGroupSize","group","orientation","panels","totalSize","panel","sortByElementOffset","panelsOrSeparators","horizontalSort","verticalSort","a","b","delta","getDistanceBetweenPointAndRect","point","rect","findClosestRect","rects","targetRect","centerPoint","closestRect","minDistance","x","y","distance","calculateHitRegions","groupElement","separators","sortedChildElements","child","element","hitRegions","hasInterleavedStaticContent","prevPanel","pendingSeparators","childElement","panelData","current","prevRect","pendingRectsOrSeparators","firstPanelEdgeRect","secondPanelEdgeRect","separator","rectOrSeparator","separatorData","convertEmToPixels","value","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","error","index","layoutNumbersEqual","actual","expected","minimumDelta","state","eventEmitter","read","update","partialState","prevState","constraints","prevLayout","isCollapsed","wasCollapsed","IDENTITY_FUNCTION","NOOP_FUNCTION","CURSOR_FLAG_HORIZONTAL_MIN","CURSOR_FLAG_HORIZONTAL_MAX","CURSOR_FLAG_VERTICAL_MIN","CURSOR_FLAG_VERTICAL_MAX","DEFAULT_POINTER_PRECISION","getCursorStyle","cursorFlags","groups","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","prevStyle","styleSheet","updateCursorStyle","interactionState","cursorStyle","nextStyle","isArrayEqual","compareLayoutNumbers","validatePanelSize","collapsible","halfwayPoint","adjustLayoutByDelta","initialLayoutProp","panelConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","prevSize","localDelta","increment","maxAvailableDelta","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","total","prevLayoutKeys","accumulated","layoutsEqual","id","updateActiveHitRegions","event","initialLayoutMap","mountedGroups","pointerDownAtPoint","nextMountedGroups","disableCursor","deltaAsPercentage","defaultLayoutDeferred","derivedPanelConstraints","separatorToPanels","panelIdsKey","onGroupPointerLeave","hitRegion","findSeparatorGroup","separatorElement","validatePanelGroupLayout","layout","nextLayoutTotalSize","remainingSize","getImperativeGroupMethods","groupId","find","unsafeLayout","getMountedGroup","mountedGroup","adjustLayoutForSeparator","onWindowKeyDown","primaryPanel","nextSize","separatorElements","nextIndex","findClosetHitRegion","closestHitRegion","cached","isCoarsePointer","compare","ancestors","get_ancestors","common_ancestor","z_indexes","get_z_index","find_stacking_context","children","furthest_ancestors","props","is_flex_item","node","display","get_parent","creates_stacking_context","nodes","i","parentNode","doRectsIntersect","isViableHitTarget","pointerEventTarget","currentElement","findMatchingHitRegions","matchingHitRegions","_","groupData","maxDistance","match","onWindowPointerDown","didChangeFocus","onWindowPointerMove","onWindowPointerUp","calculateDefaultLayout","explicitCount","remainingPanelCount","notifyPanelOnResize","borderBoxSize","resizeObserverSize","objectsEqual","key","mountGroup","isMounted","panelIds","separatorIds","resizeObserver","entries","entry","target","nextDerivedPanelConstraints","defaultLayout","defaultLayoutUnsafe","defaultLayoutSafe","nextState","useId","stableId","dynamicId","useIdReact","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useStableCallback","fn","ref","useRef","useCallback","args","useMergedRefs","refs","useStableObject","unstableObject","POINTER_EVENTS_CSS_PROPERTY_NAME","getPanelSizeCssPropertyName","panelId","groupIdEscaped","panelIdEscaped","GroupContext","createContext","useGroupImperativeHandle","groupRef","imperativeGroupRef","useImperativeHandle","Group","className","disabled","elementRef","idProp","onLayoutChangeUnstable","rest","prevLayoutRef","onLayoutChangeStable","dragActive","setDragActive","useState","setElement","setLayout","setPanels","setSeparators","inMemoryValuesRef","mergedRef","context","useMemo","prev","stableProps","registeredGroupRef","unmountGroup","removeInteractionStateChangeListener","removeMountedGroupsChangeEventListener","registeredGroup","cssVariables","propertyName","flexGrow","jsx","debounce","durationMs","timeout","getStorageKey","useDefaultLayout","debounceSaveMs","storage","storageKey","defaultLayoutString","useSyncExternalStore","subscribe","onLayoutChange","saveLayout","useGroupCallbackRef","useGroupRef","useGroupContext","useContext","getImperativePanelMethods","getPanelConstraints","getPanel","getPanelSize","setPanelSize","isLastPanel","asPercentage","inPixels","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","onResizeUnstable","idIsStable","registerPanel","hasOnResize","onResizeStable","panelSize","flexGrowVar","PROHIBITED_CSS_PROPERTIES","usePanelCallbackRef","usePanelRef","calculateSeparatorAriaValues","panelIndex","valueMax","valueMin","Separator","aria","setAria","dragState","setDragState","groupOrientation","registerSeparator","unregisterSeparator","removeMountedGroupsChangeListener"],"mappings":"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"}
|