{"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/mutable-state/groups.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/layoutNumbersEqual.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/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onDocumentKeyDown.ts","../lib/global/mutable-state/interactions.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/preserveFixedPanelSizes.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/readLegacyLayout.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<PanelConstraints>((current) => ({\n      groupResizeBehavior: current.panelConstraints.groupResizeBehavior,\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      groupResizeBehavior: panelConstraints.groupResizeBehavior,\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.hasAttribute(\"data-disabled\")) {\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 type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { EventEmitter } from \"../../utils/EventEmitter\";\nimport type { SeparatorToPanelsMap } from \"./types\";\n\ntype State = {\n  defaultLayoutDeferred: boolean;\n  derivedPanelConstraints: PanelConstraints[];\n  groupSize: number;\n  layout: Layout;\n  separatorToPanels: SeparatorToPanelsMap;\n};\n\nexport type MountedGroups = Map<RegisteredGroup, State>;\n\nlet map: MountedGroups = new Map();\n\ntype GroupChangeEvent = {\n  group: RegisteredGroup;\n  next: State;\n  prev: State | undefined;\n};\ntype GroupsChangeEvent = {\n  next: MountedGroups;\n  prev: MountedGroups;\n};\n\nconst eventEmitter = new EventEmitter<{\n  groupChange: GroupChangeEvent;\n  groupsChange: GroupsChangeEvent;\n}>();\n\nexport function deleteMutableGroup(group: RegisteredGroup) {\n  map = new Map(map);\n  map.delete(group);\n}\n\nexport function getRegisteredGroup(\n  groupId: string\n): RegisteredGroup | undefined;\nexport function getRegisteredGroup(\n  groupId: string,\n  assert: true\n): RegisteredGroup;\nexport function getRegisteredGroup(groupId: string, assert?: boolean) {\n  for (const [group] of map) {\n    if (group.id === groupId) {\n      return group;\n    }\n  }\n\n  if (assert) {\n    throw Error(`Could not find data for Group with id ${groupId}`);\n  }\n\n  return undefined;\n}\n\nexport function getMountedGroupState(groupId: string): State | undefined;\nexport function getMountedGroupState(groupId: string, assert: true): State;\nexport function getMountedGroupState(groupId: string, assert?: boolean) {\n  for (const [group, mountedGroup] of map) {\n    if (group.id === groupId) {\n      return mountedGroup;\n    }\n  }\n\n  if (assert) {\n    throw Error(`Could not find data for Group with id ${groupId}`);\n  }\n\n  return undefined;\n}\n\nexport function getMountedGroups() {\n  return map;\n}\n\nexport function subscribeToMountedGroup(\n  groupId: string,\n  callback: (event: GroupChangeEvent) => void\n) {\n  return eventEmitter.addListener(\"groupChange\", (event) => {\n    if (event.group.id === groupId) {\n      callback(event);\n    }\n  });\n}\n\nexport function updateMountedGroup(group: RegisteredGroup, next: State) {\n  const prev = map.get(group);\n\n  map = new Map(map);\n  map.set(group, next);\n\n  eventEmitter.emit(\"groupChange\", {\n    group,\n    prev,\n    next\n  });\n}\n","import type { Orientation } from \"../../components/group/types\";\nimport type { Point } from \"../../types\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function 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 { MountedGroups } from \"../mutable-state/groups\";\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: MountedGroups\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 { 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 { 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 { getMountedGroups, updateMountedGroup } from \"../mutable-state/groups\";\nimport { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\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 = getMountedGroups();\n    for (const [\n      group,\n      {\n        defaultLayoutDeferred,\n        derivedPanelConstraints,\n        layout,\n        groupSize,\n        separatorToPanels\n      }\n    ] of mountedGroups) {\n      if (group.id === groupId) {\n        return {\n          defaultLayoutDeferred,\n          derivedPanelConstraints,\n          group,\n          groupSize,\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      groupSize,\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      updateMountedGroup(group, {\n        defaultLayoutDeferred,\n        derivedPanelConstraints,\n        groupSize,\n        layout: nextLayout,\n        separatorToPanels\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 { group } = find();\n      const { element } = getPanel();\n      const groupSize = calculateAvailableGroupSize({ group });\n\n      const asPixels = sizeStyleToPixels({\n        groupSize,\n        panelElement: element,\n        styleProp: size\n      });\n\n      const asPercentage = formatLayoutNumber((asPixels / groupSize) * 100);\n\n      setPanelSize(asPercentage);\n    }\n  } satisfies PanelImperativeHandle;\n}\n","import { getMountedGroups } from \"../mutable-state/groups\";\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 = getMountedGroups();\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 { getMountedGroups } from \"../mutable-state/groups\";\n\nexport function findSeparatorGroup(separatorElement: HTMLElement) {\n  const mountedGroups = getMountedGroups();\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 { getMountedGroups, updateMountedGroup } from \"../mutable-state/groups\";\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 = getMountedGroups();\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        groupSize,\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        updateMountedGroup(group, {\n          defaultLayoutDeferred,\n          derivedPanelConstraints,\n          groupSize,\n          layout: nextLayout,\n          separatorToPanels\n        });\n      }\n\n      return nextLayout;\n    }\n  };\n}\n","import { assert } from \"../../utils/assert\";\nimport {\n  getMountedGroupState,\n  updateMountedGroup\n} from \"../mutable-state/groups\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { findSeparatorGroup } from \"./findSeparatorGroup\";\nimport { getImperativeGroupMethods } from \"./getImperativeGroupMethods\";\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 groupState = getMountedGroupState(group.id, true);\n\n  const separator = group.separators.find(\n    (current) => current.element === separatorElement\n  );\n  assert(separator, \"Matching separator not found\");\n\n  const panels = groupState.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: groupState.derivedPanelConstraints,\n    pivotIndices,\n    prevLayout,\n    trigger: \"keyboard\"\n  });\n  const nextLayout = validatePanelGroupLayout({\n    layout: unsafeLayout,\n    panelConstraints: groupState.derivedPanelConstraints\n  });\n\n  if (!layoutsEqual(prevLayout, nextLayout)) {\n    updateMountedGroup(group, {\n      defaultLayoutDeferred: groupState.defaultLayoutDeferred,\n      derivedPanelConstraints: groupState.derivedPanelConstraints,\n      groupSize: groupState.groupSize,\n      layout: nextLayout,\n      separatorToPanels: groupState.separatorToPanels\n    });\n  }\n}\n","import { assert } from \"../../utils/assert\";\nimport { getMountedGroupState } from \"../mutable-state/groups\";\nimport { adjustLayoutForSeparator } from \"../utils/adjustLayoutForSeparator\";\nimport { findSeparatorGroup } from \"../utils/findSeparatorGroup\";\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\n      const groupState = getMountedGroupState(group.id, true);\n      const { derivedPanelConstraints, layout, separatorToPanels } = groupState;\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.mutableState.expandedPanelSizes[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        preventScroll: true\n      });\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 { EventEmitter } from \"../../utils/EventEmitter\";\nimport type { InteractionState } from \"./types\";\n\nlet state: InteractionState = {\n  cursorFlags: 0,\n  state: \"inactive\"\n};\n\ntype ChangeEvent = {\n  next: InteractionState;\n  prev: InteractionState;\n};\n\nconst eventEmitter = new EventEmitter<{\n  change: ChangeEvent;\n}>();\n\nexport function getInteractionState() {\n  return state;\n}\n\nexport function subscribeToInteractionState(\n  callback: (event: ChangeEvent) => void\n) {\n  return eventEmitter.addListener(\"change\", callback);\n}\n\nexport function updateCursorFlags(cursorFlags: number) {\n  const prev = state;\n\n  const next = { ...state };\n  next.cursorFlags = cursorFlags;\n\n  state = next;\n\n  eventEmitter.emit(\"change\", {\n    prev,\n    next\n  });\n}\n\nexport function updateInteractionState(next: InteractionState) {\n  const prev = state;\n\n  state = next;\n\n  eventEmitter.emit(\"change\", {\n    prev,\n    next\n  });\n}\n","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport { getMountedGroups } from \"../mutable-state/groups\";\nimport { updateInteractionState } from \"../mutable-state/interactions\";\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 = getMountedGroups();\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          preventScroll: true\n        });\n\n        // TRICKY\n        // Calling setPointerCapture() here would help with detecting pointer \"pointermove\"/\"pointerup\" events that happen over iframes\n        // but it would also prevent \"click\" events from firing if the use releases without actually dragging\n        // Because of this, it's safer to wait until the first \"pointermove\" event to set capture\n      }\n    }\n\n    const match = mountedGroups.get(current.group);\n    if (match) {\n      initialLayoutMap.set(current.group, match.layout);\n    }\n  });\n\n  updateInteractionState({\n    cursorFlags: 0,\n    hitRegions,\n    initialLayoutMap,\n    pointerDownAtPoint: { x: event.clientX, y: event.clientY },\n    state: \"active\"\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 \"../mutable-state/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.mutableState.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 { getInteractionState } from \"../mutable-state/interactions\";\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 interactionState = getInteractionState();\n\n  switch (interactionState.state) {\n    case \"active\":\n    case \"hover\": {\n      const cursorStyle = getCursorStyle({\n        cursorFlags: interactionState.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 {\n  updateMountedGroup,\n  type MountedGroups\n} from \"../mutable-state/groups\";\nimport { updateCursorFlags } from \"../mutable-state/interactions\";\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: MountedGroups;\n  pointerDownAtPoint?: Point;\n  prevCursorFlags: number;\n}) {\n  let nextCursorFlags = 0;\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 { orientation, panels } = group;\n    const { disableCursor } = group.mutableState;\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    const groupState = mountedGroups.get(group);\n    if (!initialLayout || !groupState) {\n      return;\n    }\n\n    const {\n      defaultLayoutDeferred,\n      derivedPanelConstraints,\n      groupSize: mountedGroupSize,\n      layout: prevLayout,\n      separatorToPanels\n    } = groupState;\n    if (derivedPanelConstraints && prevLayout && separatorToPanels) {\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        updateMountedGroup(current.group, {\n          defaultLayoutDeferred,\n          derivedPanelConstraints: derivedPanelConstraints,\n          groupSize: mountedGroupSize,\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  updateCursorFlags(cursorFlags);\n  updateCursorStyle(document);\n}\n","import { getMountedGroups } from \"../mutable-state/groups\";\nimport { getInteractionState } from \"../mutable-state/interactions\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onDocumentPointerLeave(event: PointerEvent) {\n  const mountedGroups = getMountedGroups();\n  const interactionState = getInteractionState();\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: interactionState.cursorFlags\n      });\n    }\n  }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport {\n  getMountedGroups,\n  getMountedGroupState,\n  updateMountedGroup\n} from \"../mutable-state/groups\";\nimport {\n  getInteractionState,\n  updateInteractionState\n} from \"../mutable-state/interactions\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onDocumentPointerMove(event: PointerEvent) {\n  if (event.defaultPrevented) {\n    return;\n  }\n\n  const interactionState = getInteractionState();\n  const mountedGroups = getMountedGroups();\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        updateInteractionState({\n          cursorFlags: 0,\n          state: \"inactive\"\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        interactionState.hitRegions.forEach((hitRegion) => {\n          const groupState = getMountedGroupState(hitRegion.group.id, true);\n          updateMountedGroup(hitRegion.group, groupState);\n        });\n\n        return;\n      }\n\n      for (const hitRegion of interactionState.hitRegions) {\n        if (hitRegion.separator) {\n          const { element } = hitRegion.separator;\n          if (!element.hasPointerCapture?.(event.pointerId)) {\n            element.setPointerCapture?.(event.pointerId);\n          }\n        }\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: interactionState.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          updateInteractionState({\n            cursorFlags: 0,\n            state: \"inactive\"\n          });\n        }\n      } else {\n        updateInteractionState({\n          cursorFlags: 0,\n          hitRegions,\n          state: \"hover\"\n        });\n      }\n\n      updateCursorStyle(event.currentTarget as Document);\n      break;\n    }\n  }\n}\n","import {\n  getInteractionState,\n  updateInteractionState\n} from \"../mutable-state/interactions\";\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 = getInteractionState();\n    switch (interactionState.state) {\n      case \"hover\": {\n        updateInteractionState({\n          cursorFlags: 0,\n          state: \"inactive\"\n        });\n      }\n    }\n  }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport {\n  getMountedGroupState,\n  updateMountedGroup\n} from \"../mutable-state/groups\";\nimport {\n  getInteractionState,\n  updateInteractionState\n} from \"../mutable-state/interactions\";\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 = getInteractionState();\n\n  switch (interactionState.state) {\n    case \"active\": {\n      updateInteractionState({\n        cursorFlags: 0,\n        state: \"inactive\"\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        interactionState.hitRegions.forEach((hitRegion) => {\n          const groupState = getMountedGroupState(hitRegion.group.id, true);\n          updateMountedGroup(hitRegion.group, groupState);\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, RegisteredGroup } from \"../../components/group/types\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function preserveFixedPanelSizes({\n  group,\n  nextGroupSize,\n  prevGroupSize,\n  prevLayout\n}: {\n  group: RegisteredGroup;\n  nextGroupSize: number;\n  prevGroupSize: number;\n  prevLayout: Layout;\n}) {\n  if (\n    prevGroupSize <= 0 ||\n    nextGroupSize <= 0 ||\n    prevGroupSize === nextGroupSize\n  ) {\n    return prevLayout;\n  }\n\n  let fixedPanelsTotalSize = 0;\n  let flexiblePanelsTotalPrevSize = 0;\n  let hasPreservePixelSizePanels = false;\n\n  const fixedPanels = new Map<string, number>();\n  const flexiblePanelIds: string[] = [];\n\n  for (const panel of group.panels) {\n    const prevPanelSize = prevLayout[panel.id] ?? 0;\n    switch (panel.panelConstraints.groupResizeBehavior) {\n      case \"preserve-pixel-size\": {\n        hasPreservePixelSizePanels = true;\n\n        const prevPanelSizeInPixels = (prevPanelSize / 100) * prevGroupSize;\n        const nextPanelSize = formatLayoutNumber(\n          (prevPanelSizeInPixels / nextGroupSize) * 100\n        );\n\n        fixedPanels.set(panel.id, nextPanelSize);\n        fixedPanelsTotalSize += nextPanelSize;\n        break;\n      }\n      case \"preserve-relative-size\":\n      default: {\n        flexiblePanelIds.push(panel.id);\n        flexiblePanelsTotalPrevSize += prevPanelSize;\n        break;\n      }\n    }\n  }\n\n  if (!hasPreservePixelSizePanels || flexiblePanelIds.length === 0) {\n    return prevLayout;\n  }\n\n  const remainingSize = 100 - fixedPanelsTotalSize;\n  const nextLayout = { ...prevLayout };\n\n  fixedPanels.forEach((size, panelId) => {\n    nextLayout[panelId] = size;\n  });\n\n  if (flexiblePanelsTotalPrevSize > 0) {\n    for (const panelId of flexiblePanelIds) {\n      const prevSize = prevLayout[panelId] ?? 0;\n      nextLayout[panelId] = formatLayoutNumber(\n        (prevSize / flexiblePanelsTotalPrevSize) * remainingSize\n      );\n    }\n  } else {\n    const evenSize = formatLayoutNumber(\n      remainingSize / flexiblePanelIds.length\n    );\n    for (const panelId of flexiblePanelIds) {\n      nextLayout[panelId] = evenSize;\n    }\n  }\n\n  return nextLayout;\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 {\n  deleteMutableGroup,\n  getMountedGroupState,\n  updateMountedGroup\n} from \"./mutable-state/groups\";\nimport type { SeparatorToPanelsMap } from \"./mutable-state/types\";\nimport { calculateDefaultLayout } from \"./utils/calculateDefaultLayout\";\nimport { layoutsEqual } from \"./utils/layoutsEqual\";\nimport { notifyPanelOnResize } from \"./utils/notifyPanelOnResize\";\nimport { objectsEqual } from \"./utils/objectsEqual\";\nimport { preserveFixedPanelSizes } from \"./utils/preserveFixedPanelSizes\";\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          const groupState = getMountedGroupState(group.id);\n          if (!groupState) {\n            // Not mounted yet\n            return;\n          }\n\n          // Update non-percentage based constraints\n          const nextDerivedPanelConstraints = calculatePanelConstraints(group);\n\n          // Revalidate layout in case constraints have changed or group size changed\n          const prevLayout = groupState.defaultLayoutDeferred\n            ? calculateDefaultLayout(nextDerivedPanelConstraints)\n            : groupState.layout;\n          const unsafeLayout = preserveFixedPanelSizes({\n            group,\n            nextGroupSize: groupSize,\n            prevGroupSize: groupState.groupSize,\n            prevLayout\n          });\n          const nextLayout = validatePanelGroupLayout({\n            layout: unsafeLayout,\n            panelConstraints: nextDerivedPanelConstraints\n          });\n\n          if (\n            !groupState.defaultLayoutDeferred &&\n            layoutsEqual(groupState.layout, nextLayout) &&\n            objectsEqual(\n              groupState.derivedPanelConstraints,\n              nextDerivedPanelConstraints\n            ) &&\n            groupState.groupSize === groupSize\n          ) {\n            return;\n          }\n\n          updateMountedGroup(group, {\n            defaultLayoutDeferred: false,\n            derivedPanelConstraints: nextDerivedPanelConstraints,\n            groupSize,\n            layout: nextLayout,\n            separatorToPanels: groupState.separatorToPanels\n          });\n        }\n      } else {\n        notifyPanelOnResize(group, target as HTMLElement, borderBoxSize);\n      }\n    }\n  });\n\n  resizeObserver.observe(group.element);\n\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.mutableState.defaultLayout;\n  if (defaultLayout) {\n    if (!validateLayoutKeys(group.panels, defaultLayout)) {\n      defaultLayout = undefined;\n    }\n  }\n\n  const defaultLayoutUnsafe: Layout =\n    group.mutableState.layouts[panelIdsKey] ??\n    defaultLayout ??\n    calculateDefaultLayout(derivedPanelConstraints);\n  const defaultLayoutSafe = validatePanelGroupLayout({\n    layout: defaultLayoutUnsafe,\n    panelConstraints: derivedPanelConstraints\n  });\n\n  const ownerDocument = group.element.ownerDocument;\n\n  ownerDocumentReferenceCounts.set(\n    ownerDocument,\n    (ownerDocumentReferenceCounts.get(ownerDocument) ?? 0) + 1\n  );\n\n  const separatorToPanels: SeparatorToPanelsMap = new Map();\n  const hitRegions = calculateHitRegions(group);\n  hitRegions.forEach((hitRegion) => {\n    if (hitRegion.separator) {\n      separatorToPanels.set(hitRegion.separator, hitRegion.panels);\n    }\n  });\n\n  updateMountedGroup(group, {\n    defaultLayoutDeferred: groupSize === 0,\n    derivedPanelConstraints,\n    groupSize,\n    layout: defaultLayoutSafe,\n    separatorToPanels\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    deleteMutableGroup(group);\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 {\n  getMountedGroupState,\n  getRegisteredGroup,\n  subscribeToMountedGroup,\n  updateMountedGroup\n} from \"../../global/mutable-state/groups\";\nimport { getInteractionState } from \"../../global/mutable-state/interactions\";\nimport { layoutNumbersEqual } from \"../../global/utils/layoutNumbersEqual\";\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 = getInteractionState();\n      const group = getRegisteredGroup(groupId);\n      const groupState = getMountedGroupState(groupId);\n      if (groupState) {\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: groupState.layout[panelId] ?? 1,\n          pointerEvents: dragActive ? \"none\" : undefined\n        } satisfies CSSProperties;\n      }\n\n      // This is unexpected except for the initial mount (before the group has registered with the global store)\n      if (defaultLayout?.[panelId]) {\n        return {\n          flexGrow: defaultLayout?.[panelId]\n        } satisfies CSSProperties;\n      }\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 group = getRegisteredGroup(id);\n        const groupState = getMountedGroupState(id);\n        if (group && groupState) {\n          updateMountedGroup(group, {\n            ...groupState,\n            derivedPanelConstraints: calculatePanelConstraints(group)\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      disabled: !!disabled,\n      element,\n      id,\n      mutableState: {\n        defaultLayout: preSortedDefaultLayout,\n        disableCursor: !!stableProps.disableCursor,\n        expandedPanelSizes: inMemoryValuesRef.current.lastExpandedPanelSizes,\n        layouts: inMemoryValuesRef.current.layouts\n      },\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 { defaultLayoutDeferred, derivedPanelConstraints, layout } =\n      getMountedGroupState(group.id, true);\n\n    if (!defaultLayoutDeferred && derivedPanelConstraints.length > 0) {\n      onLayoutChangeStable(layout);\n      onLayoutChangedStable(layout);\n    }\n\n    const removeChangeEventListener = subscribeToMountedGroup(id, (event) => {\n      const { defaultLayoutDeferred, derivedPanelConstraints, layout } =\n        event.next;\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.mutableState.layouts[panelIdsKey] = layout;\n\n      // Also check if any collapsible Panels were collapsed in this update,\n      // and record their previous sizes so we can restore them on expand\n      derivedPanelConstraints.forEach((constraints) => {\n        if (constraints.collapsible) {\n          const { layout: prevLayout } = event.prev ?? {};\n          if (prevLayout) {\n            const isCollapsed = layoutNumbersEqual(\n              constraints.collapsedSize,\n              layout[constraints.panelId]\n            );\n            const wasCollapsed = layoutNumbersEqual(\n              constraints.collapsedSize,\n              prevLayout[constraints.panelId]\n            );\n            if (isCollapsed && !wasCollapsed) {\n              group.mutableState.expandedPanelSizes[constraints.panelId] =\n                prevLayout[constraints.panelId];\n            }\n          }\n        }\n      });\n\n      // Lastly notify layout-change(d) handlers of the update\n      const interactionState = getInteractionState();\n      const isCompleted = interactionState.state !== \"active\";\n      onLayoutChangeStable(layout);\n      if (isCompleted) {\n        onLayoutChangedStable(layout);\n      }\n    });\n\n    return () => {\n      registeredGroupRef.current = null;\n\n      unmountGroup();\n      removeChangeEventListener();\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.mutableState.defaultLayout = defaultLayout;\n      registeredGroup.mutableState.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 type { Layout, LayoutStorage } from \"./types\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\n\nexport type LegacyLayout = {\n  [key: string]: {\n    expandToSizes: unknown;\n    layout: number[];\n  };\n};\n\n/**\n * Reads a legacy layout object from `localStorage`  and converts it to a modern `Layout` object.\n * For more information see github.com/bvaughn/react-resizable-panels/issues/605\n */\nexport function readLegacyLayout({\n  id,\n  panelIds,\n  storage\n}: {\n  id: string;\n  panelIds?: string[] | undefined;\n  storage: LayoutStorage;\n}): Layout | undefined {\n  const readStorageKey = getStorageKey(id, []);\n\n  const maybeLegacyString = storage.getItem(readStorageKey);\n  if (!maybeLegacyString) {\n    return;\n  }\n\n  try {\n    // Legacy format stored multiple layouts in a single storage record, each keyed by panel ids\n    const maybeLegacyLayout = JSON.parse(maybeLegacyString);\n\n    if (panelIds) {\n      // If panel ids were explicitly provided, search for a matching layout\n      const key = panelIds.join(\",\");\n      const entry = maybeLegacyLayout[key];\n      if (\n        entry &&\n        Array.isArray(entry.layout) &&\n        panelIds.length === entry.layout.length\n      ) {\n        const layout: Layout = {};\n        for (let index = 0; index < panelIds.length; index++) {\n          layout[panelIds[index]] = entry.layout[index];\n        }\n        return layout;\n      }\n    } else {\n      // If no panel ids were provided, bailout unless the legacy object only contained a single layout\n      const keys = Object.keys(maybeLegacyLayout);\n      if (keys.length === 1) {\n        const entry = maybeLegacyLayout[keys[0]];\n        if (entry && Array.isArray(entry.layout)) {\n          const ids = keys[0].split(\",\");\n          if (ids.length === entry.layout.length) {\n            const layout: Layout = {};\n            for (let index = 0; index < ids.length; index++) {\n              layout[ids[index]] = entry.layout[index];\n            }\n            return layout;\n          }\n        }\n      }\n    }\n  } catch {\n    // No-op\n  }\n}\n","import {\n  useCallback,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useSyncExternalStore\n} from \"react\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\nimport { readLegacyLayout } from \"./readLegacyLayout\";\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  // Try to read v4 Layout format first\n  const defaultLayoutString = useSyncExternalStore(\n    subscribe,\n    () => storage.getItem(readStorageKey),\n    () => storage.getItem(readStorageKey)\n  );\n  const defaultLayoutModern = useMemo(() => {\n    if (defaultLayoutString) {\n      // Rule out false positive for legacy layout format\n      const parsed = JSON.parse(defaultLayoutString);\n      const values = Object.values(parsed);\n      if (Array.from(values).every((value) => typeof value === \"number\")) {\n        return parsed as Layout;\n      }\n    }\n  }, [defaultLayoutString]);\n\n  // If not v4 layout was found, check for legacy v3 layout format\n  const defaultLayoutLegacy = useMemo(() => {\n    if (defaultLayoutModern) {\n      return undefined;\n    }\n\n    return readLegacyLayout({\n      id,\n      panelIds,\n      storage\n    });\n  }, [defaultLayoutModern, id, panelIds, storage]);\n\n  const defaultLayout = defaultLayoutModern ?? defaultLayoutLegacy;\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 { subscribeToMountedGroup } from \"../../global/mutable-state/groups\";\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 { useGroupContext } from \"../group/useGroupContext\";\nimport type { PanelProps, PanelSize, RegisteredPanel } from \"./types\";\nimport { usePanelImperativeHandle } from \"./usePanelImperativeHandle\";\n\n/**\n * A Panel wraps resizable content and can be configured with min/max size constraints and collapsible behavior.\n *\n * Panel size props can be in the following formats:\n * - Percentage of the parent Group (0..100)\n * - Pixels\n * - Relative font units (em, rem)\n * - Viewport relative units (vh, vw)\n *\n * ℹ️ Numeric values are assumed to be pixels.\n * Strings without explicit units are assumed to be percentages (0%..100%).\n * Percentages may also be specified as strings ending with \"%\" (e.g. \"33%\")\n * Pixels may also be specified as strings ending with the unit \"px\".\n * Other units should be specified as strings ending with their CSS property units (e.g. 1rem, 50vh)\n *\n * Panel elements always include the following attributes:\n *\n * ```html\n * <div data-panel data-testid=\"panel-id-prop\" id=\"panel-id-prop\">\n * ```\n *\n * ℹ️ [Test id](https://testing-library.com/docs/queries/bytestid/) can be used to narrow selection when unit testing.\n *\n * ⚠️ Panel elements must be direct DOM children of their parent Group elements.\n */\nexport function Panel({\n  children,\n  className,\n  collapsedSize = \"0%\",\n  collapsible = false,\n  defaultSize,\n  disabled,\n  elementRef: elementRefProp,\n  groupResizeBehavior = \"preserve-relative-size\",\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          groupResizeBehavior,\n          collapsedSize,\n          collapsible,\n          defaultSize,\n          disabled: stableProps.disabled,\n          maxSize,\n          minSize\n        }\n      };\n\n      return registerPanel(registeredPanel);\n    }\n  }, [\n    groupResizeBehavior,\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  // useSyncExternalStore does not support a custom equality check\n  // stringify avoids re-rendering when the style value hasn't changed\n  const read = () => {\n    const maybePanelStyles = getPanelStyles(groupId, id);\n    if (maybePanelStyles) {\n      return JSON.stringify(maybePanelStyles);\n    }\n  };\n\n  const panelStylesString = useSyncExternalStore(\n    (subscribe) => subscribeToMountedGroup(groupId, subscribe),\n    read,\n    read\n  );\n\n  let panelStyles: CSSProperties;\n  if (panelStylesString) {\n    panelStyles = JSON.parse(panelStylesString);\n  } else if (defaultSize) {\n    panelStyles = {\n      flexGrow: undefined,\n      flexShrink: undefined,\n      flexBasis: defaultSize\n    };\n  } else {\n    panelStyles = { flexGrow: 1 };\n  }\n\n  return (\n    <div\n      {...rest}\n      data-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        overflow: \"visible\",\n\n        ...panelStyles\n      }}\n    >\n      <div\n        className={className}\n        style={{\n          maxHeight: \"100%\",\n          maxWidth: \"100%\",\n          flexGrow: 1,\n          overflow: \"auto\",\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 type { Properties } from \"csstype\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { subscribeToMountedGroup } from \"../../global/mutable-state/groups\";\nimport { subscribeToInteractionState } from \"../../global/mutable-state/interactions\";\nimport type { InteractionState } from \"../../global/mutable-state/types\";\nimport { calculateSeparatorAriaValues } from \"../../global/utils/calculateSeparatorAriaValues\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableObject } from \"../../hooks/useStableObject\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { RegisteredSeparator, SeparatorProps } from \"./types\";\n\n/**\n * Separators are not _required_ but they are _recommended_ as they improve keyboard accessibility.\n *\n * ⚠️ Separator elements must be direct DOM children of their parent Group elements.\n *\n * Separator elements always include the following attributes:\n *\n * ```html\n * <div data-separator data-testid=\"separator-id-prop\" id=\"separator-id-prop\" role=\"separator\">\n * ```\n *\n * ℹ️ [Test id](https://testing-library.com/docs/queries/bytestid/) can be used to narrow selection when unit testing.\n *\n * ℹ️ In addition to the attributes shown above, separator also renders all required [WAI-ARIA properties](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/separator_role#associated_wai-aria_roles_states_and_properties).\n */\nexport function Separator({\n  children,\n  className,\n  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 = subscribeToInteractionState(\n        (event) => {\n          setDragState(\n            event.next.state !== \"inactive\" &&\n              event.next.hitRegions.some(\n                (hitRegion) => hitRegion.separator === separator\n              )\n              ? event.next.state\n              : \"inactive\"\n          );\n        }\n      );\n\n      const removeMountedGroupsChangeListener = subscribeToMountedGroup(\n        groupId,\n        (event) => {\n          const { derivedPanelConstraints, layout, separatorToPanels } =\n            event.next;\n          const panels = separatorToPanels.get(separator);\n          if (panels) {\n            const primaryPanel = panels[0];\n            const panelIndex = 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      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","map","eventEmitter","deleteMutableGroup","getRegisteredGroup","groupId","getMountedGroupState","mountedGroup","getMountedGroups","subscribeToMountedGroup","callback","event","updateMountedGroup","next","prev","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","mountedGroups","matchingHitRegions","_","groupData","match","isArrayEqual","layoutNumbersEqual","actual","expected","minimumDelta","compareLayoutNumbers","validatePanelSize","overrideDisabledPanels","prevSize","collapsible","disabled","halfwayPoint","adjustLayoutByDelta","initialLayoutProp","panelConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","prevLayout","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","panelId","find","defaultLayoutDeferred","derivedPanelConstraints","separatorToPanels","getPanelConstraints","getPanel","getPanelSize","setPanelSize","isLastPanel","unsafeLayout","mutableValues","asPercentage","inPixels","asPixels","onDocumentDoubleClick","panelWithDefaultSize","api","findSeparatorGroup","separatorElement","getImperativeGroupMethods","adjustLayoutForSeparator","groupState","onDocumentKeyDown","primaryPanel","constraints","separatorElements","nextIndex","state","getInteractionState","subscribeToInteractionState","updateCursorFlags","cursorFlags","updateInteractionState","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","groups","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","documentToStyleMap","updateCursorStyle","ownerDocument","prevStyle","styleSheet","interactionState","cursorStyle","nextStyle","updateActiveHitRegions","document","pointerDownAtPoint","prevCursorFlags","nextCursorFlags","disableCursor","deltaAsPercentage","mountedGroupSize","onDocumentPointerLeave","onDocumentPointerMove","onDocumentPointerOut","onDocumentPointerUp","calculateDefaultLayout","explicitCount","remainingPanelCount","notifyPanelOnResize","borderBoxSize","panelSize","objectsEqual","key","preserveFixedPanelSizes","nextGroupSize","prevGroupSize","fixedPanelsTotalSize","flexiblePanelsTotalPrevSize","hasPreservePixelSizePanels","fixedPanels","flexiblePanelIds","prevPanelSize","prevPanelSizeInPixels","nextPanelSize","evenSize","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","removeChangeEventListener","isCollapsed","wasCollapsed","isCompleted","registeredGroup","jsx","getStorageKey","readLegacyLayout","storage","readStorageKey","maybeLegacyString","maybeLegacyLayout","keys","ids","useDefaultLayout","debounceSaveMs","hasPanelIds","defaultLayoutString","useSyncExternalStore","subscribe","defaultLayoutModern","parsed","values","defaultLayoutLegacy","timeoutRef","clearPendingTimeout","timeout","onLayoutChanged","writeStorageKey","onLayoutChange","useGroupCallbackRef","useGroupRef","useGroupContext","useContext","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","groupResizeBehavior","onResizeUnstable","idIsStable","registerPanel","togglePanelDisabled","hasOnResize","onResizeStable","registeredPanel","read","maybePanelStyles","panelStylesString","panelStyles","PROHIBITED_CSS_PROPERTIES","usePanelCallbackRef","usePanelRef","calculateSeparatorAriaValues","panelIndex","valueMax","valueMin","Separator","aria","setAria","dragState","setDragState","groupOrientation","registerSeparator","toggleSeparatorDisabled","unregisterSeparator","removeInteractionStateChangeListener","removeMountedGroupsChangeListener","cursor"],"mappings":"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"}