react-resizable-panels 3.0.6 → 4.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +253 -250
  3. package/dist/react-resizable-panels.cjs +2 -0
  4. package/dist/react-resizable-panels.cjs.map +1 -0
  5. package/dist/react-resizable-panels.d.ts +331 -2
  6. package/dist/react-resizable-panels.js +1063 -2373
  7. package/dist/react-resizable-panels.js.map +1 -0
  8. package/package.json +102 -66
  9. package/dist/declarations/src/Panel.d.ts +0 -70
  10. package/dist/declarations/src/PanelGroup.d.ts +0 -38
  11. package/dist/declarations/src/PanelResizeHandle.d.ts +0 -23
  12. package/dist/declarations/src/PanelResizeHandleRegistry.d.ts +0 -19
  13. package/dist/declarations/src/constants.d.ts +0 -15
  14. package/dist/declarations/src/hooks/usePanelGroupContext.d.ts +0 -4
  15. package/dist/declarations/src/index.d.ts +0 -23
  16. package/dist/declarations/src/types.d.ts +0 -3
  17. package/dist/declarations/src/utils/assert.d.ts +0 -1
  18. package/dist/declarations/src/utils/csp.d.ts +0 -2
  19. package/dist/declarations/src/utils/cursor.d.ts +0 -18
  20. package/dist/declarations/src/utils/dom/getPanelElement.d.ts +0 -1
  21. package/dist/declarations/src/utils/dom/getPanelElementsForGroup.d.ts +0 -1
  22. package/dist/declarations/src/utils/dom/getPanelGroupElement.d.ts +0 -1
  23. package/dist/declarations/src/utils/dom/getResizeHandleElement.d.ts +0 -1
  24. package/dist/declarations/src/utils/dom/getResizeHandleElementIndex.d.ts +0 -1
  25. package/dist/declarations/src/utils/dom/getResizeHandleElementsForGroup.d.ts +0 -1
  26. package/dist/declarations/src/utils/dom/getResizeHandlePanelIds.d.ts +0 -2
  27. package/dist/declarations/src/utils/rects/getIntersectingRectangle.d.ts +0 -2
  28. package/dist/declarations/src/utils/rects/intersects.d.ts +0 -2
  29. package/dist/declarations/src/utils/rects/types.d.ts +0 -6
  30. package/dist/react-resizable-panels.browser.development.js +0 -2592
  31. package/dist/react-resizable-panels.browser.js +0 -2486
  32. package/dist/react-resizable-panels.development.edge-light.js +0 -2365
  33. package/dist/react-resizable-panels.development.js +0 -2599
  34. package/dist/react-resizable-panels.edge-light.js +0 -2264
