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