react-resizable-panels 4.14.0 → 4.14.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.
@@ -1 +1 @@
1
- {"version":3,"file":"react-resizable-panels.js","sources":["../lib/hooks/useId.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/hooks/useStableCallback.ts","../lib/hooks/useMergedRefs.ts","../lib/components/grid/gridPlacement.ts","../lib/utils/assert.ts","../lib/components/grid/GridContext.ts","../lib/components/grid/useGridContext.ts","../lib/components/grid/Cell.tsx","../lib/global/utils/isCoarsePointer.ts","../lib/global/utils/expandHitTarget.ts","../lib/components/grid/excludeSpanningCells.ts","../lib/components/grid/calculateGridHitRegions.ts","../lib/components/grid/measureGridAxis.ts","../lib/global/styles/parseSizeAndUnit.ts","../lib/utils/EventEmitter.ts","../lib/global/mutable-state/interactions.ts","../lib/constants.ts","../lib/global/cursor/supportsAdvancedCursorStyles.ts","../lib/global/cursor/getCursorStyle.ts","../lib/global/cursor/updateCursorStyle.ts","../lib/global/dom/calculateAvailableAxisSize.ts","../lib/components/group/sortByElementOffset.ts","../lib/utils/isHTMLElement.ts","../lib/global/utils/getDistanceBetweenPointAndRect.ts","../lib/global/utils/findClosestRect.ts","../lib/global/dom/calculateHitRegions.ts","../lib/global/styles/convertEmToPixels.ts","../lib/global/styles/convertRemToPixels.ts","../lib/global/styles/convertVhToPixels.ts","../lib/global/styles/convertVwToPixels.ts","../lib/global/styles/sizeStyleToPixels.ts","../lib/global/utils/formatLayoutNumber.ts","../lib/global/dom/calculateItemConstraints.ts","../lib/global/mutable-state/axes.ts","../lib/utils/isArrayEqual.ts","../lib/global/utils/layoutNumbersEqual.ts","../lib/global/utils/compareLayoutNumbers.ts","../lib/global/utils/validateItemSize.ts","../lib/global/utils/adjustLayoutByDelta.ts","../lib/global/utils/layoutsEqual.ts","../lib/global/utils/updateActiveHitRegion.ts","../lib/global/utils/completeActivePointerResize.ts","../lib/global/event-handlers/onDocumentContextMenu.ts","../lib/global/utils/findClosestHitRegion.ts","../lib/utils/isShadowRoot.ts","../lib/vendor/stacking-order.ts","../lib/global/utils/doRectsIntersect.ts","../lib/global/utils/isModal.ts","../lib/global/utils/isViableHitTarget.ts","../lib/global/utils/findMatchingHitRegions.ts","../lib/global/utils/validateAxisLayout.ts","../lib/global/utils/getImperativeItemMethods.ts","../lib/global/event-handlers/onDocumentDoubleClick.ts","../lib/global/utils/findSeparatorAxis.ts","../lib/global/utils/getImperativeAxisMethods.ts","../lib/global/utils/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onDocumentKeyDown.ts","../lib/global/utils/calculateResizePreviews.ts","../lib/global/event-handlers/onDocumentPointerDown.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/validateLayoutKeys.ts","../lib/global/utils/getDefaultLayout.ts","../lib/global/utils/notifyItemOnResize.ts","../lib/global/utils/objectsEqual.ts","../lib/global/utils/itemConstraintsEqual.ts","../lib/global/utils/preserveFixedItemSizes.ts","../lib/global/mountAxis.ts","../lib/global/utils/recordAxisLayoutChange.ts","../lib/hooks/useForceUpdate.ts","../lib/hooks/useStableObject.ts","../lib/components/group/GroupContext.ts","../lib/global/utils/calculateSeparatorAriaValues.ts","../lib/components/shared/ResizeSeparator.tsx","../lib/components/grid/GridTrackSeparator.tsx","../lib/components/grid/Gridline.tsx","../lib/components/grid/Grid.tsx","../lib/components/grid/useDefaultGridLayout.ts","../lib/components/grid/useGridCallbackRef.ts","../lib/components/grid/useGridRef.ts","../lib/components/separator/SeparatorClone.tsx","../lib/components/group/useGroupContext.ts","../lib/components/separator/SeparatorOverlay.tsx","../lib/components/separator/SeparatorOverlayRenderer.tsx","../lib/components/group/ResizePreview.tsx","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/useResizePreviews.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/panel/usePanelImperativeHandle.ts","../lib/components/panel/Panel.tsx","../lib/components/panel/usePanelCallbackRef.ts","../lib/components/panel/usePanelRef.ts","../lib/components/separator/Separator.tsx"],"sourcesContent":["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","/**\n * When a Grid axis contains separators, \"gutter\" tracks are interleaved between the content tracks\n * (e.g. `grid-template-columns: 1fr auto 1fr`) so separators can be placed between cells.\n * These helpers convert track indices to CSS grid lines accordingly.\n */\n\n// Returns the (1-based) CSS grid line where the specified track starts\nexport function getTrackGridLine(index: number, hasGutters: boolean) {\n return hasGutters ? index * 2 + 1 : index + 1;\n}\n\n// Returns the number of CSS grid tracks spanned by the specified number of content tracks\nexport function getTrackGridSpan(span: number, hasGutters: boolean) {\n return hasGutters ? span * 2 - 1 : span;\n}\n\n// Returns the CSS grid placement (e.g. \"1 / span 3\") for the specified track range\nexport function getTrackGridPlacement(\n index: number,\n span: number | undefined,\n hasGutters: boolean\n) {\n const line = getTrackGridLine(index, hasGutters);\n\n return span === undefined\n ? `${line} / -1`\n : `${line} / span ${getTrackGridSpan(span, hasGutters)}`;\n}\n\n// Returns the CSS grid placement for the gutter between tracks `index - 1` and `index`\nexport function getGutterGridPlacement(index: number) {\n return `${index * 2} / span 1`;\n}\n\n// Returns the CSS grid placement for a separator along the opposite axis (e.g. the rows a column separator spans).\n// Separators that don't start (or end) at the edge of the grid extend into the adjacent gutter (if there is one)\n// so that they meet any separators that intersect them.\nexport function getSeparatorCrossGridPlacement({\n crossCount,\n crossSpan,\n crossStart,\n hasGutters\n}: {\n crossCount: number;\n crossSpan: number | undefined;\n crossStart: number;\n hasGutters: boolean;\n}) {\n const crossEnd =\n crossSpan === undefined ? crossCount : crossStart + crossSpan;\n if (crossStart === 0 && crossEnd === crossCount) {\n return \"1 / -1\";\n }\n\n let startLine = getTrackGridLine(crossStart, hasGutters);\n let endLine = getTrackGridLine(crossEnd - 1, hasGutters) + 1;\n if (hasGutters) {\n if (crossStart > 0) {\n startLine--;\n }\n if (crossEnd < crossCount) {\n endLine++;\n }\n }\n\n return `${startLine} / ${endLine}`;\n}\n\n/**\n * Gridlines sit between two tracks (e.g. column 1 is between columns 0 and 1)\n */\nexport function isValidGridlineIndex(index: number, trackCount: number) {\n return Number.isInteger(index) && index >= 1 && index < trackCount;\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 { createContext } from \"react\";\nimport type { GridContextType } from \"./types\";\n\nexport const GridContext = createContext<GridContextType | null>(null);\n","import { useContext } from \"react\";\nimport { assert } from \"../../utils/assert\";\nimport { GridContext } from \"./GridContext\";\n\nexport function useGridContext() {\n const context = useContext(GridContext);\n assert(\n context,\n \"Grid Context not found; did you render a Cell or Gridline outside of a Grid?\"\n );\n\n return context;\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { getTrackGridPlacement } from \"./gridPlacement\";\nimport type { CellProps } from \"./types\";\nimport { useGridContext } from \"./useGridContext\";\n\n/**\n * A Cell occupies one or more tracks (columns and rows) within a Grid.\n * Cells are resized along with the tracks they occupy.\n *\n * Cell elements always include the following attributes:\n *\n * ```html\n * <div data-cell data-testid=\"cell-id-prop\" id=\"cell-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 * ⚠️ Cell elements must be direct DOM children of their parent Grid elements.\n */\nexport function Cell({\n children,\n className,\n column,\n columnSpan = 1,\n elementRef: elementRefProp,\n id: idProp,\n row,\n rowSpan = 1,\n style,\n ...rest\n}: CellProps) {\n const id = useId(idProp);\n\n // Invalid placements are logged by the Grid (see getPlacementErrors)\n const { gutters, registerCell } = useGridContext();\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n useIsomorphicLayoutEffect(() => {\n const element = elementRef.current;\n if (element !== null) {\n return registerCell({\n column,\n columnSpan,\n element,\n id,\n row,\n rowSpan\n });\n }\n }, [column, columnSpan, id, registerCell, row, rowSpan]);\n\n return (\n <div\n {...rest}\n className={className}\n data-cell\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n overflow: \"auto\",\n\n ...style,\n\n // Allow cells to shrink smaller than their content\n minHeight: 0,\n minWidth: 0,\n\n gridColumn: getTrackGridPlacement(column, columnSpan, gutters.column),\n gridRow: getTrackGridPlacement(row, rowSpan, gutters.row)\n }}\n >\n {children}\n </div>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nCell.displayName = \"Cell\";\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 { isCoarsePointer } from \"./isCoarsePointer\";\nimport type { RegisteredResizeAxis } from \"../types\";\n\n/**\n * Grows a (potentially very thin) resize target so that it satisfies the Group's minimum hit target size.\n * The rect is expanded evenly on both sides so that it remains centered on the original target.\n */\nexport function expandHitTarget({\n expandHitTargets,\n axis,\n rect\n}: {\n expandHitTargets: boolean;\n axis: RegisteredResizeAxis;\n rect: DOMRect;\n}): DOMRect {\n const minHitTargetSize = expandHitTargets\n ? isCoarsePointer()\n ? axis.resizeTargetMinimumSize.coarse\n : axis.resizeTargetMinimumSize.fine\n : 0;\n\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\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 return rect;\n}\n","import type { GridAxis, RegisteredCell } from \"./types\";\n\n/**\n * Removes the parts of a (resize target) rect that overlap cells spanning across the boundary before the specified track.\n * This prevents resize targets that have been expanded (to meet the minimum hit target size)\n * from extending into cells that span across the boundary.\n */\nexport function excludeSpanningCells({\n axis,\n cells,\n index,\n rect\n}: {\n axis: GridAxis;\n cells: RegisteredCell[];\n index: number;\n rect: DOMRect;\n}): DOMRect[] {\n let rects = [rect];\n for (const cell of cells) {\n const start = axis === \"column\" ? cell.column : cell.row;\n const span = axis === \"column\" ? cell.columnSpan : cell.rowSpan;\n if (start >= index || start + span <= index) {\n continue;\n }\n\n const bounds = cell.element.getBoundingClientRect();\n const blockedStart = axis === \"column\" ? bounds.top : bounds.left;\n const blockedEnd = axis === \"column\" ? bounds.bottom : bounds.right;\n if (blockedEnd <= blockedStart) {\n continue;\n }\n\n rects = rects.flatMap((rect) => {\n const crossStart = axis === \"column\" ? rect.top : rect.left;\n const crossEnd = axis === \"column\" ? rect.bottom : rect.right;\n if (blockedStart >= crossEnd || blockedEnd <= crossStart) {\n return [rect];\n }\n\n const segments: DOMRect[] = [];\n const addSegment = (start: number, end: number) => {\n segments.push(\n axis === \"column\"\n ? new DOMRect(rect.x, start, rect.width, end - start)\n : new DOMRect(start, rect.y, end - start, rect.height)\n );\n };\n if (crossStart < blockedStart) {\n addSegment(crossStart, blockedStart);\n }\n if (crossEnd > blockedEnd) {\n addSegment(blockedEnd, crossEnd);\n }\n return segments;\n });\n }\n\n return rects;\n}\n","import type { GridAxis, GridSeparatorPlacement, RegisteredCell } from \"./types\";\nimport { expandHitTarget } from \"../../global/utils/expandHitTarget\";\nimport { excludeSpanningCells } from \"./excludeSpanningCells\";\nimport type {\n HitRegion,\n RegisteredResizeAxis,\n RegisteredSeparator\n} from \"../../global/types\";\n\ntype Segment = {\n crossEnd: number;\n crossStart: number;\n end: number;\n start: number;\n};\n\n/**\n * Determines hit regions for one axis of a Grid; a hit region is either:\n * - 1: An explicit Gridline element\n * - 2: The (implicit) boundary between two adjacent tracks\n *\n * Implicit boundaries are split into segments by cells that span across them.\n * For example, a cell that spans columns 0 and 1 prevents the boundary between those columns from being resized\n * alongside of it (though the boundary may still be resized in other rows).\n *\n * Adjacent segments are merged into a single region, including the gap between rows (or columns).\n * This ensures that the area where column and row boundaries intersect is included in the hit regions for both axes,\n * allowing both to be resized at once.\n */\nexport function calculateGridHitRegions({\n axis,\n cells,\n crossTrackCount,\n expandHitTargets,\n resizeAxis,\n axisSize,\n includeDisabled,\n separatorPlacements\n}: {\n axis: GridAxis;\n cells: RegisteredCell[];\n crossTrackCount: number;\n expandHitTargets: boolean;\n resizeAxis: RegisteredResizeAxis;\n axisSize: number;\n includeDisabled: boolean;\n separatorPlacements: Map<RegisteredSeparator, GridSeparatorPlacement>;\n}): HitRegion[] {\n const { items: tracks, separators } = resizeAxis;\n const trackCount = tracks.length;\n\n let firstEnabledIndex = -1;\n let lastEnabledIndex = -1;\n let numEnabled = 0;\n tracks.forEach((track, index) => {\n if (!track.constraintProps.disabled) {\n numEnabled++;\n if (firstEnabledIndex === -1) {\n firstEnabledIndex = index;\n }\n lastEnabledIndex = index;\n }\n });\n\n // If all (or all but one) of the tracks are disabled, there can be no resize interactions.\n if (!includeDisabled && numEnabled < 2) {\n return [];\n }\n\n const isBoundaryResizable = (index: number) =>\n includeDisabled || (index > firstEnabledIndex && index <= lastEnabledIndex);\n\n const hitRegions: HitRegion[] = [];\n\n const createHitRegion = (\n index: number,\n rect: DOMRect,\n separator?: RegisteredSeparator\n ): HitRegion => ({\n axis: resizeAxis,\n axisSize,\n items: [tracks[index - 1], tracks[index]],\n rect,\n separator\n });\n\n // Returns the position (along the cross axis) where the specified cross track starts or ends\n const getCrossTrackEdge = (crossIndex: number, edge: \"start\" | \"end\") => {\n let position: number | undefined = undefined;\n for (const cell of cells) {\n const cellCrossStart = axis === \"column\" ? cell.row : cell.column;\n const cellCrossSpan = axis === \"column\" ? cell.rowSpan : cell.columnSpan;\n if (\n edge === \"start\"\n ? cellCrossStart === crossIndex\n : cellCrossStart + cellCrossSpan - 1 === crossIndex\n ) {\n const rect = cell.element.getBoundingClientRect();\n if (edge === \"start\") {\n const start = axis === \"column\" ? rect.top : rect.left;\n position = position === undefined ? start : Math.min(position, start);\n } else {\n const end = axis === \"column\" ? rect.bottom : rect.right;\n position = position === undefined ? end : Math.max(position, end);\n }\n }\n }\n return position;\n };\n\n // Explicit separators always take precedence over implicit cell boundaries\n const boundariesWithSeparators = new Set<number>();\n for (const separator of separators) {\n const placement = separatorPlacements.get(separator);\n if (!placement || placement.index < 1 || placement.index >= trackCount) {\n continue;\n }\n\n boundariesWithSeparators.add(placement.index);\n\n if (\n !includeDisabled &&\n (separator.disabled || separator.element.hasAttribute(\"aria-disabled\"))\n ) {\n continue;\n }\n\n if (!isBoundaryResizable(placement.index)) {\n continue;\n }\n\n let rect = separator.element.getBoundingClientRect();\n\n // Separators that span a subset of the cross axis are extended into the gap before/after them (if any)\n // so that the area where they intersect a separator on the other axis resizes both axes\n const { crossSpan, crossStart } = placement;\n const crossEnd =\n crossSpan === undefined ? crossTrackCount : crossStart + crossSpan;\n let rectStart = axis === \"column\" ? rect.top : rect.left;\n let rectEnd = axis === \"column\" ? rect.bottom : rect.right;\n if (crossStart > 0) {\n const previousEnd = getCrossTrackEdge(crossStart - 1, \"end\");\n if (previousEnd !== undefined && previousEnd < rectStart) {\n rectStart = previousEnd;\n }\n }\n if (crossEnd < crossTrackCount) {\n const nextStart = getCrossTrackEdge(crossEnd, \"start\");\n if (nextStart !== undefined && nextStart > rectEnd) {\n rectEnd = nextStart;\n }\n }\n rect =\n axis === \"column\"\n ? new DOMRect(rect.x, rectStart, rect.width, rectEnd - rectStart)\n : new DOMRect(rectStart, rect.y, rectEnd - rectStart, rect.height);\n\n rect = expandHitTarget({ expandHitTargets, axis: resizeAxis, rect });\n\n if (includeDisabled) {\n // Used to map gridlines to tracks (e.g. for keyboard interactions and aria attributes)\n hitRegions.push(createHitRegion(placement.index, rect, separator));\n } else {\n // Gridlines should not be rendered alongside of cells that span across their boundary (this is logged as an error)\n // but if they are, those cells should still not be treated as resize targets\n excludeSpanningCells({\n axis,\n cells,\n index: placement.index,\n rect\n }).forEach((current) => {\n hitRegions.push(createHitRegion(placement.index, current, separator));\n });\n }\n }\n\n // Implicit boundaries may be expanded (to meet the minimum hit target size) into cells that span across them;\n // those portions are excluded so that the spanning cells remain interactive\n const addImplicitHitRegions = (index: number, rect: DOMRect) => {\n excludeSpanningCells({\n axis,\n cells,\n index,\n rect: expandHitTarget({ expandHitTargets, axis: resizeAxis, rect })\n }).forEach((current) => {\n hitRegions.push(createHitRegion(index, current));\n });\n };\n\n // Map each (cross track, track) slot to the Cell that occupies it (if any)\n const slots: (RegisteredCell | undefined)[][] = Array.from(\n { length: crossTrackCount },\n () => new Array(trackCount)\n );\n for (const cell of cells) {\n const [start, span, crossStart, crossSpan] =\n axis === \"column\"\n ? [cell.column, cell.columnSpan, cell.row, cell.rowSpan]\n : [cell.row, cell.rowSpan, cell.column, cell.columnSpan];\n\n for (\n let crossIndex = Math.max(0, crossStart);\n crossIndex < Math.min(crossTrackCount, crossStart + crossSpan);\n crossIndex++\n ) {\n for (\n let index = Math.max(0, start);\n index < Math.min(trackCount, start + span);\n index++\n ) {\n // If cells overlap, the first one wins\n slots[crossIndex][index] ??= cell;\n }\n }\n }\n\n const bounds = new Map<RegisteredCell, Segment>();\n const getBounds = (cell: RegisteredCell) => {\n let segment = bounds.get(cell);\n if (!segment) {\n const rect = cell.element.getBoundingClientRect();\n segment =\n axis === \"column\"\n ? {\n crossEnd: rect.bottom,\n crossStart: rect.top,\n end: rect.right,\n start: rect.left\n }\n : {\n crossEnd: rect.right,\n crossStart: rect.left,\n end: rect.bottom,\n start: rect.top\n };\n bounds.set(cell, segment);\n }\n return segment;\n };\n\n const toDOMRect = ({ crossEnd, crossStart, end, start }: Segment) =>\n axis === \"column\"\n ? new DOMRect(start, crossStart, end - start, crossEnd - crossStart)\n : new DOMRect(crossStart, start, crossEnd - crossStart, end - start);\n\n for (let index = 1; index < trackCount; index++) {\n if (boundariesWithSeparators.has(index) || !isBoundaryResizable(index)) {\n continue;\n }\n\n let pending: Segment | undefined = undefined;\n\n for (let crossIndex = 0; crossIndex < crossTrackCount; crossIndex++) {\n const before = slots[crossIndex][index - 1];\n const after = slots[crossIndex][index];\n\n let segment: Segment | undefined = undefined;\n if ((before || after) && before !== after) {\n const beforeBounds = before ? getBounds(before) : undefined;\n const afterBounds = after ? getBounds(after) : undefined;\n\n // The boundary is the space between the two cells (e.g. the gap)\n const from = beforeBounds?.end ?? afterBounds!.start;\n const to = afterBounds?.start ?? beforeBounds!.end;\n\n // Along the cross axis, the boundary is only resizable where the cells are next to each other\n const crossStart = Math.max(\n beforeBounds?.crossStart ?? -Infinity,\n afterBounds?.crossStart ?? -Infinity\n );\n const crossEnd = Math.min(\n beforeBounds?.crossEnd ?? Infinity,\n afterBounds?.crossEnd ?? Infinity\n );\n\n segment = {\n crossEnd: Math.max(crossStart, crossEnd),\n crossStart,\n end: Math.max(from, to),\n start: Math.min(from, to)\n };\n }\n\n if (segment) {\n pending = pending\n ? {\n crossEnd: Math.max(pending.crossEnd, segment.crossEnd),\n crossStart: Math.min(pending.crossStart, segment.crossStart),\n end: Math.max(pending.end, segment.end),\n start: Math.min(pending.start, segment.start)\n }\n : segment;\n } else if (pending) {\n addImplicitHitRegions(index, toDOMRect(pending));\n pending = undefined;\n }\n }\n\n if (pending) {\n addImplicitHitRegions(index, toDOMRect(pending));\n }\n }\n\n return hitRegions;\n}\n","import type { GridAxis } from \"./types\";\n\nfunction parsePixels(value: string | undefined | null) {\n const parsed = parseFloat(value ?? \"\");\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\n/**\n * Measures the size (in pixels) of each track along one Grid axis.\n *\n * Browsers resolve `grid-template-columns` (and rows) to pixel values for the computed style,\n * which accounts for gaps, padding, and separator gutters.\n * If the resolved values are not available (e.g. environments that don't implement CSS Grid, like jsdom)\n * the available size is approximated from the element's size and the Grid's layout.\n *\n * ℹ️ When separators are present, the Grid interleaves \"gutter\" tracks between its content tracks.\n */\nexport function measureGridAxis({\n axis,\n element,\n gutterSizes,\n hasGutters,\n layout,\n trackIds\n}: {\n axis: GridAxis;\n element: HTMLElement;\n gutterSizes: number[];\n hasGutters: boolean;\n layout: { [trackId: string]: number } | undefined;\n trackIds: string[];\n}): { availableSize: number; trackSizes: number[] } {\n const trackCount = trackIds.length;\n const cssTrackCount = hasGutters ? trackCount * 2 - 1 : trackCount;\n\n const style = element.ownerDocument.defaultView?.getComputedStyle(element);\n\n const template =\n axis === \"column\" ? style?.gridTemplateColumns : style?.gridTemplateRows;\n if (template) {\n const tokens = template.trim().split(/\\s+/);\n if (\n tokens.length === cssTrackCount &&\n tokens.every((token) => /^-?[\\d.]+px$/.test(token))\n ) {\n const trackSizes = trackIds.map((_, index) =>\n parsePixels(tokens[hasGutters ? index * 2 : index])\n );\n\n return {\n availableSize: trackSizes.reduce((total, size) => total + size, 0),\n trackSizes\n };\n }\n }\n\n const outerSize =\n axis === \"column\" ? element.offsetWidth : element.offsetHeight;\n const padding =\n axis === \"column\"\n ? parsePixels(style?.paddingLeft) +\n parsePixels(style?.paddingRight) +\n parsePixels(style?.borderLeftWidth) +\n parsePixels(style?.borderRightWidth)\n : parsePixels(style?.paddingTop) +\n parsePixels(style?.paddingBottom) +\n parsePixels(style?.borderTopWidth) +\n parsePixels(style?.borderBottomWidth);\n const gap = parsePixels(axis === \"column\" ? style?.columnGap : style?.rowGap);\n const gutters = gutterSizes.reduce((total, size) => total + size, 0);\n\n const availableSize = Math.max(\n 0,\n outerSize - padding - gap * Math.max(0, cssTrackCount - 1) - gutters\n );\n\n return {\n availableSize,\n trackSizes: trackIds.map((trackId) =>\n layout && layout[trackId] !== undefined\n ? (layout[trackId] / 100) * availableSize\n : availableSize / trackCount\n )\n };\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","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 { EventEmitter } from \"../../utils/EventEmitter\";\nimport type { RegisteredResizeAxis, RegisteredSeparator } from \"../types\";\nimport type {\n InteractionActive,\n InteractionState,\n ResizePreview\n} 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(\n cursorFlags: number,\n previews: ResizePreview[] = [],\n previewLayoutMap?: InteractionActive[\"previewLayoutMap\"],\n didPointerMove = false\n) {\n const prev = state;\n\n const next = { ...state };\n next.cursorFlags = cursorFlags;\n if (next.state === \"active\") {\n next.didPointerMove ||= didPointerMove;\n next.previews = previews;\n if (previewLayoutMap) {\n next.previewLayoutMap = previewLayoutMap;\n }\n }\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 // Keep click-to-focus behavior, but release keyboard focus after a drag.\n // This also handles interactions completed by the missed-pointerup fallback.\n if (\n prev.state === \"active\" &&\n next.state !== \"active\" &&\n prev.didPointerMove\n ) {\n prev.hitRegions.forEach(({ separator }) => {\n if (\n separator &&\n separator.element.ownerDocument.activeElement === separator.element\n ) {\n separator.element.blur();\n }\n });\n }\n\n eventEmitter.emit(\"change\", {\n prev,\n next\n });\n}\n\n/**\n * The preview prop is read through a registered separator getter.\n * Notify after its layout effect has updated that getter, without re-registering the group.\n */\nexport function notifySeparatorPreviewChanged(separator: RegisteredSeparator) {\n if (\n state.state !== \"active\" ||\n !state.previews.some((preview) => preview.separator === separator)\n ) {\n return;\n }\n\n updateInteractionState({\n ...state,\n previews: state.previews.map((preview) =>\n preview.separator === separator ? { ...preview } : preview\n )\n });\n}\n\nexport function removeAxisFromInteraction(axis: RegisteredResizeAxis) {\n if (state.state === \"inactive\") {\n return false;\n }\n\n const hitRegions = state.hitRegions.filter((region) => region.axis !== axis);\n const hasPreviews =\n state.state === \"active\" &&\n state.previews.some((preview) => preview.axis === axis);\n if (hitRegions.length === state.hitRegions.length && !hasPreviews) {\n return false;\n }\n\n if (hitRegions.length === 0) {\n updateInteractionState({ cursorFlags: 0, state: \"inactive\" });\n } else if (state.state === \"active\") {\n const initialLayoutMap = new Map(state.initialLayoutMap);\n const previewLayoutMap = new Map(state.previewLayoutMap);\n initialLayoutMap.delete(axis);\n previewLayoutMap.delete(axis);\n\n updateInteractionState({\n ...state,\n cursorFlags: 0,\n hitRegions,\n initialLayoutMap,\n previewLayoutMap,\n previews: state.previews.filter((preview) => preview.axis !== axis)\n });\n } else {\n updateInteractionState({ ...state, hitRegions });\n }\n\n return true;\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 {\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 type { RegisteredResizeAxis } from \"../types\";\nimport { supportsAdvancedCursorStyles } from \"./supportsAdvancedCursorStyles\";\n\nexport function getCursorStyle({\n cursorFlags,\n axes,\n state\n}: {\n cursorFlags: number;\n axes: RegisteredResizeAxis[];\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 axes.forEach((axis) => {\n if (axis.mutableState.disableCursor) {\n return;\n }\n\n switch (axis.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 if (!ownerDocument.defaultView || !ownerDocument.adoptedStyleSheets) {\n // Gracefully degrade for environments that don't support these DOM APIs (e.g. Safari < 16.4, jsdom)\n // See issues#559, issues#621, issues#554, pull#730\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 if (Object.isExtensible(ownerDocument.adoptedStyleSheets)) {\n ownerDocument.adoptedStyleSheets.push(styleSheet);\n } else {\n ownerDocument.adoptedStyleSheets = [\n ...ownerDocument.adoptedStyleSheets,\n styleSheet\n ];\n }\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 axes: interactionState.hitRegions.map((current) => current.axis),\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 { RegisteredResizeAxis } from \"../types\";\n\nexport function calculateAvailableAxisSize({\n axis\n}: {\n axis: RegisteredResizeAxis;\n}) {\n const { layoutStrategy, orientation, items } = axis;\n\n if (layoutStrategy) {\n return layoutStrategy.calculateAvailableSize();\n }\n\n return items.reduce((totalSize, item) => {\n totalSize +=\n orientation === \"horizontal\"\n ? item.element.offsetWidth\n : item.element.offsetHeight;\n return totalSize;\n }, 0);\n}\n","import type { Orientation } from \"./types\";\n\nexport function sortByElementOffset<\n Type extends { element: HTMLElement },\n ReturnType extends Type[]\n>(orientation: Orientation, panelsOrSeparators: Type[]): ReturnType {\n return Array.from(panelsOrSeparators).sort((a, b) => {\n const delta =\n orientation === \"horizontal\" ? horizontalSort(a, b) : verticalSort(a, b);\n if (delta !== 0) {\n return delta;\n }\n\n // JSDom and hidden elements may have identical offsets and sizes.\n // Use DOM order so registration order does not affect panel adjacency.\n const position = a.element.compareDocumentPosition(b.element);\n if (position & Node.DOCUMENT_POSITION_DISCONNECTED) {\n return 0;\n }\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n\n return 0;\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 { assert } from \"../../utils/assert\";\nimport type { Orientation } from \"../types\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosestRect({\n orientation,\n rects,\n targetRect\n}: {\n orientation: Orientation;\n rects: DOMRectReadOnly[];\n targetRect: DOMRectReadOnly;\n}): DOMRectReadOnly {\n const centerPoint = {\n x: targetRect.x + targetRect.width / 2,\n y: targetRect.y + targetRect.height / 2\n };\n\n let closestRect: DOMRectReadOnly | undefined = undefined;\n let minDistance = Number.MAX_VALUE;\n\n for (const rect of rects) {\n const { x, y } = getDistanceBetweenPointAndRect(centerPoint, rect);\n\n const distance = orientation === \"horizontal\" ? x : y;\n\n if (distance < minDistance) {\n minDistance = distance;\n closestRect = rect;\n }\n }\n\n assert(closestRect, \"No rect found\");\n\n return closestRect;\n}\n","import { sortByElementOffset } from \"../../components/group/sortByElementOffset\";\nimport { isHTMLElement } from \"../../utils/isHTMLElement\";\nimport type {\n HitRegion,\n RegisteredResizeAxis,\n RegisteredResizeItem,\n RegisteredSeparator\n} from \"../types\";\nimport { findClosestRect } from \"../utils/findClosestRect\";\nimport { expandHitTarget } from \"../utils/expandHitTarget\";\nimport { calculateAvailableAxisSize } from \"./calculateAvailableAxisSize\";\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({\n expandHitTargets = true,\n axis,\n includeDisabled = false\n}: {\n expandHitTargets?: boolean;\n axis: RegisteredResizeAxis;\n includeDisabled?: boolean;\n}) {\n if (axis.layoutStrategy) {\n return axis.layoutStrategy.calculateHitRegions({\n expandHitTargets,\n axis,\n includeDisabled\n });\n }\n\n const { element: axisElement, orientation, items, separators } = axis;\n\n // Sort elements by offset before traversing\n const sortedChildElements: HTMLElement[] = sortByElementOffset(\n orientation,\n Array.from(axisElement.children)\n .filter(isHTMLElement)\n .filter((element) => !element.hasAttribute(\"data-resize-preview\"))\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 firstEnabledItemIndex = -1;\n let axisSize: number | undefined;\n let lastEnabledItemIndex = -1;\n let numEnabledItems = 0;\n let prevItem: RegisteredResizeItem | undefined = undefined;\n let pendingSeparators: RegisteredSeparator[] = [];\n\n {\n let currentItemIndex = -1;\n\n for (const childElement of sortedChildElements) {\n if (childElement.hasAttribute(\"data-panel\")) {\n currentItemIndex++;\n\n if (!childElement.hasAttribute(\"data-disabled\")) {\n numEnabledItems++;\n\n if (firstEnabledItemIndex === -1) {\n firstEnabledItemIndex = currentItemIndex;\n }\n\n lastEnabledItemIndex = currentItemIndex;\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 (includeDisabled || numEnabledItems > 1) {\n let currentItemIndex = -1;\n\n for (const childElement of sortedChildElements) {\n if (childElement.hasAttribute(\"data-panel\")) {\n currentItemIndex++;\n\n const itemData = items.find(\n (current) => current.element === childElement\n );\n if (itemData) {\n if (prevItem) {\n const prevRect = prevItem.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 firstItemEdgeRect =\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 secondItemEdgeRect =\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 firstItemEdgeRect,\n secondItemEdgeRect\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 ? secondItemEdgeRect\n : firstItemEdgeRect\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 const rect = expandHitTarget({\n expandHitTargets,\n axis,\n rect:\n \"width\" in rectOrSeparator\n ? rectOrSeparator\n : rectOrSeparator.element.getBoundingClientRect()\n });\n\n const skip =\n currentItemIndex <= firstEnabledItemIndex ||\n currentItemIndex > lastEnabledItemIndex;\n\n if (includeDisabled || (!disabledSeparator && !skip)) {\n axisSize ??= calculateAvailableAxisSize({ axis });\n\n hitRegions.push({\n axis,\n axisSize,\n items: [prevItem, itemData],\n separator:\n \"width\" in rectOrSeparator ? undefined : rectOrSeparator,\n rect\n });\n }\n\n disabledSeparator = false;\n }\n }\n\n hasInterleavedStaticContent = false;\n prevItem = itemData;\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 prevItem = undefined;\n pendingSeparators = [];\n }\n } else {\n hasInterleavedStaticContent = true;\n }\n }\n }\n\n return hitRegions;\n}\n","export function convertEmToPixels(element: Element, value: number) {\n const style = getComputedStyle(element);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertRemToPixels(element: Element, value: number) {\n const style = getComputedStyle(element.ownerDocument.documentElement);\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 { convertEmToPixels } from \"./convertEmToPixels\";\nimport { convertRemToPixels } from \"./convertRemToPixels\";\nimport { convertVhToPixels } from \"./convertVhToPixels\";\nimport { convertVwToPixels } from \"./convertVwToPixels\";\nimport { parseSizeAndUnit } from \"./parseSizeAndUnit\";\n\nexport function sizeStyleToPixels({\n axisSize,\n itemElement,\n styleProp\n}: {\n axisSize: number;\n itemElement: 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) * axisSize;\n break;\n }\n case \"px\": {\n pixels = size;\n break;\n }\n case \"rem\": {\n pixels = convertRemToPixels(itemElement, size);\n break;\n }\n case \"em\": {\n pixels = convertEmToPixels(itemElement, 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 { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\nimport type { RegisteredResizeAxis, ResizeItemConstraints } from \"../types\";\nimport { formatLayoutNumber } from \"../utils/formatLayoutNumber\";\nimport { calculateAvailableAxisSize } from \"./calculateAvailableAxisSize\";\n\nexport function calculateItemConstraints(axis: RegisteredResizeAxis) {\n const { items } = axis;\n\n const axisSize = calculateAvailableAxisSize({ axis });\n if (axisSize === 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 items.map<ResizeItemConstraints>((current) => ({\n groupResizeBehavior: current.constraintProps.groupResizeBehavior,\n collapsedSize: 0,\n collapsible: current.constraintProps.collapsible === true,\n defaultSize: undefined,\n disabled: current.constraintProps.disabled,\n minSize: 0,\n maxSize: 100,\n itemId: current.id\n }));\n }\n\n return items.map<ResizeItemConstraints>((item) => {\n const { element, constraintProps: itemConstraints } = item;\n\n let collapsedSize = 0;\n if (itemConstraints.collapsedSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.collapsedSize\n });\n\n collapsedSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let collapsedThreshold: number | undefined = undefined;\n if (itemConstraints.collapsedThreshold !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.collapsedThreshold\n });\n\n collapsedThreshold = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let defaultSize: number | undefined = undefined;\n if (itemConstraints.defaultSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.defaultSize\n });\n\n defaultSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let minSize = 0;\n if (itemConstraints.minSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.minSize\n });\n\n minSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let maxSize = 100;\n if (itemConstraints.maxSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.maxSize\n });\n\n maxSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n return {\n groupResizeBehavior: itemConstraints.groupResizeBehavior,\n collapsedSize,\n collapsedThreshold,\n collapsible: itemConstraints.collapsible === true,\n defaultSize,\n disabled: itemConstraints.disabled,\n minSize,\n maxSize,\n itemId: item.id\n };\n });\n}\n","import { EventEmitter } from \"../../utils/EventEmitter\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n ResizeItemConstraints\n} from \"../types\";\nimport type { SeparatorToItemsMap } from \"./types\";\n\ntype State = {\n defaultLayoutDeferred: boolean;\n derivedItemConstraints: ResizeItemConstraints[];\n axisSize: number;\n layout: Layout;\n separatorToItems: SeparatorToItemsMap;\n};\n\nexport type MountedAxes = Map<RegisteredResizeAxis, State>;\n\nlet map: MountedAxes = new Map();\n\ntype AxisChangeEvent = {\n axis: RegisteredResizeAxis;\n // True if the change was triggered by a pointer or keyboard event handler\n // False for other types of resize (constraint recompute, default-size change, imperative API, etc.).\n isUserInteraction: boolean;\n next: State;\n prev: State | undefined;\n};\ntype AxesChangeEvent = {\n next: MountedAxes;\n prev: MountedAxes;\n};\n\nconst eventEmitter = new EventEmitter<{\n axisChange: AxisChangeEvent;\n axesChange: AxesChangeEvent;\n}>();\n\nexport function deleteMutableAxis(axis: RegisteredResizeAxis) {\n map = new Map(map);\n map.delete(axis);\n}\n\nexport function getRegisteredAxis(\n axisId: string\n): RegisteredResizeAxis | undefined;\nexport function getRegisteredAxis(\n axisId: string,\n assert: true\n): RegisteredResizeAxis;\nexport function getRegisteredAxis(axisId: string, assert?: boolean) {\n for (const [axis] of map) {\n if (axis.id === axisId) {\n return axis;\n }\n }\n\n if (assert) {\n throw Error(`Could not find data for Group with id ${axisId}`);\n }\n\n return undefined;\n}\n\nexport function getMountedAxisState(axisId: string): State | undefined;\nexport function getMountedAxisState(axisId: string, assert: true): State;\nexport function getMountedAxisState(axisId: string, assert?: boolean) {\n for (const [axis, mountedAxis] of map) {\n if (axis.id === axisId) {\n return mountedAxis;\n }\n }\n\n if (assert) {\n throw Error(`Could not find data for Group with id ${axisId}`);\n }\n\n return undefined;\n}\n\nexport function getMountedAxes() {\n return map;\n}\n\nexport function subscribeToMountedAxis(\n axisId: string,\n callback: (event: AxisChangeEvent) => void\n) {\n return eventEmitter.addListener(\"axisChange\", (event) => {\n if (event.axis.id === axisId) {\n callback(event);\n }\n });\n}\n\nexport function updateMountedAxis(\n axis: RegisteredResizeAxis,\n next: State,\n meta?: { isUserInteraction?: boolean }\n) {\n const prev = map.get(axis);\n\n map = new Map(map);\n map.set(axis, next);\n\n eventEmitter.emit(\"axisChange\", {\n axis,\n isUserInteraction: meta?.isUserInteraction === true,\n prev,\n next\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 { compareLayoutNumbers } from \"./compareLayoutNumbers\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport type { ResizeItemConstraints } from \"../types\";\n\n// Panel size must be in percentages; pixel values should be pre-converted\nexport function validateItemSize({\n overrideDisabledItems,\n itemConstraints,\n prevSize,\n size\n}: {\n overrideDisabledItems?: boolean;\n itemConstraints: ResizeItemConstraints;\n prevSize: number;\n size: number;\n}) {\n const {\n collapsedSize = 0,\n collapsedThreshold,\n collapsible,\n disabled,\n maxSize = 100,\n minSize = 0\n } = itemConstraints;\n\n if (disabled && !overrideDisabledItems) {\n return prevSize;\n }\n\n if (compareLayoutNumbers(size, minSize) < 0) {\n if (collapsible) {\n const threshold = collapsedThreshold ?? (minSize - collapsedSize) / 2;\n const wasCollapsed = compareLayoutNumbers(prevSize, collapsedSize) <= 0;\n const boundary = wasCollapsed\n ? collapsedSize + threshold\n : minSize - threshold;\n const comparison = compareLayoutNumbers(size, boundary);\n\n if (\n compareLayoutNumbers(size, collapsedSize) <= 0 ||\n comparison < 0 ||\n (collapsedThreshold !== undefined && wasCollapsed && comparison === 0)\n ) {\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 { assert } from \"../../utils/assert\";\nimport { isArrayEqual } from \"../../utils/isArrayEqual\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\nimport { compareLayoutNumbers } from \"../utils/compareLayoutNumbers\";\nimport { layoutNumbersEqual } from \"../utils/layoutNumbersEqual\";\nimport { validateItemSize } from \"./validateItemSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function adjustLayoutByDelta({\n delta,\n initialLayout: initialLayoutProp,\n itemConstraints: itemConstraintsArray,\n pivotIndices,\n prevLayout: prevLayoutProp,\n trigger\n}: {\n delta: number;\n initialLayout: Layout;\n itemConstraints: ResizeItemConstraints[];\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 overrideDisabledItems = trigger === \"imperative-api\";\n\n const initialLayout = itemConstraintsArray.map(\n ({ itemId }) => initialLayoutProp[itemId]\n );\n const prevLayout = itemConstraintsArray.map(\n ({ itemId }) => prevLayoutProp[itemId]\n );\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 // 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 itemConstraints = itemConstraintsArray[index];\n assert(\n itemConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = itemConstraints;\n\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\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\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 itemConstraints = itemConstraintsArray[index];\n assert(\n itemConstraints,\n `No panel constraints found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = itemConstraints;\n\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\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n }\n }\n }\n }\n break;\n }\n default: {\n // If we're starting from a collapsed state, dragging past the threshold 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\n const index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n const itemConstraints = itemConstraintsArray[index];\n assert(\n itemConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const prevSize = initialLayout[index];\n\n const { collapsedSize, collapsedThreshold, collapsible, minSize } =\n itemConstraints;\n if (collapsible && compareLayoutNumbers(prevSize, minSize) < 0) {\n const gapSize = minSize - collapsedSize;\n const threshold = collapsedThreshold ?? gapSize / 2;\n const nextSize = prevSize + Math.abs(delta);\n\n if (compareLayoutNumbers(nextSize, minSize) < 0) {\n const comparison = compareLayoutNumbers(Math.abs(delta), threshold);\n // Preserve the existing boundary behavior when no threshold is specified.\n const expandAtBoundary =\n collapsedThreshold === undefined && delta < 0;\n if (comparison > 0 || (comparison === 0 && expandAtBoundary)) {\n delta = delta < 0 ? -gapSize : gapSize;\n } else {\n delta = 0;\n }\n }\n }\n break;\n }\n }\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 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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[index],\n prevSize,\n size: 100\n });\n const delta = maxSafeSize - prevSize;\n\n maxAvailableDelta += delta;\n index += increment;\n\n if (index < 0 || index >= itemConstraintsArray.length) {\n break;\n }\n }\n\n const minAbsDelta = Math.min(Math.abs(delta), Math.abs(maxAvailableDelta));\n delta = delta < 0 ? 0 - minAbsDelta : minAbsDelta;\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 < itemConstraintsArray.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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[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\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 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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[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 < itemConstraintsArray.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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[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\n const totalSize = Object.values(nextLayout).reduce(\n (total, size) => size + total,\n 0\n );\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 return prevLayoutProp;\n }\n\n return nextLayout.reduce<Layout>((accumulated, current, index) => {\n accumulated[itemConstraintsArray[index].itemId] = current;\n return accumulated;\n }, {});\n}\n","import { compareLayoutNumbers } from \"./compareLayoutNumbers\";\nimport type { Layout } from \"../types\";\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 {\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 { updateMountedAxis, type MountedAxes } from \"../mutable-state/axes\";\nimport {\n getInteractionState,\n updateCursorFlags\n} from \"../mutable-state/interactions\";\nimport type { HitRegion, Layout, RegisteredResizeAxis } from \"../types\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { layoutsEqual } from \"./layoutsEqual\";\n\nexport function updateActiveHitRegions({\n commit,\n document,\n event,\n hitRegions,\n initialLayoutMap,\n mountedAxes,\n pointerDownAtPoint,\n prevCursorFlags\n}: {\n commit: boolean;\n document: Document;\n event: {\n clientX: number;\n clientY: number;\n movementX: number;\n movementY: number;\n };\n hitRegions: HitRegion[];\n initialLayoutMap: Map<RegisteredResizeAxis, Layout>;\n mountedAxes: MountedAxes;\n pointerDownAtPoint?: Point;\n prevCursorFlags: number;\n}) {\n let nextCursorFlags = 0;\n const interaction = getInteractionState();\n let previews = interaction.state === \"active\" ? interaction.previews : [];\n const previewLayoutMap = new Map(\n interaction.state === \"active\" ? interaction.previewLayoutMap : undefined\n );\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 { axis, axisSize } = current;\n const { orientation, items } = axis;\n if (commit && axis.resizePreviewMode !== \"separator\") {\n return;\n }\n const { disableCursor } = axis.mutableState;\n\n let deltaAsPercentage = 0;\n if (pointerDownAtPoint) {\n if (orientation === \"horizontal\") {\n deltaAsPercentage =\n ((event.clientX - pointerDownAtPoint.x) / axisSize) * 100;\n } else {\n deltaAsPercentage =\n ((event.clientY - pointerDownAtPoint.y) / axisSize) * 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(axis);\n const axisState = mountedAxes.get(axis);\n if (!initialLayout || !axisState) {\n return;\n }\n\n const {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize: mountedAxisSize,\n layout: mountedLayout,\n separatorToItems\n } = axisState;\n if (derivedItemConstraints && mountedLayout && separatorToItems) {\n const prevLayout =\n axis.resizePreviewMode === \"separator\"\n ? (previewLayoutMap.get(axis) ?? mountedLayout)\n : mountedLayout;\n const nextLayout = adjustLayoutByDelta({\n delta: deltaAsPercentage,\n initialLayout,\n itemConstraints: derivedItemConstraints,\n pivotIndices: current.items.map((item) => items.indexOf(item)),\n prevLayout,\n trigger: \"mouse-or-touch\"\n });\n\n // Preview every moved boundary, deferring the layout update until release.\n if (\n axis.resizePreviewMode === \"separator\" &&\n !commit &&\n !layoutsEqual(nextLayout, prevLayout)\n ) {\n previewLayoutMap.set(axis, nextLayout);\n\n let total = 0;\n const offsets = items.map((item) => {\n total += nextLayout[item.id] - initialLayout[item.id];\n return total * (axisSize / 100);\n });\n\n previews = previews.map((preview) => {\n if (preview.axis !== axis) {\n return preview;\n }\n\n const offset = offsets[preview.itemIndex];\n return offset === preview.offset ? preview : { ...preview, offset };\n });\n }\n\n if (layoutsEqual(nextLayout, prevLayout)) {\n if (deltaAsPercentage !== 0 && !disableCursor) {\n // An unchanged layout 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 }\n\n if (\n (axis.resizePreviewMode !== \"separator\" || commit) &&\n !layoutsEqual(nextLayout, mountedLayout)\n ) {\n updateMountedAxis(current.axis, {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize: mountedAxisSize,\n layout: nextLayout,\n separatorToItems\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 const didPointerMove =\n interaction.state === \"active\" &&\n (event.clientX !== interaction.pointerDownAtPoint.x ||\n event.clientY !== interaction.pointerDownAtPoint.y);\n\n updateCursorFlags(cursorFlags, previews, previewLayoutMap, didPointerMove);\n updateCursorStyle(document);\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle.ts\";\nimport { updateActiveHitRegions } from \"./updateActiveHitRegion\";\nimport {\n getMountedAxes,\n getMountedAxisState,\n updateMountedAxis\n} from \"../mutable-state/axes.ts\";\nimport {\n getInteractionState,\n updateInteractionState\n} from \"../mutable-state/interactions.ts\";\n\nexport function completeActivePointerResize(\n document: Document,\n event: {\n clientX: number;\n clientY: number;\n movementX: number;\n movementY: number;\n }\n) {\n const interactionState = getInteractionState();\n const mountedAxes = getMountedAxes();\n\n let match = false;\n\n switch (interactionState.state) {\n case \"active\": {\n updateActiveHitRegions({\n commit: true,\n document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedAxes,\n pointerDownAtPoint: interactionState.pointerDownAtPoint,\n prevCursorFlags: interactionState.cursorFlags\n });\n\n updateInteractionState({\n cursorFlags: 0,\n state: \"inactive\"\n });\n\n if (interactionState.hitRegions.length > 0) {\n updateCursorStyle(document);\n\n match = true;\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 // This is the canonical user-pointer-up site, so flag the dispatch with\n // isUserInteraction: true. See #716.\n interactionState.hitRegions.forEach((hitRegion) => {\n // Skip if the group was re-registered mid-gesture, so the old hit region\n // doesn't resurrect a stale entry in the mounted-groups map. See #729.\n if (!mountedAxes.has(hitRegion.axis)) {\n return;\n }\n const axisState = getMountedAxisState(hitRegion.axis.id, true);\n updateMountedAxis(hitRegion.axis, axisState, {\n isUserInteraction: true\n });\n });\n }\n }\n }\n\n return match;\n}\n","import { completeActivePointerResize } from \"../utils/completeActivePointerResize.ts\";\n\nexport function onDocumentContextMenu(event: MouseEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n completeActivePointerResize(event.currentTarget as Document, event);\n}\n","import type { Point } from \"../../types\";\nimport type { HitRegion, Orientation } from \"../types\";\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 // Ties along the primary axis are broken by the distance along the cross axis;\n // this matters for groups whose resize targets don't span the full cross axis (e.g. Grid)\n if (\n data.x < minDistance.x ||\n (data.x === minDistance.x && data.y <= minDistance.y)\n ) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n case \"vertical\": {\n if (\n data.y < minDistance.y ||\n (data.y === minDistance.y && data.x <= minDistance.x)\n ) {\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","export function isModal(element: Element) {\n try {\n return element.matches(\":modal\");\n } catch {\n // The \":modal\" pseudo-class is not supported by all environments (e.g. older browsers, JSDom)\n return false;\n }\n}\n","import { isHTMLElement } from \"../../utils/isHTMLElement\";\nimport { compare } from \"../../vendor/stacking-order\";\nimport { doRectsIntersect } from \"./doRectsIntersect\";\nimport { isModal } from \"./isModal\";\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 axisElement,\n hitRegion,\n pointerEventTarget\n}: {\n axisElement: HTMLElement;\n hitRegion: DOMRect;\n pointerEventTarget: EventTarget | null;\n}) {\n if (isHTMLElement(pointerEventTarget)) {\n // A modal dialog is rendered in the top layer and makes everything outside of it inert,\n // regardless of where the dialog is in the DOM (e.g. even if it's a descendant of the group).\n // Stacking order comparison can't detect this, so check for it explicitly.\n const dialog = pointerEventTarget.closest(\"dialog\");\n if (dialog && !dialog.contains(axisElement) && isModal(dialog)) {\n return false;\n }\n }\n\n if (\n !isHTMLElement(pointerEventTarget) ||\n pointerEventTarget.contains(axisElement) ||\n axisElement.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, axisElement) > 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(axisElement)) {\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 { calculateHitRegions } from \"../dom/calculateHitRegions\";\nimport type { MountedAxes } from \"../mutable-state/axes\";\nimport type { HitRegion } from \"../types\";\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 mountedAxes: MountedAxes\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedAxes.forEach((_, axisData) => {\n if (axisData.disabled) {\n return;\n }\n\n const hitRegions = calculateHitRegions({ axis: axisData });\n const match = findClosestHitRegion(axisData.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 axisElement: axisData.element,\n hitRegion: match.hitRegion.rect,\n pointerEventTarget: event.target\n })\n ) {\n matchingHitRegions.push(match.hitRegion);\n }\n });\n\n return matchingHitRegions;\n}\n","import { assert } from \"../../utils/assert\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { validateItemSize } from \"./validateItemSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function validateAxisLayout({\n layout,\n itemConstraints\n}: {\n layout: Layout;\n itemConstraints: ResizeItemConstraints[];\n}): Layout {\n const prevLayout = itemConstraints.map(({ itemId }) => layout[itemId]);\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 (Object.keys(layout).length !== itemConstraints.length) {\n throw Error(\n `Invalid ${itemConstraints.length} panel layout: ${Object.values(layout)\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 < itemConstraints.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 < itemConstraints.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 = validateItemSize({\n overrideDisabledItems: true,\n itemConstraints: itemConstraints[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 < itemConstraints.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 = validateItemSize({\n overrideDisabledItems: true,\n itemConstraints: itemConstraints[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 return nextLayout.reduce<Layout>((accumulated, current, index) => {\n accumulated[itemConstraints[index].itemId] = current;\n return accumulated;\n }, {});\n}\n","import type { PanelImperativeHandle } from \"../../components/panel/types\";\nimport { calculateAvailableAxisSize } from \"../dom/calculateAvailableAxisSize\";\nimport { getMountedAxes, updateMountedAxis } from \"../mutable-state/axes\";\nimport { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\nimport type {\n Layout,\n RegisteredResizeItem,\n ResizeItemConstraints\n} from \"../types\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\n\nexport function getImperativeItemMethods({\n axisId,\n itemId\n}: {\n axisId: string;\n itemId: string;\n}): PanelImperativeHandle {\n const find = () => {\n const mountedAxes = getMountedAxes();\n for (const [\n axis,\n {\n defaultLayoutDeferred,\n derivedItemConstraints,\n layout,\n axisSize,\n separatorToItems\n }\n ] of mountedAxes) {\n if (axis.id === axisId) {\n return {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axis,\n axisSize,\n layout,\n separatorToItems\n };\n }\n }\n\n throw Error(`Group ${axisId} not found`);\n };\n\n const getItemConstraints = () => {\n const match = find().derivedItemConstraints.find(\n (current) => current.itemId === itemId\n );\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Panel constraints not found for Panel ${itemId}`);\n };\n\n const getItem = () => {\n const match = find().axis.items.find((current) => current.id === itemId);\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${itemId}`);\n };\n\n const getItemSize = () => {\n const match = find().layout[itemId];\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${itemId}`);\n };\n\n /**\n * Compute the next (unvalidated) layout when resizing a panel imperatively.\n *\n * Handles two edge cases for the last panel:\n * 1. Single panel in the axis — no sibling exists to form valid pivot indices.\n * 2. All preceding panels are already collapsed — the normal reversed-delta\n * logic would cascade the freed space to the first panel. Instead the last\n * panel keeps the remainder so it stays the largest.\n */\n const computeLayout = ({\n nextSize,\n items,\n prevLayout,\n derivedItemConstraints\n }: {\n nextSize: number;\n items: RegisteredResizeItem[];\n prevLayout: Layout;\n derivedItemConstraints: ResizeItemConstraints[];\n }): Layout => {\n const prevSize = getItemSize();\n\n const index = items.findIndex((current) => current.id === itemId);\n const isFirstItem = index === 0;\n const isLastItem = index === items.length - 1;\n\n const allPreviousCollapsed =\n isLastItem &&\n nextSize < prevSize &&\n (isFirstItem ||\n items.slice(0, index).every((_item, itemIndex) => {\n const pc = derivedItemConstraints[itemIndex];\n return (\n pc?.collapsible &&\n layoutNumbersEqual(pc.collapsedSize, prevLayout[pc.itemId])\n );\n }));\n\n if (allPreviousCollapsed) {\n const occupiedByPrevious = items\n .slice(0, index)\n .reduce((total, item) => total + prevLayout[item.id], 0);\n return {\n ...prevLayout,\n [itemId]: formatLayoutNumber(100 - occupiedByPrevious)\n };\n }\n\n return adjustLayoutByDelta({\n delta: isLastItem ? prevSize - nextSize : nextSize - prevSize,\n initialLayout: prevLayout,\n itemConstraints: derivedItemConstraints,\n pivotIndices: isLastItem ? [index - 1, index] : [index, index + 1],\n prevLayout,\n trigger: \"imperative-api\"\n });\n };\n\n const setItemSize = (nextSize: number) => {\n const prevSize = getItemSize();\n if (nextSize === prevSize) {\n return;\n }\n\n const {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axis,\n axisSize,\n layout: prevLayout,\n separatorToItems\n } = find();\n\n const unsafeLayout = computeLayout({\n nextSize,\n items: axis.items,\n prevLayout,\n derivedItemConstraints\n });\n\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: derivedItemConstraints\n });\n if (!layoutsEqual(prevLayout, nextLayout)) {\n updateMountedAxis(axis, {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize,\n layout: nextLayout,\n separatorToItems\n });\n }\n };\n\n return {\n collapse: () => {\n const { collapsible, collapsedSize } = getItemConstraints();\n const { mutableValues } = getItem();\n const size = getItemSize();\n\n if (collapsible && size !== collapsedSize) {\n // Store previous size in to restore if expand() is called\n mutableValues.expandToSize = size;\n\n setItemSize(collapsedSize);\n }\n },\n expand: () => {\n const { collapsible, collapsedSize, minSize } = getItemConstraints();\n const { mutableValues } = getItem();\n const size = getItemSize();\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 setItemSize(nextSize);\n }\n },\n getSize: () => {\n const { axis } = find();\n const asPercentage = getItemSize();\n const { element } = getItem();\n\n const inPixels = axis.layoutStrategy\n ? axis.layoutStrategy.getItemSizeInPixels(itemId)\n : axis.orientation === \"horizontal\"\n ? element.offsetWidth\n : element.offsetHeight;\n\n return {\n asPercentage,\n inPixels\n };\n },\n isCollapsed: () => {\n const { collapsible, collapsedSize } = getItemConstraints();\n const size = getItemSize();\n\n return collapsible && layoutNumbersEqual(collapsedSize, size);\n },\n resize: (size: number | string) => {\n const { axis } = find();\n const { element } = getItem();\n const axisSize = calculateAvailableAxisSize({ axis });\n\n const asPixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: size\n });\n\n const asPercentage = formatLayoutNumber((asPixels / axisSize) * 100);\n\n setItemSize(asPercentage);\n }\n } satisfies PanelImperativeHandle;\n}\n","import { getMountedAxes } from \"../mutable-state/axes\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { getImperativeItemMethods } from \"../utils/getImperativeItemMethods\";\n\nexport function onDocumentDoubleClick(event: MouseEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const mountedAxes = getMountedAxes();\n const hitRegions = findMatchingHitRegions(event, mountedAxes);\n hitRegions.forEach((current) => {\n if (current.separator && !current.separator.disableDoubleClick) {\n const itemWithDefaultSize = current.items.find(\n (item) => item.constraintProps.defaultSize !== undefined\n );\n if (itemWithDefaultSize) {\n const defaultSize = itemWithDefaultSize.constraintProps.defaultSize;\n const api = getImperativeItemMethods({\n axisId: current.axis.id,\n itemId: itemWithDefaultSize.id\n });\n if (api && defaultSize !== undefined) {\n api.resize(defaultSize);\n\n event.preventDefault();\n }\n }\n }\n });\n}\n","import { getMountedAxes } from \"../mutable-state/axes\";\n\nexport function findSeparatorAxis(separatorElement: HTMLElement) {\n const mountedAxes = getMountedAxes();\n\n for (const [axis] of mountedAxes) {\n if (\n axis.separators.some(\n (separator) => separator.element === separatorElement\n )\n ) {\n return axis;\n }\n }\n\n throw Error(\"Could not find parent Group for separator element\");\n}\n","import type { GroupImperativeHandle } from \"../../components/group/types\";\nimport { getMountedAxes, updateMountedAxis } from \"../mutable-state/axes\";\nimport type { Layout } from \"../types\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\n\nexport function getImperativeAxisMethods({\n axisId\n}: {\n axisId: string;\n}): GroupImperativeHandle {\n const find = () => {\n const mountedAxes = getMountedAxes();\n for (const [axis, value] of mountedAxes) {\n if (axis.id === axisId) {\n return { axis, ...value };\n }\n }\n\n throw Error(`Could not find Group with id \"${axisId}\"`);\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 derivedItemConstraints,\n axis,\n axisSize,\n layout: prevLayout,\n separatorToItems\n } = find();\n\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: derivedItemConstraints\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 updateMountedAxis(axis, {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize,\n layout: nextLayout,\n separatorToItems\n });\n }\n\n return nextLayout;\n }\n };\n}\n","import { assert } from \"../../utils/assert\";\nimport { getMountedAxisState, updateMountedAxis } from \"../mutable-state/axes\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { findSeparatorAxis } from \"./findSeparatorAxis\";\nimport { getImperativeAxisMethods } from \"./getImperativeAxisMethods\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\n\nexport function adjustLayoutForSeparator(\n separatorElement: HTMLElement,\n delta: number\n) {\n const axis = findSeparatorAxis(separatorElement);\n const axisState = getMountedAxisState(axis.id, true);\n\n const separator = axis.separators.find(\n (current) => current.element === separatorElement\n );\n assert(separator, \"Matching separator not found\");\n\n const items = axisState.separatorToItems.get(separator);\n assert(items, \"Matching panels not found\");\n\n const pivotIndices = items.map((item) => axis.items.indexOf(item));\n\n const axisAPI = getImperativeAxisMethods({ axisId: axis.id });\n const prevLayout = axisAPI.getLayout();\n\n const unsafeLayout = adjustLayoutByDelta({\n delta,\n initialLayout: prevLayout,\n itemConstraints: axisState.derivedItemConstraints,\n pivotIndices,\n prevLayout,\n trigger: \"keyboard\"\n });\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: axisState.derivedItemConstraints\n });\n\n if (!layoutsEqual(prevLayout, nextLayout)) {\n updateMountedAxis(\n axis,\n {\n defaultLayoutDeferred: axisState.defaultLayoutDeferred,\n derivedItemConstraints: axisState.derivedItemConstraints,\n axisSize: axisState.axisSize,\n layout: nextLayout,\n separatorToItems: axisState.separatorToItems\n },\n // Keyboard resizes (arrow keys, Home/End, Enter collapse/expand) originate\n // from a real DOM event on the separator, so they are user interactions\n // just like pointer drags. This function is only reached from\n // onDocumentKeyDown. See #716.\n { isUserInteraction: true }\n );\n }\n}\n","import { assert } from \"../../utils/assert\";\nimport { getMountedAxisState } from \"../mutable-state/axes\";\nimport { adjustLayoutForSeparator } from \"../utils/adjustLayoutForSeparator\";\nimport { findSeparatorAxis } from \"../utils/findSeparatorAxis\";\n\nexport function onDocumentKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const separatorElement = event.currentTarget as HTMLElement;\n\n const axis = findSeparatorAxis(separatorElement);\n if (axis.disabled) {\n return;\n }\n\n const separator = axis.separators.find(\n (current) => current.element === separatorElement\n );\n if (separator?.disabled) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n\n if (axis.orientation === \"vertical\") {\n adjustLayoutForSeparator(separatorElement, 5);\n }\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n\n if (axis.orientation === \"horizontal\") {\n adjustLayoutForSeparator(separatorElement, -5);\n }\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n\n if (axis.orientation === \"horizontal\") {\n adjustLayoutForSeparator(separatorElement, 5);\n }\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n\n if (axis.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 axisState = getMountedAxisState(axis.id, true);\n const { derivedItemConstraints, layout, separatorToItems } = axisState;\n\n const separator = axis.separators.find(\n (current) => current.element === separatorElement\n );\n assert(separator, \"Matching separator not found\");\n\n const items = separatorToItems.get(separator);\n assert(items, \"Matching panels not found\");\n\n const primaryItem = items[0];\n const constraints = derivedItemConstraints.find(\n (current) => current.itemId === primaryItem.id\n );\n assert(constraints, \"Panel metadata not found\");\n\n if (constraints.collapsible) {\n const prevSize = layout[primaryItem.id];\n\n const nextSize =\n constraints.collapsedSize === prevSize\n ? (axis.mutableState.expandedItemSizes[primaryItem.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 separatorElements = axis.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 { calculateHitRegions } from \"../dom/calculateHitRegions\";\nimport type { ResizePreview } from \"../mutable-state/types\";\nimport type { HitRegion, RegisteredResizeAxis } from \"../types\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\n\nexport function calculateResizePreviews(\n axis: RegisteredResizeAxis,\n hitRegions: HitRegion[]\n): ResizePreview[] {\n const { element, orientation, items } = axis;\n\n const axisRect = element.getBoundingClientRect();\n const horizontal = orientation === \"horizontal\";\n\n // Use the same boundaries as hit testing, including separate edges around\n // static content. Disabled boundaries can still move indirectly during a drag.\n const boundaries = calculateHitRegions({\n expandHitTargets: false,\n axis,\n includeDisabled: true\n });\n\n return boundaries.map(({ items: boundaryItems, rect, separator }, index) => {\n const itemIndex = items.indexOf(boundaryItems[0]);\n const center = horizontal\n ? rect.left + rect.width / 2\n : rect.top + rect.height / 2;\n\n const active = hitRegions.some((region) => {\n if (region.axis !== axis || region.items[0] !== boundaryItems[0]) {\n return false;\n }\n\n if (separator || region.separator) {\n return region.separator === separator;\n }\n\n const regionCenter = horizontal\n ? region.rect.left + region.rect.width / 2\n : region.rect.top + region.rect.height / 2;\n\n return layoutNumbersEqual(center, regionCenter);\n });\n\n return {\n active,\n axis,\n key: separator\n ? `separator-${separator.id}`\n : `panel-${boundaryItems[0].id}-${index}`,\n offset: 0,\n itemIndex,\n rect: new DOMRect(\n (horizontal && !separator ? center : rect.left) -\n axisRect.left -\n element.clientLeft +\n element.scrollLeft,\n (!horizontal && !separator ? center : rect.top) -\n axisRect.top -\n element.clientTop +\n element.scrollTop,\n horizontal && !separator ? 0 : rect.width,\n !horizontal && !separator ? 0 : rect.height\n ),\n separator\n };\n });\n}\n","import { calculateResizePreviews } from \"../utils/calculateResizePreviews\";\nimport { getMountedAxes } from \"../mutable-state/axes\";\nimport { updateInteractionState } from \"../mutable-state/interactions\";\nimport type { Layout, RegisteredResizeAxis } from \"../types\";\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 mountedAxes = getMountedAxes();\n\n const hitRegions = findMatchingHitRegions(event, mountedAxes);\n if (hitRegions.length === 0) {\n return;\n }\n\n const initialLayoutMap = new Map<RegisteredResizeAxis, Layout>();\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 // @ts-expect-error https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#browser_compatibility\n focusVisible: false,\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 = mountedAxes.get(current.axis);\n if (match) {\n initialLayoutMap.set(current.axis, match.layout);\n }\n });\n\n const previews = Array.from(initialLayoutMap.keys()).flatMap((axis) =>\n axis.resizePreviewMode === \"separator\"\n ? calculateResizePreviews(axis, hitRegions)\n : []\n );\n\n updateInteractionState({\n cursorFlags: 0,\n didPointerMove: false,\n hitRegions,\n initialLayoutMap,\n pointerDownAtPoint: { x: event.clientX, y: event.clientY },\n previewLayoutMap: new Map(initialLayoutMap),\n previews,\n state: \"active\"\n });\n\n event.preventDefault();\n}\n","import { getMountedAxes } from \"../mutable-state/axes\";\nimport { getInteractionState } from \"../mutable-state/interactions\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onDocumentPointerLeave(event: PointerEvent) {\n const mountedAxes = getMountedAxes();\n const interactionState = getInteractionState();\n\n switch (interactionState.state) {\n case \"active\": {\n updateActiveHitRegions({\n commit: false,\n document: event.currentTarget as Document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedAxes,\n prevCursorFlags: interactionState.cursorFlags\n });\n }\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport {\n getMountedAxes,\n getMountedAxisState,\n updateMountedAxis\n} from \"../mutable-state/axes\";\nimport {\n getInteractionState,\n updateInteractionState\n} from \"../mutable-state/interactions\";\nimport { layoutsEqual } from \"../utils/layoutsEqual\";\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 mountedAxes = getMountedAxes();\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 // This event is a later hover, not the release position.\n // Commit the last preview without incorporating movement after the button was released.\n interactionState.previewLayoutMap.forEach((layout, axis) => {\n const axisState = mountedAxes.get(axis);\n if (\n axis.resizePreviewMode === \"separator\" &&\n axisState &&\n !layoutsEqual(layout, axisState.layout)\n ) {\n updateMountedAxis(axis, { ...axisState, layout });\n }\n });\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 // This is the missed-pointerup fallback (pointer released outside a\n // cross-origin iframe, see #340) — still a real user interaction.\n interactionState.hitRegions.forEach((hitRegion) => {\n // Skip if the group was re-registered mid-gesture, so the old hit region\n // doesn't resurrect a stale entry in the mounted-groups map. See #729.\n if (!mountedAxes.has(hitRegion.axis)) {\n return;\n }\n const axisState = getMountedAxisState(hitRegion.axis.id, true);\n updateMountedAxis(hitRegion.axis, axisState, {\n isUserInteraction: true\n });\n });\n\n updateCursorStyle(event.currentTarget as Document);\n\n return;\n }\n\n for (const hitRegion of interactionState.hitRegions) {\n if (hitRegion.separator) {\n const { element } = hitRegion.separator;\n if (\n element.isConnected &&\n !element.hasPointerCapture?.(event.pointerId)\n ) {\n element.setPointerCapture?.(event.pointerId);\n }\n }\n }\n\n updateActiveHitRegions({\n commit: false,\n document: event.currentTarget as Document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedAxes,\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, mountedAxes);\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 { completeActivePointerResize } from \"../utils/completeActivePointerResize.ts\";\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 matched = completeActivePointerResize(\n event.currentTarget as Document,\n event\n );\n if (matched) {\n event.preventDefault();\n }\n}\n","import { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\n\nexport function calculateDefaultLayout(\n derivedItemConstraints: ResizeItemConstraints[]\n): Layout {\n let explicitCount = 0;\n let total = 0;\n\n const layout: Layout = {};\n\n for (const current of derivedItemConstraints) {\n if (current.defaultSize !== undefined) {\n explicitCount++;\n\n const size = formatLayoutNumber(current.defaultSize);\n\n total += size;\n layout[current.itemId] = 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.itemId] = undefined;\n }\n }\n\n const remainingItemCount = derivedItemConstraints.length - explicitCount;\n if (remainingItemCount !== 0) {\n const size = formatLayoutNumber((100 - total) / remainingItemCount);\n\n for (const current of derivedItemConstraints) {\n if (current.defaultSize === undefined) {\n layout[current.itemId] = size;\n }\n }\n }\n\n return layout;\n}\n","import type { Layout, RegisteredResizeItem } from \"../types\";\n\nexport function validateLayoutKeys(\n items: RegisteredResizeItem[],\n layout: Layout\n) {\n const itemIds = items.map((item) => item.id);\n const layoutKeys = Object.keys(layout);\n\n if (itemIds.length !== layoutKeys.length) {\n return false;\n }\n\n for (const itemId of itemIds) {\n if (!layoutKeys.includes(itemId)) {\n return false;\n }\n }\n\n return true;\n}\n","import { calculateDefaultLayout } from \"./calculateDefaultLayout\";\nimport { validateLayoutKeys } from \"./validateLayoutKeys\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n ResizeItemConstraints\n} from \"../types\";\n\nexport function getDefaultLayout({\n axis,\n itemConstraints\n}: {\n axis: RegisteredResizeAxis;\n itemConstraints: ResizeItemConstraints[];\n}): Layout {\n const itemIdsKey = axis.items.map(({ id }) => id).join(\",\");\n const defaultLayout = axis.mutableState.defaultLayout;\n\n // Dynamic panel configurations can invalidate a supplied default layout.\n return (\n axis.mutableState.layouts[itemIdsKey] ??\n (defaultLayout && validateLayoutKeys(axis.items, defaultLayout)\n ? defaultLayout\n : calculateDefaultLayout(itemConstraints))\n );\n}\n","import { calculateAvailableAxisSize } from \"../dom/calculateAvailableAxisSize\";\nimport type { RegisteredResizeAxis } from \"../types\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function notifyItemOnResize(\n axis: RegisteredResizeAxis,\n element: HTMLElement,\n borderBoxSize: readonly ResizeObserverSize[]\n) {\n const resizeObserverSize = borderBoxSize[0];\n if (!resizeObserverSize) {\n return;\n }\n\n const item = axis.items.find((current) => current.element === element);\n if (!item || !item.onResize) {\n return;\n }\n\n const axisSize = calculateAvailableAxisSize({ axis });\n\n const itemSize =\n axis.orientation === \"horizontal\"\n ? item.element.offsetWidth\n : item.element.offsetHeight;\n\n const prevSize = item.mutableValues.prevSize;\n const nextSize = {\n asPercentage: formatLayoutNumber((itemSize / axisSize) * 100),\n inPixels: itemSize\n };\n item.mutableValues.prevSize = nextSize;\n\n item.onResize(nextSize, item.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 { objectsEqual } from \"./objectsEqual\";\nimport type { ResizeItemConstraints } from \"../types\";\n\nexport function itemConstraintsEqual(\n a: ResizeItemConstraints[],\n b: ResizeItemConstraints[]\n) {\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((current, index) => objectsEqual(current, b[index]));\n}\n","import { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport type { Layout, RegisteredResizeAxis } from \"../types\";\n\nexport function preserveFixedItemSizes({\n axis,\n nextAxisSize,\n prevAxisSize,\n prevLayout\n}: {\n axis: RegisteredResizeAxis;\n nextAxisSize: number;\n prevAxisSize: number;\n prevLayout: Layout;\n}) {\n if (prevAxisSize <= 0 || nextAxisSize <= 0 || prevAxisSize === nextAxisSize) {\n return prevLayout;\n }\n\n let fixedItemsTotalSize = 0;\n let flexibleItemsTotalPrevSize = 0;\n let hasPreservePixelSizeItems = false;\n\n const fixedItems = new Map<string, number>();\n const flexibleItemIds: string[] = [];\n\n for (const item of axis.items) {\n const prevItemSize = prevLayout[item.id] ?? 0;\n switch (item.constraintProps.groupResizeBehavior) {\n case \"preserve-pixel-size\": {\n hasPreservePixelSizeItems = true;\n\n const prevItemSizeInPixels = (prevItemSize / 100) * prevAxisSize;\n const nextItemSize = formatLayoutNumber(\n (prevItemSizeInPixels / nextAxisSize) * 100\n );\n\n fixedItems.set(item.id, nextItemSize);\n fixedItemsTotalSize += nextItemSize;\n break;\n }\n case \"preserve-relative-size\":\n default: {\n flexibleItemIds.push(item.id);\n flexibleItemsTotalPrevSize += prevItemSize;\n break;\n }\n }\n }\n\n if (!hasPreservePixelSizeItems || flexibleItemIds.length === 0) {\n return prevLayout;\n }\n\n const remainingSize = 100 - fixedItemsTotalSize;\n const nextLayout = { ...prevLayout };\n\n fixedItems.forEach((size, itemId) => {\n nextLayout[itemId] = size;\n });\n\n if (flexibleItemsTotalPrevSize > 0) {\n for (const itemId of flexibleItemIds) {\n const prevSize = prevLayout[itemId] ?? 0;\n nextLayout[itemId] = formatLayoutNumber(\n (prevSize / flexibleItemsTotalPrevSize) * remainingSize\n );\n }\n } else {\n const evenSize = formatLayoutNumber(remainingSize / flexibleItemIds.length);\n for (const itemId of flexibleItemIds) {\n nextLayout[itemId] = evenSize;\n }\n }\n\n return nextLayout;\n}\n","import { updateCursorStyle } from \"./cursor/updateCursorStyle\";\nimport { removeAxisFromInteraction } from \"./mutable-state/interactions\";\nimport { assert } from \"../utils/assert\";\nimport { calculateAvailableAxisSize } from \"./dom/calculateAvailableAxisSize\";\nimport { calculateHitRegions } from \"./dom/calculateHitRegions\";\nimport { calculateItemConstraints } from \"./dom/calculateItemConstraints\";\nimport { onDocumentContextMenu } from \"./event-handlers/onDocumentContextMenu\";\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 deleteMutableAxis,\n getMountedAxisState,\n updateMountedAxis\n} from \"./mutable-state/axes\";\nimport type { SeparatorToItemsMap } from \"./mutable-state/types\";\nimport type { RegisteredResizeAxis } from \"./types\";\nimport { getDefaultLayout } from \"./utils/getDefaultLayout\";\nimport { layoutsEqual } from \"./utils/layoutsEqual\";\nimport { notifyItemOnResize } from \"./utils/notifyItemOnResize\";\nimport { itemConstraintsEqual } from \"./utils/itemConstraintsEqual\";\nimport { preserveFixedItemSizes } from \"./utils/preserveFixedItemSizes\";\nimport { validateAxisLayout } from \"./utils/validateAxisLayout\";\n\nconst ownerDocumentReferenceCounts = new Map<Document, number>();\n\nexport function mountAxis(axis: RegisteredResizeAxis) {\n let isMounted = true;\n\n assert(\n axis.element.ownerDocument.defaultView,\n \"Cannot register an unmounted Group\"\n );\n\n const ResizeObserver = axis.element.ownerDocument.defaultView.ResizeObserver;\n\n const itemIds = 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 === axis.element) {\n if (isMounted) {\n const axisSize = calculateAvailableAxisSize({ axis });\n if (axisSize === 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 axisState = getMountedAxisState(axis.id);\n if (!axisState) {\n // Not mounted yet\n return;\n }\n\n // Update non-percentage based constraints\n const nextDerivedItemConstraints = calculateItemConstraints(axis);\n\n // Revalidate layout in case constraints have changed or group size changed\n const prevLayout = axisState.defaultLayoutDeferred\n ? getDefaultLayout({\n axis,\n itemConstraints: nextDerivedItemConstraints\n })\n : axisState.layout;\n const unsafeLayout = preserveFixedItemSizes({\n axis,\n nextAxisSize: axisSize,\n prevAxisSize: axisState.axisSize,\n prevLayout\n });\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: nextDerivedItemConstraints\n });\n\n if (\n !axisState.defaultLayoutDeferred &&\n layoutsEqual(axisState.layout, nextLayout) &&\n itemConstraintsEqual(\n axisState.derivedItemConstraints,\n nextDerivedItemConstraints\n ) &&\n axisState.axisSize === axisSize\n ) {\n continue;\n }\n\n updateMountedAxis(axis, {\n defaultLayoutDeferred: false,\n derivedItemConstraints: nextDerivedItemConstraints,\n axisSize,\n layout: nextLayout,\n separatorToItems: axisState.separatorToItems\n });\n }\n } else {\n notifyItemOnResize(axis, target as HTMLElement, borderBoxSize);\n }\n }\n });\n\n resizeObserver.observe(axis.element);\n\n axis.items.forEach((item) => {\n assert(\n !itemIds.has(item.id),\n `Panel ids must be unique; id \"${item.id}\" was used more than once`\n );\n\n itemIds.add(item.id);\n\n if (item.onResize) {\n resizeObserver.observe(item.element);\n }\n });\n\n const axisSize = calculateAvailableAxisSize({ axis });\n\n // Calculate initial layout for the new Panel configuration\n const derivedItemConstraints = calculateItemConstraints(axis);\n const defaultLayoutUnsafe = getDefaultLayout({\n axis,\n itemConstraints: derivedItemConstraints\n });\n const defaultLayoutSafe = validateAxisLayout({\n layout: defaultLayoutUnsafe,\n itemConstraints: derivedItemConstraints\n });\n\n const ownerDocument = axis.element.ownerDocument;\n\n ownerDocumentReferenceCounts.set(\n ownerDocument,\n (ownerDocumentReferenceCounts.get(ownerDocument) ?? 0) + 1\n );\n\n const separatorToItems: SeparatorToItemsMap = new Map();\n\n // Include disabled separators because enabling them later does not rebuild this map.\n // The keyboard handler checks disabled state before resizing.\n const hitRegions = calculateHitRegions({ axis, includeDisabled: true });\n hitRegions.forEach((hitRegion) => {\n if (hitRegion.separator) {\n separatorToItems.set(hitRegion.separator, hitRegion.items);\n }\n });\n\n updateMountedAxis(axis, {\n defaultLayoutDeferred: axisSize === 0,\n derivedItemConstraints,\n axisSize,\n layout: defaultLayoutSafe,\n separatorToItems\n });\n\n axis.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(\"contextmenu\", onDocumentContextMenu, true);\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 unmountAxis() {\n isMounted = false;\n\n ownerDocumentReferenceCounts.set(\n ownerDocument,\n Math.max(0, (ownerDocumentReferenceCounts.get(ownerDocument) ?? 0) - 1)\n );\n\n deleteMutableAxis(axis);\n if (removeAxisFromInteraction(axis)) {\n updateCursorStyle(ownerDocument);\n }\n\n axis.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 \"contextmenu\",\n onDocumentContextMenu,\n true\n );\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 { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n ResizeItemConstraints\n} from \"../types\";\n\n/**\n * Updates the in-memory bookkeeping a Group needs to restore previous layouts:\n * - Cache the layout (keyed by panel ids) so it persists when the panel configuration changes.\n * This improves UX for conditionally rendered panels without requiring defaultLayout.\n * - Record the pre-collapse size of any collapsible panel that was just collapsed,\n * so that it can be restored when the panel is expanded (e.g. via the keyboard)\n */\nexport function recordAxisLayoutChange({\n derivedItemConstraints,\n axis,\n layout,\n prevLayout\n}: {\n derivedItemConstraints: ResizeItemConstraints[];\n axis: RegisteredResizeAxis;\n layout: Layout;\n prevLayout: Layout | undefined;\n}) {\n const itemIdsKey = axis.items.map(({ id }) => id).join(\",\");\n axis.mutableState.layouts[itemIdsKey] = layout;\n\n if (prevLayout) {\n derivedItemConstraints.forEach((constraints) => {\n if (constraints.collapsible) {\n const isCollapsed = layoutNumbersEqual(\n constraints.collapsedSize,\n layout[constraints.itemId]\n );\n const wasCollapsed = layoutNumbersEqual(\n constraints.collapsedSize,\n prevLayout[constraints.itemId]\n );\n if (isCollapsed && !wasCollapsed) {\n axis.mutableState.expandedItemSizes[constraints.itemId] =\n prevLayout[constraints.itemId];\n }\n }\n });\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 { 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 { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\n\nexport function calculateSeparatorAriaValues({\n layout,\n itemConstraints,\n itemId,\n itemIndex\n}: {\n layout: Layout;\n itemConstraints: ResizeItemConstraints[];\n itemId: string;\n itemIndex: 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 itemSize = layout[itemId];\n\n const constraints = itemConstraints.find(\n (current) => current.itemId === itemId\n );\n if (constraints) {\n const maxSize = constraints.maxSize;\n const minSize = constraints.collapsible\n ? constraints.collapsedSize\n : constraints.minSize;\n\n const pivotIndices = [itemIndex, itemIndex + 1];\n\n const minSizeLayout = validateAxisLayout({\n layout: adjustLayoutByDelta({\n delta: minSize - itemSize,\n initialLayout: layout,\n itemConstraints,\n pivotIndices,\n prevLayout: layout\n }),\n itemConstraints\n });\n\n valueMin = minSizeLayout[itemId];\n\n const maxSizeLayout = validateAxisLayout({\n layout: adjustLayoutByDelta({\n delta: maxSize - itemSize,\n initialLayout: layout,\n itemConstraints,\n pivotIndices,\n prevLayout: layout\n }),\n itemConstraints\n });\n\n valueMax = maxSizeLayout[itemId];\n }\n\n return {\n valueControls: itemId,\n valueMax,\n valueMin,\n valueNow: itemSize\n };\n}\n","\"use client\";\n\nimport type { Properties } from \"csstype\";\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type Ref\n} from \"react\";\nimport { subscribeToMountedAxis } from \"../../global/mutable-state/axes\";\nimport {\n notifySeparatorPreviewChanged,\n subscribeToInteractionState\n} from \"../../global/mutable-state/interactions\";\nimport type { InteractionState } from \"../../global/mutable-state/types\";\nimport type {\n HitRegion,\n Orientation,\n RegisteredSeparator\n} from \"../../global/types\";\nimport { calculateSeparatorAriaValues } from \"../../global/utils/calculateSeparatorAriaValues\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableObject } from \"../../hooks/useStableObject\";\n\n/**\n * @internal\n * Shared implementation of the `Separator` (within a Group) and `Gridline` (within a Grid) components.\n *\n * It registers a separator with the resize axis it belongs to, tracks its hover/drag/focus state,\n * and renders the separator element (including its WAI-ARIA attributes).\n * Everything specific to the parent component is passed in explicitly (rather than read from context).\n */\nexport function ResizeSeparator({\n attributes,\n axisId,\n axisOrientation,\n children,\n className,\n disableCursor,\n disabled,\n disableDoubleClick,\n elementRef: elementRefProp,\n id,\n isSharedHitRegion,\n preview,\n registerSeparator,\n requiredStyle,\n style,\n styleDefaults,\n tabIndex = 0,\n updateSeparatorProps\n}: {\n /** Additional HTML attributes to render on the separator element */\n attributes?: HTMLAttributes<HTMLDivElement> | undefined;\n\n /** Id of the resize axis (e.g. the Group) this separator belongs to */\n axisId: string;\n\n /** Orientation of the resize axis; the separator's `aria-orientation` is the opposite */\n axisOrientation: Orientation;\n\n children: ReactNode | undefined;\n className: string | undefined;\n disableCursor: boolean;\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n elementRef: Ref<HTMLDivElement> | undefined;\n id: string;\n\n /**\n * Hit regions that resize the same items as this separator (e.g. other separators along the same Grid boundary);\n * this separator shares hover/active state with them.\n */\n isSharedHitRegion?: ((hitRegion: HitRegion) => boolean) | undefined;\n\n preview?: ReactNode;\n registerSeparator: (separator: RegisteredSeparator) => () => void;\n\n /** Styles that cannot be overridden by the `style` prop */\n requiredStyle?: CSSProperties | undefined;\n\n style: CSSProperties | undefined;\n\n /** Styles that can be overridden by the `style` prop */\n styleDefaults?: CSSProperties | undefined;\n\n tabIndex?: number | undefined;\n updateSeparatorProps: (\n id: string,\n props: {\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n }\n ) => void;\n}) {\n const stableProps = useStableObject({\n disabled,\n disableDoubleClick,\n children,\n className,\n preview,\n style\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 const [isFocused, setIsFocused] = useState(false);\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n const registeredSeparatorRef = useRef<RegisteredSeparator | null>(null);\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const orientation =\n axisOrientation === \"horizontal\" ? \"vertical\" : \"horizontal\";\n\n // Register the separator with its resize axis\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 disableDoubleClick: stableProps.disableDoubleClick,\n element,\n id,\n get children() {\n return stableProps.children;\n },\n get className() {\n return stableProps.className;\n },\n get preview() {\n return stableProps.preview;\n },\n get style() {\n return stableProps.style;\n }\n };\n\n registeredSeparatorRef.current = separator;\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) =>\n hitRegion.separator === separator ||\n (isSharedHitRegion?.(hitRegion) ?? false)\n )\n ? event.next.state\n : \"inactive\"\n );\n }\n );\n\n const removeMountedAxesChangeListener = subscribeToMountedAxis(\n axisId,\n (event) => {\n const { derivedItemConstraints, layout, separatorToItems } =\n event.next;\n const items = separatorToItems.get(separator);\n if (items) {\n const primaryItem = items[0];\n\n // The index must be relative to the Group's panels (not the pair this Separator sits between\n // because it's used as a pivot index into the Group's layout.\n // derivedPanelConstraints is derived from group.panels, so it's already in panel order.\n // See #740.\n const itemIndex = derivedItemConstraints.findIndex(\n (constraints) => constraints.itemId === primaryItem.id\n );\n\n const { layoutStrategy } = event.axis;\n\n setAria({\n ...calculateSeparatorAriaValues({\n layout,\n itemConstraints: derivedItemConstraints,\n itemId: primaryItem.id,\n itemIndex\n }),\n // Items without DOM elements of their own (e.g. Grid tracks) control other elements\n ...(layoutStrategy?.getItemAriaControls && {\n valueControls: layoutStrategy.getItemAriaControls(\n primaryItem.id\n )\n })\n });\n }\n }\n );\n\n return () => {\n registeredSeparatorRef.current = null;\n\n removeInteractionStateChangeListener();\n removeMountedAxesChangeListener();\n unregisterSeparator();\n };\n }\n }, [axisId, id, isSharedHitRegion, registerSeparator, stableProps]);\n\n useIsomorphicLayoutEffect(() => {\n const separator = registeredSeparatorRef.current;\n if (separator) {\n notifySeparatorPreviewChanged(separator);\n }\n }, [preview]);\n\n // Not all props require re-registering the separator;\n useEffect(() => {\n updateSeparatorProps(id, { disabled, disableDoubleClick });\n }, [disabled, disableDoubleClick, id, updateSeparatorProps]);\n\n let cursor: Properties[\"cursor\"] = undefined;\n if (disabled && !disableCursor) {\n cursor = \"not-allowed\";\n }\n\n let dataSeparator = undefined;\n if (disabled) {\n dataSeparator = \"disabled\";\n } else {\n switch (dragState) {\n case \"active\": {\n dataSeparator = \"active\";\n break;\n }\n default: {\n if (isFocused) {\n dataSeparator = \"focus\";\n } else {\n dataSeparator = dragState;\n }\n }\n }\n }\n\n return (\n <div\n {...attributes}\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={dataSeparator}\n data-testid={id}\n id={id}\n onBlur={() => setIsFocused(false)}\n onFocus={() => setIsFocused(true)}\n ref={mergedRef}\n role=\"separator\"\n style={{\n ...styleDefaults,\n cursor,\n\n ...style,\n\n ...requiredStyle,\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 : tabIndex}\n />\n );\n}\n","\"use client\";\n\nimport {\n useCallback,\n type CSSProperties,\n type ReactNode,\n type Ref\n} from \"react\";\nimport type { HitRegion, RegisteredSeparator } from \"../../global/types\";\nimport { useId } from \"../../hooks/useId\";\nimport { ResizeSeparator } from \"../shared/ResizeSeparator\";\nimport {\n getGutterGridPlacement,\n getSeparatorCrossGridPlacement,\n isValidGridlineIndex\n} from \"./gridPlacement\";\nimport type { GridAxis } from \"./types\";\nimport { useGridContext } from \"./useGridContext\";\n\n/**\n * @internal\n * Implementation of Gridline.\n *\n * Gridlines are registered with the Grid axis they resize;\n * most of their behavior (aria attributes, keyboard and pointer interactions) is shared with Separators in a Group\n */\nexport function GridTrackSeparator({\n axis,\n children,\n className,\n crossSpan,\n crossStart,\n disabled,\n elementRef,\n index,\n style\n}: {\n axis: GridAxis;\n children: ReactNode | undefined;\n className: string | undefined;\n crossSpan: number | undefined;\n crossStart: number;\n disabled: boolean | undefined;\n elementRef: Ref<HTMLDivElement> | undefined;\n index: number;\n style: CSSProperties | undefined;\n}) {\n const id = useId(undefined);\n\n const {\n getDisableCursor,\n getResizeAxisId,\n gutters,\n registerSeparator,\n separatorPlacements,\n trackCounts,\n updateSeparatorProps\n } = useGridContext();\n\n const axisId = getResizeAxisId(axis);\n const crossAxis: GridAxis = axis === \"column\" ? \"row\" : \"column\";\n const crossCount = trackCounts[crossAxis];\n\n // Invalid placements are logged by the Grid (see getPlacementErrors);\n // a gridline that isn't between two tracks can't resize anything, so it's treated as disabled\n const isDisabled =\n !!disabled || !isValidGridlineIndex(index, trackCounts[axis]);\n\n // Only one gridline per boundary should be included in the tab order;\n // (they all resize the same tracks)\n let isFirstEnabledGridlineOnBoundary = true;\n for (const placement of separatorPlacements.values()) {\n if (\n placement.axis === axis &&\n placement.index === index &&\n !placement.disabled &&\n placement.crossStart < crossStart\n ) {\n isFirstEnabledGridlineOnBoundary = false;\n break;\n }\n }\n\n // Gridlines along the same boundary resize the same tracks and so share hover/active state\n const isSharedHitRegion = useCallback(\n (hitRegion: HitRegion) =>\n hitRegion.axis.id === axisId &&\n hitRegion.axis.items.indexOf(hitRegion.items[1]) === index,\n [axisId, index]\n );\n\n const registerGridline = useCallback(\n (separator: RegisteredSeparator) =>\n registerSeparator(\n {\n axis,\n crossSpan,\n crossStart,\n disabled: !!disabled,\n index\n },\n separator\n ),\n [axis, crossSpan, crossStart, disabled, index, registerSeparator]\n );\n\n // Gridlines are rendered within the gutter track between two content tracks\n const gutterPlacement = getGutterGridPlacement(index);\n const crossPlacement = getSeparatorCrossGridPlacement({\n crossCount,\n crossSpan,\n crossStart,\n hasGutters: gutters[crossAxis]\n });\n\n return (\n <ResizeSeparator\n axisId={axisId}\n axisOrientation={axis === \"column\" ? \"horizontal\" : \"vertical\"}\n className={className}\n disableCursor={getDisableCursor()}\n disabled={isDisabled}\n disableDoubleClick={undefined}\n elementRef={elementRef}\n id={id}\n isSharedHitRegion={isSharedHitRegion}\n registerSeparator={registerGridline}\n requiredStyle={{\n gridColumn: axis === \"column\" ? gutterPlacement : crossPlacement,\n gridRow: axis === \"row\" ? gutterPlacement : crossPlacement\n }}\n style={style}\n tabIndex={isFirstEnabledGridlineOnBoundary ? 0 : -1}\n updateSeparatorProps={updateSeparatorProps}\n >\n {children}\n </ResizeSeparator>\n );\n}\n","\"use client\";\n\nimport { GridTrackSeparator } from \"./GridTrackSeparator\";\nimport type { GridlineProps } from \"./types\";\n\n/**\n * Resizes the columns (or rows) of a Grid.\n *\n * For example:\n *\n * ```tsx\n * // Rendered between columns 0 and 1 and spans all rows\n * <Gridline type=\"column\" column={1} />\n * ```\n *\n * ```tsx\n * // Rendered between rows 0 and 1 and spans all columns\n * <Gridline type=\"row\" row={1} />\n * ```\n *\n * ```tsx\n * // Rendered between columns 0 and 1 alongside of row 2 only\n * <Gridline type=\"column\" column={1} row={2} rowSpan={1} />\n * ```\n *\n * A gridline should not be rendered alongside of a Cell that spans across its boundary\n * (this includes disabled gridlines; an error will be logged to the console);\n * render multiple gridlines along the same boundary instead (e.g. before and after the spanning Cell).\n *\n * ℹ️ Once a boundary contains a gridline, it can only be resized using gridlines;\n * the parts of the boundary that aren't alongside of a gridline can't be dragged.\n *\n * Where column and row gridlines intersect, dragging resizes both axes.\n *\n * Gridlines are not _required_ but they are _recommended_ as they improve keyboard accessibility.\n *\n * Gridline elements always include the following attributes:\n *\n * ```html\n * <div aria-orientation=\"vertical\" data-separator role=\"separator\">\n * ```\n *\n * ℹ️ Column gridlines are vertical (`aria-orientation=\"vertical\"`) and row gridlines are horizontal (`aria-orientation=\"horizontal\"`).\n *\n * ℹ️ In addition to the attributes shown above, gridlines also render 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 *\n * ⚠️ Gridline elements must be direct DOM children of their parent Grid elements.\n *\n * ℹ️ Gridlines rendered by another component (rather than directly within the Grid) aren't detected until they mount, so server-rendered layouts may shift slightly during hydration.\n */\nexport function Gridline(props: GridlineProps) {\n const { children, className, disabled, elementRef, style } = props;\n\n return props.type === \"column\" ? (\n <GridTrackSeparator\n axis=\"column\"\n className={className}\n crossSpan={props.rowSpan}\n crossStart={props.row ?? 0}\n disabled={disabled}\n elementRef={elementRef}\n index={props.column}\n style={style}\n >\n {children}\n </GridTrackSeparator>\n ) : (\n <GridTrackSeparator\n axis=\"row\"\n className={className}\n crossSpan={props.columnSpan}\n crossStart={props.column ?? 0}\n disabled={disabled}\n elementRef={elementRef}\n index={props.row}\n style={style}\n >\n {children}\n </GridTrackSeparator>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nGridline.displayName = \"Gridline\";\n","\"use client\";\n\nimport {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useSyncExternalStore,\n type ReactNode\n} from \"react\";\nimport { calculateGridHitRegions } from \"./calculateGridHitRegions\";\nimport { measureGridAxis } from \"./measureGridAxis\";\nimport { parseSizeAndUnit } from \"../../global/styles/parseSizeAndUnit\";\nimport { mountAxis } from \"../../global/mountAxis\";\nimport {\n getMountedAxisState,\n getRegisteredAxis,\n subscribeToMountedAxis\n} from \"../../global/mutable-state/axes\";\nimport { getInteractionState } from \"../../global/mutable-state/interactions\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n RegisteredResizeItem,\n RegisteredSeparator\n} from \"../../global/types\";\nimport { getImperativeAxisMethods } from \"../../global/utils/getImperativeAxisMethods\";\nimport { getImperativeItemMethods } from \"../../global/utils/getImperativeItemMethods\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { recordAxisLayoutChange } from \"../../global/utils/recordAxisLayoutChange\";\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 { assert } from \"../../utils/assert\";\nimport { GroupContext } from \"../group/GroupContext\";\nimport { GridContext } from \"./GridContext\";\nimport { Gridline } from \"./Gridline\";\nimport { isValidGridlineIndex } from \"./gridPlacement\";\nimport type {\n GridAxis,\n GridContextType,\n GridImperativeHandle,\n GridLayout,\n GridProps,\n GridSeparatorPlacement,\n GridTrackImperativeHandle,\n GridTrackProps,\n RegisteredCell\n} from \"./types\";\n\ntype NormalizedTrack = GridTrackProps & { id: string };\n\ntype AxisValues = {\n expandedItemSizes: { [trackId: string]: number };\n layouts: { [trackIds: string]: Layout };\n};\n\nconst AXES: GridAxis[] = [\"column\", \"row\"];\n\nconst EMPTY_GRID_LAYOUT: GridLayout = { columns: {}, rows: {} };\n\n/**\n * A Grid arranges resizable Cells in two dimensions.\n * Columns can be resized horizontally and rows can be resized vertically;\n * dragging the point where a column boundary and a row boundary intersect resizes both.\n *\n * Size constraints (e.g. min/max size, collapsible) are specified per track (column or row),\n * using the same format as Panel props.\n *\n * Cells can span multiple columns and/or rows.\n * Track boundaries cannot be resized alongside of a cell that spans across them.\n *\n * Grid elements always include the following attributes:\n *\n * ```html\n * <div data-grid data-testid=\"grid-id-prop\" id=\"grid-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 Grid({\n children,\n className,\n columns,\n defaultLayout,\n disableCursor,\n disabled,\n elementRef: elementRefProp,\n gridRef,\n id: idProp,\n onLayoutChange: onLayoutChangeUnstable,\n onLayoutChanged: onLayoutChangedUnstable,\n resizeTargetMinimumSize = {\n coarse: 20,\n fine: 10\n },\n rows,\n style,\n ...rest\n}: GridProps) {\n const id = useId(idProp);\n\n const getResizeAxisId = useCallback(\n (axis: GridAxis) => (axis === \"column\" ? `${id}:columns` : `${id}:rows`),\n [id]\n );\n\n const columnTracks = useNormalizedTracks(columns, \"columns\");\n const rowTracks = useNormalizedTracks(rows, \"rows\");\n const getTracks = (axis: GridAxis) =>\n axis === \"column\" ? columnTracks : rowTracks;\n\n const prevLayoutRef = useRef<{\n onLayoutChange: GridLayout;\n onLayoutChanged: GridLayout;\n }>({\n onLayoutChange: EMPTY_GRID_LAYOUT,\n onLayoutChanged: EMPTY_GRID_LAYOUT\n });\n\n const onLayoutChangeStable = useStableCallback((layout: GridLayout) => {\n if (gridLayoutsEqual(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(\n (layout: GridLayout, isUserInteraction: boolean) => {\n if (gridLayoutsEqual(prevLayoutRef.current.onLayoutChanged, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChanged = layout;\n onLayoutChangedUnstable?.(layout, { isUserInteraction });\n }\n );\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const [cellOrSeparatorChangeSigil, forceUpdate] = useForceUpdate();\n\n const inMemoryValuesRef = useRef<{\n cells: RegisteredCell[];\n column: AxisValues;\n loggedErrors: Set<string>;\n row: AxisValues;\n separators: Map<RegisteredSeparator, GridSeparatorPlacement>;\n }>({\n cells: [],\n column: { expandedItemSizes: {}, layouts: {} },\n loggedErrors: new Set(),\n row: { expandedItemSizes: {}, layouts: {} },\n separators: new Map()\n });\n\n // Separators are rendered within \"gutter\" tracks, interleaved between the content tracks.\n // Gutters are only added to an axis that contains separators.\n // Separators are detected while rendering (to avoid layout shift when server rendering)\n // as well as once mounted (in case they are rendered by a nested component)\n const gutters = { column: false, row: false };\n for (const placement of inMemoryValuesRef.current.separators.values()) {\n gutters[placement.axis] = true;\n }\n findSeparatorsInChildren(children, gutters);\n\n const stableProps = useStableObject({\n defaultLayout,\n disableCursor,\n resizeTargetMinimumSize\n });\n\n const getDisableCursor = useStableCallback(() => !!stableProps.disableCursor);\n\n const registerCell = useCallback(\n (cell: RegisteredCell) => {\n const inMemoryValues = inMemoryValuesRef.current;\n inMemoryValues.cells = [...inMemoryValues.cells, cell];\n\n // Cells are only used to calculate hit regions (which is done lazily)\n // but the Grid should still be re-registered when they change (like a Group is when its Panels change).\n // Child effects run before parent effects, so a Grid may be registered before its element is in its final document\n // (e.g. when portaled into a popup window that is attached to the document in a parent effect)\n forceUpdate();\n\n return () => {\n inMemoryValues.cells = inMemoryValues.cells.filter(\n (current) => current !== cell\n );\n\n forceUpdate();\n };\n },\n [forceUpdate]\n );\n\n const registerSeparator = useCallback(\n (placement: GridSeparatorPlacement, separator: RegisteredSeparator) => {\n const inMemoryValues = inMemoryValuesRef.current;\n inMemoryValues.separators = new Map(inMemoryValues.separators);\n inMemoryValues.separators.set(separator, placement);\n\n forceUpdate();\n\n return () => {\n inMemoryValues.separators = new Map(inMemoryValues.separators);\n inMemoryValues.separators.delete(separator);\n\n forceUpdate();\n };\n },\n [forceUpdate]\n );\n\n const updateSeparatorProps = useCallback(\n (\n separatorId: string,\n {\n disabled,\n disableDoubleClick\n }: {\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n }\n ) => {\n for (const separator of inMemoryValuesRef.current.separators.keys()) {\n if (separator.id === separatorId) {\n separator.disabled = disabled;\n separator.disableDoubleClick = disableDoubleClick;\n }\n }\n },\n []\n );\n\n const separatorPlacements = inMemoryValuesRef.current.separators;\n\n const context = useMemo<GridContextType>(\n () => ({\n getDisableCursor,\n getResizeAxisId,\n gutters: {\n column: gutters.column,\n row: gutters.row\n },\n id,\n registerCell,\n registerSeparator,\n separatorPlacements,\n trackCounts: {\n column: columnTracks.length,\n row: rowTracks.length\n },\n updateSeparatorProps\n }),\n [\n columnTracks.length,\n getDisableCursor,\n getResizeAxisId,\n gutters.column,\n gutters.row,\n id,\n registerCell,\n registerSeparator,\n rowTracks.length,\n separatorPlacements,\n updateSeparatorProps\n ]\n );\n\n const registeredAxesRef = useRef<RegisteredResizeAxis[]>([]);\n\n // Register each axis of the Grid with global state (as if it were a Group)\n // Listen to global state for layout changes related to this Grid\n useIsomorphicLayoutEffect(() => {\n const element = elementRef.current;\n if (element === null) {\n return;\n }\n\n const inMemoryValues = inMemoryValuesRef.current;\n\n // Cells and gridlines register themselves (in layout effects) before this effect runs,\n // so this is the earliest point at which their placements can be validated (against the Grid and each other)\n // Invalid placements are logged (rather than thrown) because they are easy to create temporarily\n // (e.g. when the number of tracks, cells, and gridlines are conditionally rendered based on different state);\n // each problem is only logged once (until it's been resolved)\n const errors = getPlacementErrors({\n cells: inMemoryValues.cells,\n separatorPlacements: inMemoryValues.separators,\n trackCounts: { column: columnTracks.length, row: rowTracks.length }\n });\n errors.forEach((error) => {\n if (!inMemoryValues.loggedErrors.has(error)) {\n console.error(error);\n }\n });\n inMemoryValues.loggedErrors = new Set(errors);\n\n const getSeparators = (axis: GridAxis) =>\n Array.from(inMemoryValues.separators.entries())\n .filter(([, placement]) => placement.axis === axis)\n .sort(([, a], [, b]) => a.index - b.index)\n .map(([separator]) => separator);\n\n const createResizeAxis = (axis: GridAxis): RegisteredResizeAxis => {\n const tracks = axis === \"column\" ? columnTracks : rowTracks;\n const crossTracks = axis === \"column\" ? rowTracks : columnTracks;\n const trackIds = tracks.map((track) => track.id);\n const axisId = getResizeAxisId(axis);\n const separators = getSeparators(axis);\n const hasGutters = separators.length > 0;\n\n const items = tracks.map<RegisteredResizeItem>(\n ({ id: _, ...itemConstraints }, index) => ({\n // Tracks don't have DOM elements of their own;\n // the Grid element is used to resolve relative size constraints (e.g. \"em\")\n element,\n id: trackIds[index],\n idIsStable: true,\n mutableValues: {\n expandToSize: undefined,\n prevSize: undefined\n },\n onResize: undefined,\n constraintProps: itemConstraints\n })\n );\n\n const measure = () => {\n const gutterSizes: number[] = [];\n if (hasGutters) {\n for (const [separator, placement] of inMemoryValues.separators) {\n if (\n placement.axis === axis &&\n isValidGridlineIndex(placement.index, tracks.length)\n ) {\n const rect = separator.element.getBoundingClientRect();\n gutterSizes[placement.index] = Math.max(\n gutterSizes[placement.index] ?? 0,\n axis === \"column\" ? rect.width : rect.height\n );\n }\n }\n }\n\n return measureGridAxis({\n axis,\n element,\n gutterSizes: gutterSizes.filter((size) => size !== undefined),\n hasGutters,\n layout: getMountedAxisState(axisId)?.layout,\n trackIds\n });\n };\n\n // Guard against unexpected layout attribute ordering by pre-sorting track ids; see issues/656\n let preSortedDefaultLayout: Layout | undefined = undefined;\n const defaultAxisLayout =\n stableProps.defaultLayout?.[axis === \"column\" ? \"columns\" : \"rows\"];\n if (\n defaultAxisLayout !== undefined &&\n Object.keys(defaultAxisLayout).length === trackIds.length\n ) {\n preSortedDefaultLayout = {};\n for (const trackId of trackIds) {\n const size = defaultAxisLayout[trackId];\n if (size !== undefined) {\n preSortedDefaultLayout[trackId] = size;\n }\n }\n }\n\n return {\n disabled: !!disabled,\n element,\n id: axisId,\n layoutStrategy: {\n getItemAriaControls: (trackId) => {\n const index = trackIds.indexOf(trackId);\n return (\n inMemoryValues.cells\n .filter((cell) => {\n const start = axis === \"column\" ? cell.column : cell.row;\n const span =\n axis === \"column\" ? cell.columnSpan : cell.rowSpan;\n return start <= index && index < start + span;\n })\n .map((cell) => cell.element.id)\n .filter(Boolean)\n .join(\" \") || undefined\n );\n },\n calculateAvailableSize: () => measure().availableSize,\n calculateHitRegions: ({\n expandHitTargets,\n axis: resizeAxis,\n includeDisabled\n }) =>\n calculateGridHitRegions({\n axis,\n cells: inMemoryValues.cells,\n crossTrackCount: crossTracks.length,\n expandHitTargets,\n resizeAxis,\n axisSize: measure().availableSize,\n includeDisabled,\n separatorPlacements: inMemoryValues.separators\n }),\n getItemSizeInPixels: (trackId: string) =>\n measure().trackSizes[trackIds.indexOf(trackId)] ?? 0\n },\n mutableState: {\n defaultLayout: preSortedDefaultLayout,\n disableCursor: !!stableProps.disableCursor,\n expandedItemSizes: inMemoryValues[axis].expandedItemSizes,\n layouts: inMemoryValues[axis].layouts\n },\n orientation: axis === \"column\" ? \"horizontal\" : \"vertical\",\n items,\n resizePreviewMode: \"panel\",\n get resizeTargetMinimumSize() {\n return stableProps.resizeTargetMinimumSize;\n },\n separators\n };\n };\n\n const resizeAxes = AXES.map(createResizeAxis);\n\n registeredAxesRef.current = resizeAxes;\n\n const unmountAxes = resizeAxes.map((axis) => mountAxis(axis));\n\n const getGridLayout = (): GridLayout | undefined => {\n const [columnState, rowState] = resizeAxes.map((axis) =>\n getMountedAxisState(axis.id)\n );\n if (\n !columnState ||\n !rowState ||\n columnState.defaultLayoutDeferred ||\n rowState.defaultLayoutDeferred\n ) {\n // This indicates that the Grid 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 undefined;\n }\n\n return { columns: columnState.layout, rows: rowState.layout };\n };\n\n {\n const layout = getGridLayout();\n if (layout) {\n onLayoutChangeStable(layout);\n // Initial mount is not a user interaction (#716).\n onLayoutChangedStable(layout, false);\n }\n }\n\n const removeChangeEventListeners = resizeAxes.map((axis) =>\n subscribeToMountedAxis(axis.id, (event) => {\n const { defaultLayoutDeferred, derivedItemConstraints, layout } =\n event.next;\n\n if (defaultLayoutDeferred || derivedItemConstraints.length === 0) {\n return;\n }\n\n recordAxisLayoutChange({\n derivedItemConstraints,\n axis,\n layout,\n prevLayout: event.prev?.layout\n });\n\n const gridLayout = getGridLayout();\n if (gridLayout) {\n const interactionState = getInteractionState();\n const isCompleted =\n interactionState.state !== \"active\" ||\n !interactionState.hitRegions.some((region) =>\n resizeAxes.includes(region.axis)\n );\n\n onLayoutChangeStable(gridLayout);\n if (isCompleted) {\n onLayoutChangedStable(gridLayout, event.isUserInteraction);\n }\n }\n })\n );\n\n return () => {\n registeredAxesRef.current = [];\n\n unmountAxes.forEach((unmount) => unmount());\n removeChangeEventListeners.forEach((remove) => remove());\n };\n }, [\n columnTracks,\n disabled,\n getResizeAxisId,\n id,\n onLayoutChangedStable,\n onLayoutChangeStable,\n rowTracks,\n cellOrSeparatorChangeSigil,\n stableProps\n ]);\n\n // Not all props require re-registering the grid;\n // Some can be updated after the grid has been registered\n useEffect(() => {\n registeredAxesRef.current.forEach((resizeAxis) => {\n resizeAxis.mutableState.defaultLayout =\n defaultLayout?.[\n resizeAxis.orientation === \"horizontal\" ? \"columns\" : \"rows\"\n ];\n resizeAxis.mutableState.disableCursor = !!disableCursor;\n });\n });\n\n useImperativeHandle(gridRef, (): GridImperativeHandle => {\n const getLayout = (): GridLayout => {\n const [columnAxisId, rowAxisId] = AXES.map(getResizeAxisId);\n if (!getRegisteredAxis(columnAxisId) || !getRegisteredAxis(rowAxisId)) {\n return { columns: {}, rows: {} };\n }\n\n return {\n columns: getImperativeAxisMethods({\n axisId: columnAxisId\n }).getLayout(),\n rows: getImperativeAxisMethods({ axisId: rowAxisId }).getLayout()\n };\n };\n\n const formatIds = (ids: string[]) =>\n ids.map((trackId) => `\"${trackId}\"`).join(\", \");\n\n // Returns a track handle whose methods verify that the track (still) exists before delegating to the Panel methods;\n // this provides clearer errors than the (Panel-specific) messages would\n const createTrackHandle = (\n axis: GridAxis,\n trackId: string\n ): GridTrackImperativeHandle => {\n const axisId = getResizeAxisId(axis);\n const getMethods = () => {\n const resizeAxis = getRegisteredAxis(axisId);\n assert(resizeAxis, `Grid \"${id}\" has not been mounted`);\n assert(\n resizeAxis.items.some((item) => item.id === trackId),\n `Grid \"${id}\" no longer contains a ${axis} with id \"${trackId}\"; ${axis} ids are ${formatIds(resizeAxis.items.map((item) => item.id))}`\n );\n\n return getImperativeItemMethods({ axisId, itemId: trackId });\n };\n\n return {\n collapse: () => getMethods().collapse(),\n expand: () => getMethods().expand(),\n getSize: () => getMethods().getSize(),\n isCollapsed: () => getMethods().isCollapsed(),\n resize: (size: number | string) => getMethods().resize(size)\n };\n };\n\n return {\n getLayout,\n getTrackById: (axis: GridAxis, trackId: string | number) => {\n const tracks = axis === \"column\" ? columnTracks : rowTracks;\n const normalizedId = `${trackId}`;\n assert(\n tracks.some((track) => track.id === normalizedId),\n `Grid \"${id}\" does not contain a ${axis} with id \"${normalizedId}\"; ${axis} ids are ${formatIds(tracks.map((track) => track.id))}`\n );\n\n return createTrackHandle(axis, normalizedId);\n },\n getTrackByIndex: (axis: GridAxis, index: number) => {\n const tracks = axis === \"column\" ? columnTracks : rowTracks;\n const track = Number.isInteger(index) ? tracks[index] : undefined;\n assert(\n track,\n `Grid \"${id}\" does not contain a ${axis} at index ${index}; it has ${tracks.length} ${axis}s`\n );\n\n return createTrackHandle(axis, track.id);\n },\n setLayout: (layout: Parameters<GridImperativeHandle[\"setLayout\"]>[0]) => {\n AXES.forEach((axis) => {\n const axisLayout = layout[axis === \"column\" ? \"columns\" : \"rows\"];\n const axisId = getResizeAxisId(axis);\n if (axisLayout && getRegisteredAxis(axisId)) {\n getImperativeAxisMethods({ axisId }).setLayout(axisLayout);\n }\n });\n\n return getLayout();\n }\n };\n }, [columnTracks, getResizeAxisId, id, rowTracks]);\n\n // The grid template is the only thing that needs to be re-rendered when the layout changes\n const readTemplate = () =>\n AXES.map((axis) => {\n const state = getMountedAxisState(getResizeAxisId(axis));\n const tracks = getTracks(axis);\n\n const sizes =\n state && !state.defaultLayoutDeferred\n ? tracks.map((track) => `minmax(0, ${state.layout[track.id] ?? 1}fr)`)\n : getInitialTrackSizes(\n tracks,\n defaultLayout?.[axis === \"column\" ? \"columns\" : \"rows\"]\n );\n\n return sizes.join(gutters[axis] ? \" auto \" : \" \");\n }).join(\"|\");\n\n const subscribeToLayout = useCallback(\n (callback: () => void) => {\n const unsubscribes = AXES.map((axis) =>\n subscribeToMountedAxis(getResizeAxisId(axis), callback)\n );\n return () => unsubscribes.forEach((unsubscribe) => unsubscribe());\n },\n [getResizeAxisId]\n );\n\n const template = useSyncExternalStore(\n subscribeToLayout,\n readTemplate,\n readTemplate\n );\n const [gridTemplateColumns, gridTemplateRows] = template.split(\"|\");\n\n return (\n <GridContext.Provider value={context}>\n <div\n {...rest}\n className={className}\n data-grid\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: \"grid\",\n gridTemplateColumns,\n gridTemplateRows,\n\n // Inform the browser that the library is handling touch events for this element\n // NOTE This is not an inherited style\n touchAction: \"none\"\n }}\n >\n {/* Cells should not inherit context from a parent Group (if this Grid is nested within one) */}\n <GroupContext.Provider value={null}>{children}</GroupContext.Provider>\n </div>\n </GridContext.Provider>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nGrid.displayName = \"Grid\";\n\nfunction useNormalizedTracks(\n tracks: number | GridTrackProps[],\n propName: string\n): NormalizedTrack[] {\n // Track props are expected to be defined inline, so compare them by value\n const key = JSON.stringify(tracks);\n\n return useMemo(() => {\n const normalized: NormalizedTrack[] =\n typeof tracks === \"number\"\n ? Array.from({ length: tracks }, (_, index) => ({ id: `${index}` }))\n : tracks.map((track, index) => ({\n ...track,\n id: `${track.id ?? index}`\n }));\n\n assert(\n normalized.length > 0,\n `Grid must have at least one track; \"${propName}\" is ${key}`\n );\n\n return normalized;\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n}\n\nfunction findSeparatorsInChildren(\n children: ReactNode,\n gutters: { column: boolean; row: boolean }\n) {\n Children.forEach(children, (child) => {\n if (isValidElement(child)) {\n if (child.type === Gridline) {\n const { type } = child.props as { type?: unknown };\n if (type === \"column\") {\n gutters.column = true;\n } else if (type === \"row\") {\n gutters.row = true;\n }\n } else if (\n // Fragments\n typeof child.type === \"symbol\" &&\n child.props !== null &&\n typeof child.props === \"object\" &&\n \"children\" in child.props\n ) {\n findSeparatorsInChildren(child.props.children as ReactNode, gutters);\n }\n }\n });\n}\n\n/**\n * Approximates the default layout before the Grid has been mounted (e.g. during server rendering)\n * using the default layout (if one was specified) or the default size of each track.\n */\nfunction getInitialTrackSizes(\n tracks: NormalizedTrack[],\n defaultLayout: Layout | undefined\n): string[] {\n if (defaultLayout) {\n return tracks.map(\n (track) => `minmax(0, ${defaultLayout[track.id] ?? 1}fr)`\n );\n }\n\n const defaultSizes = tracks.map((track) =>\n track.defaultSize === undefined\n ? undefined\n : parseSizeAndUnit(track.defaultSize)\n );\n\n let remainingPercentage = 100;\n let numUnspecified = 0;\n defaultSizes.forEach((defaultSize) => {\n if (defaultSize === undefined) {\n numUnspecified++;\n } else if (defaultSize[1] === \"%\") {\n remainingPercentage -= defaultSize[0];\n }\n });\n\n return defaultSizes.map((defaultSize) => {\n if (defaultSize === undefined) {\n return `minmax(0, ${Math.max(0, remainingPercentage) / Math.max(1, numUnspecified)}fr)`;\n }\n\n const [size, unit] = defaultSize;\n return unit === \"%\" ? `minmax(0, ${size}fr)` : `${size}${unit}`;\n });\n}\n\nfunction getPlacementErrors({\n cells,\n separatorPlacements,\n trackCounts\n}: {\n cells: RegisteredCell[];\n separatorPlacements: ReadonlyMap<RegisteredSeparator, GridSeparatorPlacement>;\n trackCounts: { column: number; row: number };\n}): string[] {\n const errors: string[] = [];\n\n // Cells must be placed within the Grid's tracks\n for (const cell of cells) {\n AXES.forEach((axis) => {\n const [index, span] =\n axis === \"column\"\n ? [cell.column, cell.columnSpan]\n : [cell.row, cell.rowSpan];\n const trackCount = trackCounts[axis];\n if (\n !Number.isInteger(index) ||\n !Number.isInteger(span) ||\n index < 0 ||\n span < 1 ||\n index + span > trackCount\n ) {\n errors.push(\n `Invalid Cell ${axis} placement (${axis}: ${index}, ${axis}Span: ${span}); Grid has ${trackCount} ${axis}s`\n );\n }\n });\n }\n\n const describe = ({\n axis,\n crossSpan,\n crossStart,\n disabled,\n index\n }: GridSeparatorPlacement) => {\n const crossAxis = axis === \"column\" ? \"row\" : \"column\";\n let props = `type=\"${axis}\" ${axis}={${index}}`;\n if (crossStart !== 0 || crossSpan !== undefined) {\n props += ` ${crossAxis}={${crossStart}}`;\n }\n if (crossSpan !== undefined) {\n props += ` ${crossAxis}Span={${crossSpan}}`;\n }\n if (disabled) {\n props += \" disabled\";\n }\n return `<Gridline ${props} />`;\n };\n\n // Gridlines must be placed between two tracks (and alongside of tracks on the opposite axis)\n const placements = Array.from(separatorPlacements.values()).filter(\n (placement) => {\n const { axis, crossSpan, crossStart, index } = placement;\n const crossAxis = axis === \"column\" ? \"row\" : \"column\";\n const trackCount = trackCounts[axis];\n const crossCount = trackCounts[crossAxis];\n\n let isValid = true;\n if (!isValidGridlineIndex(index, trackCount)) {\n errors.push(\n `Invalid ${axis} Gridline ${axis} (${index}); must be between 1 and ${trackCount - 1}`\n );\n isValid = false;\n }\n if (\n !Number.isInteger(crossStart) ||\n crossStart < 0 ||\n crossStart >= crossCount\n ) {\n errors.push(\n `Invalid ${axis} Gridline ${crossAxis} (${crossStart}); must be between 0 and ${crossCount - 1}`\n );\n isValid = false;\n } else if (\n crossSpan !== undefined &&\n (!Number.isInteger(crossSpan) ||\n crossSpan < 1 ||\n crossStart + crossSpan > crossCount)\n ) {\n errors.push(\n `Invalid ${axis} Gridline ${crossAxis}Span (${crossSpan}); Grid has ${crossCount} ${crossAxis}s`\n );\n isValid = false;\n }\n\n // Gridlines with invalid placements are not checked for overlaps (below)\n return isValid;\n }\n );\n\n const getCrossRange = (placement: GridSeparatorPlacement) => {\n const crossCount =\n trackCounts[placement.axis === \"column\" ? \"row\" : \"column\"];\n return [\n placement.crossStart,\n placement.crossSpan === undefined\n ? crossCount\n : placement.crossStart + placement.crossSpan\n ];\n };\n\n placements.forEach((placement, placementIndex) => {\n const { axis, index } = placement;\n const [crossStart, crossEnd] = getCrossRange(placement);\n\n // Gridlines should not be rendered alongside of cells that span across their boundary\n for (const cell of cells) {\n const [start, span, cellCrossStart, cellCrossSpan] =\n axis === \"column\"\n ? [cell.column, cell.columnSpan, cell.row, cell.rowSpan]\n : [cell.row, cell.rowSpan, cell.column, cell.columnSpan];\n if (\n start < index &&\n index < start + span &&\n cellCrossStart < crossEnd &&\n crossStart < cellCrossStart + cellCrossSpan\n ) {\n const crossAxis = axis === \"column\" ? \"row\" : \"column\";\n errors.push(\n `${describe(placement)} overlaps a Cell that spans across it (${axis}: ${start}, ${axis}Span: ${span}, ${crossAxis}: ${cellCrossStart}, ${crossAxis}Span: ${cellCrossSpan}); use the ${crossAxis} and ${crossAxis}Span props to render gridlines beside the Cell instead`\n );\n }\n }\n\n // Gridlines along the same boundary should not overlap each other\n for (const other of placements.slice(placementIndex + 1)) {\n if (other.axis === axis && other.index === index) {\n const [otherCrossStart, otherCrossEnd] = getCrossRange(other);\n if (otherCrossStart < crossEnd && crossStart < otherCrossEnd) {\n errors.push(`${describe(placement)} overlaps ${describe(other)}`);\n }\n }\n }\n });\n\n return errors;\n}\n\nfunction gridLayoutsEqual(a: GridLayout, b: GridLayout) {\n return layoutsEqual(a.columns, b.columns) && layoutsEqual(a.rows, b.rows);\n}\n","import { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport type { LayoutChangedMeta, LayoutStorage } from \"../group/types\";\nimport type { GridLayout } from \"./types\";\n\n/**\n * Saves and restores Grid 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 useDefaultGridLayout({\n id,\n onlySaveAfterUserInteractions,\n storage = localStorage\n}: {\n /**\n * Uniquely identifies a specific grid/layout.\n */\n id: string;\n\n /**\n * Only auto-save layouts that were directly caused by user input (e.g. keyboard or mouse events).\n * Ignore layout changes resulting from imperative API calls or window resize events.\n */\n onlySaveAfterUserInteractions?: boolean;\n\n /**\n * Storage implementation; supports localStorage, sessionStorage, and custom implementations\n * Refer to documentation site for example integrations.\n */\n storage?: LayoutStorage;\n}) {\n const storageKey = `react-resizable-panels:grid:${id}`;\n\n // In the event that a client-only storage API is provided,\n // useSyncExternalStore prevents server/client hydration mismatch warning\n const defaultLayoutString = useSyncExternalStore(\n subscribe,\n () => storage.getItem(storageKey),\n () => storage.getItem(storageKey)\n );\n\n const defaultLayout = useMemo<Partial<GridLayout> | undefined>(() => {\n if (defaultLayoutString) {\n try {\n const parsed = JSON.parse(defaultLayoutString);\n if (parsed !== null && typeof parsed === \"object\") {\n return parsed;\n }\n } catch {\n // Ignore invalid layouts\n }\n }\n }, [defaultLayoutString]);\n\n const onLayoutChanged = useCallback(\n (layout: GridLayout, meta: LayoutChangedMeta) => {\n if (onlySaveAfterUserInteractions && !meta.isUserInteraction) {\n return;\n }\n\n try {\n storage.setItem(storageKey, JSON.stringify(layout));\n } catch (error) {\n console.error(error);\n }\n },\n [onlySaveAfterUserInteractions, storage, storageKey]\n );\n\n return {\n /**\n * Pass this value to `Grid` as the `defaultLayout` prop.\n */\n defaultLayout,\n\n /**\n * Attach this callback on the `Grid` as the `onLayoutChanged` prop.\n */\n onLayoutChanged\n };\n}\n\nfunction subscribe() {\n return function unsubscribe() {};\n}\n","import { useState } from \"react\";\nimport type { GridImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Grid component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function useGridCallbackRef() {\n return useState<GridImperativeHandle | null>(null);\n}\n","import { useRef } from \"react\";\nimport type { GridImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Grid component.\n */\nexport function useGridRef() {\n return useRef<GridImperativeHandle | null>(null);\n}\n","import { useRef } from \"react\";\nimport type { RegisteredSeparator } from \"../../global/types\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\n\nexport function SeparatorClone({\n separator\n}: {\n separator: RegisteredSeparator;\n}) {\n const { element } = separator;\n\n const ref = useRef<HTMLDivElement>(null);\n\n useIsomorphicLayoutEffect(() => {\n const clone = element.cloneNode(true) as HTMLDivElement;\n const sources = [element, ...element.querySelectorAll(\"*\")];\n const targets = [clone, ...clone.querySelectorAll(\"*\")];\n const ownerWindow = element.ownerDocument.defaultView!;\n\n sources.forEach((source, index) => {\n const target = targets[index];\n\n if (\n target instanceof ownerWindow.HTMLElement ||\n target instanceof ownerWindow.SVGElement\n ) {\n const computed = ownerWindow.getComputedStyle(source);\n\n for (let index = 0; index < computed.length; index++) {\n const property = computed.item(index);\n target.style.setProperty(\n property,\n computed.getPropertyValue(property)\n );\n }\n }\n\n target.removeAttribute(\"data-testid\");\n target.removeAttribute(\"id\");\n });\n\n Object.assign(clone.style, {\n boxSizing: \"border-box\",\n height: \"100%\",\n margin: \"0\",\n position: \"static\",\n transform: \"none\",\n width: \"100%\"\n });\n\n ref.current!.appendChild(clone);\n\n return () => clone.remove();\n }, [element]);\n\n return (\n <div\n ref={ref}\n style={{\n height: \"100%\",\n opacity: 0.65,\n pointerEvents: \"none\",\n width: \"100%\"\n }}\n />\n );\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","\"use client\";\n\nimport { useRef } from \"react\";\nimport { objectsEqual } from \"../../global/utils/objectsEqual\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { SeparatorOverlayProps } from \"./types\";\n\n/**\n * Customizes separator previews when resizePreviewMode is \"separator\".\n * Render within a `Group` to style all overlay previews, or pass to an individual `Separator` to style its overlay preview.\n *\n * Use `data-separator-overlay=\"active\"` to style the separator being dragged,\n * or `data-separator-overlay=\"inactive\"` for separators moved indirectly.\n *\n * Set `width` (horizontal groups) or `height` (vertical groups) using `style` or `className`.\n */\nexport function SeparatorOverlay(props: SeparatorOverlayProps) {\n const { registerOverlay } = useGroupContext();\n\n const propsRef = useRef(props);\n\n if (!objectsEqual(propsRef.current, props)) {\n propsRef.current = props;\n }\n\n const stableProps = propsRef.current;\n\n useIsomorphicLayoutEffect(\n () => registerOverlay(stableProps),\n [registerOverlay, stableProps]\n );\n\n return null;\n}\n\nSeparatorOverlay.displayName = \"SeparatorOverlay\";\n","import type { CSSProperties } from \"react\";\nimport type { Orientation } from \"../group/types\";\nimport type { SeparatorOverlayProps } from \"./types\";\n\n/**\n * Renders a visible overlay preview\n */\nexport function SeparatorOverlayRenderer({\n active,\n orientation,\n style,\n ...rest\n}: SeparatorOverlayProps & { active: boolean; orientation: Orientation }) {\n let styleConstraints: CSSProperties;\n\n switch (orientation) {\n case \"horizontal\": {\n styleConstraints = {\n height: \"100%\",\n minWidth: \"1px\"\n };\n break;\n }\n case \"vertical\": {\n styleConstraints = {\n minHeight: \"1px\",\n width: \"100%\"\n };\n break;\n }\n }\n\n return (\n <div\n {...rest}\n data-separator-overlay={active ? \"active\" : \"inactive\"}\n style={{\n ...styleConstraints,\n ...style,\n flexShrink: 0,\n pointerEvents: \"none\"\n }}\n />\n );\n}\n","import { isValidElement } from \"react\";\nimport type { ResizePreview as ResizePreviewState } from \"../../global/mutable-state/types\";\nimport { SeparatorClone } from \"../separator/SeparatorClone\";\nimport { SeparatorOverlay } from \"../separator/SeparatorOverlay\";\nimport { SeparatorOverlayRenderer } from \"../separator/SeparatorOverlayRenderer\";\nimport type { SeparatorOverlayProps } from \"../separator/types\";\n\nexport function ResizePreview({\n overlay,\n preview\n}: {\n overlay?: SeparatorOverlayProps | undefined;\n preview: ResizePreviewState;\n}) {\n const { axis: group, offset, rect, separator } = preview;\n\n const horizontal = group.orientation === \"horizontal\";\n\n let rendered = separator?.preview;\n let overlayProps = overlay;\n\n if (\n isValidElement<SeparatorOverlayProps>(rendered) &&\n rendered.type === SeparatorOverlay\n ) {\n overlayProps = rendered.props;\n rendered = undefined;\n }\n\n if (rendered == null) {\n if (overlayProps) {\n rendered = (\n <SeparatorOverlayRenderer\n {...overlayProps}\n active={preview.active}\n orientation={group.orientation}\n />\n );\n } else if (separator) {\n rendered = <SeparatorClone separator={separator} />;\n }\n }\n\n return (\n <div\n aria-hidden=\"true\"\n data-resize-preview\n inert\n style={{\n height: rect.height,\n left: rect.left,\n pointerEvents: \"none\",\n position: \"absolute\",\n top: rect.top,\n transform: horizontal\n ? `translateX(${offset}px)`\n : `translateY(${offset}px)`,\n width: rect.width\n }}\n >\n {rendered}\n </div>\n );\n}\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { IDENTITY_FUNCTION } from \"../../constants\";\nimport { getImperativeAxisMethods } from \"../../global/utils/getImperativeAxisMethods\";\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 getImperativeAxisMethods({ axisId: groupId })\n );\n });\n}\n","import { useRef, useState } from \"react\";\nimport { getRegisteredAxis } from \"../../global/mutable-state/axes\";\nimport {\n getInteractionState,\n subscribeToInteractionState\n} from \"../../global/mutable-state/interactions\";\nimport type {\n InteractionState,\n ResizePreview as ResizePreviewState\n} from \"../../global/mutable-state/types\";\nimport { layoutNumbersEqual } from \"../../global/utils/layoutNumbersEqual\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { ResizePreviewMode } from \"./types\";\n\nexport function useResizePreviews({\n groupId,\n resizePreviewMode\n}: {\n groupId: string;\n resizePreviewMode: ResizePreviewMode;\n}) {\n const [previews, setPreviews] = useState<ResizePreviewState[]>([]);\n\n const previewsRef = useRef(previews);\n\n useIsomorphicLayoutEffect(() => {\n const updatePreviews = (interaction: InteractionState) => {\n const group = getRegisteredAxis(groupId);\n const nextPreviews =\n resizePreviewMode === \"separator\" && interaction.state === \"active\"\n ? interaction.previews.filter(\n (preview) =>\n preview.axis === group &&\n (preview.active || !layoutNumbersEqual(preview.offset, 0))\n )\n : [];\n const previousPreviews = previewsRef.current;\n if (\n previousPreviews.length === nextPreviews.length &&\n nextPreviews.every(\n (preview, index) => preview === previousPreviews[index]\n )\n ) {\n return;\n }\n\n previewsRef.current = nextPreviews;\n setPreviews(nextPreviews);\n };\n\n if (resizePreviewMode !== \"separator\") {\n updatePreviews(getInteractionState());\n return;\n }\n\n const unsubscribe = subscribeToInteractionState(({ next }) =>\n updatePreviews(next)\n );\n\n updatePreviews(getInteractionState());\n\n return unsubscribe;\n }, [groupId, resizePreviewMode]);\n\n return previews;\n}\n","\"use client\";\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { calculateItemConstraints } from \"../../global/dom/calculateItemConstraints\";\nimport { mountAxis } from \"../../global/mountAxis\";\nimport {\n getMountedAxisState,\n getRegisteredAxis,\n subscribeToMountedAxis,\n updateMountedAxis\n} from \"../../global/mutable-state/axes\";\nimport { getInteractionState } from \"../../global/mutable-state/interactions\";\nimport type {\n RegisteredResizeAxis,\n RegisteredResizeItem,\n RegisteredSeparator\n} from \"../../global/types\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { recordAxisLayoutChange } from \"../../global/utils/recordAxisLayoutChange\";\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 { SeparatorOverlayProps } from \"../separator/types\";\nimport { GroupContext } from \"./GroupContext\";\nimport { ResizePreview } from \"./ResizePreview\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type { GroupProps, Layout } from \"./types\";\nimport { useGroupImperativeHandle } from \"./useGroupImperativeHandle\";\nimport { useResizePreviews } from \"./useResizePreviews\";\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 resizePreviewMode = \"panel\",\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(\n (layout: Layout, isUserInteraction: boolean) => {\n if (layoutsEqual(prevLayoutRef.current.onLayoutChanged, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChanged = layout;\n onLayoutChangedUnstable?.(layout, { isUserInteraction });\n }\n );\n\n const id = useId(idProp);\n\n const [overlay, setOverlay] = useState<SeparatorOverlayProps>();\n\n const previews = useResizePreviews({\n groupId: id,\n resizePreviewMode\n });\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: RegisteredResizeItem[];\n separators: RegisteredSeparator[];\n }>({\n lastExpandedPanelSizes: {},\n layouts: {},\n panels: [],\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 groupState = getMountedAxisState(groupId);\n if (groupState) {\n return {\n flexGrow: groupState.layout[panelId] ?? 1\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 resizeTargetMinimumSize\n });\n\n const context = useMemo(\n () => ({\n get disableCursor() {\n return !!stableProps.disableCursor;\n },\n getPanelStyles,\n id,\n orientation,\n registerPanel: (panel: RegisteredResizeItem) => {\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 registerOverlay: (props: SeparatorOverlayProps) => {\n setOverlay(props);\n\n return () => {\n setOverlay(undefined);\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 updatePanelProps: (\n panelId: string,\n { disabled }: { disabled: boolean | undefined }\n ) => {\n const inMemoryValues = inMemoryValuesRef.current;\n const panel = inMemoryValues.panels.find(\n (current) => current.id === panelId\n );\n if (panel) {\n panel.constraintProps.disabled = disabled;\n }\n\n const group = getRegisteredAxis(id);\n const groupState = getMountedAxisState(id);\n if (group && groupState) {\n updateMountedAxis(group, {\n ...groupState,\n derivedItemConstraints: calculateItemConstraints(group)\n });\n }\n },\n updateSeparatorProps: (\n separatorId: string,\n {\n disabled,\n disableDoubleClick\n }: {\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n }\n ) => {\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 separator.disableDoubleClick = disableDoubleClick;\n }\n }\n }),\n [getPanelStyles, id, forceUpdate, orientation, stableProps]\n );\n\n const registeredGroupRef = useRef<RegisteredResizeAxis | 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: RegisteredResizeAxis = {\n disabled: !!disabled,\n element,\n id,\n mutableState: {\n defaultLayout: preSortedDefaultLayout,\n disableCursor: !!stableProps.disableCursor,\n expandedItemSizes: inMemoryValuesRef.current.lastExpandedPanelSizes,\n layouts: inMemoryValuesRef.current.layouts\n },\n orientation,\n items: inMemoryValues.panels,\n resizePreviewMode,\n get resizeTargetMinimumSize() {\n return stableProps.resizeTargetMinimumSize;\n },\n separators: inMemoryValues.separators\n };\n\n registeredGroupRef.current = group;\n\n const unmountGroup = mountAxis(group);\n\n const {\n defaultLayoutDeferred,\n derivedItemConstraints: derivedPanelConstraints,\n layout\n } = getMountedAxisState(group.id, true);\n\n if (!defaultLayoutDeferred && derivedPanelConstraints.length > 0) {\n onLayoutChangeStable(layout);\n // Initial mount is not a user interaction (#716).\n onLayoutChangedStable(layout, false);\n }\n\n const removeChangeEventListener = subscribeToMountedAxis(id, (event) => {\n const {\n defaultLayoutDeferred,\n derivedItemConstraints: derivedPanelConstraints,\n 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 recordAxisLayoutChange({\n derivedItemConstraints: derivedPanelConstraints,\n axis: group,\n layout,\n prevLayout: event.prev?.layout\n });\n\n // Lastly notify layout-change(d) handlers of the update\n const interactionState = getInteractionState();\n const isCompleted =\n interactionState.state !== \"active\" ||\n !interactionState.hitRegions.some((region) => region.axis === group);\n onLayoutChangeStable(layout);\n if (isCompleted) {\n onLayoutChangedStable(layout, event.isUserInteraction);\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 resizePreviewMode,\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 position: resizePreviewMode === \"separator\" ? \"relative\" : undefined,\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 {previews.map((preview) => (\n <ResizePreview\n key={preview.key}\n overlay={overlay}\n preview={preview}\n />\n ))}\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 LayoutChangedMeta,\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 onlySaveAfterUserInteractions,\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 * Only auto-save layouts that were directly caused by user input (e.g. keyboard or mouse events).\n * Ignore layout changes resulting from imperative API calls or window resize events.\n */\n onlySaveAfterUserInteractions?: boolean;\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 // The hook persists every layout commit -- including library-driven ones --\n // because it owns its own storage and the goal is to remember whatever\n // layout the user is currently looking at. Consumers that only want to\n // persist on user interaction should branch on `isUserInteraction` in\n // their own callback (see #716) rather than via this hook.\n (layout: Layout, meta: LayoutChangedMeta) => {\n if (onlySaveAfterUserInteractions && !meta.isUserInteraction) {\n return;\n }\n\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 [\n clearPendingTimeout,\n hasPanelIds,\n id,\n onlySaveAfterUserInteractions,\n storage\n ]\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, { isUserInteraction: false });\n } else {\n timeoutRef.current = setTimeout(() => {\n onLayoutChanged(layout, { isUserInteraction: false });\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 { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { NOOP_FUNCTION } from \"../../constants\";\nimport { getImperativeItemMethods } from \"../../global/utils/getImperativeItemMethods\";\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 getImperativeItemMethods({ axisId: groupId, itemId: panelId })\n );\n });\n}\n","\"use client\";\n\nimport {\n useEffect,\n useRef,\n useSyncExternalStore,\n type CSSProperties\n} from \"react\";\nimport { subscribeToMountedAxis } from \"../../global/mutable-state/axes\";\nimport type { RegisteredResizeItem } from \"../../global/types\";\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 } 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 collapsedThreshold,\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 updatePanelProps\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: RegisteredResizeItem = {\n element,\n id,\n idIsStable,\n mutableValues: {\n expandToSize: undefined,\n prevSize: undefined\n },\n onResize: hasOnResize ? onResizeStable : undefined,\n constraintProps: {\n groupResizeBehavior,\n collapsedSize,\n collapsedThreshold,\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 collapsedThreshold,\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 updatePanelProps(id, { disabled });\n }, [disabled, id, updatePanelProps]);\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) => subscribeToMountedAxis(groupId, subscribe),\n read,\n read\n );\n\n let panelStyles: CSSProperties;\n if (panelStylesString) {\n panelStyles = JSON.parse(panelStylesString);\n } else if (defaultSize !== undefined) {\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","\"use client\";\n\nimport { useId } from \"../../hooks/useId\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport { ResizeSeparator } from \"../shared/ResizeSeparator\";\nimport type { SeparatorProps } from \"./types\";\n\n// Separators are flex items within their parent Group\nconst STYLE_DEFAULTS = { flexBasis: \"auto\" } as const;\nconst REQUIRED_STYLE = { flexGrow: 0, flexShrink: 0 } as const;\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 disableDoubleClick,\n elementRef,\n id: idProp,\n preview,\n style,\n ...rest\n}: SeparatorProps) {\n const id = useId(idProp);\n\n const {\n disableCursor,\n id: groupId,\n orientation,\n registerSeparator,\n updateSeparatorProps\n } = useGroupContext();\n\n return (\n <ResizeSeparator\n attributes={rest}\n axisId={groupId}\n axisOrientation={orientation}\n className={className}\n disableCursor={disableCursor}\n disabled={disabled}\n disableDoubleClick={disableDoubleClick}\n elementRef={elementRef}\n id={id}\n preview={preview}\n registerSeparator={registerSeparator}\n requiredStyle={REQUIRED_STYLE}\n style={style}\n styleDefaults={STYLE_DEFAULTS}\n updateSeparatorProps={updateSeparatorProps}\n >\n {children}\n </ResizeSeparator>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nSeparator.displayName = \"Separator\";\n"],"names":["useId","stableId","dynamicId","useIdReact","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useStableCallback","fn","ref","useRef","useCallback","args","useMergedRefs","refs","value","getTrackGridLine","index","hasGutters","getTrackGridSpan","span","getTrackGridPlacement","line","getGutterGridPlacement","getSeparatorCrossGridPlacement","crossCount","crossSpan","crossStart","crossEnd","startLine","endLine","isValidGridlineIndex","trackCount","assert","expectedCondition","message","GridContext","createContext","useGridContext","context","useContext","Cell","children","className","column","columnSpan","elementRefProp","idProp","row","rowSpan","style","rest","id","gutters","registerCell","elementRef","mergedRef","element","jsx","cached","isCoarsePointer","expandHitTarget","expandHitTargets","axis","rect","minHitTargetSize","delta","excludeSpanningCells","cells","rects","cell","start","bounds","blockedStart","blockedEnd","segments","addSegment","end","calculateGridHitRegions","crossTrackCount","resizeAxis","axisSize","includeDisabled","separatorPlacements","tracks","separators","firstEnabledIndex","lastEnabledIndex","numEnabled","track","isBoundaryResizable","hitRegions","createHitRegion","separator","getCrossTrackEdge","crossIndex","edge","position","cellCrossStart","cellCrossSpan","boundariesWithSeparators","placement","rectStart","rectEnd","previousEnd","nextStart","current","addImplicitHitRegions","slots","getBounds","segment","toDOMRect","pending","before","after","beforeBounds","afterBounds","from","to","parsePixels","parsed","measureGridAxis","gutterSizes","layout","trackIds","cssTrackCount","template","tokens","token","trackSizes","_","total","size","outerSize","padding","gap","availableSize","trackId","parseSizeAndUnit","numeric","EventEmitter","#listenerMap","type","listener","listeners","data","didThrow","caughtError","clonedListeners","i","error","state","eventEmitter","getInteractionState","subscribeToInteractionState","callback","updateCursorFlags","cursorFlags","previews","previewLayoutMap","didPointerMove","prev","next","updateInteractionState","notifySeparatorPreviewChanged","preview","removeAxisFromInteraction","region","hasPreviews","initialLayoutMap","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","axes","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","documentToStyleMap","updateCursorStyle","ownerDocument","prevStyle","styleSheet","interactionState","cursorStyle","nextStyle","calculateAvailableAxisSize","layoutStrategy","orientation","items","totalSize","item","sortByElementOffset","panelsOrSeparators","a","b","horizontalSort","verticalSort","isHTMLElement","getDistanceBetweenPointAndRect","point","findClosestRect","targetRect","centerPoint","closestRect","minDistance","x","y","distance","calculateHitRegions","axisElement","sortedChildElements","disabledSeparator","hasInterleavedStaticContent","firstEnabledItemIndex","lastEnabledItemIndex","numEnabledItems","prevItem","pendingSeparators","currentItemIndex","childElement","itemData","prevRect","pendingRectsOrSeparators","firstItemEdgeRect","secondItemEdgeRect","rectOrSeparator","skip","separatorData","convertEmToPixels","fontSize","convertRemToPixels","convertVhToPixels","convertVwToPixels","sizeStyleToPixels","itemElement","styleProp","pixels","unit","formatLayoutNumber","number","calculateItemConstraints","itemConstraints","collapsedSize","collapsedThreshold","defaultSize","minSize","maxSize","map","deleteMutableAxis","getRegisteredAxis","axisId","getMountedAxisState","mountedAxis","getMountedAxes","subscribeToMountedAxis","event","updateMountedAxis","meta","isArrayEqual","layoutNumbersEqual","actual","expected","minimumDelta","compareLayoutNumbers","validateItemSize","overrideDisabledItems","prevSize","collapsible","disabled","threshold","wasCollapsed","boundary","comparison","adjustLayoutByDelta","initialLayoutProp","itemConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","itemId","prevLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","localDelta","gapSize","nextSize","expandAtBoundary","increment","maxAvailableDelta","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","accumulated","layoutsEqual","updateActiveHitRegions","commit","document","mountedAxes","pointerDownAtPoint","prevCursorFlags","nextCursorFlags","interaction","disableCursor","deltaAsPercentage","axisState","defaultLayoutDeferred","derivedItemConstraints","mountedAxisSize","mountedLayout","separatorToItems","offsets","offset","completeActivePointerResize","match","hitRegion","onDocumentContextMenu","findClosestHitRegion","closestHitRegion","isShadowRoot","compare","ancestors","get_ancestors","common_ancestor","z_indexes","get_z_index","find_stacking_context","furthest_ancestors","child","props","is_flex_item","node","display","get_parent","creates_stacking_context","nodes","parentNode","doRectsIntersect","isModal","isViableHitTarget","pointerEventTarget","dialog","currentElement","findMatchingHitRegions","matchingHitRegions","axisData","validateAxisLayout","nextLayoutTotalSize","remainingSize","getImperativeItemMethods","find","getItemConstraints","getItem","getItemSize","computeLayout","isFirstItem","isLastItem","_item","itemIndex","pc","occupiedByPrevious","setItemSize","unsafeLayout","mutableValues","asPercentage","inPixels","asPixels","onDocumentDoubleClick","itemWithDefaultSize","api","findSeparatorAxis","separatorElement","getImperativeAxisMethods","adjustLayoutForSeparator","onDocumentKeyDown","primaryItem","constraints","separatorElements","nextIndex","calculateResizePreviews","axisRect","horizontal","boundaryItems","center","regionCenter","onDocumentPointerDown","didChangeFocus","onDocumentPointerLeave","onDocumentPointerMove","onDocumentPointerOut","onDocumentPointerUp","calculateDefaultLayout","explicitCount","remainingItemCount","validateLayoutKeys","itemIds","layoutKeys","getDefaultLayout","itemIdsKey","defaultLayout","notifyItemOnResize","borderBoxSize","itemSize","objectsEqual","key","itemConstraintsEqual","preserveFixedItemSizes","nextAxisSize","prevAxisSize","fixedItemsTotalSize","flexibleItemsTotalPrevSize","hasPreservePixelSizeItems","fixedItems","flexibleItemIds","prevItemSize","prevItemSizeInPixels","nextItemSize","evenSize","ownerDocumentReferenceCounts","mountAxis","isMounted","ResizeObserver","separatorIds","resizeObserver","entries","entry","target","nextDerivedItemConstraints","defaultLayoutUnsafe","defaultLayoutSafe","recordAxisLayoutChange","isCollapsed","useForceUpdate","sigil","setSigil","useState","forceUpdate","useStableObject","unstableObject","GroupContext","calculateSeparatorAriaValues","valueMax","valueMin","ResizeSeparator","attributes","axisOrientation","disableDoubleClick","isSharedHitRegion","registerSeparator","requiredStyle","styleDefaults","tabIndex","updateSeparatorProps","stableProps","aria","setAria","dragState","setDragState","isFocused","setIsFocused","registeredSeparatorRef","unregisterSeparator","removeInteractionStateChangeListener","removeMountedAxesChangeListener","cursor","dataSeparator","GridTrackSeparator","getDisableCursor","getResizeAxisId","trackCounts","crossAxis","isDisabled","isFirstEnabledGridlineOnBoundary","registerGridline","gutterPlacement","crossPlacement","Gridline","AXES","EMPTY_GRID_LAYOUT","Grid","columns","gridRef","onLayoutChangeUnstable","onLayoutChangedUnstable","resizeTargetMinimumSize","rows","columnTracks","useNormalizedTracks","rowTracks","getTracks","prevLayoutRef","onLayoutChangeStable","gridLayoutsEqual","onLayoutChangedStable","isUserInteraction","cellOrSeparatorChangeSigil","inMemoryValuesRef","findSeparatorsInChildren","inMemoryValues","separatorId","useMemo","registeredAxesRef","errors","getPlacementErrors","getSeparators","createResizeAxis","crossTracks","measure","preSortedDefaultLayout","defaultAxisLayout","resizeAxes","unmountAxes","getGridLayout","columnState","rowState","removeChangeEventListeners","gridLayout","isCompleted","unmount","remove","useImperativeHandle","getLayout","columnAxisId","rowAxisId","formatIds","ids","createTrackHandle","getMethods","normalizedId","axisLayout","readTemplate","getInitialTrackSizes","subscribeToLayout","unsubscribes","unsubscribe","useSyncExternalStore","gridTemplateColumns","gridTemplateRows","propName","normalized","Children","isValidElement","defaultSizes","remainingPercentage","numUnspecified","describe","placements","isValid","getCrossRange","placementIndex","other","otherCrossStart","otherCrossEnd","useDefaultGridLayout","onlySaveAfterUserInteractions","storage","storageKey","defaultLayoutString","subscribe","onLayoutChanged","useGridCallbackRef","useGridRef","SeparatorClone","clone","sources","targets","ownerWindow","source","computed","property","useGroupContext","SeparatorOverlay","registerOverlay","propsRef","SeparatorOverlayRenderer","active","styleConstraints","ResizePreview","overlay","group","rendered","overlayProps","useGroupImperativeHandle","groupId","groupRef","imperativeGroupRef","useResizePreviews","resizePreviewMode","setPreviews","previewsRef","updatePreviews","nextPreviews","previousPreviews","Group","setOverlay","panelOrSeparatorChangeSigil","getPanelStyles","panelId","groupState","panel","registeredGroupRef","unmountGroup","derivedPanelConstraints","removeChangeEventListener","registeredGroup","jsxs","getStorageKey","panelIds","readLegacyLayout","readStorageKey","maybeLegacyString","maybeLegacyLayout","keys","useDefaultLayout","debounceSaveMs","hasPanelIds","defaultLayoutModern","values","defaultLayoutLegacy","timeoutRef","clearPendingTimeout","timeout","writeStorageKey","onLayoutChange","useGroupCallbackRef","useGroupRef","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","groupResizeBehavior","onResizeUnstable","idIsStable","registerPanel","updatePanelProps","hasOnResize","onResizeStable","panelSize","prevPanelSize","registeredPanel","read","maybePanelStyles","panelStylesString","panelStyles","PROHIBITED_CSS_PROPERTIES","usePanelCallbackRef","usePanelRef","STYLE_DEFAULTS","REQUIRED_STYLE","Separator"],"mappings":"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"}
1
+ {"version":3,"file":"react-resizable-panels.js","sources":["../lib/hooks/useId.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/hooks/useStableCallback.ts","../lib/hooks/useMergedRefs.ts","../lib/components/grid/gridPlacement.ts","../lib/utils/assert.ts","../lib/components/grid/GridContext.ts","../lib/components/grid/useGridContext.ts","../lib/components/grid/Cell.tsx","../lib/global/utils/isCoarsePointer.ts","../lib/global/utils/expandHitTarget.ts","../lib/components/grid/excludeSpanningCells.ts","../lib/components/grid/calculateGridHitRegions.ts","../lib/components/grid/measureGridAxis.ts","../lib/global/styles/parseSizeAndUnit.ts","../lib/utils/EventEmitter.ts","../lib/global/mutable-state/interactions.ts","../lib/constants.ts","../lib/global/cursor/supportsAdvancedCursorStyles.ts","../lib/global/cursor/getCursorStyle.ts","../lib/global/cursor/updateCursorStyle.ts","../lib/global/dom/calculateAvailableAxisSize.ts","../lib/components/group/sortByElementOffset.ts","../lib/utils/isHTMLElement.ts","../lib/global/utils/getDistanceBetweenPointAndRect.ts","../lib/global/utils/findClosestRect.ts","../lib/global/dom/calculateHitRegions.ts","../lib/global/styles/convertEmToPixels.ts","../lib/global/styles/convertRemToPixels.ts","../lib/global/styles/convertVhToPixels.ts","../lib/global/styles/convertVwToPixels.ts","../lib/global/styles/sizeStyleToPixels.ts","../lib/global/utils/formatLayoutNumber.ts","../lib/global/dom/calculateItemConstraints.ts","../lib/global/mutable-state/axes.ts","../lib/utils/isArrayEqual.ts","../lib/global/utils/layoutNumbersEqual.ts","../lib/global/utils/compareLayoutNumbers.ts","../lib/global/utils/validateItemSize.ts","../lib/global/utils/adjustLayoutByDelta.ts","../lib/global/utils/layoutsEqual.ts","../lib/global/utils/updateActiveHitRegion.ts","../lib/global/utils/completeActivePointerResize.ts","../lib/global/event-handlers/onDocumentContextMenu.ts","../lib/global/utils/findClosestHitRegion.ts","../lib/utils/isShadowRoot.ts","../lib/vendor/stacking-order.ts","../lib/global/utils/doRectsIntersect.ts","../lib/global/utils/isModal.ts","../lib/global/utils/isViableHitTarget.ts","../lib/global/utils/findMatchingHitRegions.ts","../lib/global/utils/validateAxisLayout.ts","../lib/global/utils/getImperativeItemMethods.ts","../lib/global/event-handlers/onDocumentDoubleClick.ts","../lib/global/utils/findSeparatorAxis.ts","../lib/global/utils/getImperativeAxisMethods.ts","../lib/global/utils/adjustLayoutForSeparator.ts","../lib/global/event-handlers/onDocumentKeyDown.ts","../lib/global/utils/calculateResizePreviews.ts","../lib/global/event-handlers/onDocumentPointerDown.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/validateLayoutKeys.ts","../lib/global/utils/getDefaultLayout.ts","../lib/global/utils/normalizeLayout.ts","../lib/global/utils/notifyItemOnResize.ts","../lib/global/utils/objectsEqual.ts","../lib/global/utils/itemConstraintsEqual.ts","../lib/global/utils/preserveFixedItemSizes.ts","../lib/global/mountAxis.ts","../lib/global/utils/recordAxisLayoutChange.ts","../lib/hooks/useForceUpdate.ts","../lib/hooks/useStableObject.ts","../lib/components/group/GroupContext.ts","../lib/global/utils/calculateSeparatorAriaValues.ts","../lib/components/shared/ResizeSeparator.tsx","../lib/components/grid/GridTrackSeparator.tsx","../lib/components/grid/Gridline.tsx","../lib/components/grid/Grid.tsx","../lib/components/grid/useDefaultGridLayout.ts","../lib/components/grid/useGridCallbackRef.ts","../lib/components/grid/useGridRef.ts","../lib/components/separator/SeparatorClone.tsx","../lib/components/group/useGroupContext.ts","../lib/components/separator/SeparatorOverlay.tsx","../lib/components/separator/SeparatorOverlayRenderer.tsx","../lib/components/group/ResizePreview.tsx","../lib/components/group/useGroupImperativeHandle.ts","../lib/components/group/useResizePreviews.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/panel/usePanelImperativeHandle.ts","../lib/components/panel/Panel.tsx","../lib/components/panel/usePanelCallbackRef.ts","../lib/components/panel/usePanelRef.ts","../lib/components/separator/Separator.tsx"],"sourcesContent":["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","/**\n * When a Grid axis contains separators, \"gutter\" tracks are interleaved between the content tracks\n * (e.g. `grid-template-columns: 1fr auto 1fr`) so separators can be placed between cells.\n * These helpers convert track indices to CSS grid lines accordingly.\n */\n\n// Returns the (1-based) CSS grid line where the specified track starts\nexport function getTrackGridLine(index: number, hasGutters: boolean) {\n return hasGutters ? index * 2 + 1 : index + 1;\n}\n\n// Returns the number of CSS grid tracks spanned by the specified number of content tracks\nexport function getTrackGridSpan(span: number, hasGutters: boolean) {\n return hasGutters ? span * 2 - 1 : span;\n}\n\n// Returns the CSS grid placement (e.g. \"1 / span 3\") for the specified track range\nexport function getTrackGridPlacement(\n index: number,\n span: number | undefined,\n hasGutters: boolean\n) {\n const line = getTrackGridLine(index, hasGutters);\n\n return span === undefined\n ? `${line} / -1`\n : `${line} / span ${getTrackGridSpan(span, hasGutters)}`;\n}\n\n// Returns the CSS grid placement for the gutter between tracks `index - 1` and `index`\nexport function getGutterGridPlacement(index: number) {\n return `${index * 2} / span 1`;\n}\n\n// Returns the CSS grid placement for a separator along the opposite axis (e.g. the rows a column separator spans).\n// Separators that don't start (or end) at the edge of the grid extend into the adjacent gutter (if there is one)\n// so that they meet any separators that intersect them.\nexport function getSeparatorCrossGridPlacement({\n crossCount,\n crossSpan,\n crossStart,\n hasGutters\n}: {\n crossCount: number;\n crossSpan: number | undefined;\n crossStart: number;\n hasGutters: boolean;\n}) {\n const crossEnd =\n crossSpan === undefined ? crossCount : crossStart + crossSpan;\n if (crossStart === 0 && crossEnd === crossCount) {\n return \"1 / -1\";\n }\n\n let startLine = getTrackGridLine(crossStart, hasGutters);\n let endLine = getTrackGridLine(crossEnd - 1, hasGutters) + 1;\n if (hasGutters) {\n if (crossStart > 0) {\n startLine--;\n }\n if (crossEnd < crossCount) {\n endLine++;\n }\n }\n\n return `${startLine} / ${endLine}`;\n}\n\n/**\n * Gridlines sit between two tracks (e.g. column 1 is between columns 0 and 1)\n */\nexport function isValidGridlineIndex(index: number, trackCount: number) {\n return Number.isInteger(index) && index >= 1 && index < trackCount;\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 { createContext } from \"react\";\nimport type { GridContextType } from \"./types\";\n\nexport const GridContext = createContext<GridContextType | null>(null);\n","import { useContext } from \"react\";\nimport { assert } from \"../../utils/assert\";\nimport { GridContext } from \"./GridContext\";\n\nexport function useGridContext() {\n const context = useContext(GridContext);\n assert(\n context,\n \"Grid Context not found; did you render a Cell or Gridline outside of a Grid?\"\n );\n\n return context;\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useId } from \"../../hooks/useId\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { getTrackGridPlacement } from \"./gridPlacement\";\nimport type { CellProps } from \"./types\";\nimport { useGridContext } from \"./useGridContext\";\n\n/**\n * A Cell occupies one or more tracks (columns and rows) within a Grid.\n * Cells are resized along with the tracks they occupy.\n *\n * Cell elements always include the following attributes:\n *\n * ```html\n * <div data-cell data-testid=\"cell-id-prop\" id=\"cell-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 * ⚠️ Cell elements must be direct DOM children of their parent Grid elements.\n */\nexport function Cell({\n children,\n className,\n column,\n columnSpan = 1,\n elementRef: elementRefProp,\n id: idProp,\n row,\n rowSpan = 1,\n style,\n ...rest\n}: CellProps) {\n const id = useId(idProp);\n\n // Invalid placements are logged by the Grid (see getPlacementErrors)\n const { gutters, registerCell } = useGridContext();\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n useIsomorphicLayoutEffect(() => {\n const element = elementRef.current;\n if (element !== null) {\n return registerCell({\n column,\n columnSpan,\n element,\n id,\n row,\n rowSpan\n });\n }\n }, [column, columnSpan, id, registerCell, row, rowSpan]);\n\n return (\n <div\n {...rest}\n className={className}\n data-cell\n data-testid={id}\n id={id}\n ref={mergedRef}\n style={{\n overflow: \"auto\",\n\n ...style,\n\n // Allow cells to shrink smaller than their content\n minHeight: 0,\n minWidth: 0,\n\n gridColumn: getTrackGridPlacement(column, columnSpan, gutters.column),\n gridRow: getTrackGridPlacement(row, rowSpan, gutters.row)\n }}\n >\n {children}\n </div>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nCell.displayName = \"Cell\";\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 { isCoarsePointer } from \"./isCoarsePointer\";\nimport type { RegisteredResizeAxis } from \"../types\";\n\n/**\n * Grows a (potentially very thin) resize target so that it satisfies the Group's minimum hit target size.\n * The rect is expanded evenly on both sides so that it remains centered on the original target.\n */\nexport function expandHitTarget({\n expandHitTargets,\n axis,\n rect\n}: {\n expandHitTargets: boolean;\n axis: RegisteredResizeAxis;\n rect: DOMRect;\n}): DOMRect {\n const minHitTargetSize = expandHitTargets\n ? isCoarsePointer()\n ? axis.resizeTargetMinimumSize.coarse\n : axis.resizeTargetMinimumSize.fine\n : 0;\n\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\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 return rect;\n}\n","import type { GridAxis, RegisteredCell } from \"./types\";\n\n/**\n * Removes the parts of a (resize target) rect that overlap cells spanning across the boundary before the specified track.\n * This prevents resize targets that have been expanded (to meet the minimum hit target size)\n * from extending into cells that span across the boundary.\n */\nexport function excludeSpanningCells({\n axis,\n cells,\n index,\n rect\n}: {\n axis: GridAxis;\n cells: RegisteredCell[];\n index: number;\n rect: DOMRect;\n}): DOMRect[] {\n let rects = [rect];\n for (const cell of cells) {\n const start = axis === \"column\" ? cell.column : cell.row;\n const span = axis === \"column\" ? cell.columnSpan : cell.rowSpan;\n if (start >= index || start + span <= index) {\n continue;\n }\n\n const bounds = cell.element.getBoundingClientRect();\n const blockedStart = axis === \"column\" ? bounds.top : bounds.left;\n const blockedEnd = axis === \"column\" ? bounds.bottom : bounds.right;\n if (blockedEnd <= blockedStart) {\n continue;\n }\n\n rects = rects.flatMap((rect) => {\n const crossStart = axis === \"column\" ? rect.top : rect.left;\n const crossEnd = axis === \"column\" ? rect.bottom : rect.right;\n if (blockedStart >= crossEnd || blockedEnd <= crossStart) {\n return [rect];\n }\n\n const segments: DOMRect[] = [];\n const addSegment = (start: number, end: number) => {\n segments.push(\n axis === \"column\"\n ? new DOMRect(rect.x, start, rect.width, end - start)\n : new DOMRect(start, rect.y, end - start, rect.height)\n );\n };\n if (crossStart < blockedStart) {\n addSegment(crossStart, blockedStart);\n }\n if (crossEnd > blockedEnd) {\n addSegment(blockedEnd, crossEnd);\n }\n return segments;\n });\n }\n\n return rects;\n}\n","import type { GridAxis, GridSeparatorPlacement, RegisteredCell } from \"./types\";\nimport { expandHitTarget } from \"../../global/utils/expandHitTarget\";\nimport { excludeSpanningCells } from \"./excludeSpanningCells\";\nimport type {\n HitRegion,\n RegisteredResizeAxis,\n RegisteredSeparator\n} from \"../../global/types\";\n\ntype Segment = {\n crossEnd: number;\n crossStart: number;\n end: number;\n start: number;\n};\n\n/**\n * Determines hit regions for one axis of a Grid; a hit region is either:\n * - 1: An explicit Gridline element\n * - 2: The (implicit) boundary between two adjacent tracks\n *\n * Implicit boundaries are split into segments by cells that span across them.\n * For example, a cell that spans columns 0 and 1 prevents the boundary between those columns from being resized\n * alongside of it (though the boundary may still be resized in other rows).\n *\n * Adjacent segments are merged into a single region, including the gap between rows (or columns).\n * This ensures that the area where column and row boundaries intersect is included in the hit regions for both axes,\n * allowing both to be resized at once.\n */\nexport function calculateGridHitRegions({\n axis,\n cells,\n crossTrackCount,\n expandHitTargets,\n resizeAxis,\n axisSize,\n includeDisabled,\n separatorPlacements\n}: {\n axis: GridAxis;\n cells: RegisteredCell[];\n crossTrackCount: number;\n expandHitTargets: boolean;\n resizeAxis: RegisteredResizeAxis;\n axisSize: number;\n includeDisabled: boolean;\n separatorPlacements: Map<RegisteredSeparator, GridSeparatorPlacement>;\n}): HitRegion[] {\n const { items: tracks, separators } = resizeAxis;\n const trackCount = tracks.length;\n\n let firstEnabledIndex = -1;\n let lastEnabledIndex = -1;\n let numEnabled = 0;\n tracks.forEach((track, index) => {\n if (!track.constraintProps.disabled) {\n numEnabled++;\n if (firstEnabledIndex === -1) {\n firstEnabledIndex = index;\n }\n lastEnabledIndex = index;\n }\n });\n\n // If all (or all but one) of the tracks are disabled, there can be no resize interactions.\n if (!includeDisabled && numEnabled < 2) {\n return [];\n }\n\n const isBoundaryResizable = (index: number) =>\n includeDisabled || (index > firstEnabledIndex && index <= lastEnabledIndex);\n\n const hitRegions: HitRegion[] = [];\n\n const createHitRegion = (\n index: number,\n rect: DOMRect,\n separator?: RegisteredSeparator\n ): HitRegion => ({\n axis: resizeAxis,\n axisSize,\n items: [tracks[index - 1], tracks[index]],\n rect,\n separator\n });\n\n // Returns the position (along the cross axis) where the specified cross track starts or ends\n const getCrossTrackEdge = (crossIndex: number, edge: \"start\" | \"end\") => {\n let position: number | undefined = undefined;\n for (const cell of cells) {\n const cellCrossStart = axis === \"column\" ? cell.row : cell.column;\n const cellCrossSpan = axis === \"column\" ? cell.rowSpan : cell.columnSpan;\n if (\n edge === \"start\"\n ? cellCrossStart === crossIndex\n : cellCrossStart + cellCrossSpan - 1 === crossIndex\n ) {\n const rect = cell.element.getBoundingClientRect();\n if (edge === \"start\") {\n const start = axis === \"column\" ? rect.top : rect.left;\n position = position === undefined ? start : Math.min(position, start);\n } else {\n const end = axis === \"column\" ? rect.bottom : rect.right;\n position = position === undefined ? end : Math.max(position, end);\n }\n }\n }\n return position;\n };\n\n // Explicit separators always take precedence over implicit cell boundaries\n const boundariesWithSeparators = new Set<number>();\n for (const separator of separators) {\n const placement = separatorPlacements.get(separator);\n if (!placement || placement.index < 1 || placement.index >= trackCount) {\n continue;\n }\n\n boundariesWithSeparators.add(placement.index);\n\n if (\n !includeDisabled &&\n (separator.disabled || separator.element.hasAttribute(\"aria-disabled\"))\n ) {\n continue;\n }\n\n if (!isBoundaryResizable(placement.index)) {\n continue;\n }\n\n let rect = separator.element.getBoundingClientRect();\n\n // Separators that span a subset of the cross axis are extended into the gap before/after them (if any)\n // so that the area where they intersect a separator on the other axis resizes both axes\n const { crossSpan, crossStart } = placement;\n const crossEnd =\n crossSpan === undefined ? crossTrackCount : crossStart + crossSpan;\n let rectStart = axis === \"column\" ? rect.top : rect.left;\n let rectEnd = axis === \"column\" ? rect.bottom : rect.right;\n if (crossStart > 0) {\n const previousEnd = getCrossTrackEdge(crossStart - 1, \"end\");\n if (previousEnd !== undefined && previousEnd < rectStart) {\n rectStart = previousEnd;\n }\n }\n if (crossEnd < crossTrackCount) {\n const nextStart = getCrossTrackEdge(crossEnd, \"start\");\n if (nextStart !== undefined && nextStart > rectEnd) {\n rectEnd = nextStart;\n }\n }\n rect =\n axis === \"column\"\n ? new DOMRect(rect.x, rectStart, rect.width, rectEnd - rectStart)\n : new DOMRect(rectStart, rect.y, rectEnd - rectStart, rect.height);\n\n rect = expandHitTarget({ expandHitTargets, axis: resizeAxis, rect });\n\n if (includeDisabled) {\n // Used to map gridlines to tracks (e.g. for keyboard interactions and aria attributes)\n hitRegions.push(createHitRegion(placement.index, rect, separator));\n } else {\n // Gridlines should not be rendered alongside of cells that span across their boundary (this is logged as an error)\n // but if they are, those cells should still not be treated as resize targets\n excludeSpanningCells({\n axis,\n cells,\n index: placement.index,\n rect\n }).forEach((current) => {\n hitRegions.push(createHitRegion(placement.index, current, separator));\n });\n }\n }\n\n // Implicit boundaries may be expanded (to meet the minimum hit target size) into cells that span across them;\n // those portions are excluded so that the spanning cells remain interactive\n const addImplicitHitRegions = (index: number, rect: DOMRect) => {\n excludeSpanningCells({\n axis,\n cells,\n index,\n rect: expandHitTarget({ expandHitTargets, axis: resizeAxis, rect })\n }).forEach((current) => {\n hitRegions.push(createHitRegion(index, current));\n });\n };\n\n // Map each (cross track, track) slot to the Cell that occupies it (if any)\n const slots: (RegisteredCell | undefined)[][] = Array.from(\n { length: crossTrackCount },\n () => new Array(trackCount)\n );\n for (const cell of cells) {\n const [start, span, crossStart, crossSpan] =\n axis === \"column\"\n ? [cell.column, cell.columnSpan, cell.row, cell.rowSpan]\n : [cell.row, cell.rowSpan, cell.column, cell.columnSpan];\n\n for (\n let crossIndex = Math.max(0, crossStart);\n crossIndex < Math.min(crossTrackCount, crossStart + crossSpan);\n crossIndex++\n ) {\n for (\n let index = Math.max(0, start);\n index < Math.min(trackCount, start + span);\n index++\n ) {\n // If cells overlap, the first one wins\n slots[crossIndex][index] ??= cell;\n }\n }\n }\n\n const bounds = new Map<RegisteredCell, Segment>();\n const getBounds = (cell: RegisteredCell) => {\n let segment = bounds.get(cell);\n if (!segment) {\n const rect = cell.element.getBoundingClientRect();\n segment =\n axis === \"column\"\n ? {\n crossEnd: rect.bottom,\n crossStart: rect.top,\n end: rect.right,\n start: rect.left\n }\n : {\n crossEnd: rect.right,\n crossStart: rect.left,\n end: rect.bottom,\n start: rect.top\n };\n bounds.set(cell, segment);\n }\n return segment;\n };\n\n const toDOMRect = ({ crossEnd, crossStart, end, start }: Segment) =>\n axis === \"column\"\n ? new DOMRect(start, crossStart, end - start, crossEnd - crossStart)\n : new DOMRect(crossStart, start, crossEnd - crossStart, end - start);\n\n for (let index = 1; index < trackCount; index++) {\n if (boundariesWithSeparators.has(index) || !isBoundaryResizable(index)) {\n continue;\n }\n\n let pending: Segment | undefined = undefined;\n\n for (let crossIndex = 0; crossIndex < crossTrackCount; crossIndex++) {\n const before = slots[crossIndex][index - 1];\n const after = slots[crossIndex][index];\n\n let segment: Segment | undefined = undefined;\n if ((before || after) && before !== after) {\n const beforeBounds = before ? getBounds(before) : undefined;\n const afterBounds = after ? getBounds(after) : undefined;\n\n // The boundary is the space between the two cells (e.g. the gap)\n const from = beforeBounds?.end ?? afterBounds!.start;\n const to = afterBounds?.start ?? beforeBounds!.end;\n\n // Along the cross axis, the boundary is only resizable where the cells are next to each other\n const crossStart = Math.max(\n beforeBounds?.crossStart ?? -Infinity,\n afterBounds?.crossStart ?? -Infinity\n );\n const crossEnd = Math.min(\n beforeBounds?.crossEnd ?? Infinity,\n afterBounds?.crossEnd ?? Infinity\n );\n\n segment = {\n crossEnd: Math.max(crossStart, crossEnd),\n crossStart,\n end: Math.max(from, to),\n start: Math.min(from, to)\n };\n }\n\n if (segment) {\n pending = pending\n ? {\n crossEnd: Math.max(pending.crossEnd, segment.crossEnd),\n crossStart: Math.min(pending.crossStart, segment.crossStart),\n end: Math.max(pending.end, segment.end),\n start: Math.min(pending.start, segment.start)\n }\n : segment;\n } else if (pending) {\n addImplicitHitRegions(index, toDOMRect(pending));\n pending = undefined;\n }\n }\n\n if (pending) {\n addImplicitHitRegions(index, toDOMRect(pending));\n }\n }\n\n return hitRegions;\n}\n","import type { GridAxis } from \"./types\";\n\nfunction parsePixels(value: string | undefined | null) {\n const parsed = parseFloat(value ?? \"\");\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\n/**\n * Measures the size (in pixels) of each track along one Grid axis.\n *\n * Browsers resolve `grid-template-columns` (and rows) to pixel values for the computed style,\n * which accounts for gaps, padding, and separator gutters.\n * If the resolved values are not available (e.g. environments that don't implement CSS Grid, like jsdom)\n * the available size is approximated from the element's size and the Grid's layout.\n *\n * ℹ️ When separators are present, the Grid interleaves \"gutter\" tracks between its content tracks.\n */\nexport function measureGridAxis({\n axis,\n element,\n gutterSizes,\n hasGutters,\n layout,\n trackIds\n}: {\n axis: GridAxis;\n element: HTMLElement;\n gutterSizes: number[];\n hasGutters: boolean;\n layout: { [trackId: string]: number } | undefined;\n trackIds: string[];\n}): { availableSize: number; trackSizes: number[] } {\n const trackCount = trackIds.length;\n const cssTrackCount = hasGutters ? trackCount * 2 - 1 : trackCount;\n\n const style = element.ownerDocument.defaultView?.getComputedStyle(element);\n\n const template =\n axis === \"column\" ? style?.gridTemplateColumns : style?.gridTemplateRows;\n if (template) {\n const tokens = template.trim().split(/\\s+/);\n if (\n tokens.length === cssTrackCount &&\n tokens.every((token) => /^-?[\\d.]+px$/.test(token))\n ) {\n const trackSizes = trackIds.map((_, index) =>\n parsePixels(tokens[hasGutters ? index * 2 : index])\n );\n\n return {\n availableSize: trackSizes.reduce((total, size) => total + size, 0),\n trackSizes\n };\n }\n }\n\n const outerSize =\n axis === \"column\" ? element.offsetWidth : element.offsetHeight;\n const padding =\n axis === \"column\"\n ? parsePixels(style?.paddingLeft) +\n parsePixels(style?.paddingRight) +\n parsePixels(style?.borderLeftWidth) +\n parsePixels(style?.borderRightWidth)\n : parsePixels(style?.paddingTop) +\n parsePixels(style?.paddingBottom) +\n parsePixels(style?.borderTopWidth) +\n parsePixels(style?.borderBottomWidth);\n const gap = parsePixels(axis === \"column\" ? style?.columnGap : style?.rowGap);\n const gutters = gutterSizes.reduce((total, size) => total + size, 0);\n\n const availableSize = Math.max(\n 0,\n outerSize - padding - gap * Math.max(0, cssTrackCount - 1) - gutters\n );\n\n return {\n availableSize,\n trackSizes: trackIds.map((trackId) =>\n layout && layout[trackId] !== undefined\n ? (layout[trackId] / 100) * availableSize\n : availableSize / trackCount\n )\n };\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","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 { EventEmitter } from \"../../utils/EventEmitter\";\nimport type { RegisteredResizeAxis, RegisteredSeparator } from \"../types\";\nimport type {\n InteractionActive,\n InteractionState,\n ResizePreview\n} 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(\n cursorFlags: number,\n previews: ResizePreview[] = [],\n previewLayoutMap?: InteractionActive[\"previewLayoutMap\"],\n didPointerMove = false\n) {\n const prev = state;\n\n const next = { ...state };\n next.cursorFlags = cursorFlags;\n if (next.state === \"active\") {\n next.didPointerMove ||= didPointerMove;\n next.previews = previews;\n if (previewLayoutMap) {\n next.previewLayoutMap = previewLayoutMap;\n }\n }\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 // Keep click-to-focus behavior, but release keyboard focus after a drag.\n // This also handles interactions completed by the missed-pointerup fallback.\n if (\n prev.state === \"active\" &&\n next.state !== \"active\" &&\n prev.didPointerMove\n ) {\n prev.hitRegions.forEach(({ separator }) => {\n if (\n separator &&\n separator.element.ownerDocument.activeElement === separator.element\n ) {\n separator.element.blur();\n }\n });\n }\n\n eventEmitter.emit(\"change\", {\n prev,\n next\n });\n}\n\n/**\n * The preview prop is read through a registered separator getter.\n * Notify after its layout effect has updated that getter, without re-registering the group.\n */\nexport function notifySeparatorPreviewChanged(separator: RegisteredSeparator) {\n if (\n state.state !== \"active\" ||\n !state.previews.some((preview) => preview.separator === separator)\n ) {\n return;\n }\n\n updateInteractionState({\n ...state,\n previews: state.previews.map((preview) =>\n preview.separator === separator ? { ...preview } : preview\n )\n });\n}\n\nexport function removeAxisFromInteraction(axis: RegisteredResizeAxis) {\n if (state.state === \"inactive\") {\n return false;\n }\n\n const hitRegions = state.hitRegions.filter((region) => region.axis !== axis);\n const hasPreviews =\n state.state === \"active\" &&\n state.previews.some((preview) => preview.axis === axis);\n if (hitRegions.length === state.hitRegions.length && !hasPreviews) {\n return false;\n }\n\n if (hitRegions.length === 0) {\n updateInteractionState({ cursorFlags: 0, state: \"inactive\" });\n } else if (state.state === \"active\") {\n const initialLayoutMap = new Map(state.initialLayoutMap);\n const previewLayoutMap = new Map(state.previewLayoutMap);\n initialLayoutMap.delete(axis);\n previewLayoutMap.delete(axis);\n\n updateInteractionState({\n ...state,\n cursorFlags: 0,\n hitRegions,\n initialLayoutMap,\n previewLayoutMap,\n previews: state.previews.filter((preview) => preview.axis !== axis)\n });\n } else {\n updateInteractionState({ ...state, hitRegions });\n }\n\n return true;\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 {\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 type { RegisteredResizeAxis } from \"../types\";\nimport { supportsAdvancedCursorStyles } from \"./supportsAdvancedCursorStyles\";\n\nexport function getCursorStyle({\n cursorFlags,\n axes,\n state\n}: {\n cursorFlags: number;\n axes: RegisteredResizeAxis[];\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 axes.forEach((axis) => {\n if (axis.mutableState.disableCursor) {\n return;\n }\n\n switch (axis.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 if (!ownerDocument.defaultView || !ownerDocument.adoptedStyleSheets) {\n // Gracefully degrade for environments that don't support these DOM APIs (e.g. Safari < 16.4, jsdom)\n // See issues#559, issues#621, issues#554, pull#730\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 if (Object.isExtensible(ownerDocument.adoptedStyleSheets)) {\n ownerDocument.adoptedStyleSheets.push(styleSheet);\n } else {\n ownerDocument.adoptedStyleSheets = [\n ...ownerDocument.adoptedStyleSheets,\n styleSheet\n ];\n }\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 axes: interactionState.hitRegions.map((current) => current.axis),\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 { RegisteredResizeAxis } from \"../types\";\n\nexport function calculateAvailableAxisSize({\n axis\n}: {\n axis: RegisteredResizeAxis;\n}) {\n const { layoutStrategy, orientation, items } = axis;\n\n if (layoutStrategy) {\n return layoutStrategy.calculateAvailableSize();\n }\n\n return items.reduce((totalSize, item) => {\n totalSize +=\n orientation === \"horizontal\"\n ? item.element.offsetWidth\n : item.element.offsetHeight;\n return totalSize;\n }, 0);\n}\n","import type { Orientation } from \"./types\";\n\nexport function sortByElementOffset<\n Type extends { element: HTMLElement },\n ReturnType extends Type[]\n>(orientation: Orientation, panelsOrSeparators: Type[]): ReturnType {\n return Array.from(panelsOrSeparators).sort((a, b) => {\n const delta =\n orientation === \"horizontal\" ? horizontalSort(a, b) : verticalSort(a, b);\n if (delta !== 0) {\n return delta;\n }\n\n // JSDom and hidden elements may have identical offsets and sizes.\n // Use DOM order so registration order does not affect panel adjacency.\n const position = a.element.compareDocumentPosition(b.element);\n if (position & Node.DOCUMENT_POSITION_DISCONNECTED) {\n return 0;\n }\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) {\n return -1;\n }\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n return 1;\n }\n\n return 0;\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 { assert } from \"../../utils/assert\";\nimport type { Orientation } from \"../types\";\nimport { getDistanceBetweenPointAndRect } from \"./getDistanceBetweenPointAndRect\";\n\nexport function findClosestRect({\n orientation,\n rects,\n targetRect\n}: {\n orientation: Orientation;\n rects: DOMRectReadOnly[];\n targetRect: DOMRectReadOnly;\n}): DOMRectReadOnly {\n const centerPoint = {\n x: targetRect.x + targetRect.width / 2,\n y: targetRect.y + targetRect.height / 2\n };\n\n let closestRect: DOMRectReadOnly | undefined = undefined;\n let minDistance = Number.MAX_VALUE;\n\n for (const rect of rects) {\n const { x, y } = getDistanceBetweenPointAndRect(centerPoint, rect);\n\n const distance = orientation === \"horizontal\" ? x : y;\n\n if (distance < minDistance) {\n minDistance = distance;\n closestRect = rect;\n }\n }\n\n assert(closestRect, \"No rect found\");\n\n return closestRect;\n}\n","import { sortByElementOffset } from \"../../components/group/sortByElementOffset\";\nimport { isHTMLElement } from \"../../utils/isHTMLElement\";\nimport type {\n HitRegion,\n RegisteredResizeAxis,\n RegisteredResizeItem,\n RegisteredSeparator\n} from \"../types\";\nimport { findClosestRect } from \"../utils/findClosestRect\";\nimport { expandHitTarget } from \"../utils/expandHitTarget\";\nimport { calculateAvailableAxisSize } from \"./calculateAvailableAxisSize\";\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({\n expandHitTargets = true,\n axis,\n includeDisabled = false\n}: {\n expandHitTargets?: boolean;\n axis: RegisteredResizeAxis;\n includeDisabled?: boolean;\n}) {\n if (axis.layoutStrategy) {\n return axis.layoutStrategy.calculateHitRegions({\n expandHitTargets,\n axis,\n includeDisabled\n });\n }\n\n const { element: axisElement, orientation, items, separators } = axis;\n\n // Sort elements by offset before traversing\n const sortedChildElements: HTMLElement[] = sortByElementOffset(\n orientation,\n Array.from(axisElement.children)\n .filter(isHTMLElement)\n .filter((element) => !element.hasAttribute(\"data-resize-preview\"))\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 firstEnabledItemIndex = -1;\n let axisSize: number | undefined;\n let lastEnabledItemIndex = -1;\n let numEnabledItems = 0;\n let prevItem: RegisteredResizeItem | undefined = undefined;\n let pendingSeparators: RegisteredSeparator[] = [];\n\n {\n let currentItemIndex = -1;\n\n for (const childElement of sortedChildElements) {\n if (childElement.hasAttribute(\"data-panel\")) {\n currentItemIndex++;\n\n if (!childElement.hasAttribute(\"data-disabled\")) {\n numEnabledItems++;\n\n if (firstEnabledItemIndex === -1) {\n firstEnabledItemIndex = currentItemIndex;\n }\n\n lastEnabledItemIndex = currentItemIndex;\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 (includeDisabled || numEnabledItems > 1) {\n let currentItemIndex = -1;\n\n for (const childElement of sortedChildElements) {\n if (childElement.hasAttribute(\"data-panel\")) {\n currentItemIndex++;\n\n const itemData = items.find(\n (current) => current.element === childElement\n );\n if (itemData) {\n if (prevItem) {\n const prevRect = prevItem.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 firstItemEdgeRect =\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 secondItemEdgeRect =\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 firstItemEdgeRect,\n secondItemEdgeRect\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 ? secondItemEdgeRect\n : firstItemEdgeRect\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 const rect = expandHitTarget({\n expandHitTargets,\n axis,\n rect:\n \"width\" in rectOrSeparator\n ? rectOrSeparator\n : rectOrSeparator.element.getBoundingClientRect()\n });\n\n const skip =\n currentItemIndex <= firstEnabledItemIndex ||\n currentItemIndex > lastEnabledItemIndex;\n\n if (includeDisabled || (!disabledSeparator && !skip)) {\n axisSize ??= calculateAvailableAxisSize({ axis });\n\n hitRegions.push({\n axis,\n axisSize,\n items: [prevItem, itemData],\n separator:\n \"width\" in rectOrSeparator ? undefined : rectOrSeparator,\n rect\n });\n }\n\n disabledSeparator = false;\n }\n }\n\n hasInterleavedStaticContent = false;\n prevItem = itemData;\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 prevItem = undefined;\n pendingSeparators = [];\n }\n } else {\n hasInterleavedStaticContent = true;\n }\n }\n }\n\n return hitRegions;\n}\n","export function convertEmToPixels(element: Element, value: number) {\n const style = getComputedStyle(element);\n const fontSize = parseFloat(style.fontSize);\n\n return value * fontSize;\n}\n","export function convertRemToPixels(element: Element, value: number) {\n const style = getComputedStyle(element.ownerDocument.documentElement);\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 { convertEmToPixels } from \"./convertEmToPixels\";\nimport { convertRemToPixels } from \"./convertRemToPixels\";\nimport { convertVhToPixels } from \"./convertVhToPixels\";\nimport { convertVwToPixels } from \"./convertVwToPixels\";\nimport { parseSizeAndUnit } from \"./parseSizeAndUnit\";\n\nexport function sizeStyleToPixels({\n axisSize,\n itemElement,\n styleProp\n}: {\n axisSize: number;\n itemElement: 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) * axisSize;\n break;\n }\n case \"px\": {\n pixels = size;\n break;\n }\n case \"rem\": {\n pixels = convertRemToPixels(itemElement, size);\n break;\n }\n case \"em\": {\n pixels = convertEmToPixels(itemElement, 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 { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\nimport type { RegisteredResizeAxis, ResizeItemConstraints } from \"../types\";\nimport { formatLayoutNumber } from \"../utils/formatLayoutNumber\";\nimport { calculateAvailableAxisSize } from \"./calculateAvailableAxisSize\";\n\nexport function calculateItemConstraints(axis: RegisteredResizeAxis) {\n const { items } = axis;\n\n const axisSize = calculateAvailableAxisSize({ axis });\n if (axisSize === 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 items.map<ResizeItemConstraints>((current) => ({\n groupResizeBehavior: current.constraintProps.groupResizeBehavior,\n collapsedSize: 0,\n collapsible: current.constraintProps.collapsible === true,\n defaultSize: undefined,\n disabled: current.constraintProps.disabled,\n minSize: 0,\n maxSize: 100,\n itemId: current.id\n }));\n }\n\n return items.map<ResizeItemConstraints>((item) => {\n const { element, constraintProps: itemConstraints } = item;\n\n let collapsedSize = 0;\n if (itemConstraints.collapsedSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.collapsedSize\n });\n\n collapsedSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let collapsedThreshold: number | undefined = undefined;\n if (itemConstraints.collapsedThreshold !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.collapsedThreshold\n });\n\n collapsedThreshold = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let defaultSize: number | undefined = undefined;\n if (itemConstraints.defaultSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.defaultSize\n });\n\n defaultSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let minSize = 0;\n if (itemConstraints.minSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.minSize\n });\n\n minSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n let maxSize = 100;\n if (itemConstraints.maxSize !== undefined) {\n const pixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: itemConstraints.maxSize\n });\n\n maxSize = formatLayoutNumber((pixels / axisSize) * 100);\n }\n\n return {\n groupResizeBehavior: itemConstraints.groupResizeBehavior,\n collapsedSize,\n collapsedThreshold,\n collapsible: itemConstraints.collapsible === true,\n defaultSize,\n disabled: itemConstraints.disabled,\n minSize,\n maxSize,\n itemId: item.id\n };\n });\n}\n","import { EventEmitter } from \"../../utils/EventEmitter\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n ResizeItemConstraints\n} from \"../types\";\nimport type { SeparatorToItemsMap } from \"./types\";\n\ntype State = {\n defaultLayoutDeferred: boolean;\n derivedItemConstraints: ResizeItemConstraints[];\n axisSize: number;\n layout: Layout;\n\n /**\n * Layout most recently requested by the user or application (e.g. default layout, pointer or keyboard resize, imperative API).\n * When the axis is resized, `layout` is re-derived from this value so that constraints don't permanently alter it.\n * See #720.\n */\n requestedLayout: Layout;\n\n /**\n * Axis size (in pixels) when the requested layout was recorded; used for `preserve-pixel-size` items.\n */\n requestedAxisSize: number;\n\n separatorToItems: SeparatorToItemsMap;\n};\n\nexport type MountedAxes = Map<RegisteredResizeAxis, State>;\n\nlet map: MountedAxes = new Map();\n\ntype AxisChangeEvent = {\n axis: RegisteredResizeAxis;\n // True if the change was triggered by a pointer or keyboard event handler\n // False for other types of resize (constraint recompute, default-size change, imperative API, etc.).\n isUserInteraction: boolean;\n next: State;\n prev: State | undefined;\n};\ntype AxesChangeEvent = {\n next: MountedAxes;\n prev: MountedAxes;\n};\n\nconst eventEmitter = new EventEmitter<{\n axisChange: AxisChangeEvent;\n axesChange: AxesChangeEvent;\n}>();\n\nexport function deleteMutableAxis(axis: RegisteredResizeAxis) {\n map = new Map(map);\n map.delete(axis);\n}\n\nexport function getRegisteredAxis(\n axisId: string\n): RegisteredResizeAxis | undefined;\nexport function getRegisteredAxis(\n axisId: string,\n assert: true\n): RegisteredResizeAxis;\nexport function getRegisteredAxis(axisId: string, assert?: boolean) {\n for (const [axis] of map) {\n if (axis.id === axisId) {\n return axis;\n }\n }\n\n if (assert) {\n throw Error(`Could not find data for Group with id ${axisId}`);\n }\n\n return undefined;\n}\n\nexport function getMountedAxisState(axisId: string): State | undefined;\nexport function getMountedAxisState(axisId: string, assert: true): State;\nexport function getMountedAxisState(axisId: string, assert?: boolean) {\n for (const [axis, mountedAxis] of map) {\n if (axis.id === axisId) {\n return mountedAxis;\n }\n }\n\n if (assert) {\n throw Error(`Could not find data for Group with id ${axisId}`);\n }\n\n return undefined;\n}\n\nexport function getMountedAxes() {\n return map;\n}\n\nexport function subscribeToMountedAxis(\n axisId: string,\n callback: (event: AxisChangeEvent) => void\n) {\n return eventEmitter.addListener(\"axisChange\", (event) => {\n if (event.axis.id === axisId) {\n callback(event);\n }\n });\n}\n\nexport function updateMountedAxis(\n axis: RegisteredResizeAxis,\n next: State,\n meta?: { isUserInteraction?: boolean }\n) {\n const prev = map.get(axis);\n\n map = new Map(map);\n map.set(axis, next);\n\n eventEmitter.emit(\"axisChange\", {\n axis,\n isUserInteraction: meta?.isUserInteraction === true,\n prev,\n next\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 { compareLayoutNumbers } from \"./compareLayoutNumbers\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport type { ResizeItemConstraints } from \"../types\";\n\n// Panel size must be in percentages; pixel values should be pre-converted\nexport function validateItemSize({\n overrideDisabledItems,\n itemConstraints,\n prevSize,\n size\n}: {\n overrideDisabledItems?: boolean;\n itemConstraints: ResizeItemConstraints;\n prevSize: number;\n size: number;\n}) {\n const {\n collapsedSize = 0,\n collapsedThreshold,\n collapsible,\n disabled,\n maxSize = 100,\n minSize = 0\n } = itemConstraints;\n\n if (disabled && !overrideDisabledItems) {\n return prevSize;\n }\n\n if (compareLayoutNumbers(size, minSize) < 0) {\n if (collapsible) {\n const threshold = collapsedThreshold ?? (minSize - collapsedSize) / 2;\n const wasCollapsed = compareLayoutNumbers(prevSize, collapsedSize) <= 0;\n const boundary = wasCollapsed\n ? collapsedSize + threshold\n : minSize - threshold;\n const comparison = compareLayoutNumbers(size, boundary);\n\n if (\n compareLayoutNumbers(size, collapsedSize) <= 0 ||\n comparison < 0 ||\n (collapsedThreshold !== undefined && wasCollapsed && comparison === 0)\n ) {\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 { assert } from \"../../utils/assert\";\nimport { isArrayEqual } from \"../../utils/isArrayEqual\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\nimport { compareLayoutNumbers } from \"../utils/compareLayoutNumbers\";\nimport { layoutNumbersEqual } from \"../utils/layoutNumbersEqual\";\nimport { validateItemSize } from \"./validateItemSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function adjustLayoutByDelta({\n delta,\n initialLayout: initialLayoutProp,\n itemConstraints: itemConstraintsArray,\n pivotIndices,\n prevLayout: prevLayoutProp,\n trigger\n}: {\n delta: number;\n initialLayout: Layout;\n itemConstraints: ResizeItemConstraints[];\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 overrideDisabledItems = trigger === \"imperative-api\";\n\n const initialLayout = itemConstraintsArray.map(\n ({ itemId }) => initialLayoutProp[itemId]\n );\n const prevLayout = itemConstraintsArray.map(\n ({ itemId }) => prevLayoutProp[itemId]\n );\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 // 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 itemConstraints = itemConstraintsArray[index];\n assert(\n itemConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = itemConstraints;\n\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\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\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 itemConstraints = itemConstraintsArray[index];\n assert(\n itemConstraints,\n `No panel constraints found for index ${index}`\n );\n\n const {\n collapsedSize = 0,\n collapsible,\n minSize = 0\n } = itemConstraints;\n\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\n if (compareLayoutNumbers(localDelta, Math.abs(delta)) > 0) {\n delta = delta < 0 ? 0 - localDelta : localDelta;\n }\n }\n }\n }\n break;\n }\n default: {\n // If we're starting from a collapsed state, dragging past the threshold 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\n const index = delta < 0 ? secondPivotIndex : firstPivotIndex;\n const itemConstraints = itemConstraintsArray[index];\n assert(\n itemConstraints,\n `Panel constraints not found for index ${index}`\n );\n\n const prevSize = initialLayout[index];\n\n const { collapsedSize, collapsedThreshold, collapsible, minSize } =\n itemConstraints;\n if (collapsible && compareLayoutNumbers(prevSize, minSize) < 0) {\n const gapSize = minSize - collapsedSize;\n const threshold = collapsedThreshold ?? gapSize / 2;\n const nextSize = prevSize + Math.abs(delta);\n\n if (compareLayoutNumbers(nextSize, minSize) < 0) {\n const comparison = compareLayoutNumbers(Math.abs(delta), threshold);\n // Preserve the existing boundary behavior when no threshold is specified.\n const expandAtBoundary =\n collapsedThreshold === undefined && delta < 0;\n if (comparison > 0 || (comparison === 0 && expandAtBoundary)) {\n delta = delta < 0 ? -gapSize : gapSize;\n } else {\n delta = 0;\n }\n }\n }\n break;\n }\n }\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 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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[index],\n prevSize,\n size: 100\n });\n const delta = maxSafeSize - prevSize;\n\n maxAvailableDelta += delta;\n index += increment;\n\n if (index < 0 || index >= itemConstraintsArray.length) {\n break;\n }\n }\n\n const minAbsDelta = Math.min(Math.abs(delta), Math.abs(maxAvailableDelta));\n delta = delta < 0 ? 0 - minAbsDelta : minAbsDelta;\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 < itemConstraintsArray.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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[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\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 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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[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 < itemConstraintsArray.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 = validateItemSize({\n overrideDisabledItems,\n itemConstraints: itemConstraintsArray[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\n const totalSize = Object.values(nextLayout).reduce(\n (total, size) => size + total,\n 0\n );\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 return prevLayoutProp;\n }\n\n return nextLayout.reduce<Layout>((accumulated, current, index) => {\n accumulated[itemConstraintsArray[index].itemId] = current;\n return accumulated;\n }, {});\n}\n","import { compareLayoutNumbers } from \"./compareLayoutNumbers\";\nimport type { Layout } from \"../types\";\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 {\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 { updateMountedAxis, type MountedAxes } from \"../mutable-state/axes\";\nimport {\n getInteractionState,\n updateCursorFlags\n} from \"../mutable-state/interactions\";\nimport type { HitRegion, Layout, RegisteredResizeAxis } from \"../types\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { layoutsEqual } from \"./layoutsEqual\";\n\nexport function updateActiveHitRegions({\n commit,\n document,\n event,\n hitRegions,\n initialLayoutMap,\n mountedAxes,\n pointerDownAtPoint,\n prevCursorFlags\n}: {\n commit: boolean;\n document: Document;\n event: {\n clientX: number;\n clientY: number;\n movementX: number;\n movementY: number;\n };\n hitRegions: HitRegion[];\n initialLayoutMap: Map<RegisteredResizeAxis, Layout>;\n mountedAxes: MountedAxes;\n pointerDownAtPoint?: Point;\n prevCursorFlags: number;\n}) {\n let nextCursorFlags = 0;\n const interaction = getInteractionState();\n let previews = interaction.state === \"active\" ? interaction.previews : [];\n const previewLayoutMap = new Map(\n interaction.state === \"active\" ? interaction.previewLayoutMap : undefined\n );\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 { axis, axisSize } = current;\n const { orientation, items } = axis;\n if (commit && axis.resizePreviewMode !== \"separator\") {\n return;\n }\n const { disableCursor } = axis.mutableState;\n\n let deltaAsPercentage = 0;\n if (pointerDownAtPoint) {\n if (orientation === \"horizontal\") {\n deltaAsPercentage =\n ((event.clientX - pointerDownAtPoint.x) / axisSize) * 100;\n } else {\n deltaAsPercentage =\n ((event.clientY - pointerDownAtPoint.y) / axisSize) * 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(axis);\n const axisState = mountedAxes.get(axis);\n if (!initialLayout || !axisState) {\n return;\n }\n\n const {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize: mountedAxisSize,\n layout: mountedLayout,\n separatorToItems\n } = axisState;\n if (derivedItemConstraints && mountedLayout && separatorToItems) {\n const prevLayout =\n axis.resizePreviewMode === \"separator\"\n ? (previewLayoutMap.get(axis) ?? mountedLayout)\n : mountedLayout;\n const nextLayout = adjustLayoutByDelta({\n delta: deltaAsPercentage,\n initialLayout,\n itemConstraints: derivedItemConstraints,\n pivotIndices: current.items.map((item) => items.indexOf(item)),\n prevLayout,\n trigger: \"mouse-or-touch\"\n });\n\n // Preview every moved boundary, deferring the layout update until release.\n if (\n axis.resizePreviewMode === \"separator\" &&\n !commit &&\n !layoutsEqual(nextLayout, prevLayout)\n ) {\n previewLayoutMap.set(axis, nextLayout);\n\n let total = 0;\n const offsets = items.map((item) => {\n total += nextLayout[item.id] - initialLayout[item.id];\n return total * (axisSize / 100);\n });\n\n previews = previews.map((preview) => {\n if (preview.axis !== axis) {\n return preview;\n }\n\n const offset = offsets[preview.itemIndex];\n return offset === preview.offset ? preview : { ...preview, offset };\n });\n }\n\n if (layoutsEqual(nextLayout, prevLayout)) {\n if (deltaAsPercentage !== 0 && !disableCursor) {\n // An unchanged layout 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 }\n\n if (\n (axis.resizePreviewMode !== \"separator\" || commit) &&\n !layoutsEqual(nextLayout, mountedLayout)\n ) {\n updateMountedAxis(current.axis, {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize: mountedAxisSize,\n layout: nextLayout,\n requestedAxisSize: mountedAxisSize,\n requestedLayout: nextLayout,\n separatorToItems\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 const didPointerMove =\n interaction.state === \"active\" &&\n (event.clientX !== interaction.pointerDownAtPoint.x ||\n event.clientY !== interaction.pointerDownAtPoint.y);\n\n updateCursorFlags(cursorFlags, previews, previewLayoutMap, didPointerMove);\n updateCursorStyle(document);\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle.ts\";\nimport { updateActiveHitRegions } from \"./updateActiveHitRegion\";\nimport {\n getMountedAxes,\n getMountedAxisState,\n updateMountedAxis\n} from \"../mutable-state/axes.ts\";\nimport {\n getInteractionState,\n updateInteractionState\n} from \"../mutable-state/interactions.ts\";\n\nexport function completeActivePointerResize(\n document: Document,\n event: {\n clientX: number;\n clientY: number;\n movementX: number;\n movementY: number;\n }\n) {\n const interactionState = getInteractionState();\n const mountedAxes = getMountedAxes();\n\n let match = false;\n\n switch (interactionState.state) {\n case \"active\": {\n updateActiveHitRegions({\n commit: true,\n document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedAxes,\n pointerDownAtPoint: interactionState.pointerDownAtPoint,\n prevCursorFlags: interactionState.cursorFlags\n });\n\n updateInteractionState({\n cursorFlags: 0,\n state: \"inactive\"\n });\n\n if (interactionState.hitRegions.length > 0) {\n updateCursorStyle(document);\n\n match = true;\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 // This is the canonical user-pointer-up site, so flag the dispatch with\n // isUserInteraction: true. See #716.\n interactionState.hitRegions.forEach((hitRegion) => {\n // Skip if the group was re-registered mid-gesture, so the old hit region\n // doesn't resurrect a stale entry in the mounted-groups map. See #729.\n if (!mountedAxes.has(hitRegion.axis)) {\n return;\n }\n const axisState = getMountedAxisState(hitRegion.axis.id, true);\n updateMountedAxis(hitRegion.axis, axisState, {\n isUserInteraction: true\n });\n });\n }\n }\n }\n\n return match;\n}\n","import { completeActivePointerResize } from \"../utils/completeActivePointerResize.ts\";\n\nexport function onDocumentContextMenu(event: MouseEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n completeActivePointerResize(event.currentTarget as Document, event);\n}\n","import type { Point } from \"../../types\";\nimport type { HitRegion, Orientation } from \"../types\";\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 // Ties along the primary axis are broken by the distance along the cross axis;\n // this matters for groups whose resize targets don't span the full cross axis (e.g. Grid)\n if (\n data.x < minDistance.x ||\n (data.x === minDistance.x && data.y <= minDistance.y)\n ) {\n closestHitRegion = hitRegion;\n minDistance = data;\n }\n break;\n }\n case \"vertical\": {\n if (\n data.y < minDistance.y ||\n (data.y === minDistance.y && data.x <= minDistance.x)\n ) {\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","export function isModal(element: Element) {\n try {\n return element.matches(\":modal\");\n } catch {\n // The \":modal\" pseudo-class is not supported by all environments (e.g. older browsers, JSDom)\n return false;\n }\n}\n","import { isHTMLElement } from \"../../utils/isHTMLElement\";\nimport { compare } from \"../../vendor/stacking-order\";\nimport { doRectsIntersect } from \"./doRectsIntersect\";\nimport { isModal } from \"./isModal\";\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 axisElement,\n hitRegion,\n pointerEventTarget\n}: {\n axisElement: HTMLElement;\n hitRegion: DOMRect;\n pointerEventTarget: EventTarget | null;\n}) {\n if (isHTMLElement(pointerEventTarget)) {\n // A modal dialog is rendered in the top layer and makes everything outside of it inert,\n // regardless of where the dialog is in the DOM (e.g. even if it's a descendant of the group).\n // Stacking order comparison can't detect this, so check for it explicitly.\n const dialog = pointerEventTarget.closest(\"dialog\");\n if (dialog && !dialog.contains(axisElement) && isModal(dialog)) {\n return false;\n }\n }\n\n if (\n !isHTMLElement(pointerEventTarget) ||\n pointerEventTarget.contains(axisElement) ||\n axisElement.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, axisElement) > 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(axisElement)) {\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 { calculateHitRegions } from \"../dom/calculateHitRegions\";\nimport type { MountedAxes } from \"../mutable-state/axes\";\nimport type { HitRegion } from \"../types\";\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 mountedAxes: MountedAxes\n): HitRegion[] {\n const matchingHitRegions: HitRegion[] = [];\n\n mountedAxes.forEach((_, axisData) => {\n if (axisData.disabled) {\n return;\n }\n\n const hitRegions = calculateHitRegions({ axis: axisData });\n const match = findClosestHitRegion(axisData.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 axisElement: axisData.element,\n hitRegion: match.hitRegion.rect,\n pointerEventTarget: event.target\n })\n ) {\n matchingHitRegions.push(match.hitRegion);\n }\n });\n\n return matchingHitRegions;\n}\n","import { assert } from \"../../utils/assert\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { validateItemSize } from \"./validateItemSize\";\n\n// All units must be in percentages; pixel values should be pre-converted\nexport function validateAxisLayout({\n layout,\n itemConstraints\n}: {\n layout: Layout;\n itemConstraints: ResizeItemConstraints[];\n}): Layout {\n const prevLayout = itemConstraints.map(({ itemId }) => layout[itemId]);\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 (Object.keys(layout).length !== itemConstraints.length) {\n throw Error(\n `Invalid ${itemConstraints.length} panel layout: ${Object.values(layout)\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 < itemConstraints.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 < itemConstraints.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 = validateItemSize({\n overrideDisabledItems: true,\n itemConstraints: itemConstraints[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 < itemConstraints.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 = validateItemSize({\n overrideDisabledItems: true,\n itemConstraints: itemConstraints[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 return nextLayout.reduce<Layout>((accumulated, current, index) => {\n accumulated[itemConstraints[index].itemId] = current;\n return accumulated;\n }, {});\n}\n","import type { PanelImperativeHandle } from \"../../components/panel/types\";\nimport { calculateAvailableAxisSize } from \"../dom/calculateAvailableAxisSize\";\nimport { getMountedAxes, updateMountedAxis } from \"../mutable-state/axes\";\nimport { sizeStyleToPixels } from \"../styles/sizeStyleToPixels\";\nimport type {\n Layout,\n RegisteredResizeItem,\n ResizeItemConstraints\n} from \"../types\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\n\nexport function getImperativeItemMethods({\n axisId,\n itemId\n}: {\n axisId: string;\n itemId: string;\n}): PanelImperativeHandle {\n const find = () => {\n const mountedAxes = getMountedAxes();\n for (const [\n axis,\n {\n defaultLayoutDeferred,\n derivedItemConstraints,\n layout,\n axisSize,\n separatorToItems\n }\n ] of mountedAxes) {\n if (axis.id === axisId) {\n return {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axis,\n axisSize,\n layout,\n separatorToItems\n };\n }\n }\n\n throw Error(`Group ${axisId} not found`);\n };\n\n const getItemConstraints = () => {\n const match = find().derivedItemConstraints.find(\n (current) => current.itemId === itemId\n );\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Panel constraints not found for Panel ${itemId}`);\n };\n\n const getItem = () => {\n const match = find().axis.items.find((current) => current.id === itemId);\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${itemId}`);\n };\n\n const getItemSize = () => {\n const match = find().layout[itemId];\n if (match !== undefined) {\n return match;\n }\n\n throw Error(`Layout not found for Panel ${itemId}`);\n };\n\n /**\n * Compute the next (unvalidated) layout when resizing a panel imperatively.\n *\n * Handles two edge cases for the last panel:\n * 1. Single panel in the axis — no sibling exists to form valid pivot indices.\n * 2. All preceding panels are already collapsed — the normal reversed-delta\n * logic would cascade the freed space to the first panel. Instead the last\n * panel keeps the remainder so it stays the largest.\n */\n const computeLayout = ({\n nextSize,\n items,\n prevLayout,\n derivedItemConstraints\n }: {\n nextSize: number;\n items: RegisteredResizeItem[];\n prevLayout: Layout;\n derivedItemConstraints: ResizeItemConstraints[];\n }): Layout => {\n const prevSize = getItemSize();\n\n const index = items.findIndex((current) => current.id === itemId);\n const isFirstItem = index === 0;\n const isLastItem = index === items.length - 1;\n\n const allPreviousCollapsed =\n isLastItem &&\n nextSize < prevSize &&\n (isFirstItem ||\n items.slice(0, index).every((_item, itemIndex) => {\n const pc = derivedItemConstraints[itemIndex];\n return (\n pc?.collapsible &&\n layoutNumbersEqual(pc.collapsedSize, prevLayout[pc.itemId])\n );\n }));\n\n if (allPreviousCollapsed) {\n const occupiedByPrevious = items\n .slice(0, index)\n .reduce((total, item) => total + prevLayout[item.id], 0);\n return {\n ...prevLayout,\n [itemId]: formatLayoutNumber(100 - occupiedByPrevious)\n };\n }\n\n return adjustLayoutByDelta({\n delta: isLastItem ? prevSize - nextSize : nextSize - prevSize,\n initialLayout: prevLayout,\n itemConstraints: derivedItemConstraints,\n pivotIndices: isLastItem ? [index - 1, index] : [index, index + 1],\n prevLayout,\n trigger: \"imperative-api\"\n });\n };\n\n const setItemSize = (nextSize: number) => {\n const prevSize = getItemSize();\n if (nextSize === prevSize) {\n return;\n }\n\n const {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axis,\n axisSize,\n layout: prevLayout,\n separatorToItems\n } = find();\n\n const unsafeLayout = computeLayout({\n nextSize,\n items: axis.items,\n prevLayout,\n derivedItemConstraints\n });\n\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: derivedItemConstraints\n });\n if (!layoutsEqual(prevLayout, nextLayout)) {\n updateMountedAxis(axis, {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize,\n layout: nextLayout,\n requestedAxisSize: axisSize,\n requestedLayout: nextLayout,\n separatorToItems\n });\n }\n };\n\n return {\n collapse: () => {\n const { collapsible, collapsedSize } = getItemConstraints();\n const { mutableValues } = getItem();\n const size = getItemSize();\n\n if (collapsible && size !== collapsedSize) {\n // Store previous size in to restore if expand() is called\n mutableValues.expandToSize = size;\n\n setItemSize(collapsedSize);\n }\n },\n expand: () => {\n const { collapsible, collapsedSize, minSize } = getItemConstraints();\n const { mutableValues } = getItem();\n const size = getItemSize();\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 setItemSize(nextSize);\n }\n },\n getSize: () => {\n const { axis } = find();\n const asPercentage = getItemSize();\n const { element } = getItem();\n\n const inPixels = axis.layoutStrategy\n ? axis.layoutStrategy.getItemSizeInPixels(itemId)\n : axis.orientation === \"horizontal\"\n ? element.offsetWidth\n : element.offsetHeight;\n\n return {\n asPercentage,\n inPixels\n };\n },\n isCollapsed: () => {\n const { collapsible, collapsedSize } = getItemConstraints();\n const size = getItemSize();\n\n return collapsible && layoutNumbersEqual(collapsedSize, size);\n },\n resize: (size: number | string) => {\n const { axis } = find();\n const { element } = getItem();\n const axisSize = calculateAvailableAxisSize({ axis });\n\n const asPixels = sizeStyleToPixels({\n axisSize,\n itemElement: element,\n styleProp: size\n });\n\n const asPercentage = formatLayoutNumber((asPixels / axisSize) * 100);\n\n setItemSize(asPercentage);\n }\n } satisfies PanelImperativeHandle;\n}\n","import { getMountedAxes } from \"../mutable-state/axes\";\nimport { findMatchingHitRegions } from \"../utils/findMatchingHitRegions\";\nimport { getImperativeItemMethods } from \"../utils/getImperativeItemMethods\";\n\nexport function onDocumentDoubleClick(event: MouseEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const mountedAxes = getMountedAxes();\n const hitRegions = findMatchingHitRegions(event, mountedAxes);\n hitRegions.forEach((current) => {\n if (current.separator && !current.separator.disableDoubleClick) {\n const itemWithDefaultSize = current.items.find(\n (item) => item.constraintProps.defaultSize !== undefined\n );\n if (itemWithDefaultSize) {\n const defaultSize = itemWithDefaultSize.constraintProps.defaultSize;\n const api = getImperativeItemMethods({\n axisId: current.axis.id,\n itemId: itemWithDefaultSize.id\n });\n if (api && defaultSize !== undefined) {\n api.resize(defaultSize);\n\n event.preventDefault();\n }\n }\n }\n });\n}\n","import { getMountedAxes } from \"../mutable-state/axes\";\n\nexport function findSeparatorAxis(separatorElement: HTMLElement) {\n const mountedAxes = getMountedAxes();\n\n for (const [axis] of mountedAxes) {\n if (\n axis.separators.some(\n (separator) => separator.element === separatorElement\n )\n ) {\n return axis;\n }\n }\n\n throw Error(\"Could not find parent Group for separator element\");\n}\n","import type { GroupImperativeHandle } from \"../../components/group/types\";\nimport { getMountedAxes, updateMountedAxis } from \"../mutable-state/axes\";\nimport type { Layout } from \"../types\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\n\nexport function getImperativeAxisMethods({\n axisId\n}: {\n axisId: string;\n}): GroupImperativeHandle {\n const find = () => {\n const mountedAxes = getMountedAxes();\n for (const [axis, value] of mountedAxes) {\n if (axis.id === axisId) {\n return { axis, ...value };\n }\n }\n\n throw Error(`Could not find Group with id \"${axisId}\"`);\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 derivedItemConstraints,\n axis,\n axisSize,\n layout: prevLayout,\n separatorToItems\n } = find();\n\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: derivedItemConstraints\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 updateMountedAxis(axis, {\n defaultLayoutDeferred,\n derivedItemConstraints,\n axisSize,\n layout: nextLayout,\n requestedAxisSize: axisSize,\n requestedLayout: nextLayout,\n separatorToItems\n });\n }\n\n return nextLayout;\n }\n };\n}\n","import { assert } from \"../../utils/assert\";\nimport { getMountedAxisState, updateMountedAxis } from \"../mutable-state/axes\";\nimport { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { findSeparatorAxis } from \"./findSeparatorAxis\";\nimport { getImperativeAxisMethods } from \"./getImperativeAxisMethods\";\nimport { layoutsEqual } from \"./layoutsEqual\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\n\nexport function adjustLayoutForSeparator(\n separatorElement: HTMLElement,\n delta: number\n) {\n const axis = findSeparatorAxis(separatorElement);\n const axisState = getMountedAxisState(axis.id, true);\n\n const separator = axis.separators.find(\n (current) => current.element === separatorElement\n );\n assert(separator, \"Matching separator not found\");\n\n const items = axisState.separatorToItems.get(separator);\n assert(items, \"Matching panels not found\");\n\n const pivotIndices = items.map((item) => axis.items.indexOf(item));\n\n const axisAPI = getImperativeAxisMethods({ axisId: axis.id });\n const prevLayout = axisAPI.getLayout();\n\n const unsafeLayout = adjustLayoutByDelta({\n delta,\n initialLayout: prevLayout,\n itemConstraints: axisState.derivedItemConstraints,\n pivotIndices,\n prevLayout,\n trigger: \"keyboard\"\n });\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: axisState.derivedItemConstraints\n });\n\n if (!layoutsEqual(prevLayout, nextLayout)) {\n updateMountedAxis(\n axis,\n {\n defaultLayoutDeferred: axisState.defaultLayoutDeferred,\n derivedItemConstraints: axisState.derivedItemConstraints,\n axisSize: axisState.axisSize,\n layout: nextLayout,\n requestedAxisSize: axisState.axisSize,\n requestedLayout: nextLayout,\n separatorToItems: axisState.separatorToItems\n },\n // Keyboard resizes (arrow keys, Home/End, Enter collapse/expand) originate\n // from a real DOM event on the separator, so they are user interactions\n // just like pointer drags. This function is only reached from\n // onDocumentKeyDown. See #716.\n { isUserInteraction: true }\n );\n }\n}\n","import { assert } from \"../../utils/assert\";\nimport { getMountedAxisState } from \"../mutable-state/axes\";\nimport { adjustLayoutForSeparator } from \"../utils/adjustLayoutForSeparator\";\nimport { findSeparatorAxis } from \"../utils/findSeparatorAxis\";\n\nexport function onDocumentKeyDown(event: KeyboardEvent) {\n if (event.defaultPrevented) {\n return;\n }\n\n const separatorElement = event.currentTarget as HTMLElement;\n\n const axis = findSeparatorAxis(separatorElement);\n if (axis.disabled) {\n return;\n }\n\n const separator = axis.separators.find(\n (current) => current.element === separatorElement\n );\n if (separator?.disabled) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n\n if (axis.orientation === \"vertical\") {\n adjustLayoutForSeparator(separatorElement, 5);\n }\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n\n if (axis.orientation === \"horizontal\") {\n adjustLayoutForSeparator(separatorElement, -5);\n }\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n\n if (axis.orientation === \"horizontal\") {\n adjustLayoutForSeparator(separatorElement, 5);\n }\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n\n if (axis.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 axisState = getMountedAxisState(axis.id, true);\n const { derivedItemConstraints, layout, separatorToItems } = axisState;\n\n const separator = axis.separators.find(\n (current) => current.element === separatorElement\n );\n assert(separator, \"Matching separator not found\");\n\n const items = separatorToItems.get(separator);\n assert(items, \"Matching panels not found\");\n\n const primaryItem = items[0];\n const constraints = derivedItemConstraints.find(\n (current) => current.itemId === primaryItem.id\n );\n assert(constraints, \"Panel metadata not found\");\n\n if (constraints.collapsible) {\n const prevSize = layout[primaryItem.id];\n\n const nextSize =\n constraints.collapsedSize === prevSize\n ? (axis.mutableState.expandedItemSizes[primaryItem.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 separatorElements = axis.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 { calculateHitRegions } from \"../dom/calculateHitRegions\";\nimport type { ResizePreview } from \"../mutable-state/types\";\nimport type { HitRegion, RegisteredResizeAxis } from \"../types\";\nimport { layoutNumbersEqual } from \"./layoutNumbersEqual\";\n\nexport function calculateResizePreviews(\n axis: RegisteredResizeAxis,\n hitRegions: HitRegion[]\n): ResizePreview[] {\n const { element, orientation, items } = axis;\n\n const axisRect = element.getBoundingClientRect();\n const horizontal = orientation === \"horizontal\";\n\n // Use the same boundaries as hit testing, including separate edges around\n // static content. Disabled boundaries can still move indirectly during a drag.\n const boundaries = calculateHitRegions({\n expandHitTargets: false,\n axis,\n includeDisabled: true\n });\n\n return boundaries.map(({ items: boundaryItems, rect, separator }, index) => {\n const itemIndex = items.indexOf(boundaryItems[0]);\n const center = horizontal\n ? rect.left + rect.width / 2\n : rect.top + rect.height / 2;\n\n const active = hitRegions.some((region) => {\n if (region.axis !== axis || region.items[0] !== boundaryItems[0]) {\n return false;\n }\n\n if (separator || region.separator) {\n return region.separator === separator;\n }\n\n const regionCenter = horizontal\n ? region.rect.left + region.rect.width / 2\n : region.rect.top + region.rect.height / 2;\n\n return layoutNumbersEqual(center, regionCenter);\n });\n\n return {\n active,\n axis,\n key: separator\n ? `separator-${separator.id}`\n : `panel-${boundaryItems[0].id}-${index}`,\n offset: 0,\n itemIndex,\n rect: new DOMRect(\n (horizontal && !separator ? center : rect.left) -\n axisRect.left -\n element.clientLeft +\n element.scrollLeft,\n (!horizontal && !separator ? center : rect.top) -\n axisRect.top -\n element.clientTop +\n element.scrollTop,\n horizontal && !separator ? 0 : rect.width,\n !horizontal && !separator ? 0 : rect.height\n ),\n separator\n };\n });\n}\n","import { calculateResizePreviews } from \"../utils/calculateResizePreviews\";\nimport { getMountedAxes } from \"../mutable-state/axes\";\nimport { updateInteractionState } from \"../mutable-state/interactions\";\nimport type { Layout, RegisteredResizeAxis } from \"../types\";\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 mountedAxes = getMountedAxes();\n\n const hitRegions = findMatchingHitRegions(event, mountedAxes);\n if (hitRegions.length === 0) {\n return;\n }\n\n const initialLayoutMap = new Map<RegisteredResizeAxis, Layout>();\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 // @ts-expect-error https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#browser_compatibility\n focusVisible: false,\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 = mountedAxes.get(current.axis);\n if (match) {\n initialLayoutMap.set(current.axis, match.layout);\n }\n });\n\n const previews = Array.from(initialLayoutMap.keys()).flatMap((axis) =>\n axis.resizePreviewMode === \"separator\"\n ? calculateResizePreviews(axis, hitRegions)\n : []\n );\n\n updateInteractionState({\n cursorFlags: 0,\n didPointerMove: false,\n hitRegions,\n initialLayoutMap,\n pointerDownAtPoint: { x: event.clientX, y: event.clientY },\n previewLayoutMap: new Map(initialLayoutMap),\n previews,\n state: \"active\"\n });\n\n event.preventDefault();\n}\n","import { getMountedAxes } from \"../mutable-state/axes\";\nimport { getInteractionState } from \"../mutable-state/interactions\";\nimport { updateActiveHitRegions } from \"../utils/updateActiveHitRegion\";\n\nexport function onDocumentPointerLeave(event: PointerEvent) {\n const mountedAxes = getMountedAxes();\n const interactionState = getInteractionState();\n\n switch (interactionState.state) {\n case \"active\": {\n updateActiveHitRegions({\n commit: false,\n document: event.currentTarget as Document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedAxes,\n prevCursorFlags: interactionState.cursorFlags\n });\n }\n }\n}\n","import { updateCursorStyle } from \"../cursor/updateCursorStyle\";\nimport {\n getMountedAxes,\n getMountedAxisState,\n updateMountedAxis\n} from \"../mutable-state/axes\";\nimport {\n getInteractionState,\n updateInteractionState\n} from \"../mutable-state/interactions\";\nimport { layoutsEqual } from \"../utils/layoutsEqual\";\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 mountedAxes = getMountedAxes();\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 // This event is a later hover, not the release position.\n // Commit the last preview without incorporating movement after the button was released.\n interactionState.previewLayoutMap.forEach((layout, axis) => {\n const axisState = mountedAxes.get(axis);\n if (\n axis.resizePreviewMode === \"separator\" &&\n axisState &&\n !layoutsEqual(layout, axisState.layout)\n ) {\n updateMountedAxis(axis, {\n ...axisState,\n layout,\n requestedAxisSize: axisState.axisSize,\n requestedLayout: layout\n });\n }\n });\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 // This is the missed-pointerup fallback (pointer released outside a\n // cross-origin iframe, see #340) — still a real user interaction.\n interactionState.hitRegions.forEach((hitRegion) => {\n // Skip if the group was re-registered mid-gesture, so the old hit region\n // doesn't resurrect a stale entry in the mounted-groups map. See #729.\n if (!mountedAxes.has(hitRegion.axis)) {\n return;\n }\n const axisState = getMountedAxisState(hitRegion.axis.id, true);\n updateMountedAxis(hitRegion.axis, axisState, {\n isUserInteraction: true\n });\n });\n\n updateCursorStyle(event.currentTarget as Document);\n\n return;\n }\n\n for (const hitRegion of interactionState.hitRegions) {\n if (hitRegion.separator) {\n const { element } = hitRegion.separator;\n if (\n element.isConnected &&\n !element.hasPointerCapture?.(event.pointerId)\n ) {\n element.setPointerCapture?.(event.pointerId);\n }\n }\n }\n\n updateActiveHitRegions({\n commit: false,\n document: event.currentTarget as Document,\n event,\n hitRegions: interactionState.hitRegions,\n initialLayoutMap: interactionState.initialLayoutMap,\n mountedAxes,\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, mountedAxes);\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 { completeActivePointerResize } from \"../utils/completeActivePointerResize.ts\";\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 matched = completeActivePointerResize(\n event.currentTarget as Document,\n event\n );\n if (matched) {\n event.preventDefault();\n }\n}\n","import { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\n\nexport function calculateDefaultLayout(\n derivedItemConstraints: ResizeItemConstraints[]\n): Layout {\n let explicitCount = 0;\n let total = 0;\n\n const layout: Layout = {};\n\n for (const current of derivedItemConstraints) {\n if (current.defaultSize !== undefined) {\n explicitCount++;\n\n const size = formatLayoutNumber(current.defaultSize);\n\n total += size;\n layout[current.itemId] = 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.itemId] = undefined;\n }\n }\n\n const remainingItemCount = derivedItemConstraints.length - explicitCount;\n if (remainingItemCount !== 0) {\n const size = formatLayoutNumber((100 - total) / remainingItemCount);\n\n for (const current of derivedItemConstraints) {\n if (current.defaultSize === undefined) {\n layout[current.itemId] = size;\n }\n }\n }\n\n return layout;\n}\n","import type { Layout, RegisteredResizeItem } from \"../types\";\n\nexport function validateLayoutKeys(\n items: RegisteredResizeItem[],\n layout: Layout\n) {\n const itemIds = items.map((item) => item.id);\n const layoutKeys = Object.keys(layout);\n\n if (itemIds.length !== layoutKeys.length) {\n return false;\n }\n\n for (const itemId of itemIds) {\n if (!layoutKeys.includes(itemId)) {\n return false;\n }\n }\n\n return true;\n}\n","import { calculateDefaultLayout } from \"./calculateDefaultLayout\";\nimport { validateLayoutKeys } from \"./validateLayoutKeys\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n ResizeItemConstraints\n} from \"../types\";\n\nexport function getDefaultLayout({\n axis,\n itemConstraints\n}: {\n axis: RegisteredResizeAxis;\n itemConstraints: ResizeItemConstraints[];\n}): Layout {\n const itemIdsKey = axis.items.map(({ id }) => id).join(\",\");\n const defaultLayout = axis.mutableState.defaultLayout;\n\n // Dynamic panel configurations can invalidate a supplied default layout.\n return (\n axis.mutableState.layouts[itemIdsKey] ??\n (defaultLayout && validateLayoutKeys(axis.items, defaultLayout)\n ? defaultLayout\n : calculateDefaultLayout(itemConstraints))\n );\n}\n","import type { Layout } from \"../types\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\n\n/**\n * Scales a layout so that its sizes total 100% (rounded the same way as validateAxisLayout),\n * without applying item constraints.\n *\n * @param itemIds Ids in render order; determines which item absorbs rounding errors\n */\nexport function normalizeLayout({\n itemIds,\n layout\n}: {\n itemIds: string[];\n layout: Layout;\n}): Layout {\n return validateAxisLayout({\n layout,\n itemConstraints: itemIds.map((itemId) => ({\n collapsedSize: 0,\n collapsible: false,\n defaultSize: undefined,\n disabled: undefined,\n itemId,\n maxSize: 100,\n minSize: 0\n }))\n });\n}\n","import { calculateAvailableAxisSize } from \"../dom/calculateAvailableAxisSize\";\nimport type { RegisteredResizeAxis } from \"../types\";\nimport { formatLayoutNumber } from \"./formatLayoutNumber\";\n\nexport function notifyItemOnResize(\n axis: RegisteredResizeAxis,\n element: HTMLElement,\n borderBoxSize: readonly ResizeObserverSize[]\n) {\n const resizeObserverSize = borderBoxSize[0];\n if (!resizeObserverSize) {\n return;\n }\n\n const item = axis.items.find((current) => current.element === element);\n if (!item || !item.onResize) {\n return;\n }\n\n const axisSize = calculateAvailableAxisSize({ axis });\n\n const itemSize =\n axis.orientation === \"horizontal\"\n ? item.element.offsetWidth\n : item.element.offsetHeight;\n\n const prevSize = item.mutableValues.prevSize;\n const nextSize = {\n asPercentage: formatLayoutNumber((itemSize / axisSize) * 100),\n inPixels: itemSize\n };\n item.mutableValues.prevSize = nextSize;\n\n item.onResize(nextSize, item.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 { objectsEqual } from \"./objectsEqual\";\nimport type { ResizeItemConstraints } from \"../types\";\n\nexport function itemConstraintsEqual(\n a: ResizeItemConstraints[],\n b: ResizeItemConstraints[]\n) {\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((current, index) => objectsEqual(current, b[index]));\n}\n","import { formatLayoutNumber } from \"./formatLayoutNumber\";\nimport type { Layout, RegisteredResizeAxis } from \"../types\";\n\nexport function preserveFixedItemSizes({\n axis,\n nextAxisSize,\n prevAxisSize,\n prevLayout\n}: {\n axis: RegisteredResizeAxis;\n nextAxisSize: number;\n prevAxisSize: number;\n prevLayout: Layout;\n}) {\n if (prevAxisSize <= 0 || nextAxisSize <= 0 || prevAxisSize === nextAxisSize) {\n return prevLayout;\n }\n\n let fixedItemsTotalSize = 0;\n let flexibleItemsTotalPrevSize = 0;\n let hasPreservePixelSizeItems = false;\n\n const fixedItems = new Map<string, number>();\n const flexibleItemIds: string[] = [];\n\n for (const item of axis.items) {\n const prevItemSize = prevLayout[item.id] ?? 0;\n switch (item.constraintProps.groupResizeBehavior) {\n case \"preserve-pixel-size\": {\n hasPreservePixelSizeItems = true;\n\n const prevItemSizeInPixels = (prevItemSize / 100) * prevAxisSize;\n const nextItemSize = formatLayoutNumber(\n (prevItemSizeInPixels / nextAxisSize) * 100\n );\n\n fixedItems.set(item.id, nextItemSize);\n fixedItemsTotalSize += nextItemSize;\n break;\n }\n case \"preserve-relative-size\":\n default: {\n flexibleItemIds.push(item.id);\n flexibleItemsTotalPrevSize += prevItemSize;\n break;\n }\n }\n }\n\n if (!hasPreservePixelSizeItems || flexibleItemIds.length === 0) {\n return prevLayout;\n }\n\n const remainingSize = 100 - fixedItemsTotalSize;\n const nextLayout = { ...prevLayout };\n\n fixedItems.forEach((size, itemId) => {\n nextLayout[itemId] = size;\n });\n\n if (flexibleItemsTotalPrevSize > 0) {\n for (const itemId of flexibleItemIds) {\n const prevSize = prevLayout[itemId] ?? 0;\n nextLayout[itemId] = formatLayoutNumber(\n (prevSize / flexibleItemsTotalPrevSize) * remainingSize\n );\n }\n } else {\n const evenSize = formatLayoutNumber(remainingSize / flexibleItemIds.length);\n for (const itemId of flexibleItemIds) {\n nextLayout[itemId] = evenSize;\n }\n }\n\n return nextLayout;\n}\n","import { updateCursorStyle } from \"./cursor/updateCursorStyle\";\nimport { removeAxisFromInteraction } from \"./mutable-state/interactions\";\nimport { assert } from \"../utils/assert\";\nimport { calculateAvailableAxisSize } from \"./dom/calculateAvailableAxisSize\";\nimport { calculateHitRegions } from \"./dom/calculateHitRegions\";\nimport { calculateItemConstraints } from \"./dom/calculateItemConstraints\";\nimport { onDocumentContextMenu } from \"./event-handlers/onDocumentContextMenu\";\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 deleteMutableAxis,\n getMountedAxisState,\n updateMountedAxis\n} from \"./mutable-state/axes\";\nimport type { SeparatorToItemsMap } from \"./mutable-state/types\";\nimport type { RegisteredResizeAxis } from \"./types\";\nimport { getDefaultLayout } from \"./utils/getDefaultLayout\";\nimport { layoutsEqual } from \"./utils/layoutsEqual\";\nimport { normalizeLayout } from \"./utils/normalizeLayout\";\nimport { notifyItemOnResize } from \"./utils/notifyItemOnResize\";\nimport { itemConstraintsEqual } from \"./utils/itemConstraintsEqual\";\nimport { preserveFixedItemSizes } from \"./utils/preserveFixedItemSizes\";\nimport { validateAxisLayout } from \"./utils/validateAxisLayout\";\n\nconst ownerDocumentReferenceCounts = new Map<Document, number>();\n\nexport function mountAxis(axis: RegisteredResizeAxis) {\n let isMounted = true;\n\n assert(\n axis.element.ownerDocument.defaultView,\n \"Cannot register an unmounted Group\"\n );\n\n const ResizeObserver = axis.element.ownerDocument.defaultView.ResizeObserver;\n\n const itemIds = 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 === axis.element) {\n if (isMounted) {\n const axisSize = calculateAvailableAxisSize({ axis });\n if (axisSize === 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 axisState = getMountedAxisState(axis.id);\n if (!axisState) {\n // Not mounted yet\n return;\n }\n\n // Update non-percentage based constraints\n const nextDerivedItemConstraints = calculateItemConstraints(axis);\n\n // Revalidate layout in case constraints have changed or group size changed\n // Start from the requested layout so that constraints only temporarily clamp item sizes (see #720)\n let requestedAxisSize = axisState.requestedAxisSize;\n let requestedLayout = axisState.requestedLayout;\n if (axisState.defaultLayoutDeferred) {\n requestedAxisSize = axisSize;\n requestedLayout = normalizeLayout({\n itemIds: axis.items.map(({ id }) => id),\n layout: getDefaultLayout({\n axis,\n itemConstraints: nextDerivedItemConstraints\n })\n });\n }\n\n const unsafeLayout = preserveFixedItemSizes({\n axis,\n nextAxisSize: axisSize,\n prevAxisSize: requestedAxisSize,\n prevLayout: requestedLayout\n });\n const nextLayout = validateAxisLayout({\n layout: unsafeLayout,\n itemConstraints: nextDerivedItemConstraints\n });\n\n if (\n !axisState.defaultLayoutDeferred &&\n layoutsEqual(axisState.layout, nextLayout) &&\n itemConstraintsEqual(\n axisState.derivedItemConstraints,\n nextDerivedItemConstraints\n ) &&\n axisState.axisSize === axisSize\n ) {\n continue;\n }\n\n updateMountedAxis(axis, {\n defaultLayoutDeferred: false,\n derivedItemConstraints: nextDerivedItemConstraints,\n axisSize,\n layout: nextLayout,\n requestedAxisSize,\n requestedLayout,\n separatorToItems: axisState.separatorToItems\n });\n }\n } else {\n notifyItemOnResize(axis, target as HTMLElement, borderBoxSize);\n }\n }\n });\n\n resizeObserver.observe(axis.element);\n\n axis.items.forEach((item) => {\n assert(\n !itemIds.has(item.id),\n `Panel ids must be unique; id \"${item.id}\" was used more than once`\n );\n\n itemIds.add(item.id);\n\n if (item.onResize) {\n resizeObserver.observe(item.element);\n }\n });\n\n const axisSize = calculateAvailableAxisSize({ axis });\n\n // Calculate initial layout for the new Panel configuration\n const derivedItemConstraints = calculateItemConstraints(axis);\n const defaultLayoutUnsafe = getDefaultLayout({\n axis,\n itemConstraints: derivedItemConstraints\n });\n const defaultLayoutSafe = validateAxisLayout({\n layout: defaultLayoutUnsafe,\n itemConstraints: derivedItemConstraints\n });\n\n const ownerDocument = axis.element.ownerDocument;\n\n ownerDocumentReferenceCounts.set(\n ownerDocument,\n (ownerDocumentReferenceCounts.get(ownerDocument) ?? 0) + 1\n );\n\n const separatorToItems: SeparatorToItemsMap = new Map();\n\n // Include disabled separators because enabling them later does not rebuild this map.\n // The keyboard handler checks disabled state before resizing.\n const hitRegions = calculateHitRegions({ axis, includeDisabled: true });\n hitRegions.forEach((hitRegion) => {\n if (hitRegion.separator) {\n separatorToItems.set(hitRegion.separator, hitRegion.items);\n }\n });\n\n updateMountedAxis(axis, {\n defaultLayoutDeferred: axisSize === 0,\n derivedItemConstraints,\n axisSize,\n layout: defaultLayoutSafe,\n requestedAxisSize: axisSize,\n requestedLayout: normalizeLayout({\n itemIds: axis.items.map(({ id }) => id),\n layout: defaultLayoutUnsafe\n }),\n separatorToItems\n });\n\n axis.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(\"contextmenu\", onDocumentContextMenu, true);\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 unmountAxis() {\n isMounted = false;\n\n ownerDocumentReferenceCounts.set(\n ownerDocument,\n Math.max(0, (ownerDocumentReferenceCounts.get(ownerDocument) ?? 0) - 1)\n );\n\n deleteMutableAxis(axis);\n if (removeAxisFromInteraction(axis)) {\n updateCursorStyle(ownerDocument);\n }\n\n axis.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 \"contextmenu\",\n onDocumentContextMenu,\n true\n );\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 { layoutNumbersEqual } from \"./layoutNumbersEqual\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n ResizeItemConstraints\n} from \"../types\";\n\n/**\n * Updates the in-memory bookkeeping a Group needs to restore previous layouts:\n * - Cache the requested layout (keyed by panel ids) so it persists when the panel configuration changes.\n * This improves UX for conditionally rendered panels without requiring defaultLayout.\n * - Record the pre-collapse size of any collapsible panel that was just collapsed,\n * so that it can be restored when the panel is expanded (e.g. via the keyboard)\n */\nexport function recordAxisLayoutChange({\n derivedItemConstraints,\n axis,\n layout,\n prevLayout,\n requestedLayout\n}: {\n derivedItemConstraints: ResizeItemConstraints[];\n axis: RegisteredResizeAxis;\n layout: Layout;\n prevLayout: Layout | undefined;\n requestedLayout: Layout;\n}) {\n const itemIdsKey = axis.items.map(({ id }) => id).join(\",\");\n axis.mutableState.layouts[itemIdsKey] = requestedLayout;\n\n if (prevLayout) {\n derivedItemConstraints.forEach((constraints) => {\n if (constraints.collapsible) {\n const isCollapsed = layoutNumbersEqual(\n constraints.collapsedSize,\n layout[constraints.itemId]\n );\n const wasCollapsed = layoutNumbersEqual(\n constraints.collapsedSize,\n prevLayout[constraints.itemId]\n );\n if (isCollapsed && !wasCollapsed) {\n axis.mutableState.expandedItemSizes[constraints.itemId] =\n prevLayout[constraints.itemId];\n }\n }\n });\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 { 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 { adjustLayoutByDelta } from \"./adjustLayoutByDelta\";\nimport { validateAxisLayout } from \"./validateAxisLayout\";\nimport type { Layout, ResizeItemConstraints } from \"../types\";\n\nexport function calculateSeparatorAriaValues({\n layout,\n itemConstraints,\n itemId,\n itemIndex\n}: {\n layout: Layout;\n itemConstraints: ResizeItemConstraints[];\n itemId: string;\n itemIndex: 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 itemSize = layout[itemId];\n\n const constraints = itemConstraints.find(\n (current) => current.itemId === itemId\n );\n if (constraints) {\n const maxSize = constraints.maxSize;\n const minSize = constraints.collapsible\n ? constraints.collapsedSize\n : constraints.minSize;\n\n const pivotIndices = [itemIndex, itemIndex + 1];\n\n const minSizeLayout = validateAxisLayout({\n layout: adjustLayoutByDelta({\n delta: minSize - itemSize,\n initialLayout: layout,\n itemConstraints,\n pivotIndices,\n prevLayout: layout\n }),\n itemConstraints\n });\n\n valueMin = minSizeLayout[itemId];\n\n const maxSizeLayout = validateAxisLayout({\n layout: adjustLayoutByDelta({\n delta: maxSize - itemSize,\n initialLayout: layout,\n itemConstraints,\n pivotIndices,\n prevLayout: layout\n }),\n itemConstraints\n });\n\n valueMax = maxSizeLayout[itemId];\n }\n\n return {\n valueControls: itemId,\n valueMax,\n valueMin,\n valueNow: itemSize\n };\n}\n","\"use client\";\n\nimport type { Properties } from \"csstype\";\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type Ref\n} from \"react\";\nimport { subscribeToMountedAxis } from \"../../global/mutable-state/axes\";\nimport {\n notifySeparatorPreviewChanged,\n subscribeToInteractionState\n} from \"../../global/mutable-state/interactions\";\nimport type { InteractionState } from \"../../global/mutable-state/types\";\nimport type {\n HitRegion,\n Orientation,\n RegisteredSeparator\n} from \"../../global/types\";\nimport { calculateSeparatorAriaValues } from \"../../global/utils/calculateSeparatorAriaValues\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMergedRefs } from \"../../hooks/useMergedRefs\";\nimport { useStableObject } from \"../../hooks/useStableObject\";\n\n/**\n * @internal\n * Shared implementation of the `Separator` (within a Group) and `Gridline` (within a Grid) components.\n *\n * It registers a separator with the resize axis it belongs to, tracks its hover/drag/focus state,\n * and renders the separator element (including its WAI-ARIA attributes).\n * Everything specific to the parent component is passed in explicitly (rather than read from context).\n */\nexport function ResizeSeparator({\n attributes,\n axisId,\n axisOrientation,\n children,\n className,\n disableCursor,\n disabled,\n disableDoubleClick,\n elementRef: elementRefProp,\n id,\n isSharedHitRegion,\n preview,\n registerSeparator,\n requiredStyle,\n style,\n styleDefaults,\n tabIndex = 0,\n updateSeparatorProps\n}: {\n /** Additional HTML attributes to render on the separator element */\n attributes?: HTMLAttributes<HTMLDivElement> | undefined;\n\n /** Id of the resize axis (e.g. the Group) this separator belongs to */\n axisId: string;\n\n /** Orientation of the resize axis; the separator's `aria-orientation` is the opposite */\n axisOrientation: Orientation;\n\n children: ReactNode | undefined;\n className: string | undefined;\n disableCursor: boolean;\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n elementRef: Ref<HTMLDivElement> | undefined;\n id: string;\n\n /**\n * Hit regions that resize the same items as this separator (e.g. other separators along the same Grid boundary);\n * this separator shares hover/active state with them.\n */\n isSharedHitRegion?: ((hitRegion: HitRegion) => boolean) | undefined;\n\n preview?: ReactNode;\n registerSeparator: (separator: RegisteredSeparator) => () => void;\n\n /** Styles that cannot be overridden by the `style` prop */\n requiredStyle?: CSSProperties | undefined;\n\n style: CSSProperties | undefined;\n\n /** Styles that can be overridden by the `style` prop */\n styleDefaults?: CSSProperties | undefined;\n\n tabIndex?: number | undefined;\n updateSeparatorProps: (\n id: string,\n props: {\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n }\n ) => void;\n}) {\n const stableProps = useStableObject({\n disabled,\n disableDoubleClick,\n children,\n className,\n preview,\n style\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 const [isFocused, setIsFocused] = useState(false);\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n const registeredSeparatorRef = useRef<RegisteredSeparator | null>(null);\n\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const orientation =\n axisOrientation === \"horizontal\" ? \"vertical\" : \"horizontal\";\n\n // Register the separator with its resize axis\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 disableDoubleClick: stableProps.disableDoubleClick,\n element,\n id,\n get children() {\n return stableProps.children;\n },\n get className() {\n return stableProps.className;\n },\n get preview() {\n return stableProps.preview;\n },\n get style() {\n return stableProps.style;\n }\n };\n\n registeredSeparatorRef.current = separator;\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) =>\n hitRegion.separator === separator ||\n (isSharedHitRegion?.(hitRegion) ?? false)\n )\n ? event.next.state\n : \"inactive\"\n );\n }\n );\n\n const removeMountedAxesChangeListener = subscribeToMountedAxis(\n axisId,\n (event) => {\n const { derivedItemConstraints, layout, separatorToItems } =\n event.next;\n const items = separatorToItems.get(separator);\n if (items) {\n const primaryItem = items[0];\n\n // The index must be relative to the Group's panels (not the pair this Separator sits between\n // because it's used as a pivot index into the Group's layout.\n // derivedPanelConstraints is derived from group.panels, so it's already in panel order.\n // See #740.\n const itemIndex = derivedItemConstraints.findIndex(\n (constraints) => constraints.itemId === primaryItem.id\n );\n\n const { layoutStrategy } = event.axis;\n\n setAria({\n ...calculateSeparatorAriaValues({\n layout,\n itemConstraints: derivedItemConstraints,\n itemId: primaryItem.id,\n itemIndex\n }),\n // Items without DOM elements of their own (e.g. Grid tracks) control other elements\n ...(layoutStrategy?.getItemAriaControls && {\n valueControls: layoutStrategy.getItemAriaControls(\n primaryItem.id\n )\n })\n });\n }\n }\n );\n\n return () => {\n registeredSeparatorRef.current = null;\n\n removeInteractionStateChangeListener();\n removeMountedAxesChangeListener();\n unregisterSeparator();\n };\n }\n }, [axisId, id, isSharedHitRegion, registerSeparator, stableProps]);\n\n useIsomorphicLayoutEffect(() => {\n const separator = registeredSeparatorRef.current;\n if (separator) {\n notifySeparatorPreviewChanged(separator);\n }\n }, [preview]);\n\n // Not all props require re-registering the separator;\n useEffect(() => {\n updateSeparatorProps(id, { disabled, disableDoubleClick });\n }, [disabled, disableDoubleClick, id, updateSeparatorProps]);\n\n let cursor: Properties[\"cursor\"] = undefined;\n if (disabled && !disableCursor) {\n cursor = \"not-allowed\";\n }\n\n let dataSeparator = undefined;\n if (disabled) {\n dataSeparator = \"disabled\";\n } else {\n switch (dragState) {\n case \"active\": {\n dataSeparator = \"active\";\n break;\n }\n default: {\n if (isFocused) {\n dataSeparator = \"focus\";\n } else {\n dataSeparator = dragState;\n }\n }\n }\n }\n\n return (\n <div\n {...attributes}\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={dataSeparator}\n data-testid={id}\n id={id}\n onBlur={() => setIsFocused(false)}\n onFocus={() => setIsFocused(true)}\n ref={mergedRef}\n role=\"separator\"\n style={{\n ...styleDefaults,\n cursor,\n\n ...style,\n\n ...requiredStyle,\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 : tabIndex}\n />\n );\n}\n","\"use client\";\n\nimport {\n useCallback,\n type CSSProperties,\n type ReactNode,\n type Ref\n} from \"react\";\nimport type { HitRegion, RegisteredSeparator } from \"../../global/types\";\nimport { useId } from \"../../hooks/useId\";\nimport { ResizeSeparator } from \"../shared/ResizeSeparator\";\nimport {\n getGutterGridPlacement,\n getSeparatorCrossGridPlacement,\n isValidGridlineIndex\n} from \"./gridPlacement\";\nimport type { GridAxis } from \"./types\";\nimport { useGridContext } from \"./useGridContext\";\n\n/**\n * @internal\n * Implementation of Gridline.\n *\n * Gridlines are registered with the Grid axis they resize;\n * most of their behavior (aria attributes, keyboard and pointer interactions) is shared with Separators in a Group\n */\nexport function GridTrackSeparator({\n axis,\n children,\n className,\n crossSpan,\n crossStart,\n disabled,\n elementRef,\n index,\n style\n}: {\n axis: GridAxis;\n children: ReactNode | undefined;\n className: string | undefined;\n crossSpan: number | undefined;\n crossStart: number;\n disabled: boolean | undefined;\n elementRef: Ref<HTMLDivElement> | undefined;\n index: number;\n style: CSSProperties | undefined;\n}) {\n const id = useId(undefined);\n\n const {\n getDisableCursor,\n getResizeAxisId,\n gutters,\n registerSeparator,\n separatorPlacements,\n trackCounts,\n updateSeparatorProps\n } = useGridContext();\n\n const axisId = getResizeAxisId(axis);\n const crossAxis: GridAxis = axis === \"column\" ? \"row\" : \"column\";\n const crossCount = trackCounts[crossAxis];\n\n // Invalid placements are logged by the Grid (see getPlacementErrors);\n // a gridline that isn't between two tracks can't resize anything, so it's treated as disabled\n const isDisabled =\n !!disabled || !isValidGridlineIndex(index, trackCounts[axis]);\n\n // Only one gridline per boundary should be included in the tab order;\n // (they all resize the same tracks)\n let isFirstEnabledGridlineOnBoundary = true;\n for (const placement of separatorPlacements.values()) {\n if (\n placement.axis === axis &&\n placement.index === index &&\n !placement.disabled &&\n placement.crossStart < crossStart\n ) {\n isFirstEnabledGridlineOnBoundary = false;\n break;\n }\n }\n\n // Gridlines along the same boundary resize the same tracks and so share hover/active state\n const isSharedHitRegion = useCallback(\n (hitRegion: HitRegion) =>\n hitRegion.axis.id === axisId &&\n hitRegion.axis.items.indexOf(hitRegion.items[1]) === index,\n [axisId, index]\n );\n\n const registerGridline = useCallback(\n (separator: RegisteredSeparator) =>\n registerSeparator(\n {\n axis,\n crossSpan,\n crossStart,\n disabled: !!disabled,\n index\n },\n separator\n ),\n [axis, crossSpan, crossStart, disabled, index, registerSeparator]\n );\n\n // Gridlines are rendered within the gutter track between two content tracks\n const gutterPlacement = getGutterGridPlacement(index);\n const crossPlacement = getSeparatorCrossGridPlacement({\n crossCount,\n crossSpan,\n crossStart,\n hasGutters: gutters[crossAxis]\n });\n\n return (\n <ResizeSeparator\n axisId={axisId}\n axisOrientation={axis === \"column\" ? \"horizontal\" : \"vertical\"}\n className={className}\n disableCursor={getDisableCursor()}\n disabled={isDisabled}\n disableDoubleClick={undefined}\n elementRef={elementRef}\n id={id}\n isSharedHitRegion={isSharedHitRegion}\n registerSeparator={registerGridline}\n requiredStyle={{\n gridColumn: axis === \"column\" ? gutterPlacement : crossPlacement,\n gridRow: axis === \"row\" ? gutterPlacement : crossPlacement\n }}\n style={style}\n tabIndex={isFirstEnabledGridlineOnBoundary ? 0 : -1}\n updateSeparatorProps={updateSeparatorProps}\n >\n {children}\n </ResizeSeparator>\n );\n}\n","\"use client\";\n\nimport { GridTrackSeparator } from \"./GridTrackSeparator\";\nimport type { GridlineProps } from \"./types\";\n\n/**\n * Resizes the columns (or rows) of a Grid.\n *\n * For example:\n *\n * ```tsx\n * // Rendered between columns 0 and 1 and spans all rows\n * <Gridline type=\"column\" column={1} />\n * ```\n *\n * ```tsx\n * // Rendered between rows 0 and 1 and spans all columns\n * <Gridline type=\"row\" row={1} />\n * ```\n *\n * ```tsx\n * // Rendered between columns 0 and 1 alongside of row 2 only\n * <Gridline type=\"column\" column={1} row={2} rowSpan={1} />\n * ```\n *\n * A gridline should not be rendered alongside of a Cell that spans across its boundary\n * (this includes disabled gridlines; an error will be logged to the console);\n * render multiple gridlines along the same boundary instead (e.g. before and after the spanning Cell).\n *\n * ℹ️ Once a boundary contains a gridline, it can only be resized using gridlines;\n * the parts of the boundary that aren't alongside of a gridline can't be dragged.\n *\n * Where column and row gridlines intersect, dragging resizes both axes.\n *\n * Gridlines are not _required_ but they are _recommended_ as they improve keyboard accessibility.\n *\n * Gridline elements always include the following attributes:\n *\n * ```html\n * <div aria-orientation=\"vertical\" data-separator role=\"separator\">\n * ```\n *\n * ℹ️ Column gridlines are vertical (`aria-orientation=\"vertical\"`) and row gridlines are horizontal (`aria-orientation=\"horizontal\"`).\n *\n * ℹ️ In addition to the attributes shown above, gridlines also render 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 *\n * ⚠️ Gridline elements must be direct DOM children of their parent Grid elements.\n *\n * ℹ️ Gridlines rendered by another component (rather than directly within the Grid) aren't detected until they mount, so server-rendered layouts may shift slightly during hydration.\n */\nexport function Gridline(props: GridlineProps) {\n const { children, className, disabled, elementRef, style } = props;\n\n return props.type === \"column\" ? (\n <GridTrackSeparator\n axis=\"column\"\n className={className}\n crossSpan={props.rowSpan}\n crossStart={props.row ?? 0}\n disabled={disabled}\n elementRef={elementRef}\n index={props.column}\n style={style}\n >\n {children}\n </GridTrackSeparator>\n ) : (\n <GridTrackSeparator\n axis=\"row\"\n className={className}\n crossSpan={props.columnSpan}\n crossStart={props.column ?? 0}\n disabled={disabled}\n elementRef={elementRef}\n index={props.row}\n style={style}\n >\n {children}\n </GridTrackSeparator>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nGridline.displayName = \"Gridline\";\n","\"use client\";\n\nimport {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useSyncExternalStore,\n type ReactNode\n} from \"react\";\nimport { calculateGridHitRegions } from \"./calculateGridHitRegions\";\nimport { measureGridAxis } from \"./measureGridAxis\";\nimport { parseSizeAndUnit } from \"../../global/styles/parseSizeAndUnit\";\nimport { mountAxis } from \"../../global/mountAxis\";\nimport {\n getMountedAxisState,\n getRegisteredAxis,\n subscribeToMountedAxis\n} from \"../../global/mutable-state/axes\";\nimport { getInteractionState } from \"../../global/mutable-state/interactions\";\nimport type {\n Layout,\n RegisteredResizeAxis,\n RegisteredResizeItem,\n RegisteredSeparator\n} from \"../../global/types\";\nimport { getImperativeAxisMethods } from \"../../global/utils/getImperativeAxisMethods\";\nimport { getImperativeItemMethods } from \"../../global/utils/getImperativeItemMethods\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { recordAxisLayoutChange } from \"../../global/utils/recordAxisLayoutChange\";\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 { assert } from \"../../utils/assert\";\nimport { GroupContext } from \"../group/GroupContext\";\nimport { GridContext } from \"./GridContext\";\nimport { Gridline } from \"./Gridline\";\nimport { isValidGridlineIndex } from \"./gridPlacement\";\nimport type {\n GridAxis,\n GridContextType,\n GridImperativeHandle,\n GridLayout,\n GridProps,\n GridSeparatorPlacement,\n GridTrackImperativeHandle,\n GridTrackProps,\n RegisteredCell\n} from \"./types\";\n\ntype NormalizedTrack = GridTrackProps & { id: string };\n\ntype AxisValues = {\n expandedItemSizes: { [trackId: string]: number };\n layouts: { [trackIds: string]: Layout };\n};\n\nconst AXES: GridAxis[] = [\"column\", \"row\"];\n\nconst EMPTY_GRID_LAYOUT: GridLayout = { columns: {}, rows: {} };\n\n/**\n * A Grid arranges resizable Cells in two dimensions.\n * Columns can be resized horizontally and rows can be resized vertically;\n * dragging the point where a column boundary and a row boundary intersect resizes both.\n *\n * Size constraints (e.g. min/max size, collapsible) are specified per track (column or row),\n * using the same format as Panel props.\n *\n * Cells can span multiple columns and/or rows.\n * Track boundaries cannot be resized alongside of a cell that spans across them.\n *\n * Grid elements always include the following attributes:\n *\n * ```html\n * <div data-grid data-testid=\"grid-id-prop\" id=\"grid-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 Grid({\n children,\n className,\n columns,\n defaultLayout,\n disableCursor,\n disabled,\n elementRef: elementRefProp,\n gridRef,\n id: idProp,\n onLayoutChange: onLayoutChangeUnstable,\n onLayoutChanged: onLayoutChangedUnstable,\n resizeTargetMinimumSize = {\n coarse: 20,\n fine: 10\n },\n rows,\n style,\n ...rest\n}: GridProps) {\n const id = useId(idProp);\n\n const getResizeAxisId = useCallback(\n (axis: GridAxis) => (axis === \"column\" ? `${id}:columns` : `${id}:rows`),\n [id]\n );\n\n const columnTracks = useNormalizedTracks(columns, \"columns\");\n const rowTracks = useNormalizedTracks(rows, \"rows\");\n const getTracks = (axis: GridAxis) =>\n axis === \"column\" ? columnTracks : rowTracks;\n\n const prevLayoutRef = useRef<{\n onLayoutChange: GridLayout;\n onLayoutChanged: GridLayout;\n }>({\n onLayoutChange: EMPTY_GRID_LAYOUT,\n onLayoutChanged: EMPTY_GRID_LAYOUT\n });\n\n const onLayoutChangeStable = useStableCallback((layout: GridLayout) => {\n if (gridLayoutsEqual(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(\n (\n layout: GridLayout,\n isUserInteraction: boolean,\n requestedLayout: GridLayout\n ) => {\n // Only the validated layout is memoized; requested layout changes alone don't trigger the callback\n if (gridLayoutsEqual(prevLayoutRef.current.onLayoutChanged, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChanged = layout;\n onLayoutChangedUnstable?.(layout, { isUserInteraction, requestedLayout });\n }\n );\n\n const elementRef = useRef<HTMLDivElement | null>(null);\n const mergedRef = useMergedRefs(elementRef, elementRefProp);\n\n const [cellOrSeparatorChangeSigil, forceUpdate] = useForceUpdate();\n\n const inMemoryValuesRef = useRef<{\n cells: RegisteredCell[];\n column: AxisValues;\n loggedErrors: Set<string>;\n row: AxisValues;\n separators: Map<RegisteredSeparator, GridSeparatorPlacement>;\n }>({\n cells: [],\n column: { expandedItemSizes: {}, layouts: {} },\n loggedErrors: new Set(),\n row: { expandedItemSizes: {}, layouts: {} },\n separators: new Map()\n });\n\n // Separators are rendered within \"gutter\" tracks, interleaved between the content tracks.\n // Gutters are only added to an axis that contains separators.\n // Separators are detected while rendering (to avoid layout shift when server rendering)\n // as well as once mounted (in case they are rendered by a nested component)\n const gutters = { column: false, row: false };\n for (const placement of inMemoryValuesRef.current.separators.values()) {\n gutters[placement.axis] = true;\n }\n findSeparatorsInChildren(children, gutters);\n\n const stableProps = useStableObject({\n defaultLayout,\n disableCursor,\n resizeTargetMinimumSize\n });\n\n const getDisableCursor = useStableCallback(() => !!stableProps.disableCursor);\n\n const registerCell = useCallback(\n (cell: RegisteredCell) => {\n const inMemoryValues = inMemoryValuesRef.current;\n inMemoryValues.cells = [...inMemoryValues.cells, cell];\n\n // Cells are only used to calculate hit regions (which is done lazily)\n // but the Grid should still be re-registered when they change (like a Group is when its Panels change).\n // Child effects run before parent effects, so a Grid may be registered before its element is in its final document\n // (e.g. when portaled into a popup window that is attached to the document in a parent effect)\n forceUpdate();\n\n return () => {\n inMemoryValues.cells = inMemoryValues.cells.filter(\n (current) => current !== cell\n );\n\n forceUpdate();\n };\n },\n [forceUpdate]\n );\n\n const registerSeparator = useCallback(\n (placement: GridSeparatorPlacement, separator: RegisteredSeparator) => {\n const inMemoryValues = inMemoryValuesRef.current;\n inMemoryValues.separators = new Map(inMemoryValues.separators);\n inMemoryValues.separators.set(separator, placement);\n\n forceUpdate();\n\n return () => {\n inMemoryValues.separators = new Map(inMemoryValues.separators);\n inMemoryValues.separators.delete(separator);\n\n forceUpdate();\n };\n },\n [forceUpdate]\n );\n\n const updateSeparatorProps = useCallback(\n (\n separatorId: string,\n {\n disabled,\n disableDoubleClick\n }: {\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n }\n ) => {\n for (const separator of inMemoryValuesRef.current.separators.keys()) {\n if (separator.id === separatorId) {\n separator.disabled = disabled;\n separator.disableDoubleClick = disableDoubleClick;\n }\n }\n },\n []\n );\n\n const separatorPlacements = inMemoryValuesRef.current.separators;\n\n const context = useMemo<GridContextType>(\n () => ({\n getDisableCursor,\n getResizeAxisId,\n gutters: {\n column: gutters.column,\n row: gutters.row\n },\n id,\n registerCell,\n registerSeparator,\n separatorPlacements,\n trackCounts: {\n column: columnTracks.length,\n row: rowTracks.length\n },\n updateSeparatorProps\n }),\n [\n columnTracks.length,\n getDisableCursor,\n getResizeAxisId,\n gutters.column,\n gutters.row,\n id,\n registerCell,\n registerSeparator,\n rowTracks.length,\n separatorPlacements,\n updateSeparatorProps\n ]\n );\n\n const registeredAxesRef = useRef<RegisteredResizeAxis[]>([]);\n\n // Register each axis of the Grid with global state (as if it were a Group)\n // Listen to global state for layout changes related to this Grid\n useIsomorphicLayoutEffect(() => {\n const element = elementRef.current;\n if (element === null) {\n return;\n }\n\n const inMemoryValues = inMemoryValuesRef.current;\n\n // Cells and gridlines register themselves (in layout effects) before this effect runs,\n // so this is the earliest point at which their placements can be validated (against the Grid and each other)\n // Invalid placements are logged (rather than thrown) because they are easy to create temporarily\n // (e.g. when the number of tracks, cells, and gridlines are conditionally rendered based on different state);\n // each problem is only logged once (until it's been resolved)\n const errors = getPlacementErrors({\n cells: inMemoryValues.cells,\n separatorPlacements: inMemoryValues.separators,\n trackCounts: { column: columnTracks.length, row: rowTracks.length }\n });\n errors.forEach((error) => {\n if (!inMemoryValues.loggedErrors.has(error)) {\n console.error(error);\n }\n });\n inMemoryValues.loggedErrors = new Set(errors);\n\n const getSeparators = (axis: GridAxis) =>\n Array.from(inMemoryValues.separators.entries())\n .filter(([, placement]) => placement.axis === axis)\n .sort(([, a], [, b]) => a.index - b.index)\n .map(([separator]) => separator);\n\n const createResizeAxis = (axis: GridAxis): RegisteredResizeAxis => {\n const tracks = axis === \"column\" ? columnTracks : rowTracks;\n const crossTracks = axis === \"column\" ? rowTracks : columnTracks;\n const trackIds = tracks.map((track) => track.id);\n const axisId = getResizeAxisId(axis);\n const separators = getSeparators(axis);\n const hasGutters = separators.length > 0;\n\n const items = tracks.map<RegisteredResizeItem>(\n ({ id: _, ...itemConstraints }, index) => ({\n // Tracks don't have DOM elements of their own;\n // the Grid element is used to resolve relative size constraints (e.g. \"em\")\n element,\n id: trackIds[index],\n idIsStable: true,\n mutableValues: {\n expandToSize: undefined,\n prevSize: undefined\n },\n onResize: undefined,\n constraintProps: itemConstraints\n })\n );\n\n const measure = () => {\n const gutterSizes: number[] = [];\n if (hasGutters) {\n for (const [separator, placement] of inMemoryValues.separators) {\n if (\n placement.axis === axis &&\n isValidGridlineIndex(placement.index, tracks.length)\n ) {\n const rect = separator.element.getBoundingClientRect();\n gutterSizes[placement.index] = Math.max(\n gutterSizes[placement.index] ?? 0,\n axis === \"column\" ? rect.width : rect.height\n );\n }\n }\n }\n\n return measureGridAxis({\n axis,\n element,\n gutterSizes: gutterSizes.filter((size) => size !== undefined),\n hasGutters,\n layout: getMountedAxisState(axisId)?.layout,\n trackIds\n });\n };\n\n // Guard against unexpected layout attribute ordering by pre-sorting track ids; see issues/656\n let preSortedDefaultLayout: Layout | undefined = undefined;\n const defaultAxisLayout =\n stableProps.defaultLayout?.[axis === \"column\" ? \"columns\" : \"rows\"];\n if (\n defaultAxisLayout !== undefined &&\n Object.keys(defaultAxisLayout).length === trackIds.length\n ) {\n preSortedDefaultLayout = {};\n for (const trackId of trackIds) {\n const size = defaultAxisLayout[trackId];\n if (size !== undefined) {\n preSortedDefaultLayout[trackId] = size;\n }\n }\n }\n\n return {\n disabled: !!disabled,\n element,\n id: axisId,\n layoutStrategy: {\n getItemAriaControls: (trackId) => {\n const index = trackIds.indexOf(trackId);\n return (\n inMemoryValues.cells\n .filter((cell) => {\n const start = axis === \"column\" ? cell.column : cell.row;\n const span =\n axis === \"column\" ? cell.columnSpan : cell.rowSpan;\n return start <= index && index < start + span;\n })\n .map((cell) => cell.element.id)\n .filter(Boolean)\n .join(\" \") || undefined\n );\n },\n calculateAvailableSize: () => measure().availableSize,\n calculateHitRegions: ({\n expandHitTargets,\n axis: resizeAxis,\n includeDisabled\n }) =>\n calculateGridHitRegions({\n axis,\n cells: inMemoryValues.cells,\n crossTrackCount: crossTracks.length,\n expandHitTargets,\n resizeAxis,\n axisSize: measure().availableSize,\n includeDisabled,\n separatorPlacements: inMemoryValues.separators\n }),\n getItemSizeInPixels: (trackId: string) =>\n measure().trackSizes[trackIds.indexOf(trackId)] ?? 0\n },\n mutableState: {\n defaultLayout: preSortedDefaultLayout,\n disableCursor: !!stableProps.disableCursor,\n expandedItemSizes: inMemoryValues[axis].expandedItemSizes,\n layouts: inMemoryValues[axis].layouts\n },\n orientation: axis === \"column\" ? \"horizontal\" : \"vertical\",\n items,\n resizePreviewMode: \"panel\",\n get resizeTargetMinimumSize() {\n return stableProps.resizeTargetMinimumSize;\n },\n separators\n };\n };\n\n const resizeAxes = AXES.map(createResizeAxis);\n\n registeredAxesRef.current = resizeAxes;\n\n const unmountAxes = resizeAxes.map((axis) => mountAxis(axis));\n\n const getGridLayouts = ():\n | { layout: GridLayout; requestedLayout: GridLayout }\n | undefined => {\n const [columnState, rowState] = resizeAxes.map((axis) =>\n getMountedAxisState(axis.id)\n );\n if (\n !columnState ||\n !rowState ||\n columnState.defaultLayoutDeferred ||\n rowState.defaultLayoutDeferred\n ) {\n // This indicates that the Grid 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 undefined;\n }\n\n return {\n layout: { columns: columnState.layout, rows: rowState.layout },\n requestedLayout: {\n columns: columnState.requestedLayout,\n rows: rowState.requestedLayout\n }\n };\n };\n\n {\n const layouts = getGridLayouts();\n if (layouts) {\n onLayoutChangeStable(layouts.layout);\n // Initial mount is not a user interaction (#716).\n onLayoutChangedStable(layouts.layout, false, layouts.requestedLayout);\n }\n }\n\n const removeChangeEventListeners = resizeAxes.map((axis) =>\n subscribeToMountedAxis(axis.id, (event) => {\n const {\n defaultLayoutDeferred,\n derivedItemConstraints,\n layout,\n requestedLayout\n } = event.next;\n\n if (defaultLayoutDeferred || derivedItemConstraints.length === 0) {\n return;\n }\n\n recordAxisLayoutChange({\n derivedItemConstraints,\n axis,\n layout,\n prevLayout: event.prev?.layout,\n requestedLayout\n });\n\n const gridLayouts = getGridLayouts();\n if (gridLayouts) {\n const interactionState = getInteractionState();\n const isCompleted =\n interactionState.state !== \"active\" ||\n !interactionState.hitRegions.some((region) =>\n resizeAxes.includes(region.axis)\n );\n\n onLayoutChangeStable(gridLayouts.layout);\n if (isCompleted) {\n onLayoutChangedStable(\n gridLayouts.layout,\n event.isUserInteraction,\n gridLayouts.requestedLayout\n );\n }\n }\n })\n );\n\n return () => {\n registeredAxesRef.current = [];\n\n unmountAxes.forEach((unmount) => unmount());\n removeChangeEventListeners.forEach((remove) => remove());\n };\n }, [\n columnTracks,\n disabled,\n getResizeAxisId,\n id,\n onLayoutChangedStable,\n onLayoutChangeStable,\n rowTracks,\n cellOrSeparatorChangeSigil,\n stableProps\n ]);\n\n // Not all props require re-registering the grid;\n // Some can be updated after the grid has been registered\n useEffect(() => {\n registeredAxesRef.current.forEach((resizeAxis) => {\n resizeAxis.mutableState.defaultLayout =\n defaultLayout?.[\n resizeAxis.orientation === \"horizontal\" ? \"columns\" : \"rows\"\n ];\n resizeAxis.mutableState.disableCursor = !!disableCursor;\n });\n });\n\n useImperativeHandle(gridRef, (): GridImperativeHandle => {\n const getLayout = (): GridLayout => {\n const [columnAxisId, rowAxisId] = AXES.map(getResizeAxisId);\n if (!getRegisteredAxis(columnAxisId) || !getRegisteredAxis(rowAxisId)) {\n return { columns: {}, rows: {} };\n }\n\n return {\n columns: getImperativeAxisMethods({\n axisId: columnAxisId\n }).getLayout(),\n rows: getImperativeAxisMethods({ axisId: rowAxisId }).getLayout()\n };\n };\n\n const formatIds = (ids: string[]) =>\n ids.map((trackId) => `\"${trackId}\"`).join(\", \");\n\n // Returns a track handle whose methods verify that the track (still) exists before delegating to the Panel methods;\n // this provides clearer errors than the (Panel-specific) messages would\n const createTrackHandle = (\n axis: GridAxis,\n trackId: string\n ): GridTrackImperativeHandle => {\n const axisId = getResizeAxisId(axis);\n const getMethods = () => {\n const resizeAxis = getRegisteredAxis(axisId);\n assert(resizeAxis, `Grid \"${id}\" has not been mounted`);\n assert(\n resizeAxis.items.some((item) => item.id === trackId),\n `Grid \"${id}\" no longer contains a ${axis} with id \"${trackId}\"; ${axis} ids are ${formatIds(resizeAxis.items.map((item) => item.id))}`\n );\n\n return getImperativeItemMethods({ axisId, itemId: trackId });\n };\n\n return {\n collapse: () => getMethods().collapse(),\n expand: () => getMethods().expand(),\n getSize: () => getMethods().getSize(),\n isCollapsed: () => getMethods().isCollapsed(),\n resize: (size: number | string) => getMethods().resize(size)\n };\n };\n\n return {\n getLayout,\n getTrackById: (axis: GridAxis, trackId: string | number) => {\n const tracks = axis === \"column\" ? columnTracks : rowTracks;\n const normalizedId = `${trackId}`;\n assert(\n tracks.some((track) => track.id === normalizedId),\n `Grid \"${id}\" does not contain a ${axis} with id \"${normalizedId}\"; ${axis} ids are ${formatIds(tracks.map((track) => track.id))}`\n );\n\n return createTrackHandle(axis, normalizedId);\n },\n getTrackByIndex: (axis: GridAxis, index: number) => {\n const tracks = axis === \"column\" ? columnTracks : rowTracks;\n const track = Number.isInteger(index) ? tracks[index] : undefined;\n assert(\n track,\n `Grid \"${id}\" does not contain a ${axis} at index ${index}; it has ${tracks.length} ${axis}s`\n );\n\n return createTrackHandle(axis, track.id);\n },\n setLayout: (layout: Parameters<GridImperativeHandle[\"setLayout\"]>[0]) => {\n AXES.forEach((axis) => {\n const axisLayout = layout[axis === \"column\" ? \"columns\" : \"rows\"];\n const axisId = getResizeAxisId(axis);\n if (axisLayout && getRegisteredAxis(axisId)) {\n getImperativeAxisMethods({ axisId }).setLayout(axisLayout);\n }\n });\n\n return getLayout();\n }\n };\n }, [columnTracks, getResizeAxisId, id, rowTracks]);\n\n // The grid template is the only thing that needs to be re-rendered when the layout changes\n const readTemplate = () =>\n AXES.map((axis) => {\n const state = getMountedAxisState(getResizeAxisId(axis));\n const tracks = getTracks(axis);\n\n const sizes =\n state && !state.defaultLayoutDeferred\n ? tracks.map((track) => `minmax(0, ${state.layout[track.id] ?? 1}fr)`)\n : getInitialTrackSizes(\n tracks,\n defaultLayout?.[axis === \"column\" ? \"columns\" : \"rows\"]\n );\n\n return sizes.join(gutters[axis] ? \" auto \" : \" \");\n }).join(\"|\");\n\n const subscribeToLayout = useCallback(\n (callback: () => void) => {\n const unsubscribes = AXES.map((axis) =>\n subscribeToMountedAxis(getResizeAxisId(axis), callback)\n );\n return () => unsubscribes.forEach((unsubscribe) => unsubscribe());\n },\n [getResizeAxisId]\n );\n\n const template = useSyncExternalStore(\n subscribeToLayout,\n readTemplate,\n readTemplate\n );\n const [gridTemplateColumns, gridTemplateRows] = template.split(\"|\");\n\n return (\n <GridContext.Provider value={context}>\n <div\n {...rest}\n className={className}\n data-grid\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: \"grid\",\n gridTemplateColumns,\n gridTemplateRows,\n\n // Inform the browser that the library is handling touch events for this element\n // NOTE This is not an inherited style\n touchAction: \"none\"\n }}\n >\n {/* Cells should not inherit context from a parent Group (if this Grid is nested within one) */}\n <GroupContext.Provider value={null}>{children}</GroupContext.Provider>\n </div>\n </GridContext.Provider>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nGrid.displayName = \"Grid\";\n\nfunction useNormalizedTracks(\n tracks: number | GridTrackProps[],\n propName: string\n): NormalizedTrack[] {\n // Track props are expected to be defined inline, so compare them by value\n const key = JSON.stringify(tracks);\n\n return useMemo(() => {\n const normalized: NormalizedTrack[] =\n typeof tracks === \"number\"\n ? Array.from({ length: tracks }, (_, index) => ({ id: `${index}` }))\n : tracks.map((track, index) => ({\n ...track,\n id: `${track.id ?? index}`\n }));\n\n assert(\n normalized.length > 0,\n `Grid must have at least one track; \"${propName}\" is ${key}`\n );\n\n return normalized;\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key]);\n}\n\nfunction findSeparatorsInChildren(\n children: ReactNode,\n gutters: { column: boolean; row: boolean }\n) {\n Children.forEach(children, (child) => {\n if (isValidElement(child)) {\n if (child.type === Gridline) {\n const { type } = child.props as { type?: unknown };\n if (type === \"column\") {\n gutters.column = true;\n } else if (type === \"row\") {\n gutters.row = true;\n }\n } else if (\n // Fragments\n typeof child.type === \"symbol\" &&\n child.props !== null &&\n typeof child.props === \"object\" &&\n \"children\" in child.props\n ) {\n findSeparatorsInChildren(child.props.children as ReactNode, gutters);\n }\n }\n });\n}\n\n/**\n * Approximates the default layout before the Grid has been mounted (e.g. during server rendering)\n * using the default layout (if one was specified) or the default size of each track.\n */\nfunction getInitialTrackSizes(\n tracks: NormalizedTrack[],\n defaultLayout: Layout | undefined\n): string[] {\n if (defaultLayout) {\n return tracks.map(\n (track) => `minmax(0, ${defaultLayout[track.id] ?? 1}fr)`\n );\n }\n\n const defaultSizes = tracks.map((track) =>\n track.defaultSize === undefined\n ? undefined\n : parseSizeAndUnit(track.defaultSize)\n );\n\n let remainingPercentage = 100;\n let numUnspecified = 0;\n defaultSizes.forEach((defaultSize) => {\n if (defaultSize === undefined) {\n numUnspecified++;\n } else if (defaultSize[1] === \"%\") {\n remainingPercentage -= defaultSize[0];\n }\n });\n\n return defaultSizes.map((defaultSize) => {\n if (defaultSize === undefined) {\n return `minmax(0, ${Math.max(0, remainingPercentage) / Math.max(1, numUnspecified)}fr)`;\n }\n\n const [size, unit] = defaultSize;\n return unit === \"%\" ? `minmax(0, ${size}fr)` : `${size}${unit}`;\n });\n}\n\nfunction getPlacementErrors({\n cells,\n separatorPlacements,\n trackCounts\n}: {\n cells: RegisteredCell[];\n separatorPlacements: ReadonlyMap<RegisteredSeparator, GridSeparatorPlacement>;\n trackCounts: { column: number; row: number };\n}): string[] {\n const errors: string[] = [];\n\n // Cells must be placed within the Grid's tracks\n for (const cell of cells) {\n AXES.forEach((axis) => {\n const [index, span] =\n axis === \"column\"\n ? [cell.column, cell.columnSpan]\n : [cell.row, cell.rowSpan];\n const trackCount = trackCounts[axis];\n if (\n !Number.isInteger(index) ||\n !Number.isInteger(span) ||\n index < 0 ||\n span < 1 ||\n index + span > trackCount\n ) {\n errors.push(\n `Invalid Cell ${axis} placement (${axis}: ${index}, ${axis}Span: ${span}); Grid has ${trackCount} ${axis}s`\n );\n }\n });\n }\n\n const describe = ({\n axis,\n crossSpan,\n crossStart,\n disabled,\n index\n }: GridSeparatorPlacement) => {\n const crossAxis = axis === \"column\" ? \"row\" : \"column\";\n let props = `type=\"${axis}\" ${axis}={${index}}`;\n if (crossStart !== 0 || crossSpan !== undefined) {\n props += ` ${crossAxis}={${crossStart}}`;\n }\n if (crossSpan !== undefined) {\n props += ` ${crossAxis}Span={${crossSpan}}`;\n }\n if (disabled) {\n props += \" disabled\";\n }\n return `<Gridline ${props} />`;\n };\n\n // Gridlines must be placed between two tracks (and alongside of tracks on the opposite axis)\n const placements = Array.from(separatorPlacements.values()).filter(\n (placement) => {\n const { axis, crossSpan, crossStart, index } = placement;\n const crossAxis = axis === \"column\" ? \"row\" : \"column\";\n const trackCount = trackCounts[axis];\n const crossCount = trackCounts[crossAxis];\n\n let isValid = true;\n if (!isValidGridlineIndex(index, trackCount)) {\n errors.push(\n `Invalid ${axis} Gridline ${axis} (${index}); must be between 1 and ${trackCount - 1}`\n );\n isValid = false;\n }\n if (\n !Number.isInteger(crossStart) ||\n crossStart < 0 ||\n crossStart >= crossCount\n ) {\n errors.push(\n `Invalid ${axis} Gridline ${crossAxis} (${crossStart}); must be between 0 and ${crossCount - 1}`\n );\n isValid = false;\n } else if (\n crossSpan !== undefined &&\n (!Number.isInteger(crossSpan) ||\n crossSpan < 1 ||\n crossStart + crossSpan > crossCount)\n ) {\n errors.push(\n `Invalid ${axis} Gridline ${crossAxis}Span (${crossSpan}); Grid has ${crossCount} ${crossAxis}s`\n );\n isValid = false;\n }\n\n // Gridlines with invalid placements are not checked for overlaps (below)\n return isValid;\n }\n );\n\n const getCrossRange = (placement: GridSeparatorPlacement) => {\n const crossCount =\n trackCounts[placement.axis === \"column\" ? \"row\" : \"column\"];\n return [\n placement.crossStart,\n placement.crossSpan === undefined\n ? crossCount\n : placement.crossStart + placement.crossSpan\n ];\n };\n\n placements.forEach((placement, placementIndex) => {\n const { axis, index } = placement;\n const [crossStart, crossEnd] = getCrossRange(placement);\n\n // Gridlines should not be rendered alongside of cells that span across their boundary\n for (const cell of cells) {\n const [start, span, cellCrossStart, cellCrossSpan] =\n axis === \"column\"\n ? [cell.column, cell.columnSpan, cell.row, cell.rowSpan]\n : [cell.row, cell.rowSpan, cell.column, cell.columnSpan];\n if (\n start < index &&\n index < start + span &&\n cellCrossStart < crossEnd &&\n crossStart < cellCrossStart + cellCrossSpan\n ) {\n const crossAxis = axis === \"column\" ? \"row\" : \"column\";\n errors.push(\n `${describe(placement)} overlaps a Cell that spans across it (${axis}: ${start}, ${axis}Span: ${span}, ${crossAxis}: ${cellCrossStart}, ${crossAxis}Span: ${cellCrossSpan}); use the ${crossAxis} and ${crossAxis}Span props to render gridlines beside the Cell instead`\n );\n }\n }\n\n // Gridlines along the same boundary should not overlap each other\n for (const other of placements.slice(placementIndex + 1)) {\n if (other.axis === axis && other.index === index) {\n const [otherCrossStart, otherCrossEnd] = getCrossRange(other);\n if (otherCrossStart < crossEnd && crossStart < otherCrossEnd) {\n errors.push(`${describe(placement)} overlaps ${describe(other)}`);\n }\n }\n }\n });\n\n return errors;\n}\n\nfunction gridLayoutsEqual(a: GridLayout, b: GridLayout) {\n return layoutsEqual(a.columns, b.columns) && layoutsEqual(a.rows, b.rows);\n}\n","import { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport type { LayoutChangedMeta, LayoutStorage } from \"../group/types\";\nimport type { GridLayout } from \"./types\";\n\n/**\n * Saves and restores Grid 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 useDefaultGridLayout({\n id,\n onlySaveAfterUserInteractions,\n storage = localStorage\n}: {\n /**\n * Uniquely identifies a specific grid/layout.\n */\n id: string;\n\n /**\n * Only auto-save layouts that were directly caused by user input (e.g. keyboard or mouse events).\n * Ignore layout changes resulting from imperative API calls or window resize events.\n */\n onlySaveAfterUserInteractions?: boolean;\n\n /**\n * Storage implementation; supports localStorage, sessionStorage, and custom implementations\n * Refer to documentation site for example integrations.\n */\n storage?: LayoutStorage;\n}) {\n const storageKey = `react-resizable-panels:grid:${id}`;\n\n // In the event that a client-only storage API is provided,\n // useSyncExternalStore prevents server/client hydration mismatch warning\n const defaultLayoutString = useSyncExternalStore(\n subscribe,\n () => storage.getItem(storageKey),\n () => storage.getItem(storageKey)\n );\n\n const defaultLayout = useMemo<Partial<GridLayout> | undefined>(() => {\n if (defaultLayoutString) {\n try {\n const parsed = JSON.parse(defaultLayoutString);\n if (parsed !== null && typeof parsed === \"object\") {\n return parsed;\n }\n } catch {\n // Ignore invalid layouts\n }\n }\n }, [defaultLayoutString]);\n\n const onLayoutChanged = useCallback(\n (layout: GridLayout, meta: LayoutChangedMeta<GridLayout>) => {\n if (onlySaveAfterUserInteractions && !meta.isUserInteraction) {\n return;\n }\n\n try {\n // Save the requested layout so size-dependent constraints aren't persisted (see #720)\n storage.setItem(\n storageKey,\n JSON.stringify(meta.requestedLayout ?? layout)\n );\n } catch (error) {\n console.error(error);\n }\n },\n [onlySaveAfterUserInteractions, storage, storageKey]\n );\n\n return {\n /**\n * Pass this value to `Grid` as the `defaultLayout` prop.\n */\n defaultLayout,\n\n /**\n * Attach this callback on the `Grid` as the `onLayoutChanged` prop.\n */\n onLayoutChanged\n };\n}\n\nfunction subscribe() {\n return function unsubscribe() {};\n}\n","import { useState } from \"react\";\nimport type { GridImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Grid component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport function useGridCallbackRef() {\n return useState<GridImperativeHandle | null>(null);\n}\n","import { useRef } from \"react\";\nimport type { GridImperativeHandle } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Grid component.\n */\nexport function useGridRef() {\n return useRef<GridImperativeHandle | null>(null);\n}\n","import { useRef } from \"react\";\nimport type { RegisteredSeparator } from \"../../global/types\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\n\nexport function SeparatorClone({\n separator\n}: {\n separator: RegisteredSeparator;\n}) {\n const { element } = separator;\n\n const ref = useRef<HTMLDivElement>(null);\n\n useIsomorphicLayoutEffect(() => {\n const clone = element.cloneNode(true) as HTMLDivElement;\n const sources = [element, ...element.querySelectorAll(\"*\")];\n const targets = [clone, ...clone.querySelectorAll(\"*\")];\n const ownerWindow = element.ownerDocument.defaultView!;\n\n sources.forEach((source, index) => {\n const target = targets[index];\n\n if (\n target instanceof ownerWindow.HTMLElement ||\n target instanceof ownerWindow.SVGElement\n ) {\n const computed = ownerWindow.getComputedStyle(source);\n\n for (let index = 0; index < computed.length; index++) {\n const property = computed.item(index);\n target.style.setProperty(\n property,\n computed.getPropertyValue(property)\n );\n }\n }\n\n target.removeAttribute(\"data-testid\");\n target.removeAttribute(\"id\");\n });\n\n Object.assign(clone.style, {\n boxSizing: \"border-box\",\n height: \"100%\",\n margin: \"0\",\n position: \"static\",\n transform: \"none\",\n width: \"100%\"\n });\n\n ref.current!.appendChild(clone);\n\n return () => clone.remove();\n }, [element]);\n\n return (\n <div\n ref={ref}\n style={{\n height: \"100%\",\n opacity: 0.65,\n pointerEvents: \"none\",\n width: \"100%\"\n }}\n />\n );\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","\"use client\";\n\nimport { useRef } from \"react\";\nimport { objectsEqual } from \"../../global/utils/objectsEqual\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport type { SeparatorOverlayProps } from \"./types\";\n\n/**\n * Customizes separator previews when resizePreviewMode is \"separator\".\n * Render within a `Group` to style all overlay previews, or pass to an individual `Separator` to style its overlay preview.\n *\n * Use `data-separator-overlay=\"active\"` to style the separator being dragged,\n * or `data-separator-overlay=\"inactive\"` for separators moved indirectly.\n *\n * Set `width` (horizontal groups) or `height` (vertical groups) using `style` or `className`.\n */\nexport function SeparatorOverlay(props: SeparatorOverlayProps) {\n const { registerOverlay } = useGroupContext();\n\n const propsRef = useRef(props);\n\n if (!objectsEqual(propsRef.current, props)) {\n propsRef.current = props;\n }\n\n const stableProps = propsRef.current;\n\n useIsomorphicLayoutEffect(\n () => registerOverlay(stableProps),\n [registerOverlay, stableProps]\n );\n\n return null;\n}\n\nSeparatorOverlay.displayName = \"SeparatorOverlay\";\n","import type { CSSProperties } from \"react\";\nimport type { Orientation } from \"../group/types\";\nimport type { SeparatorOverlayProps } from \"./types\";\n\n/**\n * Renders a visible overlay preview\n */\nexport function SeparatorOverlayRenderer({\n active,\n orientation,\n style,\n ...rest\n}: SeparatorOverlayProps & { active: boolean; orientation: Orientation }) {\n let styleConstraints: CSSProperties;\n\n switch (orientation) {\n case \"horizontal\": {\n styleConstraints = {\n height: \"100%\",\n minWidth: \"1px\"\n };\n break;\n }\n case \"vertical\": {\n styleConstraints = {\n minHeight: \"1px\",\n width: \"100%\"\n };\n break;\n }\n }\n\n return (\n <div\n {...rest}\n data-separator-overlay={active ? \"active\" : \"inactive\"}\n style={{\n ...styleConstraints,\n ...style,\n flexShrink: 0,\n pointerEvents: \"none\"\n }}\n />\n );\n}\n","import { isValidElement } from \"react\";\nimport type { ResizePreview as ResizePreviewState } from \"../../global/mutable-state/types\";\nimport { SeparatorClone } from \"../separator/SeparatorClone\";\nimport { SeparatorOverlay } from \"../separator/SeparatorOverlay\";\nimport { SeparatorOverlayRenderer } from \"../separator/SeparatorOverlayRenderer\";\nimport type { SeparatorOverlayProps } from \"../separator/types\";\n\nexport function ResizePreview({\n overlay,\n preview\n}: {\n overlay?: SeparatorOverlayProps | undefined;\n preview: ResizePreviewState;\n}) {\n const { axis: group, offset, rect, separator } = preview;\n\n const horizontal = group.orientation === \"horizontal\";\n\n let rendered = separator?.preview;\n let overlayProps = overlay;\n\n if (\n isValidElement<SeparatorOverlayProps>(rendered) &&\n rendered.type === SeparatorOverlay\n ) {\n overlayProps = rendered.props;\n rendered = undefined;\n }\n\n if (rendered == null) {\n if (overlayProps) {\n rendered = (\n <SeparatorOverlayRenderer\n {...overlayProps}\n active={preview.active}\n orientation={group.orientation}\n />\n );\n } else if (separator) {\n rendered = <SeparatorClone separator={separator} />;\n }\n }\n\n return (\n <div\n aria-hidden=\"true\"\n data-resize-preview\n inert\n style={{\n height: rect.height,\n left: rect.left,\n pointerEvents: \"none\",\n position: \"absolute\",\n top: rect.top,\n transform: horizontal\n ? `translateX(${offset}px)`\n : `translateY(${offset}px)`,\n width: rect.width\n }}\n >\n {rendered}\n </div>\n );\n}\n","import { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { IDENTITY_FUNCTION } from \"../../constants\";\nimport { getImperativeAxisMethods } from \"../../global/utils/getImperativeAxisMethods\";\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 getImperativeAxisMethods({ axisId: groupId })\n );\n });\n}\n","import { useRef, useState } from \"react\";\nimport { getRegisteredAxis } from \"../../global/mutable-state/axes\";\nimport {\n getInteractionState,\n subscribeToInteractionState\n} from \"../../global/mutable-state/interactions\";\nimport type {\n InteractionState,\n ResizePreview as ResizePreviewState\n} from \"../../global/mutable-state/types\";\nimport { layoutNumbersEqual } from \"../../global/utils/layoutNumbersEqual\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport type { ResizePreviewMode } from \"./types\";\n\nexport function useResizePreviews({\n groupId,\n resizePreviewMode\n}: {\n groupId: string;\n resizePreviewMode: ResizePreviewMode;\n}) {\n const [previews, setPreviews] = useState<ResizePreviewState[]>([]);\n\n const previewsRef = useRef(previews);\n\n useIsomorphicLayoutEffect(() => {\n const updatePreviews = (interaction: InteractionState) => {\n const group = getRegisteredAxis(groupId);\n const nextPreviews =\n resizePreviewMode === \"separator\" && interaction.state === \"active\"\n ? interaction.previews.filter(\n (preview) =>\n preview.axis === group &&\n (preview.active || !layoutNumbersEqual(preview.offset, 0))\n )\n : [];\n const previousPreviews = previewsRef.current;\n if (\n previousPreviews.length === nextPreviews.length &&\n nextPreviews.every(\n (preview, index) => preview === previousPreviews[index]\n )\n ) {\n return;\n }\n\n previewsRef.current = nextPreviews;\n setPreviews(nextPreviews);\n };\n\n if (resizePreviewMode !== \"separator\") {\n updatePreviews(getInteractionState());\n return;\n }\n\n const unsubscribe = subscribeToInteractionState(({ next }) =>\n updatePreviews(next)\n );\n\n updatePreviews(getInteractionState());\n\n return unsubscribe;\n }, [groupId, resizePreviewMode]);\n\n return previews;\n}\n","\"use client\";\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { calculateItemConstraints } from \"../../global/dom/calculateItemConstraints\";\nimport { mountAxis } from \"../../global/mountAxis\";\nimport {\n getMountedAxisState,\n getRegisteredAxis,\n subscribeToMountedAxis,\n updateMountedAxis\n} from \"../../global/mutable-state/axes\";\nimport { getInteractionState } from \"../../global/mutable-state/interactions\";\nimport type {\n RegisteredResizeAxis,\n RegisteredResizeItem,\n RegisteredSeparator\n} from \"../../global/types\";\nimport { layoutsEqual } from \"../../global/utils/layoutsEqual\";\nimport { recordAxisLayoutChange } from \"../../global/utils/recordAxisLayoutChange\";\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 { SeparatorOverlayProps } from \"../separator/types\";\nimport { GroupContext } from \"./GroupContext\";\nimport { ResizePreview } from \"./ResizePreview\";\nimport { sortByElementOffset } from \"./sortByElementOffset\";\nimport type { GroupProps, Layout } from \"./types\";\nimport { useGroupImperativeHandle } from \"./useGroupImperativeHandle\";\nimport { useResizePreviews } from \"./useResizePreviews\";\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 resizePreviewMode = \"panel\",\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(\n (layout: Layout, isUserInteraction: boolean, requestedLayout: Layout) => {\n // Only the validated layout is memoized; requested layout changes alone don't trigger the callback\n if (layoutsEqual(prevLayoutRef.current.onLayoutChanged, layout)) {\n // Memoize callback\n return;\n }\n\n prevLayoutRef.current.onLayoutChanged = layout;\n onLayoutChangedUnstable?.(layout, { isUserInteraction, requestedLayout });\n }\n );\n\n const id = useId(idProp);\n\n const [overlay, setOverlay] = useState<SeparatorOverlayProps>();\n\n const previews = useResizePreviews({\n groupId: id,\n resizePreviewMode\n });\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: RegisteredResizeItem[];\n separators: RegisteredSeparator[];\n }>({\n lastExpandedPanelSizes: {},\n layouts: {},\n panels: [],\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 groupState = getMountedAxisState(groupId);\n if (groupState) {\n return {\n flexGrow: groupState.layout[panelId] ?? 1\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 resizeTargetMinimumSize\n });\n\n const context = useMemo(\n () => ({\n get disableCursor() {\n return !!stableProps.disableCursor;\n },\n getPanelStyles,\n id,\n orientation,\n registerPanel: (panel: RegisteredResizeItem) => {\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 registerOverlay: (props: SeparatorOverlayProps) => {\n setOverlay(props);\n\n return () => {\n setOverlay(undefined);\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 updatePanelProps: (\n panelId: string,\n { disabled }: { disabled: boolean | undefined }\n ) => {\n const inMemoryValues = inMemoryValuesRef.current;\n const panel = inMemoryValues.panels.find(\n (current) => current.id === panelId\n );\n if (panel) {\n panel.constraintProps.disabled = disabled;\n }\n\n const group = getRegisteredAxis(id);\n const groupState = getMountedAxisState(id);\n if (group && groupState) {\n updateMountedAxis(group, {\n ...groupState,\n derivedItemConstraints: calculateItemConstraints(group)\n });\n }\n },\n updateSeparatorProps: (\n separatorId: string,\n {\n disabled,\n disableDoubleClick\n }: {\n disabled: boolean | undefined;\n disableDoubleClick: boolean | undefined;\n }\n ) => {\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 separator.disableDoubleClick = disableDoubleClick;\n }\n }\n }),\n [getPanelStyles, id, forceUpdate, orientation, stableProps]\n );\n\n const registeredGroupRef = useRef<RegisteredResizeAxis | 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: RegisteredResizeAxis = {\n disabled: !!disabled,\n element,\n id,\n mutableState: {\n defaultLayout: preSortedDefaultLayout,\n disableCursor: !!stableProps.disableCursor,\n expandedItemSizes: inMemoryValuesRef.current.lastExpandedPanelSizes,\n layouts: inMemoryValuesRef.current.layouts\n },\n orientation,\n items: inMemoryValues.panels,\n resizePreviewMode,\n get resizeTargetMinimumSize() {\n return stableProps.resizeTargetMinimumSize;\n },\n separators: inMemoryValues.separators\n };\n\n registeredGroupRef.current = group;\n\n const unmountGroup = mountAxis(group);\n\n const {\n defaultLayoutDeferred,\n derivedItemConstraints: derivedPanelConstraints,\n layout,\n requestedLayout\n } = getMountedAxisState(group.id, true);\n\n if (!defaultLayoutDeferred && derivedPanelConstraints.length > 0) {\n onLayoutChangeStable(layout);\n // Initial mount is not a user interaction (#716).\n onLayoutChangedStable(layout, false, requestedLayout);\n }\n\n const removeChangeEventListener = subscribeToMountedAxis(id, (event) => {\n const {\n defaultLayoutDeferred,\n derivedItemConstraints: derivedPanelConstraints,\n layout,\n requestedLayout\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 recordAxisLayoutChange({\n derivedItemConstraints: derivedPanelConstraints,\n axis: group,\n layout,\n prevLayout: event.prev?.layout,\n requestedLayout\n });\n\n // Lastly notify layout-change(d) handlers of the update\n const interactionState = getInteractionState();\n const isCompleted =\n interactionState.state !== \"active\" ||\n !interactionState.hitRegions.some((region) => region.axis === group);\n onLayoutChangeStable(layout);\n if (isCompleted) {\n onLayoutChangedStable(layout, event.isUserInteraction, requestedLayout);\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 resizePreviewMode,\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 position: resizePreviewMode === \"separator\" ? \"relative\" : undefined,\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 {previews.map((preview) => (\n <ResizePreview\n key={preview.key}\n overlay={overlay}\n preview={preview}\n />\n ))}\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 LayoutChangedMeta,\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 onlySaveAfterUserInteractions,\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 * Only auto-save layouts that were directly caused by user input (e.g. keyboard or mouse events).\n * Ignore layout changes resulting from imperative API calls or window resize events.\n */\n onlySaveAfterUserInteractions?: boolean;\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 // The hook persists every layout commit -- including library-driven ones --\n // because it owns its own storage and the goal is to remember whatever\n // layout the user is currently looking at. Consumers that only want to\n // persist on user interaction should branch on `isUserInteraction` in\n // their own callback (see #716) rather than via this hook.\n (layout: Layout, meta: LayoutChangedMeta) => {\n if (onlySaveAfterUserInteractions && !meta.isUserInteraction) {\n return;\n }\n\n clearPendingTimeout();\n\n // Save the requested layout so size-dependent constraints aren't persisted (see #720)\n const layoutToSave = meta.requestedLayout ?? layout;\n\n let writeStorageKey: string;\n if (hasPanelIds) {\n writeStorageKey = getStorageKey(id, Object.keys(layoutToSave));\n } else {\n writeStorageKey = getStorageKey(id, []);\n }\n\n try {\n storage.setItem(writeStorageKey, JSON.stringify(layoutToSave));\n } catch (error) {\n console.error(error);\n }\n },\n [\n clearPendingTimeout,\n hasPanelIds,\n id,\n onlySaveAfterUserInteractions,\n storage\n ]\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, { isUserInteraction: false });\n } else {\n timeoutRef.current = setTimeout(() => {\n onLayoutChanged(layout, { isUserInteraction: false });\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 { useImperativeHandle, useRef, type Ref } from \"react\";\nimport { NOOP_FUNCTION } from \"../../constants\";\nimport { getImperativeItemMethods } from \"../../global/utils/getImperativeItemMethods\";\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 getImperativeItemMethods({ axisId: groupId, itemId: panelId })\n );\n });\n}\n","\"use client\";\n\nimport {\n useEffect,\n useRef,\n useSyncExternalStore,\n type CSSProperties\n} from \"react\";\nimport { subscribeToMountedAxis } from \"../../global/mutable-state/axes\";\nimport type { RegisteredResizeItem } from \"../../global/types\";\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 } 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 collapsedThreshold,\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 updatePanelProps\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: RegisteredResizeItem = {\n element,\n id,\n idIsStable,\n mutableValues: {\n expandToSize: undefined,\n prevSize: undefined\n },\n onResize: hasOnResize ? onResizeStable : undefined,\n constraintProps: {\n groupResizeBehavior,\n collapsedSize,\n collapsedThreshold,\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 collapsedThreshold,\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 updatePanelProps(id, { disabled });\n }, [disabled, id, updatePanelProps]);\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) => subscribeToMountedAxis(groupId, subscribe),\n read,\n read\n );\n\n let panelStyles: CSSProperties;\n if (panelStylesString) {\n panelStyles = JSON.parse(panelStylesString);\n } else if (defaultSize !== undefined) {\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","\"use client\";\n\nimport { useId } from \"../../hooks/useId\";\nimport { useGroupContext } from \"../group/useGroupContext\";\nimport { ResizeSeparator } from \"../shared/ResizeSeparator\";\nimport type { SeparatorProps } from \"./types\";\n\n// Separators are flex items within their parent Group\nconst STYLE_DEFAULTS = { flexBasis: \"auto\" } as const;\nconst REQUIRED_STYLE = { flexGrow: 0, flexShrink: 0 } as const;\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 disableDoubleClick,\n elementRef,\n id: idProp,\n preview,\n style,\n ...rest\n}: SeparatorProps) {\n const id = useId(idProp);\n\n const {\n disableCursor,\n id: groupId,\n orientation,\n registerSeparator,\n updateSeparatorProps\n } = useGroupContext();\n\n return (\n <ResizeSeparator\n attributes={rest}\n axisId={groupId}\n axisOrientation={orientation}\n className={className}\n disableCursor={disableCursor}\n disabled={disabled}\n disableDoubleClick={disableDoubleClick}\n elementRef={elementRef}\n id={id}\n preview={preview}\n registerSeparator={registerSeparator}\n requiredStyle={REQUIRED_STYLE}\n style={style}\n styleDefaults={STYLE_DEFAULTS}\n updateSeparatorProps={updateSeparatorProps}\n >\n {children}\n </ResizeSeparator>\n );\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName\nSeparator.displayName = \"Separator\";\n"],"names":["useId","stableId","dynamicId","useIdReact","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useStableCallback","fn","ref","useRef","useCallback","args","useMergedRefs","refs","value","getTrackGridLine","index","hasGutters","getTrackGridSpan","span","getTrackGridPlacement","line","getGutterGridPlacement","getSeparatorCrossGridPlacement","crossCount","crossSpan","crossStart","crossEnd","startLine","endLine","isValidGridlineIndex","trackCount","assert","expectedCondition","message","GridContext","createContext","useGridContext","context","useContext","Cell","children","className","column","columnSpan","elementRefProp","idProp","row","rowSpan","style","rest","id","gutters","registerCell","elementRef","mergedRef","element","jsx","cached","isCoarsePointer","expandHitTarget","expandHitTargets","axis","rect","minHitTargetSize","delta","excludeSpanningCells","cells","rects","cell","start","bounds","blockedStart","blockedEnd","segments","addSegment","end","calculateGridHitRegions","crossTrackCount","resizeAxis","axisSize","includeDisabled","separatorPlacements","tracks","separators","firstEnabledIndex","lastEnabledIndex","numEnabled","track","isBoundaryResizable","hitRegions","createHitRegion","separator","getCrossTrackEdge","crossIndex","edge","position","cellCrossStart","cellCrossSpan","boundariesWithSeparators","placement","rectStart","rectEnd","previousEnd","nextStart","current","addImplicitHitRegions","slots","getBounds","segment","toDOMRect","pending","before","after","beforeBounds","afterBounds","from","to","parsePixels","parsed","measureGridAxis","gutterSizes","layout","trackIds","cssTrackCount","template","tokens","token","trackSizes","_","total","size","outerSize","padding","gap","availableSize","trackId","parseSizeAndUnit","numeric","EventEmitter","#listenerMap","type","listener","listeners","data","didThrow","caughtError","clonedListeners","i","error","state","eventEmitter","getInteractionState","subscribeToInteractionState","callback","updateCursorFlags","cursorFlags","previews","previewLayoutMap","didPointerMove","prev","next","updateInteractionState","notifySeparatorPreviewChanged","preview","removeAxisFromInteraction","region","hasPreviews","initialLayoutMap","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","axes","horizontalCount","verticalCount","horizontalMin","horizontalMax","verticalMin","verticalMax","documentToStyleMap","updateCursorStyle","ownerDocument","prevStyle","styleSheet","interactionState","cursorStyle","nextStyle","calculateAvailableAxisSize","layoutStrategy","orientation","items","totalSize","item","sortByElementOffset","panelsOrSeparators","a","b","horizontalSort","verticalSort","isHTMLElement","getDistanceBetweenPointAndRect","point","findClosestRect","targetRect","centerPoint","closestRect","minDistance","x","y","distance","calculateHitRegions","axisElement","sortedChildElements","disabledSeparator","hasInterleavedStaticContent","firstEnabledItemIndex","lastEnabledItemIndex","numEnabledItems","prevItem","pendingSeparators","currentItemIndex","childElement","itemData","prevRect","pendingRectsOrSeparators","firstItemEdgeRect","secondItemEdgeRect","rectOrSeparator","skip","separatorData","convertEmToPixels","fontSize","convertRemToPixels","convertVhToPixels","convertVwToPixels","sizeStyleToPixels","itemElement","styleProp","pixels","unit","formatLayoutNumber","number","calculateItemConstraints","itemConstraints","collapsedSize","collapsedThreshold","defaultSize","minSize","maxSize","map","deleteMutableAxis","getRegisteredAxis","axisId","getMountedAxisState","mountedAxis","getMountedAxes","subscribeToMountedAxis","event","updateMountedAxis","meta","isArrayEqual","layoutNumbersEqual","actual","expected","minimumDelta","compareLayoutNumbers","validateItemSize","overrideDisabledItems","prevSize","collapsible","disabled","threshold","wasCollapsed","boundary","comparison","adjustLayoutByDelta","initialLayoutProp","itemConstraintsArray","pivotIndices","prevLayoutProp","trigger","initialLayout","itemId","prevLayout","nextLayout","firstPivotIndex","secondPivotIndex","deltaApplied","localDelta","gapSize","nextSize","expandAtBoundary","increment","maxAvailableDelta","minAbsDelta","deltaRemaining","unsafeSize","safeSize","pivotIndex","accumulated","layoutsEqual","updateActiveHitRegions","commit","document","mountedAxes","pointerDownAtPoint","prevCursorFlags","nextCursorFlags","interaction","disableCursor","deltaAsPercentage","axisState","defaultLayoutDeferred","derivedItemConstraints","mountedAxisSize","mountedLayout","separatorToItems","offsets","offset","completeActivePointerResize","match","hitRegion","onDocumentContextMenu","findClosestHitRegion","closestHitRegion","isShadowRoot","compare","ancestors","get_ancestors","common_ancestor","z_indexes","get_z_index","find_stacking_context","furthest_ancestors","child","props","is_flex_item","node","display","get_parent","creates_stacking_context","nodes","parentNode","doRectsIntersect","isModal","isViableHitTarget","pointerEventTarget","dialog","currentElement","findMatchingHitRegions","matchingHitRegions","axisData","validateAxisLayout","nextLayoutTotalSize","remainingSize","getImperativeItemMethods","find","getItemConstraints","getItem","getItemSize","computeLayout","isFirstItem","isLastItem","_item","itemIndex","pc","occupiedByPrevious","setItemSize","unsafeLayout","mutableValues","asPercentage","inPixels","asPixels","onDocumentDoubleClick","itemWithDefaultSize","api","findSeparatorAxis","separatorElement","getImperativeAxisMethods","adjustLayoutForSeparator","onDocumentKeyDown","primaryItem","constraints","separatorElements","nextIndex","calculateResizePreviews","axisRect","horizontal","boundaryItems","center","regionCenter","onDocumentPointerDown","didChangeFocus","onDocumentPointerLeave","onDocumentPointerMove","onDocumentPointerOut","onDocumentPointerUp","calculateDefaultLayout","explicitCount","remainingItemCount","validateLayoutKeys","itemIds","layoutKeys","getDefaultLayout","itemIdsKey","defaultLayout","normalizeLayout","notifyItemOnResize","borderBoxSize","itemSize","objectsEqual","key","itemConstraintsEqual","preserveFixedItemSizes","nextAxisSize","prevAxisSize","fixedItemsTotalSize","flexibleItemsTotalPrevSize","hasPreservePixelSizeItems","fixedItems","flexibleItemIds","prevItemSize","prevItemSizeInPixels","nextItemSize","evenSize","ownerDocumentReferenceCounts","mountAxis","isMounted","ResizeObserver","separatorIds","resizeObserver","entries","entry","target","nextDerivedItemConstraints","requestedAxisSize","requestedLayout","defaultLayoutUnsafe","defaultLayoutSafe","recordAxisLayoutChange","isCollapsed","useForceUpdate","sigil","setSigil","useState","forceUpdate","useStableObject","unstableObject","GroupContext","calculateSeparatorAriaValues","valueMax","valueMin","ResizeSeparator","attributes","axisOrientation","disableDoubleClick","isSharedHitRegion","registerSeparator","requiredStyle","styleDefaults","tabIndex","updateSeparatorProps","stableProps","aria","setAria","dragState","setDragState","isFocused","setIsFocused","registeredSeparatorRef","unregisterSeparator","removeInteractionStateChangeListener","removeMountedAxesChangeListener","cursor","dataSeparator","GridTrackSeparator","getDisableCursor","getResizeAxisId","trackCounts","crossAxis","isDisabled","isFirstEnabledGridlineOnBoundary","registerGridline","gutterPlacement","crossPlacement","Gridline","AXES","EMPTY_GRID_LAYOUT","Grid","columns","gridRef","onLayoutChangeUnstable","onLayoutChangedUnstable","resizeTargetMinimumSize","rows","columnTracks","useNormalizedTracks","rowTracks","getTracks","prevLayoutRef","onLayoutChangeStable","gridLayoutsEqual","onLayoutChangedStable","isUserInteraction","cellOrSeparatorChangeSigil","inMemoryValuesRef","findSeparatorsInChildren","inMemoryValues","separatorId","useMemo","registeredAxesRef","errors","getPlacementErrors","getSeparators","createResizeAxis","crossTracks","measure","preSortedDefaultLayout","defaultAxisLayout","resizeAxes","unmountAxes","getGridLayouts","columnState","rowState","layouts","removeChangeEventListeners","gridLayouts","isCompleted","unmount","remove","useImperativeHandle","getLayout","columnAxisId","rowAxisId","formatIds","ids","createTrackHandle","getMethods","normalizedId","axisLayout","readTemplate","getInitialTrackSizes","subscribeToLayout","unsubscribes","unsubscribe","useSyncExternalStore","gridTemplateColumns","gridTemplateRows","propName","normalized","Children","isValidElement","defaultSizes","remainingPercentage","numUnspecified","describe","placements","isValid","getCrossRange","placementIndex","other","otherCrossStart","otherCrossEnd","useDefaultGridLayout","onlySaveAfterUserInteractions","storage","storageKey","defaultLayoutString","subscribe","onLayoutChanged","useGridCallbackRef","useGridRef","SeparatorClone","clone","sources","targets","ownerWindow","source","computed","property","useGroupContext","SeparatorOverlay","registerOverlay","propsRef","SeparatorOverlayRenderer","active","styleConstraints","ResizePreview","overlay","group","rendered","overlayProps","useGroupImperativeHandle","groupId","groupRef","imperativeGroupRef","useResizePreviews","resizePreviewMode","setPreviews","previewsRef","updatePreviews","nextPreviews","previousPreviews","Group","setOverlay","panelOrSeparatorChangeSigil","getPanelStyles","panelId","groupState","panel","registeredGroupRef","unmountGroup","derivedPanelConstraints","removeChangeEventListener","registeredGroup","jsxs","getStorageKey","panelIds","readLegacyLayout","readStorageKey","maybeLegacyString","maybeLegacyLayout","keys","useDefaultLayout","debounceSaveMs","hasPanelIds","defaultLayoutModern","values","defaultLayoutLegacy","timeoutRef","clearPendingTimeout","timeout","layoutToSave","writeStorageKey","onLayoutChange","useGroupCallbackRef","useGroupRef","usePanelImperativeHandle","panelRef","imperativePanelRef","Panel","groupResizeBehavior","onResizeUnstable","idIsStable","registerPanel","updatePanelProps","hasOnResize","onResizeStable","panelSize","prevPanelSize","registeredPanel","read","maybePanelStyles","panelStylesString","panelStyles","PROHIBITED_CSS_PROPERTIES","usePanelCallbackRef","usePanelRef","STYLE_DEFAULTS","REQUIRED_STYLE","Separator"],"mappings":"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"}