@@ -0,0 +1 @@
1
+ {"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/EventEmitter.ts","../lib/global/mutableState.ts","../lib/constants.ts","../lib/components/group/sortByElementOffset.ts","../lib/global/dom/calculateHitRegions.ts","../lib/global/utils/getDistanceBetweenPointAndRect.ts","../lib/global/utils/findClosetHitRegion.ts","../lib/global/utils/isCoarsePointer.ts","../lib/global/utils/findMatchingHitRegions.ts","../lib/global/pointer-events/onPointerDown.ts","../lib/global/cursor/getCursorStyle.ts","../lib/global/cursor/updateCursorStyle.ts","../lib/utils/assert.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/pointer-events/onPointerMove.ts","../lib/global/pointer-events/onPointerUp.ts","../lib/global/utils/calculateDefaultLayout.ts","../lib/global/utils/notifyPanelOnResize.ts","../lib/global/utils/validatePanelGroupLayout.ts","../lib/global/mountGroup.ts","../lib/hooks/useId.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/hooks/useStableCallback.ts","../lib/hooks/useMergedRefs.ts","../lib/components/panel/constants.ts","../lib/components/group/getPanelSizeCssPropertyName.ts","../lib/components/group/GroupContext.ts","../lib/global/utils/getImperativeGroupMethods.ts","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/Group.tsx","../lib/components/group/auto-save/getStorageKey.ts","../lib/components/group/auto-save/saveGroupLayout.ts","../lib/components/group/useDefaultLayout.ts","../lib/components/group/useGroupCallbackRef.ts","../lib/components/group/useGroupRef.ts","../lib/components/group/useGroupContext.ts","../lib/global/utils/getImperativePanelMethods.ts","../lib/components/panel/usePanelImperativeHandle.ts","../lib/components/panel/Panel.tsx","../lib/components/panel/usePanelCallbackRef.ts","../lib/components/panel/usePanelRef.ts","../lib/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\n return panels.map<PanelConstraints>((panel) => {\n const { element, panelConstraints } = panel;\n\n let collapsedSize = 0;\n if (panelConstraints.collapsedSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.collapsedSize\n });\n\n collapsedSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let defaultSize: number | undefined = undefined;\n if (panelConstraints.defaultSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.defaultSize\n });\n\n defaultSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let minSize = 0;\n if (panelConstraints.minSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.minSize\n });\n\n minSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n let maxSize = 100;\n if (panelConstraints.maxSize) {\n const pixels = sizeStyleToPixels({\n groupSize,\n panelElement: element,\n styleProp: panelConstraints.maxSize\n });\n\n maxSize = formatLayoutNumber((pixels / groupSize) * 100);\n }\n\n return {\n collapsedSize,\n collapsible: panelConstraints.collapsible === true,\n defaultSize,\n minSize,\n maxSize,\n panelId: panel.id\n };\n });\n}\n","export type EventMap = {\n [key: string]: unknown;\n};\n\nexport type EventListener<Data> = (data: Data) => void;\n\nexport class EventEmitter<Events extends EventMap> {\n #listenerMap: {\n [Key in keyof Events]?: EventListener<Events[Key]>[];\n } = {};\n\n addListener<Type extends keyof Events>(\n type: Type,\n listener: EventListener<Events[Type]>\n ) {\n const listeners = this.#listenerMap[type];\n if (listeners === undefined) {\n this.#listenerMap[type] = [listener];\n } else {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n }\n\n return () => {\n this.removeListener(type, listener);\n };\n }\n\n emit<Type extends keyof Events>(type: Type, data: Events[Type]) {\n const listeners = this.#listenerMap[type];\n if (listeners !== undefined) {\n if (listeners.length === 1) {\n const listener = listeners[0];\n listener.call(null, data);\n } else {\n let didThrow = false;\n let caughtError = null;\n\n // Clone the current listeners before calling\n // in case calling triggers listeners to be added or removed\n const clonedListeners = Array.from(listeners);\n for (let i = 0; i < clonedListeners.length; i++) {\n const listener = clonedListeners[i];\n try {\n listener.call(null, data);\n } catch (error) {\n if (caughtError === null) {\n didThrow = true;\n caughtError = error;\n }\n }\n }\n\n if (didThrow) {\n throw caughtError;\n }\n }\n }\n }\n\n removeAllListeners() {\n this.#listenerMap = {};\n }\n\n removeListener<Type extends keyof Events>(\n type: Type,\n listener: EventListener<Events[Type]>\n ) {\n const listeners = this.#listenerMap[type];\n if (listeners !== undefined) {\n const index = listeners.indexOf(listener);\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n }\n}\n","import type { Layout, RegisteredGroup } from \"../components/group/types\";\nimport type { PanelConstraints } from \"../components/panel/types\";\nimport { EventEmitter } from \"../utils/EventEmitter\";\nimport type { InteractionState } from \"./types\";\n\ntype UpdaterFunction = (prevState: State) => Partial<State>;\n\nexport type MountedGroupMap = Map<\n RegisteredGroup,\n {\n derivedPanelConstraints: PanelConstraints[];\n layout: Layout;\n }\n>;\n\ntype Events = {\n cursorFlagsChange: number;\n interactionStateChange: InteractionState;\n mountedGroupsChange: MountedGroupMap;\n};\n\ntype State = {\n cursorFlags: number;\n interactionState: InteractionState;\n mountedGroups: MountedGroupMap;\n};\n\nlet state: State = {\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n },\n mountedGroups: new Map()\n};\n\nexport const eventEmitter = new EventEmitter<Events>();\n\nexport function read(): State {\n return state;\n}\n\nexport function update(value: Partial<State> | UpdaterFunction) {\n const partialState = typeof value === \"function\" ? value(state) : value;\n if (state === partialState) {\n return state;\n }\n\n state = {\n ...state,\n ...partialState\n };\n\n if (partialState.cursorFlags !== undefined) {\n eventEmitter.emit(\"cursorFlagsChange\", state.cursorFlags);\n }\n\n if (partialState.interactionState !== undefined) {\n eventEmitter.emit(\"interactionStateChange\", state.interactionState);\n }\n\n if (partialState.mountedGroups !== undefined) {\n eventEmitter.emit(\"mountedGroupsChange\", state.mountedGroups);\n }\n\n return state;\n}\n","// Constants used for memoization\nexport const EMPTY_ARRAY: unknown[] = [];\nexport const EMPTY_DOM_RECT: DOMRectReadOnly = {\n bottom: 0,\n height: 0,\n left: 0,\n right: 0,\n toJSON: () => {},\n top: 0,\n width: 0,\n x: 0,\n y: 0\n};\nexport const EMPTY_OBJECT = {};\nexport const EMPTY_POINT = { x: 0, y: 0 };\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const IDENTITY_FUNCTION = (value: any) => value;\nexport const NOOP_FUNCTION = () => {};\n\n// Cursor flags\nexport const CURSOR_FLAG_HORIZONTAL_MIN = 0b0001;\nexport const CURSOR_FLAG_HORIZONTAL_MAX = 0b0010;\nexport const CURSOR_FLAG_VERTICAL_MIN = 0b0100;\nexport const CURSOR_FLAG_VERTICAL_MAX = 0b1000;\n\n// Misc. shared values\nexport const DEFAULT_POINTER_PRECISION = {\n coarse: 10,\n precise: 5\n};\n","import type { Orientation } from \"./types\";\n\nexport function sortByElementOffset<\n Type extends { element: HTMLElement },\n ReturnType extends Type[]\n>(orientation: Orientation, panelsOrSeparators: Type[]): ReturnType {\n return panelsOrSeparators.sort(\n orientation === \"horizontal\" ? horizontalSort : verticalSort\n ) as ReturnType;\n}\n\nfunction horizontalSort<Type extends { element: HTMLElement }>(\n a: Type,\n b: Type\n) {\n const delta = a.element.offsetLeft - b.element.offsetLeft;\n if (delta !== 0) {\n return delta;\n }\n return a.element.offsetWidth - b.element.offsetWidth;\n}\n\nfunction verticalSort<Type extends { element: HTMLElement }>(a: Type, b: Type) {\n const delta = a.element.offsetTop - b.element.offsetTop;\n if (delta !== 0) {\n return delta;\n }\n return a.element.offsetHeight - b.element.offsetHeight;\n}\n","import { 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\";\n\ntype PanelsTuple = [panel: RegisteredPanel, panel: RegisteredPanel];\n\nexport type HitRegion = {\n group: RegisteredGroup;\n panels: PanelsTuple;\n rect: DOMRect;\n separator: RegisteredSeparator | undefined;\n};\n\n/**\n * Determines hit regions for a Group; a hit region is either:\n * - 1: An explicit Separator element\n * - 2: The edge of a Panel element that has another Panel beside it\n *\n * This method determines bounding rects of all regions for the particular group.\n */\nexport function calculateHitRegions(group: RegisteredGroup) {\n const { element: groupElement, orientation, panels, separators } = group;\n\n // Sort elements by offset before traversing\n const sortedChildElements: HTMLElement[] = sortByElementOffset(\n orientation,\n Array.from(groupElement.children)\n .filter((child) => child instanceof HTMLElement)\n .map((element) => ({ element }))\n ).map(({ element }) => element);\n\n const hitRegions: HitRegion[] = [];\n\n let prevPanel: RegisteredPanel | undefined = undefined;\n let prevSeparator: RegisteredSeparator | undefined = undefined;\n\n for (const childElement of sortedChildElements) {\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 hitRegions.push({\n group,\n panels: [prevPanel, panelData],\n separator: prevSeparator,\n rect:\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 prevPanel = panelData;\n prevSeparator = undefined;\n } else {\n const separatorData = separators.find(\n (current) => current.element === childElement\n );\n if (separatorData) {\n // No-op; this area will be included by default when closing the next panel\n prevSeparator = separatorData;\n } else {\n prevPanel = undefined;\n prevSeparator = undefined;\n }\n }\n }\n\n return hitRegions;\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 type { Point } from \"../../types\";\nimport type { HitRegion } from \"../dom/calculateHitRegions\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosetHitRegion(\n orientation: Orientation,\n hitRegions: HitRegion[],\n point: Point\n) {\n let closestHitRegion: HitRegion | undefined = undefined;\n let minDistance = {\n x: Infinity,\n y: Infinity\n };\n\n for (const hitRegion of hitRegions) {\n const data = getDistanceBetweenPointAndRect(point, hitRegion.rect);\n switch (orientation) {\n case \"horizontal\": {\n if (data.x <= minDistance.x) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n case \"vertical\": {\n if (data.y <= minDistance.y) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n }\n }\n\n return closestHitRegion\n ? {\n distance: minDistance,\n hitRegion: closestHitRegion\n }\n : undefined;\n}\n","let cached: boolean | undefined = undefined;\n\nexport function isCoarsePointer(): boolean {\n if (cached === undefined) {\n if (typeof matchMedia === \"function\") {\n cached = !!matchMedia(\"(pointer:coarse)\").matches;\n } else {\n cached = false;\n }\n }\n\n return cached;\n}\n","import { DEFAULT_POINTER_PRECISION } from \"../../constants\";\nimport type { MountedGroupMap } from \"../mutableState\";\nimport {\n calculateHitRegions,\n type HitRegion\n} from \"../dom/calculateHitRegions\";\nimport { findClosetHitRegion } from \"./findClosetHitRegion\";\nimport { isCoarsePointer } from \"./isCoarsePointer\";\n\nexport function findMatchingHitRegions(\n event: PointerEvent,\n mountedGroups: MountedGroupMap\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedGroups.forEach((_, groupData) => {\n if (groupData.disabled) {\n return;\n }\n\n const maxDistance = isCoarsePointer()\n ? DEFAULT_POINTER_PRECISION.coarse\n : DEFAULT_POINTER_PRECISION.precise;\n\n const hitRegions = calculateHitRegions(groupData);\n const match = findClosetHitRegion(groupData.orientation, hitRegions, {\n x: event.clientX,\n y: event.clientY\n });\n\n if (\n match &&\n match.distance.x <= maxDistance &&\n match.distance.y <= maxDistance\n ) {\n matchingHitRegions.push(match.hitRegion);\n }\n });\n\n return matchingHitRegions;\n}\n","import type { Layout, RegisteredGroup } from \"../../components/group/types\";\nimport type { RegisteredPanel } from \"../../components/panel/types\";\nimport type { RegisteredSeparator } from \"../../components/separator/types\";\nimport { read, update } from \"../mutableState\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\n\nexport function onPointerDown(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { mountedGroups } = read();\n\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n const groups = new Set<RegisteredGroup>();\n const panels = new Set<RegisteredPanel>();\n const separators = new Set<RegisteredSeparator>();\n const initialLayoutMap = new Map<RegisteredGroup, Layout>();\n\n hitRegions.forEach((current) => {\n groups.add(current.group);\n current.panels.forEach((panel) => {\n panels.add(panel);\n });\n if (current.separator) {\n separators.add(current.separator);\n }\n\n const match = mountedGroups.get(current.group);\n if (match) {\n initialLayoutMap.set(current.group, match.layout);\n }\n });\n\n update({\n interactionState: {\n hitRegions,\n initialLayoutMap,\n pointerDownAtPoint: { x: event.clientX, y: event.clientY },\n state: \"active\"\n }\n });\n\n if (hitRegions.length) {\n event.preventDefault();\n }\n}\n","import type { Properties } from \"csstype\";\nimport type { RegisteredGroup } from \"../../components/group/types\";\nimport {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport type { InteractionState } from \"../types\";\n\nexport function getCursorStyle({\n cursorFlags,\n groups,\n state\n}: {\n cursorFlags: number;\n groups: RegisteredGroup[];\n state: InteractionState[\"state\"];\n}): Properties[\"cursor\"] | null {\n let horizontalCount = 0;\n let verticalCount = 0;\n\n switch (state) {\n case \"active\":\n case \"hover\": {\n groups.forEach((group) => {\n if (group.disableCursor) {\n return;\n }\n\n switch (group.orientation) {\n case \"horizontal\": {\n horizontalCount++;\n break;\n }\n case \"vertical\": {\n verticalCount++;\n break;\n }\n }\n });\n }\n }\n\n if (horizontalCount === 0 && verticalCount === 0) {\n return null;\n }\n\n switch (state) {\n case \"active\": {\n const horizontalMin = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MIN) !== 0;\n const horizontalMax = (cursorFlags & CURSOR_FLAG_HORIZONTAL_MAX) !== 0;\n const verticalMin = (cursorFlags & CURSOR_FLAG_VERTICAL_MIN) !== 0;\n const verticalMax = (cursorFlags & CURSOR_FLAG_VERTICAL_MAX) !== 0;\n\n if (cursorFlags) {\n if (horizontalMin) {\n if (verticalMin) {\n return \"se-resize\";\n } else if (verticalMax) {\n return \"ne-resize\";\n } else {\n return \"e-resize\";\n }\n } else if (horizontalMax) {\n if (verticalMin) {\n return \"sw-resize\";\n } else if (verticalMax) {\n return \"nw-resize\";\n } else {\n return \"w-resize\";\n }\n } else if (verticalMin) {\n return \"s-resize\";\n } else if (verticalMax) {\n return \"n-resize\";\n }\n }\n break;\n }\n }\n\n if (horizontalCount > 0 && verticalCount > 0) {\n return \"move\";\n } else if (horizontalCount > 0) {\n return \"ew-resize\";\n } else {\n return \"ns-resize\";\n }\n}\n","import type { Properties } from \"csstype\";\nimport { read } from \"../mutableState\";\nimport { getCursorStyle } from \"./getCursorStyle\";\n\nlet prevCursor: Properties[\"cursor\"] | null = null;\nlet styleSheet: CSSStyleSheet | undefined = undefined;\n\nexport function updateCursorStyle() {\n if (styleSheet === undefined) {\n styleSheet = new CSSStyleSheet();\n\n document.adoptedStyleSheets = [styleSheet];\n }\n\n const { cursorFlags, interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\":\n case \"hover\": {\n const style = getCursorStyle({\n cursorFlags,\n groups: interactionState.hitRegions.map((current) => current.group),\n state: interactionState.state\n });\n\n if (prevCursor === style) {\n return;\n }\n\n prevCursor = style;\n\n if (style) {\n if (styleSheet.cssRules.length === 0) {\n styleSheet.insertRule(`*{cursor: ${style} !important;}`);\n } else {\n styleSheet.replaceSync(`*{cursor: ${style} !important;}`);\n }\n } else if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n case \"inactive\": {\n prevCursor = null;\n\n if (styleSheet.cssRules.length === 1) {\n styleSheet.deleteRule(0);\n }\n break;\n }\n }\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","export function isArrayEqual(a: number[], b: number[]) {\n if (a.length !== b.length) {\n return false;\n } else {\n for (let index = 0; index < a.length; index++) {\n if (a[index] != b[index]) {\n return false;\n }\n }\n }\n return true;\n}\n","import { 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 panelConstraints,\n size\n}: {\n panelConstraints: PanelConstraints;\n size: number;\n}) {\n const {\n collapsedSize = 0,\n collapsible,\n maxSize = 100,\n minSize = 0\n } = panelConstraints;\n\n if (compareLayoutNumbers(size, minSize) < 0) {\n if (collapsible) {\n // Collapsible panels should snap closed or open only once they cross the halfway point between collapsed and min size.\n const halfwayPoint = (collapsedSize + minSize) / 2;\n if (compareLayoutNumbers(size, halfwayPoint) < 0) {\n size = collapsedSize;\n } else {\n size = minSize;\n }\n } else {\n size = minSize;\n }\n }\n\n size = Math.min(maxSize, size);\n size = formatLayoutNumber(size);\n\n return size;\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { assert } from \"../../utils/assert\";\nimport { isArrayEqual } from \"../../utils/isArrayEqual\";\nimport { compareLayoutNumbers } from \"../utils/compareLayoutNumbers\";\nimport { layoutNumbersEqual } from \"../utils/layoutNumbersEqual\";\nimport { validatePanelSize } from \"../utils/validatePanelSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function adjustLayoutByDelta({\n delta,\n initialLayout: initialLayoutProp,\n panelConstraints: panelConstraintsArray,\n pivotIndices,\n prevLayout: prevLayoutProp,\n trigger\n}: {\n delta: number;\n initialLayout: Layout;\n panelConstraints: PanelConstraints[];\n pivotIndices: number[];\n prevLayout: Layout;\n trigger: \"imperative-api\" | \"keyboard\" | \"mouse-or-touch\";\n}): Layout {\n if (layoutNumbersEqual(delta, 0)) {\n return initialLayoutProp;\n }\n\n const initialLayout = Object.values(initialLayoutProp);\n const prevLayout = Object.values(prevLayoutProp);\n const nextLayout = [...initialLayout];\n\n const [firstPivotIndex, secondPivotIndex] = pivotIndices;\n assert(firstPivotIndex != null, \"Invalid first pivot index\");\n assert(secondPivotIndex != null, \"Invalid second pivot index\");\n\n let deltaApplied = 0;\n\n // const DEBUG = [];\n // DEBUG.push(`adjustLayoutByDelta()`);\n // DEBUG.push(` initialLayout: ${initialLayout.join(\", \")}`);\n // DEBUG.push(` prevLayout: ${prevLayout.join(\", \")}`);\n // DEBUG.push(` delta: ${delta}`);\n // DEBUG.push(` pivotIndices: ${pivotIndices.join(\", \")}`);\n // DEBUG.push(` trigger: ${trigger}`);\n // DEBUG.push(\"\");\n\n // A resizing panel affects the panels before or after it.\n //\n // A negative delta means the panel(s) immediately after the separator should grow/expand by decreasing its offset.\n // Other panels may also need to shrink/contract (and shift) to make room, depending on the min weights.\n //\n // A positive delta means the panel(s) immediately before the separator should \"expand\".\n // This is accomplished by shrinking/contracting (and shifting) one or more of the panels after the separator.\n\n {\n // If this is a resize triggered by a keyboard event, our logic for expanding/collapsing is different.\n // We no longer check the halfway threshold because this may prevent the panel from expanding at all.\n if (trigger === \"keyboard\") {\n {\n // Check if we should expand a collapsed panel\n const index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 1: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, collapsedSize)) {\n const localDelta = minSize - prevSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n\n {\n // Check if we should collapse a panel at its minimum size\n const index = delta < 0 ? firstPivotIndex : secondPivotIndex;\n const panelConstraints = panelConstraintsArray[index];\n assert(\n panelConstraints,\n `No panel constraints found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = panelConstraints;\n\n // DEBUG.push(`edge case check 2: ${index}`);\n // DEBUG.push(` -> collapsible? ${collapsible}`);\n if (collapsible) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n if (layoutNumbersEqual(prevSize, minSize)) {\n const localDelta = prevSize - collapsedSize;\n // DEBUG.push(` -> expand delta: ${localDelta}`);\n\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n // DEBUG.push(` -> delta: ${delta}`);\n }\n }\n }\n }\n }\n // DEBUG.push(\"\");\n }\n\n {\n // Pre-calculate max available delta in the opposite direction of our pivot.\n // This will be the maximum amount we're allowed to expand/contract the panels in the primary direction.\n // If this amount is less than the requested delta, adjust the requested delta.\n // If this amount is greater than the requested delta, that's useful information too–\n // as an expanding panel might change from collapsed to min size.\n\n const increment = delta < 0 ? 1 : -1;\n\n let index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let maxAvailableDelta = 0;\n\n // DEBUG.push(\"pre calc...\");\n while (true) {\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const maxSafeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: 100\n });\n const delta = maxSafeSize - prevSize;\n // DEBUG.push(` ${index}: ${prevSize} -> ${maxSafeSize}`);\n\n maxAvailableDelta += delta;\n index += increment;\n\n if (index < 0 || index >= panelConstraintsArray.length) {\n break;\n }\n }\n\n // DEBUG.push(` -> max available delta: ${maxAvailableDelta}`);\n const minAbsDelta = Math.min(Math.abs(delta), Math.abs(maxAvailableDelta));\n delta = delta < 0 ? 0 - minAbsDelta : minAbsDelta;\n // DEBUG.push(` -> adjusted delta: ${delta}`);\n // DEBUG.push(\"\");\n }\n\n {\n // Delta added to a panel needs to be subtracted from other panels (within the constraints that those panels allow).\n\n const pivotIndex = delta < 0 ? firstPivotIndex : secondPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const deltaRemaining = Math.abs(delta) - Math.abs(deltaApplied);\n\n const prevSize = initialLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize - deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaApplied += prevSize - safeSize;\n\n nextLayout[index] = safeSize;\n\n if (\n deltaApplied\n .toFixed(3)\n .localeCompare(Math.abs(delta).toFixed(3), undefined, {\n numeric: true\n }) >= 0\n ) {\n break;\n }\n }\n\n if (delta < 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n // DEBUG.push(`after 1: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n // If we were unable to resize any of the panels panels, return the previous state.\n // This will essentially bailout and ignore e.g. drags past a panel's boundaries\n if (isArrayEqual(prevLayout, nextLayout)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n {\n // Now distribute the applied delta to the panels in the other direction\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n\n const prevSize = initialLayout[pivotIndex];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${pivotIndex}`\n );\n\n const unsafeSize = prevSize + deltaApplied;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[pivotIndex],\n size: unsafeSize\n });\n\n // Adjust the pivot panel before, but only by the amount that surrounding panels were able to shrink/contract.\n nextLayout[pivotIndex] = safeSize;\n\n // Edge case where expanding or contracting one panel caused another one to change collapsed state\n if (!layoutNumbersEqual(safeSize, unsafeSize)) {\n let deltaRemaining = unsafeSize - safeSize;\n\n const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;\n let index = pivotIndex;\n while (index >= 0 && index < panelConstraintsArray.length) {\n const prevSize = nextLayout[index];\n assert(\n prevSize != null,\n `Previous layout not found for panel index ${index}`\n );\n\n const unsafeSize = prevSize + deltaRemaining;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraintsArray[index],\n size: unsafeSize\n });\n\n if (!layoutNumbersEqual(prevSize, safeSize)) {\n deltaRemaining -= safeSize - prevSize;\n\n nextLayout[index] = safeSize;\n }\n\n if (layoutNumbersEqual(deltaRemaining, 0)) {\n break;\n }\n\n if (delta > 0) {\n index--;\n } else {\n index++;\n }\n }\n }\n }\n // DEBUG.push(`after 2: ${nextLayout.join(\", \")}`);\n // DEBUG.push(` deltaApplied: ${deltaApplied}`);\n // DEBUG.push(\"\");\n\n const totalSize = Object.values(nextLayout).reduce(\n (total, size) => size + total,\n 0\n );\n // DEBUG.push(`total size: ${totalSize}`);\n\n // If our new layout doesn't add up to 100%, that means the requested delta can't be applied\n // In that case, fall back to our most recent valid layout\n // Allow for a small rounding difference, else e.g. 3 panel layouts may never be considered valid\n if (!layoutNumbersEqual(totalSize, 100, 0.1)) {\n // DEBUG.push(`bailout to previous layout: ${prevLayout.join(\", \")}`);\n // console.log(DEBUG.join(\"\\n\"));\n\n return prevLayoutProp;\n }\n\n const prevLayoutKeys = Object.keys(prevLayoutProp);\n\n // console.log(DEBUG.join(\"\\n\"));\n return nextLayout.reduce<Layout>((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\n}\n","import type { Layout } from \"../../components/group/types\";\nimport { compareLayoutNumbers } from \"./compareLayoutNumbers\";\n\nexport function layoutsEqual(a: Layout, b: Layout): boolean {\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const id in a) {\n if (compareLayoutNumbers(a[id], b[id]) !== 0) {\n return false;\n }\n }\n\n return true;\n}\n","import {\n CURSOR_FLAG_HORIZONTAL_MAX,\n CURSOR_FLAG_HORIZONTAL_MIN,\n CURSOR_FLAG_VERTICAL_MAX,\n CURSOR_FLAG_VERTICAL_MIN\n} from \"../../constants\";\nimport { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\nimport { adjustLayoutByDelta } from \"../utils/adjustLayoutByDelta\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { layoutsEqual } from \"../utils/layoutsEqual\";\n\nexport function onPointerMove(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const { interactionState, mountedGroups } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n // Edge case (see #340)\n // Detect when the pointer has been released outside an iframe on a different domain\n if (\n // Skip this check for \"pointerleave\" events, else Firefox triggers a false positive (see #514)\n event.type !== \"pointerleave\" &&\n event.buttons === 0\n ) {\n update((prevState) =>\n prevState.interactionState.state === \"inactive\"\n ? prevState\n : {\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n }\n );\n\n return;\n }\n\n let cursorFlags = 0;\n const nextMountedGroups = new Map(mountedGroups);\n\n // Note that HitRegions are frozen once a drag has started\n // Modify the Group layouts for all matching HitRegions though\n interactionState.hitRegions.forEach((current) => {\n const { disableCursor, element, orientation, panels } = current.group;\n\n let deltaAsPercentage = 0;\n if (interactionState.state === \"active\") {\n if (orientation === \"horizontal\") {\n deltaAsPercentage =\n ((event.clientX - interactionState.pointerDownAtPoint.x) /\n element.offsetWidth) *\n 100;\n } else {\n deltaAsPercentage =\n ((event.clientY - interactionState.pointerDownAtPoint.y) /\n element.offsetHeight) *\n 100;\n }\n }\n\n const initialLayout = interactionState.initialLayoutMap.get(\n current.group\n );\n const { derivedPanelConstraints, layout: prevLayout } =\n mountedGroups.get(current.group) ?? {};\n if (derivedPanelConstraints && initialLayout && prevLayout) {\n const nextLayout = adjustLayoutByDelta({\n delta: deltaAsPercentage,\n initialLayout,\n panelConstraints: derivedPanelConstraints,\n pivotIndices: current.panels.map((panel) => panels.indexOf(panel)),\n prevLayout,\n trigger: \"mouse-or-touch\"\n });\n\n if (layoutsEqual(nextLayout, prevLayout)) {\n if (deltaAsPercentage !== 0 && !disableCursor) {\n // An unchanged means the cursor has exceeded the allowed bounds\n switch (orientation) {\n case \"horizontal\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_HORIZONTAL_MIN\n : CURSOR_FLAG_HORIZONTAL_MAX;\n break;\n }\n case \"vertical\": {\n cursorFlags |=\n deltaAsPercentage < 0\n ? CURSOR_FLAG_VERTICAL_MIN\n : CURSOR_FLAG_VERTICAL_MAX;\n break;\n }\n }\n }\n } else {\n nextMountedGroups.set(current.group, {\n derivedPanelConstraints: derivedPanelConstraints,\n layout: nextLayout\n });\n\n // Save the most recent layout for this group of panels in-memory\n // so that layouts will be remembered between different sets of conditionally rendered panels\n const panelIdsKey = current.group.panels\n .map(({ id }) => id)\n .join(\",\");\n current.group.inMemoryLayouts[panelIdsKey] = nextLayout;\n }\n }\n });\n\n update({\n cursorFlags,\n mountedGroups: nextMountedGroups\n });\n\n updateCursorStyle();\n break;\n }\n default: {\n // Update HitRegions if a drag has not been started\n const hitRegions = findMatchingHitRegions(event, mountedGroups);\n\n if (hitRegions.length === 0) {\n if (interactionState.state !== \"inactive\") {\n update({\n interactionState: { state: \"inactive\" }\n });\n }\n } else {\n update({\n interactionState: {\n hitRegions,\n state: \"hover\"\n }\n });\n }\n\n updateCursorStyle();\n break;\n }\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport { read, update } from \"../mutableState\";\n\nexport function onPointerUp(event: PointerEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n event.preventDefault();\n\n const { interactionState } = read();\n\n switch (interactionState.state) {\n case \"active\": {\n update({\n cursorFlags: 0,\n interactionState: {\n state: \"inactive\"\n }\n });\n\n updateCursorStyle();\n }\n }\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function calculateDefaultLayout(\n derivedPanelConstraints: PanelConstraints[]\n): Layout {\n let explicitCount = 0;\n let total = 0;\n\n const layout: Layout = {};\n\n for (const current of derivedPanelConstraints) {\n if (current.defaultSize !== undefined) {\n explicitCount++;\n\n const size = formatLayoutNumber(current.defaultSize);\n\n total += size;\n layout[current.panelId] = size;\n } else {\n // @ts-expect-error Add panel keys in order to simplify traversal elsewhere; we'll fill them in in the loop below\n layout[current.panelId] = undefined;\n }\n }\n\n const remainingPanelCount = derivedPanelConstraints.length - explicitCount;\n if (remainingPanelCount !== 0) {\n const size = formatLayoutNumber((100 - total) / remainingPanelCount);\n\n for (const current of derivedPanelConstraints) {\n if (current.defaultSize === undefined) {\n layout[current.panelId] = size;\n }\n }\n }\n\n return layout;\n}\n","import type { RegisteredGroup } from \"../../components/group/types\";\nimport { calculateAvailableGroupSize } from \"../dom/calculateAvailableGroupSize\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function notifyPanelOnResize(\n group: RegisteredGroup,\n element: HTMLElement,\n borderBoxSize: readonly ResizeObserverSize[]\n) {\n const resizeObserverSize = borderBoxSize[0];\n if (!resizeObserverSize) {\n return;\n }\n\n const panel = group.panels.find((current) => current.element === element);\n if (!panel || !panel.onResize) {\n return;\n }\n\n const groupSize = calculateAvailableGroupSize({ group });\n\n panel.onResize(\n {\n asPercentage: formatLayoutNumber(\n (resizeObserverSize.inlineSize / groupSize) * 100\n ),\n inPixels: resizeObserverSize.inlineSize\n },\n panel.id\n );\n}\n","import type { Layout } from \"../../components/group/types\";\nimport type { PanelConstraints } from \"../../components/panel/types\";\nimport { assert } from \"../../utils/assert\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { validatePanelSize } from \"./validatePanelSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function validatePanelGroupLayout({\n layout,\n panelConstraints\n}: {\n layout: Layout;\n panelConstraints: PanelConstraints[];\n}): Layout {\n const prevLayout = Object.values(layout);\n const nextLayout = [...prevLayout];\n\n const nextLayoutTotalSize = nextLayout.reduce(\n (accumulated, current) => accumulated + current,\n 0\n );\n\n // Validate layout expectations\n if (nextLayout.length !== panelConstraints.length) {\n throw Error(\n `Invalid ${panelConstraints.length} panel layout: ${nextLayout\n .map((size) => `${size}%`)\n .join(\", \")}`\n );\n } else if (\n !layoutNumbersEqual(nextLayoutTotalSize, 100) &&\n nextLayout.length > 0\n ) {\n for (let index = 0; index < panelConstraints.length; index++) {\n const unsafeSize = nextLayout[index];\n assert(unsafeSize != null, `No layout data found for index ${index}`);\n const safeSize = (100 / nextLayoutTotalSize) * unsafeSize;\n nextLayout[index] = safeSize;\n }\n }\n\n let remainingSize = 0;\n\n // First pass: Validate the proposed layout given each panel's constraints\n for (let index = 0; index < panelConstraints.length; index++) {\n const unsafeSize = nextLayout[index];\n assert(unsafeSize != null, `No layout data found for index ${index}`);\n\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraints[index],\n size: unsafeSize\n });\n\n if (unsafeSize != safeSize) {\n remainingSize += unsafeSize - safeSize;\n\n nextLayout[index] = safeSize;\n }\n }\n\n // If there is additional, left over space, assign it to any panel(s) that permits it\n // (It's not worth taking multiple additional passes to evenly distribute)\n if (!layoutNumbersEqual(remainingSize, 0)) {\n for (let index = 0; index < panelConstraints.length; index++) {\n const prevSize = nextLayout[index];\n assert(prevSize != null, `No layout data found for index ${index}`);\n const unsafeSize = prevSize + remainingSize;\n const safeSize = validatePanelSize({\n panelConstraints: panelConstraints[index],\n size: unsafeSize\n });\n\n if (prevSize !== safeSize) {\n remainingSize -= safeSize - prevSize;\n nextLayout[index] = safeSize;\n\n // Once we've used up the remainder, bail\n if (layoutNumbersEqual(remainingSize, 0)) {\n break;\n }\n }\n }\n }\n\n const prevLayoutKeys = Object.keys(layout);\n\n return nextLayout.reduce<Layout>((accumulated, current, index) => {\n accumulated[prevLayoutKeys[index]] = current;\n return accumulated;\n }, {});\n}\n","import type { Layout, RegisteredGroup } from \"../components/group/types\";\nimport { calculatePanelConstraints } from \"./dom/calculatePanelConstraints\";\nimport { update } from \"./mutableState\";\nimport { onPointerDown } from \"./pointer-events/onPointerDown\";\nimport { onPointerMove } from \"./pointer-events/onPointerMove\";\nimport { onPointerUp } from \"./pointer-events/onPointerUp\";\nimport { calculateDefaultLayout } from \"./utils/calculateDefaultLayout\";\nimport { notifyPanelOnResize } from \"./utils/notifyPanelOnResize\";\nimport { validatePanelGroupLayout } from \"./utils/validatePanelGroupLayout\";\n\nexport function mountGroup(group: RegisteredGroup) {\n let isMounted = false;\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 update((prevState) => {\n const match = prevState.mountedGroups.get(group);\n if (match) {\n // Update non-percentage based constraints\n const nextDerivedPanelConstraints =\n calculatePanelConstraints(group);\n\n // Revalidate layout in case constraints have changed\n const prevLayout = match.layout;\n const nextLayout = validatePanelGroupLayout({\n layout: prevLayout,\n panelConstraints: nextDerivedPanelConstraints\n });\n\n return {\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n derivedPanelConstraints: nextDerivedPanelConstraints,\n layout: nextLayout\n })\n };\n }\n return prevState;\n });\n }\n } else {\n notifyPanelOnResize(group, target as HTMLElement, borderBoxSize);\n }\n }\n });\n resizeObserver.observe(group.element);\n group.panels.forEach((panel) => {\n if (panel.onResize) {\n resizeObserver.observe(panel.element);\n }\n });\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 const defaultLayoutUnsafe: Layout =\n group.inMemoryLayouts[panelIdsKey] ??\n group.defaultLayout ??\n calculateDefaultLayout(derivedPanelConstraints);\n const defaultLayoutSafe = validatePanelGroupLayout({\n layout: defaultLayoutUnsafe,\n panelConstraints: derivedPanelConstraints\n });\n\n const nextState = update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n derivedPanelConstraints,\n layout: defaultLayoutSafe\n })\n }));\n\n isMounted = true;\n\n // If this is the first group to be mounted, initialize event handlers\n if (nextState.mountedGroups.size === 1) {\n window.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"pointerleave\", onPointerMove);\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", onPointerUp);\n\n // TODO Add keyboard event listeners\n }\n\n return function unmountGroup() {\n const nextState = update((prevState) => {\n const mountedGroups = new Map(prevState.mountedGroups);\n mountedGroups.delete(group);\n\n return { mountedGroups };\n });\n\n isMounted = false;\n\n // If this was the last group to be mounted, tear down event handlers\n if (nextState.mountedGroups.size === 0) {\n window.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointerleave\", onPointerMove);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n\n // TODO Remove keyboard event listeners\n }\n\n resizeObserver.disconnect();\n };\n}\n","import { useId as useIdReact } from \"react\";\n\nexport function useId(stableId: number | string | undefined) {\n const dynamicId = useIdReact();\n\n return `${stableId ?? dynamicId}`;\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Return>(fn: () => Return): () => Return;\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return;\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(fn);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","import { type Ref } from \"react\";\nimport { useStableCallback } from \"./useStableCallback\";\n\ntype PossibleRef<Type> = Ref<Type> | undefined;\n\nexport function useMergedRefs<Type>(...refs: PossibleRef<Type>[]) {\n return useStableCallback((value: Type | null) => {\n refs.forEach((ref) => {\n if (ref) {\n switch (typeof ref) {\n case \"function\": {\n ref(value);\n break;\n }\n case \"object\": {\n ref.current = value;\n break;\n }\n }\n }\n });\n });\n}\n","export const POINTER_EVENTS_CSS_PROPERTY_NAME =\n \"--react-resizable-panels--panel--pointer-events\";\n","export function getPanelSizeCssPropertyName(groupId: string, panelId: string) {\n const groupIdEscaped = groupId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n const panelIdEscaped = panelId.replace(/[^a-zA-Z0-9\\-_]/g, \"\");\n\n return `--react-resizable-panels--${groupIdEscaped}--${panelIdEscaped}`;\n}\n","import { createContext } from \"react\";\nimport type { GroupContextType } from \"./types\";\n\nexport const GroupContext = createContext<GroupContextType | null>(null);\n","import type {\n GroupImperativeHandle,\n Layout\n} from \"../../components/group/types\";\nimport { read, update } from \"../mutableState\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validatePanelGroupLayout } from \"./validatePanelGroupLayout\";\n\nexport function getImperativeGroupMethods({\n groupId\n}: {\n groupId: string;\n}): GroupImperativeHandle {\n const find = () => {\n const { mountedGroups } = read();\n for (const [group, { derivedPanelConstraints, layout }] of mountedGroups) {\n if (group.id === groupId) {\n return { derivedPanelConstraints, group, layout };\n }\n }\n\n throw Error(`Group ${groupId} not found`);\n };\n\n return {\n getLayout() {\n const { layout } = find();\n\n return layout;\n },\n setLayout(unsafeLayout: Layout) {\n const { derivedPanelConstraints, group, layout: prevLayout } = find();\n\n const nextLayout = validatePanelGroupLayout({\n layout: unsafeLayout,\n panelConstraints: derivedPanelConstraints\n });\n\n if (!layoutsEqual(prevLayout, nextLayout)) {\n update((prevState) => ({\n mountedGroups: new Map(prevState.mountedGroups).set(group, {\n derivedPanelConstraints,\n layout: nextLayout\n })\n }));\n }\n\n return nextLayout;\n }\n };\n}\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { IDENTITY_FUNCTION } from \"../../constants\";\nimport { getImperativeGroupMethods } from \"../../global/utils/getImperativeGroupMethods\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { GroupImperativeHandle } from \"./types\";\n\nexport function useGroupImperativeHandle(\n groupId: string,\n groupRef: Ref<GroupImperativeHandle> | undefined\n) {\n const imperativeGroupRef = useRef<GroupImperativeHandle>({\n getLayout: () => ({}),\n setLayout: IDENTITY_FUNCTION\n });\n\n useImperativeHandle(groupRef, () => imperativeGroupRef.current, []);\n\n useIsomorphicLayoutEffect(() => {\n Object.assign(\n imperativeGroupRef.current,\n getImperativeGroupMethods({ groupId })\n );\n });\n}\n","\"use client\";\nimport { useMemo, useRef, useState } from \"react\";\nimport { mountGroup } from \"../../global/mountGroup\";\nimport { eventEmitter, read } from \"../../global/mutableState\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"../panel/constants\";\nimport type { RegisteredPanel } from \"../panel/types\";\nimport type { RegisteredSeparator } from \"../separator/types\";\nimport { getPanelSizeCssPropertyName } from \"./getPanelSizeCssPropertyName\";\nimport { GroupContext } from \"./GroupContext\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type { GroupProps, Layout, RegisteredGroup } from \"./types\";\nimport { useGroupImperativeHandle } from \"./useGroupImperativeHandle\";\n\n// TODO Validate unique Panel and Separator ids\n// TODO Warn if Group is defaultLayout is provided and Panel(s) do not have ids\n\n/**\n * A Group wraps a set of resizable Panel components.\n * Group content can be resized _horizontally_ or _vertically_.\n *\n * For unit testing purposes, Group elements always include the following data attributes:\n *\n * ```html\n * <div data-group=\"your-group-id\">\n * ```\n */\nexport function Group({\n children,\n className,\n defaultLayout,\n disableCursor,\n disabled,\n elementRef,\n groupRef,\n id: idProp,\n onLayoutChange: onLayoutChangeUnstable,\n orientation = \"horizontal\",\n style\n}: GroupProps) {\n const prevLayoutRef = useRef<Layout>({});\n\n const onLayoutChangeStable = useStableCallback((layout: Layout) => {\n if (layoutsEqual(prevLayoutRef.current, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current = layout;\n onLayoutChangeUnstable?.(layout);\n });\n\n const id = useId(idProp);\n\n const [dragActive, setDragActive] = useState(false);\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n const inMemoryLayoutsRef = useRef<{\n [panelIds: string]: Layout;\n }>({});\n const [layout, setLayout] = useState<Layout>(defaultLayout ?? {});\n const [panels, setPanels] = useState<RegisteredPanel[]>([]);\n const [separators, setSeparators] = useState<RegisteredSeparator[]>([]);\n\n const mergedRef = useMergedRefs(setElement, elementRef);\n\n useGroupImperativeHandle(id, groupRef);\n\n const context = useMemo(\n () => ({\n id,\n orientation,\n registerPanel: (panel: RegisteredPanel) => {\n setPanels((prev) => sortByElementOffset(orientation, [...prev, panel]));\n return () => {\n setPanels((prev) => prev.filter((current) => current !== panel));\n };\n },\n registerSeparator: (separator: RegisteredSeparator) => {\n setSeparators((prev) =>\n sortByElementOffset(orientation, [...prev, separator])\n );\n return () => {\n setSeparators((prev) =>\n prev.filter((current) => current !== separator)\n );\n };\n }\n }),\n [id, orientation]\n );\n\n // Register Group and child Panels/Separators with global state\n // Listen to global state for drag state related to this Group\n useIsomorphicLayoutEffect(() => {\n if (element !== null && panels.length > 0) {\n const group: RegisteredGroup = {\n defaultLayout,\n disableCursor: !!disableCursor,\n disabled: !!disabled,\n element,\n id,\n inMemoryLayouts: inMemoryLayoutsRef.current,\n orientation,\n panels,\n separators\n };\n\n const unmountGroup = mountGroup(group);\n\n const globalState = read();\n const match = globalState.mountedGroups.get(group);\n if (match) {\n setLayout(match.layout);\n onLayoutChangeStable?.(match.layout);\n }\n\n const removeInteractionStateChangeListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n switch (interactionState.state) {\n case \"active\":\n case \"hover\": {\n setDragActive(\n interactionState.hitRegions.some(\n (current) => current.group === group\n )\n );\n break;\n }\n }\n }\n );\n\n const removeMountedGroupsChangeEventListener = eventEmitter.addListener(\n \"mountedGroupsChange\",\n (mountedGroups) => {\n const match = mountedGroups.get(group);\n if (match && match.derivedPanelConstraints.length > 0) {\n setLayout(match.layout);\n onLayoutChangeStable?.(match.layout);\n }\n }\n );\n\n return () => {\n unmountGroup();\n removeInteractionStateChangeListener();\n removeMountedGroupsChangeEventListener();\n };\n }\n }, [\n defaultLayout,\n disableCursor,\n disabled,\n element,\n id,\n onLayoutChangeStable,\n orientation,\n panels,\n separators\n ]);\n\n // Panel layouts and Group dragging state are shared via CSS variables\n const cssVariables: { [key: string]: number | string | undefined } = {\n [POINTER_EVENTS_CSS_PROPERTY_NAME]: dragActive ? \"none\" : undefined\n };\n for (const panelId in layout) {\n const propertyName = getPanelSizeCssPropertyName(id, panelId);\n const flexGrow = layout[panelId];\n cssVariables[propertyName] = flexGrow;\n }\n\n return (\n <GroupContext.Provider value={context}>\n <div\n aria-orientation={orientation}\n className={className}\n data-group={id}\n ref={mergedRef}\n style={{\n ...style,\n ...cssVariables,\n display: \"flex\",\n flexDirection: orientation === \"horizontal\" ? \"row\" : \"column\",\n flexWrap: \"nowrap\"\n }}\n >\n {children}\n </div>\n </GroupContext.Provider>\n );\n}\n","export function getStorageKey(id: string): string {\n return `react-resizable-panels:${id}`;\n}\n","import type { Layout, LayoutStorage } from \"../types\";\nimport { getStorageKey } from \"./getStorageKey\";\n\nexport function saveGroupLayout({\n id,\n layout,\n storage\n}: {\n id: string;\n layout: Layout;\n storage: LayoutStorage;\n}) {\n try {\n const storageKey = getStorageKey(id);\n\n storage.setItem(storageKey, JSON.stringify(layout));\n } catch (error) {\n console.error(error);\n }\n}\n","import { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport { getStorageKey } from \"./auto-save/getStorageKey\";\nimport { saveGroupLayout } from \"./auto-save/saveGroupLayout\";\nimport type { LayoutStorage, OnGroupLayoutChange } from \"./types\";\n\nexport function useDefaultLayout({\n groupId,\n storage\n}: {\n groupId: string;\n storage: LayoutStorage;\n}) {\n // In the event that a client-only storage API is provided,\n // useSyncExternalStore prevents server/client hydration mismatch warning\n // This is not ideal; if possible a server-friendly storage API should be used\n const defaultLayoutString = useSyncExternalStore(\n subscribe,\n () => storage.getItem(getStorageKey(groupId)),\n () => storage.getItem(getStorageKey(groupId))\n );\n\n const defaultLayout = useMemo(\n () => (defaultLayoutString ? JSON.parse(defaultLayoutString) : null),\n [defaultLayoutString]\n );\n\n const onLayoutChange = useCallback<NonNullable<OnGroupLayoutChange>>(\n (layout) =>\n saveGroupLayout({\n id: groupId,\n layout,\n storage\n }),\n [groupId, storage]\n );\n\n return {\n defaultLayout,\n onLayoutChange\n };\n}\n\nfunction subscribe() {\n return function unsubscribe() {};\n}\n","import { useState } from \"react\";\nimport type { GroupImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Group component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function useGroupCallbackRef() {\n return useState<GroupImperativeHandle | null>(null);\n}\n","import { useRef } from \"react\";\nimport type { GroupImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Group component.\n */\nexport function useGroupRef() {\n return useRef<GroupImperativeHandle>(null);\n}\n","import { useContext } from \"react\";\nimport { assert } from \"../../utils/assert\";\nimport { GroupContext } from \"./GroupContext\";\n\nexport function useGroupContext() {\n const context = useContext(GroupContext);\n assert(context, \"Unexpected\");\n\n return context;\n}\n","import type { PanelImperativeHandle } from \"../../components/panel/types\";\nimport { calculateAvailableGroupSize } from \"../dom/calculateAvailableGroupSize\";\nimport { read } from \"../mutableState\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\n\nexport function getImperativePanelMethods({\n groupId,\n panelId\n}: {\n groupId: string;\n panelId: string;\n}): PanelImperativeHandle {\n const find = () => {\n const { mountedGroups } = read();\n for (const [group, { derivedPanelConstraints, layout }] of mountedGroups) {\n if (group.id === groupId) {\n return { derivedPanelConstraints, group, layout };\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 = (_size: number) => {\n // TODO Calculate next layout\n // TODO Validate next layout\n // TODO Update group state\n };\n\n return {\n collapse: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const size = getPanelSize();\n\n if (collapsible && size !== collapsedSize) {\n setPanelSize(collapsedSize);\n }\n },\n expand: () => {\n const { collapsible, collapsedSize, minSize } = getPanelConstraints();\n const size = getPanelSize();\n\n if (collapsible && size === collapsedSize) {\n setPanelSize(minSize);\n }\n },\n getSize: () => {\n const { group } = find();\n const asPercentage = getPanelSize();\n const { element } = getPanel();\n\n const inPixels =\n group.orientation === \"horizontal\"\n ? element.offsetWidth\n : element.offsetHeight;\n\n return {\n asPercentage,\n inPixels\n };\n },\n isCollapsed: () => {\n const { collapsible, collapsedSize } = getPanelConstraints();\n const size = getPanelSize();\n\n return collapsible && layoutNumbersEqual(collapsedSize, size);\n },\n resize: (size: number | string) => {\n const prevSize = getPanelSize();\n if (prevSize !== size) {\n let asPercentage;\n switch (typeof size) {\n case \"number\": {\n const { group } = find();\n const groupSize = calculateAvailableGroupSize({ group });\n asPercentage = formatLayoutNumber((size / groupSize) * 100);\n break;\n }\n case \"string\": {\n asPercentage = parseFloat(size);\n break;\n }\n }\n\n setPanelSize(asPercentage);\n }\n }\n } satisfies PanelImperativeHandle;\n}\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { NOOP_FUNCTION } from \"../../constants\";\nimport { getImperativePanelMethods } from \"../../global/utils/getImperativePanelMethods\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { PanelImperativeHandle } from \"./types\";\n\nexport function usePanelImperativeHandle(\n panelId: string,\n panelRef: Ref<PanelImperativeHandle> | undefined\n) {\n const { id: groupId } = useGroupContext();\n\n const imperativePanelRef = useRef<PanelImperativeHandle>({\n collapse: NOOP_FUNCTION,\n expand: NOOP_FUNCTION,\n getSize: () => ({\n asPercentage: 0,\n inPixels: 0\n }),\n isCollapsed: () => false,\n resize: NOOP_FUNCTION\n });\n\n useImperativeHandle(panelRef, () => imperativePanelRef.current, []);\n\n useIsomorphicLayoutEffect(() => {\n Object.assign(\n imperativePanelRef.current,\n getImperativePanelMethods({ groupId, panelId })\n );\n });\n}\n","\"use client\";\n\nimport type { Property } from \"csstype\";\nimport { useState } from \"react\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { getPanelSizeCssPropertyName } from \"../group/getPanelSizeCssPropertyName\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport { POINTER_EVENTS_CSS_PROPERTY_NAME } from \"./constants\";\nimport type { PanelProps, PanelSize } from \"./types\";\nimport { usePanelImperativeHandle } from \"./usePanelImperativeHandle\";\n\n// TODO Validate CSS styles\n// Warn and remove the following: width/height (including min/max), flex/flex-basis/flex-grow/flex-shrink, and padding\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 specified using the following CSS units:\n * - Pixels (default if value is of type `number`)\n * - Percentages (default if value is of type `string`)\n * - Font sizes (em, rem)\n * - Viewport sizes (vh, vw)\n *\n * For unit testing purposes, Panel elements always include the following data attributes:\n *\n * ```html\n * <div data-panel=\"your-panel-id\">\n * ```\n */\nexport function Panel({\n children,\n className,\n collapsedSize = 0,\n collapsible = false,\n defaultSize,\n elementRef,\n id: idProp,\n maxSize = \"100\",\n minSize = \"0\",\n onResize: onResizeUnstable,\n panelRef,\n style\n}: PanelProps) {\n const idIsStable = !!idProp;\n\n const id = useId(idProp);\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const mergedRef = useMergedRefs(setElement, elementRef);\n\n const { id: groupId, registerPanel } = useGroupContext();\n\n const hasOnResize = onResizeUnstable !== null;\n const onResizeStable = useStableCallback((panelSize: PanelSize) => {\n onResizeUnstable?.(panelSize, idProp);\n });\n\n // Register Panel with parent Group\n useIsomorphicLayoutEffect(() => {\n if (element !== null) {\n return registerPanel({\n element,\n id,\n idIsStable,\n onResize: hasOnResize ? onResizeStable : undefined,\n panelConstraints: {\n collapsedSize,\n collapsible,\n defaultSize,\n maxSize,\n minSize\n }\n });\n }\n }, [\n collapsedSize,\n collapsible,\n defaultSize,\n element,\n hasOnResize,\n id,\n idIsStable,\n maxSize,\n minSize,\n onResizeStable,\n registerPanel\n ]);\n\n usePanelImperativeHandle(id, panelRef);\n\n const flexGrowVar = getPanelSizeCssPropertyName(groupId, id);\n\n return (\n <div\n data-panel={id}\n ref={mergedRef}\n style={{\n flexBasis: 0,\n flexGrow: `var(${flexGrowVar}, 1)`,\n flexShrink: 1,\n\n // Prevent Panel content from interfering with panel size\n overflow: \"hidden\",\n\n // Disable pointer events inside of a panel during resize\n // This avoid edge cases like nested iframes\n pointerEvents:\n `var(${POINTER_EVENTS_CSS_PROPERTY_NAME})` as Property.PointerEvents\n }}\n >\n <div\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n ...style\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { PanelImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Panel component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function usePanelCallbackRef() {\n return useState<PanelImperativeHandle | null>(null);\n}\n","import { useRef } from \"react\";\nimport type { PanelImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Panel component.\n */\nexport function usePanelRef() {\n return useRef<PanelImperativeHandle>(null);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { eventEmitter } from \"../../global/mutableState\";\nimport type { InteractionState } from \"../../global/types\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { RegisteredSeparator, SeparatorProps } from \"./types\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\n\n/**\n * Separators are not _required_ but they are _recommended_ as they improve keyboard accessibility.\n *\n * Separators should be rendered as the direct child of a Group component.\n *\n * For unit testing purposes, Separator elements always include the following data attributes:\n *\n * ```html\n * <div data-separator=\"your-separator-id\" role=\"separator\" />\n * ```\n */\nexport function Separator({\n children,\n className,\n elementRef,\n id: idProp,\n style\n}: SeparatorProps) {\n const id = useId(idProp);\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n const [dragState, setDragState] =\n useState<InteractionState[\"state\"]>(\"inactive\");\n\n const mergedRef = useMergedRefs(setElement, elementRef);\n\n const { orientation: groupOrientation, registerSeparator } =\n useGroupContext();\n const orientation =\n groupOrientation === \"horizontal\" ? \"vertical\" : \"horizontal\";\n\n // Register Separator with parent Group\n // Listen to global state for drag state related to this Separator\n useIsomorphicLayoutEffect(() => {\n if (element !== null) {\n const separator: RegisteredSeparator = {\n element,\n id\n };\n\n const unregisterSeparator = registerSeparator(separator);\n\n const removeEventListener = eventEmitter.addListener(\n \"interactionStateChange\",\n (interactionState) => {\n setDragState(\n interactionState.state !== \"inactive\" &&\n interactionState.hitRegions.some(\n (hitRegion) => hitRegion.separator === separator\n )\n ? interactionState.state\n : \"inactive\"\n );\n }\n );\n\n return () => {\n unregisterSeparator();\n removeEventListener();\n };\n }\n }, [element, id, registerSeparator]);\n\n // TODO ARIA attributes aria-valuenow, aria-valuemin, and aria-valuemax\n // These values should correspond to the Panel before the Separator\n return (\n <div\n aria-orientation={orientation}\n children={children}\n className={className}\n data-separator={id}\n data-separator-state={dragState}\n ref={mergedRef}\n role=\"separator\"\n style={{\n flexBasis: \"auto\",\n ...style,\n flexGrow: 0,\n flexShrink: 0\n }}\n tabIndex={0}\n />\n );\n}\n"],"names":["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","panelConstraints","collapsedSize","defaultSize","minSize","maxSize","EventEmitter","#listenerMap","type","listener","listeners","data","didThrow","caughtError","clonedListeners","i","error","index","state","eventEmitter","read","update","partialState","IDENTITY_FUNCTION","NOOP_FUNCTION","CURSOR_FLAG_HORIZONTAL_MIN","CURSOR_FLAG_HORIZONTAL_MAX","CURSOR_FLAG_VERTICAL_MIN","CURSOR_FLAG_VERTICAL_MAX","DEFAULT_POINTER_PRECISION","sortByElementOffset","panelsOrSeparators","horizontalSort","verticalSort","a","b","delta","calculateHitRegions","groupElement","separators","sortedChildElements","child","hitRegions","prevPanel","prevSeparator","childElement","panelData","current","prevRect","rect","separatorData","getDistanceBetweenPointAndRect","point","findClosetHitRegion","closestHitRegion","minDistance","hitRegion","cached","isCoarsePointer","findMatchingHitRegions","event","mountedGroups","matchingHitRegions","_","groupData","maxDistance","match","onPointerDown","groups","initialLayoutMap","getCursorStyle","cursorFlags","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","prevCursor","styleSheet","updateCursorStyle","interactionState","assert","expectedCondition","message","isArrayEqual","layoutNumbersEqual","actual","expected","minimumDelta","compareLayoutNumbers","validatePanelSize","collapsible","halfwayPoint","adjustLayoutByDelta","initialLayoutProp","panelConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","prevLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","increment","maxAvailableDelta","prevSize","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","total","prevLayoutKeys","accumulated","layoutsEqual","id","onPointerMove","prevState","nextMountedGroups","disableCursor","deltaAsPercentage","derivedPanelConstraints","panelIdsKey","onPointerUp","calculateDefaultLayout","explicitCount","layout","remainingPanelCount","notifyPanelOnResize","borderBoxSize","resizeObserverSize","validatePanelGroupLayout","nextLayoutTotalSize","remainingSize","mountGroup","isMounted","resizeObserver","entries","entry","target","nextDerivedPanelConstraints","defaultLayoutUnsafe","defaultLayoutSafe","nextState","useId","stableId","dynamicId","useIdReact","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useStableCallback","fn","ref","useRef","useCallback","args","useMergedRefs","refs","POINTER_EVENTS_CSS_PROPERTY_NAME","getPanelSizeCssPropertyName","groupId","panelId","groupIdEscaped","panelIdEscaped","GroupContext","createContext","getImperativeGroupMethods","find","unsafeLayout","useGroupImperativeHandle","groupRef","imperativeGroupRef","useImperativeHandle","Group","children","className","defaultLayout","disabled","elementRef","idProp","onLayoutChangeUnstable","prevLayoutRef","onLayoutChangeStable","dragActive","setDragActive","useState","setElement","inMemoryLayoutsRef","setLayout","setPanels","setSeparators","mergedRef","context","useMemo","prev","separator","unmountGroup","removeInteractionStateChangeListener","removeMountedGroupsChangeEventListener","cssVariables","propertyName","flexGrow","jsx","getStorageKey","saveGroupLayout","storage","storageKey","useDefaultLayout","defaultLayoutString","useSyncExternalStore","subscribe","onLayoutChange","useGroupCallbackRef","useGroupRef","useGroupContext","useContext","getImperativePanelMethods","getPanelConstraints","getPanel","getPanelSize","asPercentage","inPixels","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","onResizeUnstable","idIsStable","registerPanel","hasOnResize","onResizeStable","panelSize","flexGrowVar","usePanelCallbackRef","usePanelRef","Separator","dragState","setDragState","groupOrientation","registerSeparator","unregisterSeparator","removeEventListener"],"mappings":"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"}
@@ -1,2 +1,331 @@
1
- export * from "./declarations/src/index.js";
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtcmVzaXphYmxlLXBhbmVscy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi9kZWNsYXJhdGlvbnMvc3JjL2luZGV4LmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEifQ==
1
+ import { CSSProperties } from 'react';
2
+ import { Dispatch } from 'react';
3
+ import { JSX } from 'react/jsx-runtime';
4
+ import { PropsWithChildren } from 'react';
5
+ import { ReactNode } from 'react';
6
+ import { Ref } from 'react';
7
+ import { RefObject } from 'react';
8
+ import { SetStateAction } from 'react';
9
+
10
+ /**
11
+ * A Group wraps a set of resizable Panel components.
12
+ * Group content can be resized _horizontally_ or _vertically_.
13
+ *
14
+ * For unit testing purposes, Group elements always include the following data attributes:
15
+ *
16
+ * ```html
17
+ * <div data-group="your-group-id">
18
+ * ```
19
+ */
20
+ export declare function Group({ children, className, defaultLayout, disableCursor, disabled, elementRef, groupRef, id: idProp, onLayoutChange: onLayoutChangeUnstable, orientation, style }: GroupProps): JSX.Element;
21
+
22
+ /**
23
+ * Imperative Group API.
24
+ *
25
+ * ℹ️ The `useGroupRef` and `useGroupCallbackRef` hooks are exported for convenience use in TypeScript projects.
26
+ */
27
+ declare interface GroupImperativeHandle {
28
+ /**
29
+ * Get the Group's current layout as a map of Panel id to percentage (0..100)
30
+ *
31
+ * @return Map of Panel id to percentage (0..100)
32
+ */
33
+ getLayout: () => {
34
+ [panelId: string]: number;
35
+ };
36
+ /**
37
+ * Set a new layout for the Group
38
+ *
39
+ * @param layout Map of Panel id to percentage (0..100)
40
+ * @return Applied layout (after validation)
41
+ */
42
+ setLayout: (layout: {
43
+ [panelId: string]: number;
44
+ }) => Layout;
45
+ }
46
+
47
+ export declare type GroupProps = {
48
+ /**
49
+ * Panel and Separator components that comprise this group.
50
+ */
51
+ children?: ReactNode | undefined;
52
+ /**
53
+ * CSS class name.
54
+ */
55
+ className?: string | undefined;
56
+ /**
57
+ * Default layout for the Group.
58
+ *
59
+ * ℹ️ This value allows layouts to be remembered between page reloads.
60
+ *
61
+ * ⚠️ Refer to the documentation for how to avoid layout shift when using server components.
62
+ */
63
+ defaultLayout?: Layout | undefined;
64
+ /**
65
+ * This library sets custom mouse cursor styles to indicate drag state.
66
+ * Use this prop to disable that behavior for Panels and Separators in this group.
67
+ */
68
+ disableCursor?: boolean | undefined;
69
+ /**
70
+ * Disable resize functionality.
71
+ */
72
+ disabled?: boolean | undefined;
73
+ /**
74
+ * Ref attached to the root `HTMLDivElement`.
75
+ */
76
+ elementRef?: Ref<HTMLDivElement> | undefined;
77
+ /**
78
+ * Exposes the following imperative API:
79
+ * - `getLayout(): Layout`
80
+ * - `setLayout(layout: Layout): void`
81
+ *
82
+ * ℹ️ The `useGroupRef` and `useGroupCallbackRef` hooks are exported for convenience use in TypeScript projects.
83
+ */
84
+ groupRef?: Ref<GroupImperativeHandle> | undefined;
85
+ /**
86
+ * Uniquely identifies this group within an application.
87
+ * Falls back to `useId` when not provided.
88
+ *
89
+ * ℹ️ This value will also be assigned to the `data-group` attribute.
90
+ */
91
+ id?: string | number | undefined;
92
+ /**
93
+ * Called when panel sizes change; receives a map of Panel id to size.
94
+ */
95
+ onLayoutChange?: (layout: Layout) => void | undefined;
96
+ /**
97
+ * Specifies the resizable orientation ("horizontal" or "vertical"); defaults to "horizontal"
98
+ */
99
+ orientation?: "horizontal" | "vertical" | undefined;
100
+ /**
101
+ * CSS properties.
102
+ *
103
+ * ⚠️ The following styles cannot be overridden: `display`, `flex-direction`, `flex-wrap`, and `overflow`.
104
+ */
105
+ style?: CSSProperties | undefined;
106
+ };
107
+
108
+ /**
109
+ * Map of Panel id to flexGrow value;
110
+ */
111
+ export declare type Layout = {
112
+ [id: string]: number;
113
+ };
114
+
115
+ export declare type LayoutStorage = Pick<Storage, "getItem" | "setItem">;
116
+
117
+ export declare type OnGroupLayoutChange = GroupProps["onLayoutChange"];
118
+
119
+ export declare type OnPanelResize = PanelProps["onResize"];
120
+
121
+ /**
122
+ * Panel group orientation loosely relates to the `aria-orientation` attribute.
123
+ * It determines how panels are are laid out within the group group and the direction they can be resized in.
124
+ */
125
+ export declare type Orientation = "horizontal" | "vertical";
126
+
127
+ /**
128
+ * A Panel wraps resizable content and can be configured with min/max size constraints and collapsible behavior.
129
+ *
130
+ * Panel size props can be specified using the following CSS units:
131
+ * - Pixels (default if value is of type `number`)
132
+ * - Percentages (default if value is of type `string`)
133
+ * - Font sizes (em, rem)
134
+ * - Viewport sizes (vh, vw)
135
+ *
136
+ * For unit testing purposes, Panel elements always include the following data attributes:
137
+ *
138
+ * ```html
139
+ * <div data-panel="your-panel-id">
140
+ * ```
141
+ */
142
+ export declare function Panel({ children, className, collapsedSize, collapsible, defaultSize, elementRef, id: idProp, maxSize, minSize, onResize: onResizeUnstable, panelRef, style }: PanelProps): JSX.Element;
143
+
144
+ /**
145
+ * Imperative Panel API
146
+ *
147
+ * ℹ️ The `usePanelRef` and `usePanelCallbackRef` hooks are exported for convenience use in TypeScript projects.
148
+ */
149
+ declare interface PanelImperativeHandle {
150
+ /**
151
+ * Collapse the Panel to it's `collapsedSize`.
152
+ *
153
+ * ⚠️ This method will do nothing if the Panel is not `collapsible` or if it is already collapsed.
154
+ */
155
+ collapse: () => void;
156
+ /**
157
+ * Expand a collapsed Panel to its most recent size.
158
+ *
159
+ * ⚠️ This method will do nothing if the Panel is not currently collapsed.
160
+ */
161
+ expand: () => void;
162
+ /**
163
+ * Get the current size of the Panel in pixels as well as a percentage of the parent group (0..100).
164
+ *
165
+ * @return Panel size (in pixels and as a percentage of the parent group)
166
+ */
167
+ getSize: () => PanelSize;
168
+ /**
169
+ * The Panel is currently collapsed.
170
+ */
171
+ isCollapsed: () => boolean;
172
+ /**
173
+ * Update the Panel's size.
174
+ *
175
+ * ℹ️ Size may be specified in pixel format (number) or as a percentage (string).
176
+ *
177
+ * @param size New panel size
178
+ * @return Applied size (after validation)
179
+ */
180
+ resize: (size: number | string) => void;
181
+ }
182
+
183
+ export declare type PanelProps = PropsWithChildren<{
184
+ /**
185
+ * CSS class name.
186
+ *
187
+ * ⚠️ Class is applied to nested `HTMLDivElement` to avoid styles that interfere with Flex layout.
188
+ */
189
+ className?: string | undefined;
190
+ /**
191
+ * Panel size when collapsed; defaults to 0.
192
+ */
193
+ collapsedSize?: number | string | undefined;
194
+ /**
195
+ * This panel can be collapsed.
196
+ *
197
+ * ℹ️ A collapsible panel will collapse when it's size is less than of the specified `minSize`
198
+ */
199
+ collapsible?: boolean | undefined;
200
+ /**
201
+ * Default size of Panel within its parent group; default is auto-assigned based on the total number of Panels.
202
+ */
203
+ defaultSize?: number | string | undefined;
204
+ /**
205
+ * Ref attached to the root `HTMLDivElement`.
206
+ */
207
+ elementRef?: Ref<HTMLDivElement> | undefined;
208
+ /**
209
+ * Uniquely identifies this panel within the parent group.
210
+ * Falls back to `useId` when not provided.
211
+ *
212
+ * ℹ️ This prop is used to associate persisted group layouts with the original panel.
213
+ *
214
+ * ℹ️ This value will also be assigned to the `data-panel` attribute.
215
+ */
216
+ id?: string | number | undefined;
217
+ /**
218
+ * Maximum size of Panel within its parent group; defaults to 100%.
219
+ */
220
+ maxSize?: number | string | undefined;
221
+ /**
222
+ * Minimum size of Panel within its parent group; defaults to 0%.
223
+ */
224
+ minSize?: number | string | undefined;
225
+ /**
226
+ * Called when panel sizes change; receives a map of Panel id to size.
227
+ */
228
+ onResize?: ((panelSize: PanelSize, id: string | number | undefined) => void) | undefined;
229
+ /**
230
+ * Exposes the following imperative API:
231
+ * - `collapse(): void`
232
+ * - `expand(): void`
233
+ * - `getSize(): number`
234
+ * - `isCollapsed(): boolean`
235
+ * - `isExpanded(): boolean`
236
+ * - `resize(size: number): void`
237
+ *
238
+ * ℹ️ The `usePanelRef` and `usePanelCallbackRef` hooks are exported for convenience use in TypeScript projects.
239
+ */
240
+ panelRef?: Ref<PanelImperativeHandle> | undefined;
241
+ /**
242
+ * CSS properties.
243
+ *
244
+ * ⚠️ Style is applied to nested `HTMLDivElement` to avoid styles that interfere with Flex layout.
245
+ */
246
+ style?: CSSProperties | undefined;
247
+ }>;
248
+
249
+ export declare type PanelSize = {
250
+ asPercentage: number;
251
+ inPixels: number;
252
+ };
253
+
254
+ /**
255
+ * Separators are not _required_ but they are _recommended_ as they improve keyboard accessibility.
256
+ *
257
+ * Separators should be rendered as the direct child of a Group component.
258
+ *
259
+ * For unit testing purposes, Separator elements always include the following data attributes:
260
+ *
261
+ * ```html
262
+ * <div data-separator="your-separator-id" role="separator" />
263
+ * ```
264
+ */
265
+ export declare function Separator({ children, className, elementRef, id: idProp, style }: SeparatorProps): JSX.Element;
266
+
267
+ export declare type SeparatorProps = PropsWithChildren<{
268
+ /**
269
+ * CSS class name.
270
+ *
271
+ * ℹ️ Use the `data-separator-state` attribute for custom _hover_ and _active_ styles
272
+ *
273
+ * ⚠️ The following properties cannot be overridden: `flex-grow`, `flex-shrink`
274
+ */
275
+ className?: string | undefined;
276
+ /**
277
+ * Ref attached to the root `HTMLDivElement`.
278
+ */
279
+ elementRef?: Ref<HTMLDivElement> | undefined;
280
+ /**
281
+ * Uniquely identifies the separator within the parent group.
282
+ * Falls back to `useId` when not provided.
283
+ *
284
+ * ℹ️ This value will also be assigned to the `data-separator` attribute.
285
+ */
286
+ id?: string | number | undefined;
287
+ /**
288
+ * CSS properties.
289
+ *
290
+ * ℹ️ Use the `data-separator-state` attribute for custom _hover_ and _active_ styles
291
+ *
292
+ * ⚠️ The following properties cannot be overridden: `flex-grow`, `flex-shrink`
293
+ */
294
+ style?: CSSProperties | undefined;
295
+ }>;
296
+
297
+ export declare type SizeUnit = "px" | "%" | "em" | "rem" | "vh" | "vw";
298
+
299
+ export declare function useDefaultLayout({ groupId, storage }: {
300
+ groupId: string;
301
+ storage: LayoutStorage;
302
+ }): {
303
+ defaultLayout: any;
304
+ onLayoutChange: (layout: Layout) => void | undefined;
305
+ };
306
+
307
+ /**
308
+ * Convenience hook to return a properly typed ref callback for the Group component.
309
+ *
310
+ * Use this hook when you need to share the ref with another component or hook.
311
+ */
312
+ export declare function useGroupCallbackRef(): [GroupImperativeHandle | null, Dispatch<SetStateAction<GroupImperativeHandle | null>>];
313
+
314
+ /**
315
+ * Convenience hook to return a properly typed ref for the Group component.
316
+ */
317
+ export declare function useGroupRef(): RefObject<GroupImperativeHandle | null>;
318
+
319
+ /**
320
+ * Convenience hook to return a properly typed ref callback for the Panel component.
321
+ *
322
+ * Use this hook when you need to share the ref with another component or hook.
323
+ */
324
+ export declare function usePanelCallbackRef(): [PanelImperativeHandle | null, Dispatch<SetStateAction<PanelImperativeHandle | null>>];
325
+
326
+ /**
327
+ * Convenience hook to return a properly typed ref for the Panel component.
328
+ */
329
+ export declare function usePanelRef(): RefObject<PanelImperativeHandle | null>;
330
+
331
+ export { }