react-resizable-panels 2.1.8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/LICENSE +21 -0
  2. package/dist/declarations/src/Panel.d.ts +9 -9
  3. package/dist/declarations/src/PanelGroup.d.ts +10 -10
  4. package/dist/declarations/src/PanelResizeHandle.d.ts +1 -1
  5. package/dist/declarations/src/constants.d.ts +15 -0
  6. package/dist/declarations/src/hooks/usePanelGroupContext.d.ts +4 -0
  7. package/dist/declarations/src/index.d.ts +4 -2
  8. package/dist/{react-resizable-panels.browser.development.esm.js → react-resizable-panels.browser.development.js} +148 -106
  9. package/dist/{react-resizable-panels.browser.esm.js → react-resizable-panels.browser.js} +148 -106
  10. package/dist/react-resizable-panels.d.ts +2 -0
  11. package/dist/{react-resizable-panels.development.esm.js → react-resizable-panels.development.js} +148 -106
  12. package/dist/{react-resizable-panels.development.node.esm.js → react-resizable-panels.development.node.js} +148 -106
  13. package/dist/{react-resizable-panels.esm.js → react-resizable-panels.js} +148 -106
  14. package/dist/{react-resizable-panels.node.esm.js → react-resizable-panels.node.js} +148 -106
  15. package/package.json +25 -47
  16. package/dist/react-resizable-panels.browser.cjs.js +0 -2453
  17. package/dist/react-resizable-panels.browser.cjs.mjs +0 -18
  18. package/dist/react-resizable-panels.browser.development.cjs.js +0 -2559
  19. package/dist/react-resizable-panels.browser.development.cjs.mjs +0 -18
  20. package/dist/react-resizable-panels.cjs.d.mts +0 -2
  21. package/dist/react-resizable-panels.cjs.d.mts.map +0 -1
  22. package/dist/react-resizable-panels.cjs.d.ts +0 -2
  23. package/dist/react-resizable-panels.cjs.d.ts.map +0 -1
  24. package/dist/react-resizable-panels.cjs.js +0 -2455
  25. package/dist/react-resizable-panels.cjs.mjs +0 -18
  26. package/dist/react-resizable-panels.development.cjs.js +0 -2566
  27. package/dist/react-resizable-panels.development.cjs.mjs +0 -18
  28. package/dist/react-resizable-panels.development.node.cjs.js +0 -2332
  29. package/dist/react-resizable-panels.development.node.cjs.mjs +0 -18
  30. package/dist/react-resizable-panels.node.cjs.js +0 -2231
  31. package/dist/react-resizable-panels.node.cjs.mjs +0 -18
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Brian Vaughn
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -51,20 +51,20 @@ export declare function PanelWithForwardedRef({ children, className: classNameFr
51
51
  export declare namespace PanelWithForwardedRef {
52
52
  var displayName: string;
53
53
  }
54
- export declare const Panel: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLObjectElement | HTMLElement | HTMLSlotElement | HTMLStyleElement | HTMLTitleElement | HTMLAnchorElement | HTMLAreaElement | HTMLAudioElement | HTMLBaseElement | HTMLQuoteElement | HTMLBodyElement | HTMLBRElement | HTMLButtonElement | HTMLCanvasElement | HTMLTableCaptionElement | HTMLTableColElement | HTMLDataElement | HTMLDataListElement | HTMLModElement | HTMLDetailsElement | HTMLDialogElement | HTMLDivElement | HTMLDListElement | HTMLEmbedElement | HTMLFieldSetElement | HTMLFormElement | HTMLHeadingElement | HTMLHeadElement | HTMLHRElement | HTMLHtmlElement | HTMLIFrameElement | HTMLImageElement | HTMLInputElement | HTMLLabelElement | HTMLLegendElement | HTMLLIElement | HTMLLinkElement | HTMLMapElement | HTMLMenuElement | HTMLMetaElement | HTMLMeterElement | HTMLOListElement | HTMLOptGroupElement | HTMLOptionElement | HTMLOutputElement | HTMLParagraphElement | HTMLPictureElement | HTMLPreElement | HTMLProgressElement | HTMLScriptElement | HTMLSelectElement | HTMLSourceElement | HTMLSpanElement | HTMLTableElement | HTMLTableSectionElement | HTMLTableCellElement | HTMLTemplateElement | HTMLTextAreaElement | HTMLTimeElement | HTMLTableRowElement | HTMLTrackElement | HTMLUListElement | HTMLVideoElement>, "id" | "onResize"> & {
55
- className?: string | undefined;
54
+ export declare const Panel: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLObjectElement | HTMLElement | HTMLAnchorElement | HTMLAreaElement | HTMLAudioElement | HTMLBaseElement | HTMLQuoteElement | HTMLBodyElement | HTMLBRElement | HTMLButtonElement | HTMLCanvasElement | HTMLTableCaptionElement | HTMLTableColElement | HTMLDataElement | HTMLDataListElement | HTMLModElement | HTMLDetailsElement | HTMLDialogElement | HTMLDivElement | HTMLDListElement | HTMLEmbedElement | HTMLFieldSetElement | HTMLFormElement | HTMLHeadingElement | HTMLHeadElement | HTMLHRElement | HTMLHtmlElement | HTMLIFrameElement | HTMLImageElement | HTMLInputElement | HTMLLabelElement | HTMLLegendElement | HTMLLIElement | HTMLLinkElement | HTMLMapElement | HTMLMenuElement | HTMLMetaElement | HTMLMeterElement | HTMLOListElement | HTMLOptGroupElement | HTMLOptionElement | HTMLOutputElement | HTMLParagraphElement | HTMLPictureElement | HTMLPreElement | HTMLProgressElement | HTMLScriptElement | HTMLSelectElement | HTMLSlotElement | HTMLSourceElement | HTMLSpanElement | HTMLStyleElement | HTMLTableElement | HTMLTableSectionElement | HTMLTableCellElement | HTMLTemplateElement | HTMLTextAreaElement | HTMLTimeElement | HTMLTitleElement | HTMLTableRowElement | HTMLTrackElement | HTMLUListElement | HTMLVideoElement>, "id" | "onResize"> & {
55
+ className?: string;
56
56
  collapsedSize?: number | undefined;
57
57
  collapsible?: boolean | undefined;
58
58
  defaultSize?: number | undefined;
59
- id?: string | undefined;
59
+ id?: string;
60
60
  maxSize?: number | undefined;
61
61
  minSize?: number | undefined;
62
- onCollapse?: PanelOnCollapse | undefined;
63
- onExpand?: PanelOnExpand | undefined;
64
- onResize?: PanelOnResize | undefined;
65
- order?: number | undefined;
66
- style?: object | undefined;
62
+ onCollapse?: PanelOnCollapse;
63
+ onExpand?: PanelOnExpand;
64
+ onResize?: PanelOnResize;
65
+ order?: number;
66
+ style?: object;
67
67
  tagName?: keyof HTMLElementTagNameMap | undefined;
68
68
  } & {
69
- children?: import("react").ReactNode;
69
+ children?: import("react").ReactNode | undefined;
70
70
  } & import("react").RefAttributes<ImperativePanelHandle>>;
@@ -1,5 +1,5 @@
1
- import { Direction } from "./types.js";
2
1
  import { CSSProperties, HTMLAttributes, PropsWithChildren } from "react";
2
+ import { Direction } from "./types.js";
3
3
  export type ImperativePanelGroupHandle = {
4
4
  getId: () => string;
5
5
  getLayout: () => number[];
@@ -23,16 +23,16 @@ export type PanelGroupProps = Omit<HTMLAttributes<keyof HTMLElementTagNameMap>,
23
23
  dir?: "auto" | "ltr" | "rtl" | undefined;
24
24
  }>;
25
25
  export declare const PanelGroup: import("react").ForwardRefExoticComponent<Omit<HTMLAttributes<keyof HTMLElementTagNameMap>, "id"> & {
26
- autoSaveId?: string | null | undefined;
27
- className?: string | undefined;
26
+ autoSaveId?: string | null;
27
+ className?: string;
28
28
  direction: Direction;
29
- id?: string | null | undefined;
30
- keyboardResizeBy?: number | null | undefined;
31
- onLayout?: PanelGroupOnLayout | null | undefined;
32
- storage?: PanelGroupStorage | undefined;
33
- style?: CSSProperties | undefined;
34
- tagName?: keyof HTMLElementTagNameMap | undefined;
29
+ id?: string | null;
30
+ keyboardResizeBy?: number | null;
31
+ onLayout?: PanelGroupOnLayout | null;
32
+ storage?: PanelGroupStorage;
33
+ style?: CSSProperties;
34
+ tagName?: keyof HTMLElementTagNameMap;
35
35
  dir?: "auto" | "ltr" | "rtl" | undefined;
36
36
  } & {
37
- children?: import("react").ReactNode;
37
+ children?: import("react").ReactNode | undefined;
38
38
  } & import("react").RefAttributes<ImperativePanelGroupHandle>>;
@@ -1,5 +1,5 @@
1
- import { PointerHitAreaMargins } from "./PanelResizeHandleRegistry.js";
2
1
  import { CSSProperties, HTMLAttributes, PropsWithChildren, ReactElement } from "react";
2
+ import { PointerHitAreaMargins } from "./PanelResizeHandleRegistry.js";
3
3
  export type PanelResizeHandleOnDragging = (isDragging: boolean) => void;
4
4
  export type ResizeHandlerState = "drag" | "hover" | "inactive";
5
5
  export type PanelResizeHandleProps = Omit<HTMLAttributes<keyof HTMLElementTagNameMap>, "id" | "onBlur" | "onClick" | "onFocus" | "onPointerDown" | "onPointerUp"> & PropsWithChildren<{
@@ -0,0 +1,15 @@
1
+ export declare const DATA_ATTRIBUTES: {
2
+ readonly group: "data-panel-group";
3
+ readonly groupDirection: "data-panel-group-direction";
4
+ readonly groupId: "data-panel-group-id";
5
+ readonly panel: "data-panel";
6
+ readonly panelCollapsible: "data-panel-collapsible";
7
+ readonly panelId: "data-panel-id";
8
+ readonly panelSize: "data-panel-size";
9
+ readonly resizeHandle: "data-resize-handle";
10
+ readonly resizeHandleActive: "data-resize-handle-active";
11
+ readonly resizeHandleEnabled: "data-panel-resize-handle-enabled";
12
+ readonly resizeHandleId: "data-panel-resize-handle-id";
13
+ readonly resizeHandleState: "data-resize-handle-state";
14
+ };
15
+ export declare const PRECISION = 10;
@@ -0,0 +1,4 @@
1
+ export declare function usePanelGroupContext(): {
2
+ direction: "horizontal" | "vertical" | undefined;
3
+ groupId: string | undefined;
4
+ };
@@ -1,9 +1,11 @@
1
1
  import { Panel } from "./Panel.js";
2
2
  import { PanelGroup } from "./PanelGroup.js";
3
3
  import { PanelResizeHandle } from "./PanelResizeHandle.js";
4
+ import { DATA_ATTRIBUTES } from "./constants.js";
5
+ import { usePanelGroupContext } from "./hooks/usePanelGroupContext.js";
4
6
  import { assert } from "./utils/assert.js";
5
7
  import { setNonce } from "./utils/csp.js";
6
- import { enableGlobalCursorStyles, disableGlobalCursorStyles } from "./utils/cursor.js";
8
+ import { disableGlobalCursorStyles, enableGlobalCursorStyles } from "./utils/cursor.js";
7
9
  import { getPanelElement } from "./utils/dom/getPanelElement.js";
8
10
  import { getPanelElementsForGroup } from "./utils/dom/getPanelElementsForGroup.js";
9
11
  import { getPanelGroupElement } from "./utils/dom/getPanelGroupElement.js";
@@ -17,4 +19,4 @@ import type { ImperativePanelHandle, PanelOnCollapse, PanelOnExpand, PanelOnResi
17
19
  import type { ImperativePanelGroupHandle, PanelGroupOnLayout, PanelGroupProps, PanelGroupStorage } from "./PanelGroup.js";
18
20
  import type { PanelResizeHandleOnDragging, PanelResizeHandleProps } from "./PanelResizeHandle.js";
19
21
  import type { PointerHitAreaMargins } from "./PanelResizeHandleRegistry.js";
20
- export { ImperativePanelGroupHandle, ImperativePanelHandle, PanelGroupOnLayout, PanelGroupProps, PanelGroupStorage, PanelOnCollapse, PanelOnExpand, PanelOnResize, PanelProps, PanelResizeHandleOnDragging, PanelResizeHandleProps, PointerHitAreaMargins, Panel, PanelGroup, PanelResizeHandle, assert, getIntersectingRectangle, intersects, getPanelElement, getPanelElementsForGroup, getPanelGroupElement, getResizeHandleElement, getResizeHandleElementIndex, getResizeHandleElementsForGroup, getResizeHandlePanelIds, enableGlobalCursorStyles, disableGlobalCursorStyles, setNonce, };
22
+ export { ImperativePanelGroupHandle, ImperativePanelHandle, PanelGroupOnLayout, PanelGroupProps, PanelGroupStorage, PanelOnCollapse, PanelOnExpand, PanelOnResize, PanelProps, PanelResizeHandleOnDragging, PanelResizeHandleProps, PointerHitAreaMargins, Panel, PanelGroup, PanelResizeHandle, usePanelGroupContext, assert, getIntersectingRectangle, intersects, getPanelElement, getPanelElementsForGroup, getPanelGroupElement, getResizeHandleElement, getResizeHandleElementIndex, getResizeHandleElementsForGroup, getResizeHandlePanelIds, enableGlobalCursorStyles, disableGlobalCursorStyles, setNonce, DATA_ATTRIBUTES, };
@@ -6,6 +6,22 @@ import { createContext, useLayoutEffect, useRef, forwardRef, createElement, useC
6
6
  const PanelGroupContext = createContext(null);
7
7
  PanelGroupContext.displayName = "PanelGroupContext";
8
8
 
9
+ const DATA_ATTRIBUTES = {
10
+ group: "data-panel-group",
11
+ groupDirection: "data-panel-group-direction",
12
+ groupId: "data-panel-group-id",
13
+ panel: "data-panel",
14
+ panelCollapsible: "data-panel-collapsible",
15
+ panelId: "data-panel-id",
16
+ panelSize: "data-panel-size",
17
+ resizeHandle: "data-resize-handle",
18
+ resizeHandleActive: "data-resize-handle-active",
19
+ resizeHandleEnabled: "data-panel-resize-handle-enabled",
20
+ resizeHandleId: "data-panel-resize-handle-id",
21
+ resizeHandleState: "data-resize-handle-state"
22
+ };
23
+ const PRECISION = 10;
24
+
9
25
  const useIsomorphicLayoutEffect = useLayoutEffect ;
10
26
 
11
27
  const useId = React["useId".toString()];
@@ -148,11 +164,11 @@ function PanelWithForwardedRef({
148
164
  ...styleFromProps
149
165
  },
150
166
  // CSS selectors
151
- "data-panel": "",
152
- "data-panel-collapsible": collapsible || undefined,
153
- "data-panel-group-id": groupId,
154
- "data-panel-id": panelId,
155
- "data-panel-size": parseFloat("" + style.flexGrow).toFixed(1)
167
+ [DATA_ATTRIBUTES.groupId]: groupId,
168
+ [DATA_ATTRIBUTES.panel]: "",
169
+ [DATA_ATTRIBUTES.panelCollapsible]: collapsible || undefined,
170
+ [DATA_ATTRIBUTES.panelId]: panelId,
171
+ [DATA_ATTRIBUTES.panelSize]: parseFloat("" + style.flexGrow).toFixed(1)
156
172
  });
157
173
  }
158
174
  const Panel = forwardRef((props, ref) => createElement(PanelWithForwardedRef, {
@@ -172,6 +188,7 @@ function setNonce(value) {
172
188
 
173
189
  let currentCursorStyle = null;
174
190
  let enabled = true;
191
+ let prevRuleIndex = -1;
175
192
  let styleElement = null;
176
193
  function disableGlobalCursorStyles() {
177
194
  enabled = false;
@@ -221,9 +238,11 @@ function resetGlobalCursorStyle() {
221
238
  document.head.removeChild(styleElement);
222
239
  currentCursorStyle = null;
223
240
  styleElement = null;
241
+ prevRuleIndex = -1;
224
242
  }
225
243
  }
226
244
  function setGlobalCursorStyle(state, constraintFlags) {
245
+ var _styleElement$sheet$i, _styleElement$sheet2;
227
246
  if (!enabled) {
228
247
  return;
229
248
  }
@@ -240,7 +259,11 @@ function setGlobalCursorStyle(state, constraintFlags) {
240
259
  }
241
260
  document.head.appendChild(styleElement);
242
261
  }
243
- styleElement.innerHTML = `*{cursor: ${style}!important;}`;
262
+ if (prevRuleIndex >= 0) {
263
+ var _styleElement$sheet;
264
+ (_styleElement$sheet = styleElement.sheet) === null || _styleElement$sheet === void 0 ? void 0 : _styleElement$sheet.removeRule(prevRuleIndex);
265
+ }
266
+ prevRuleIndex = (_styleElement$sheet$i = (_styleElement$sheet2 = styleElement.sheet) === null || _styleElement$sheet2 === void 0 ? void 0 : _styleElement$sheet2.insertRule(`*{cursor: ${style} !important;}`)) !== null && _styleElement$sheet$i !== void 0 ? _styleElement$sheet$i : -1;
244
267
  }
245
268
 
246
269
  function isKeyDown(event) {
@@ -471,7 +494,9 @@ function handlePointerDown(event) {
471
494
  if (intersectingHandles.length > 0) {
472
495
  updateResizeHandlerStates("down", event);
473
496
  event.preventDefault();
474
- event.stopPropagation();
497
+ if (!isWithinResizeHandle(target)) {
498
+ event.stopImmediatePropagation();
499
+ }
475
500
  }
476
501
  }
477
502
  function handlePointerMove(event) {
@@ -520,6 +545,9 @@ function handlePointerUp(event) {
520
545
  isPointerDown = false;
521
546
  if (intersectingHandles.length > 0) {
522
547
  event.preventDefault();
548
+ if (!isWithinResizeHandle(target)) {
549
+ event.stopImmediatePropagation();
550
+ }
523
551
  }
524
552
  updateResizeHandlerStates("up", event);
525
553
  recalculateIntersectingHandles({
@@ -530,6 +558,16 @@ function handlePointerUp(event) {
530
558
  updateCursor();
531
559
  updateListeners();
532
560
  }
561
+ function isWithinResizeHandle(element) {
562
+ let currentElement = element;
563
+ while (currentElement) {
564
+ if (currentElement.hasAttribute(DATA_ATTRIBUTES.resizeHandle)) {
565
+ return true;
566
+ }
567
+ currentElement = currentElement.parentElement;
568
+ }
569
+ return false;
570
+ }
533
571
  function recalculateIntersectingHandles({
534
572
  target,
535
573
  x,
@@ -621,49 +659,47 @@ function updateCursor() {
621
659
  resetGlobalCursorStyle();
622
660
  }
623
661
  }
662
+ let listenersAbortController = new AbortController();
624
663
  function updateListeners() {
625
- ownerDocumentCounts.forEach((_, ownerDocument) => {
626
- const {
627
- body
628
- } = ownerDocument;
629
- body.removeEventListener("contextmenu", handlePointerUp);
630
- body.removeEventListener("pointerdown", handlePointerDown, {
631
- capture: true
632
- });
633
- body.removeEventListener("pointerleave", handlePointerMove);
634
- body.removeEventListener("pointermove", handlePointerMove);
635
- });
636
- window.removeEventListener("pointerup", handlePointerUp);
637
- window.removeEventListener("pointercancel", handlePointerUp);
638
- if (registeredResizeHandlers.size > 0) {
639
- if (isPointerDown) {
640
- if (intersectingHandles.length > 0) {
641
- ownerDocumentCounts.forEach((count, ownerDocument) => {
642
- const {
643
- body
644
- } = ownerDocument;
645
- if (count > 0) {
646
- body.addEventListener("contextmenu", handlePointerUp);
647
- body.addEventListener("pointerleave", handlePointerMove);
648
- body.addEventListener("pointermove", handlePointerMove);
649
- }
650
- });
651
- }
652
- window.addEventListener("pointerup", handlePointerUp);
653
- window.addEventListener("pointercancel", handlePointerUp);
654
- } else {
664
+ listenersAbortController.abort();
665
+ listenersAbortController = new AbortController();
666
+ const options = {
667
+ capture: true,
668
+ signal: listenersAbortController.signal
669
+ };
670
+ if (!registeredResizeHandlers.size) {
671
+ return;
672
+ }
673
+ if (isPointerDown) {
674
+ if (intersectingHandles.length > 0) {
655
675
  ownerDocumentCounts.forEach((count, ownerDocument) => {
656
676
  const {
657
677
  body
658
678
  } = ownerDocument;
659
679
  if (count > 0) {
660
- body.addEventListener("pointerdown", handlePointerDown, {
661
- capture: true
662
- });
663
- body.addEventListener("pointermove", handlePointerMove);
680
+ body.addEventListener("contextmenu", handlePointerUp, options);
681
+ body.addEventListener("pointerleave", handlePointerMove, options);
682
+ body.addEventListener("pointermove", handlePointerMove, options);
664
683
  }
665
684
  });
666
685
  }
686
+ ownerDocumentCounts.forEach((_, ownerDocument) => {
687
+ const {
688
+ body
689
+ } = ownerDocument;
690
+ body.addEventListener("pointerup", handlePointerUp, options);
691
+ body.addEventListener("pointercancel", handlePointerUp, options);
692
+ });
693
+ } else {
694
+ ownerDocumentCounts.forEach((count, ownerDocument) => {
695
+ const {
696
+ body
697
+ } = ownerDocument;
698
+ if (count > 0) {
699
+ body.addEventListener("pointerdown", handlePointerDown, options);
700
+ body.addEventListener("pointermove", handlePointerMove, options);
701
+ }
702
+ });
667
703
  }
668
704
  }
669
705
  function updateResizeHandlerStates(action, event) {
@@ -688,8 +724,6 @@ function assert(expectedCondition, message) {
688
724
  }
689
725
  }
690
726
 
691
- const PRECISION = 10;
692
-
693
727
  function fuzzyCompareNumbers(actual, expected, fractionDigits = PRECISION) {
694
728
  if (actual.toFixed(fractionDigits) === expected.toFixed(fractionDigits)) {
695
729
  return 0;
@@ -1033,12 +1067,12 @@ function calculateAriaValues({
1033
1067
  }
1034
1068
 
1035
1069
  function getResizeHandleElementsForGroup(groupId, scope = document) {
1036
- return Array.from(scope.querySelectorAll(`[data-panel-resize-handle-id][data-panel-group-id="${groupId}"]`));
1070
+ return Array.from(scope.querySelectorAll(`[${DATA_ATTRIBUTES.resizeHandleId}][data-panel-group-id="${groupId}"]`));
1037
1071
  }
1038
1072
 
1039
1073
  function getResizeHandleElementIndex(groupId, id, scope = document) {
1040
1074
  const handles = getResizeHandleElementsForGroup(groupId, scope);
1041
- const index = handles.findIndex(handle => handle.getAttribute("data-panel-resize-handle-id") === id);
1075
+ const index = handles.findIndex(handle => handle.getAttribute(DATA_ATTRIBUTES.resizeHandleId) === id);
1042
1076
  return index !== null && index !== void 0 ? index : null;
1043
1077
  }
1044
1078
 
@@ -1063,7 +1097,7 @@ function getPanelGroupElement(id, rootElement = document) {
1063
1097
  }
1064
1098
 
1065
1099
  function getResizeHandleElement(id, scope = document) {
1066
- const element = scope.querySelector(`[data-panel-resize-handle-id="${id}"]`);
1100
+ const element = scope.querySelector(`[${DATA_ATTRIBUTES.resizeHandleId}="${id}"]`);
1067
1101
  if (element) {
1068
1102
  return element;
1069
1103
  }
@@ -1152,7 +1186,7 @@ function useWindowSplitterPanelGroupBehavior({
1152
1186
  const handles = getResizeHandleElementsForGroup(groupId, panelGroupElement);
1153
1187
  assert(handles, `No resize handles found for group id "${groupId}"`);
1154
1188
  const cleanupFunctions = handles.map(handle => {
1155
- const handleId = handle.getAttribute("data-panel-resize-handle-id");
1189
+ const handleId = handle.getAttribute(DATA_ATTRIBUTES.resizeHandleId);
1156
1190
  assert(handleId, `Resize handle element has no handle id attribute`);
1157
1191
  const [idBefore, idAfter] = getResizeHandlePanelIds(groupId, handleId, panelDataArray, panelGroupElement);
1158
1192
  if (idBefore == null || idAfter == null) {
@@ -1230,7 +1264,7 @@ function calculateDragOffsetPercentage(event, dragHandleId, direction, initialDr
1230
1264
  const isHorizontal = direction === "horizontal";
1231
1265
  const handleElement = getResizeHandleElement(dragHandleId, panelGroupElement);
1232
1266
  assert(handleElement, `No resize handle element found for id "${dragHandleId}"`);
1233
- const groupId = handleElement.getAttribute("data-panel-group-id");
1267
+ const groupId = handleElement.getAttribute(DATA_ATTRIBUTES.groupId);
1234
1268
  assert(groupId, `Resize handle element has no group id attribute`);
1235
1269
  let {
1236
1270
  initialCursorPosition
@@ -2236,9 +2270,9 @@ function PanelGroupWithForwardedRef({
2236
2270
  ...styleFromProps
2237
2271
  },
2238
2272
  // CSS selectors
2239
- "data-panel-group": "",
2240
- "data-panel-group-direction": direction,
2241
- "data-panel-group-id": groupId
2273
+ [DATA_ATTRIBUTES.group]: "",
2274
+ [DATA_ATTRIBUTES.groupDirection]: direction,
2275
+ [DATA_ATTRIBUTES.groupId]: groupId
2242
2276
  }));
2243
2277
  }
2244
2278
  const PanelGroup = forwardRef((props, ref) => createElement(PanelGroupWithForwardedRef, {
@@ -2297,7 +2331,7 @@ function useWindowSplitterResizeHandlerBehavior({
2297
2331
  case "F6":
2298
2332
  {
2299
2333
  event.preventDefault();
2300
- const groupId = handleElement.getAttribute("data-panel-group-id");
2334
+ const groupId = handleElement.getAttribute(DATA_ATTRIBUTES.groupId);
2301
2335
  assert(groupId, `No group element found for id "${groupId}"`);
2302
2336
  const handles = getResizeHandleElementsForGroup(groupId, panelGroupElement);
2303
2337
  const index = getResizeHandleElementIndex(groupId, handleId, panelGroupElement);
@@ -2392,54 +2426,54 @@ function PanelResizeHandle({
2392
2426
  assert(element, "Element ref not attached");
2393
2427
  let didMove = false;
2394
2428
  const setResizeHandlerState = (action, isActive, event) => {
2395
- if (isActive) {
2396
- switch (action) {
2397
- case "down":
2398
- {
2399
- setState("drag");
2400
- didMove = false;
2401
- assert(event, 'Expected event to be defined for "down" action');
2402
- startDragging(resizeHandleId, event);
2403
- const {
2404
- onDragging,
2405
- onPointerDown
2406
- } = callbacksRef.current;
2407
- onDragging === null || onDragging === void 0 ? void 0 : onDragging(true);
2408
- onPointerDown === null || onPointerDown === void 0 ? void 0 : onPointerDown();
2409
- break;
2410
- }
2411
- case "move":
2412
- {
2413
- const {
2414
- state
2415
- } = committedValuesRef.current;
2416
- didMove = true;
2417
- if (state !== "drag") {
2418
- setState("hover");
2419
- }
2420
- assert(event, 'Expected event to be defined for "move" action');
2421
- resizeHandler(event);
2422
- break;
2423
- }
2424
- case "up":
2425
- {
2429
+ if (!isActive) {
2430
+ setState("inactive");
2431
+ return;
2432
+ }
2433
+ switch (action) {
2434
+ case "down":
2435
+ {
2436
+ setState("drag");
2437
+ didMove = false;
2438
+ assert(event, 'Expected event to be defined for "down" action');
2439
+ startDragging(resizeHandleId, event);
2440
+ const {
2441
+ onDragging,
2442
+ onPointerDown
2443
+ } = callbacksRef.current;
2444
+ onDragging === null || onDragging === void 0 ? void 0 : onDragging(true);
2445
+ onPointerDown === null || onPointerDown === void 0 ? void 0 : onPointerDown();
2446
+ break;
2447
+ }
2448
+ case "move":
2449
+ {
2450
+ const {
2451
+ state
2452
+ } = committedValuesRef.current;
2453
+ didMove = true;
2454
+ if (state !== "drag") {
2426
2455
  setState("hover");
2427
- stopDragging();
2428
- const {
2429
- onClick,
2430
- onDragging,
2431
- onPointerUp
2432
- } = callbacksRef.current;
2433
- onDragging === null || onDragging === void 0 ? void 0 : onDragging(false);
2434
- onPointerUp === null || onPointerUp === void 0 ? void 0 : onPointerUp();
2435
- if (!didMove) {
2436
- onClick === null || onClick === void 0 ? void 0 : onClick();
2437
- }
2438
- break;
2439
2456
  }
2440
- }
2441
- } else {
2442
- setState("inactive");
2457
+ assert(event, 'Expected event to be defined for "move" action');
2458
+ resizeHandler(event);
2459
+ break;
2460
+ }
2461
+ case "up":
2462
+ {
2463
+ setState("hover");
2464
+ stopDragging();
2465
+ const {
2466
+ onClick,
2467
+ onDragging,
2468
+ onPointerUp
2469
+ } = callbacksRef.current;
2470
+ onDragging === null || onDragging === void 0 ? void 0 : onDragging(false);
2471
+ onPointerUp === null || onPointerUp === void 0 ? void 0 : onPointerUp();
2472
+ if (!didMove) {
2473
+ onClick === null || onClick === void 0 ? void 0 : onClick();
2474
+ }
2475
+ break;
2476
+ }
2443
2477
  }
2444
2478
  };
2445
2479
  return registerResizeHandle(resizeHandleId, element, direction, {
@@ -2478,17 +2512,25 @@ function PanelResizeHandle({
2478
2512
  },
2479
2513
  tabIndex,
2480
2514
  // CSS selectors
2481
- "data-panel-group-direction": direction,
2482
- "data-panel-group-id": groupId,
2483
- "data-resize-handle": "",
2484
- "data-resize-handle-active": state === "drag" ? "pointer" : isFocused ? "keyboard" : undefined,
2485
- "data-resize-handle-state": state,
2486
- "data-panel-resize-handle-enabled": !disabled,
2487
- "data-panel-resize-handle-id": resizeHandleId
2515
+ [DATA_ATTRIBUTES.groupDirection]: direction,
2516
+ [DATA_ATTRIBUTES.groupId]: groupId,
2517
+ [DATA_ATTRIBUTES.resizeHandle]: "",
2518
+ [DATA_ATTRIBUTES.resizeHandleActive]: state === "drag" ? "pointer" : isFocused ? "keyboard" : undefined,
2519
+ [DATA_ATTRIBUTES.resizeHandleEnabled]: !disabled,
2520
+ [DATA_ATTRIBUTES.resizeHandleId]: resizeHandleId,
2521
+ [DATA_ATTRIBUTES.resizeHandleState]: state
2488
2522
  });
2489
2523
  }
2490
2524
  PanelResizeHandle.displayName = "PanelResizeHandle";
2491
2525
 
2526
+ function usePanelGroupContext() {
2527
+ const context = useContext(PanelGroupContext);
2528
+ return {
2529
+ direction: context === null || context === void 0 ? void 0 : context.direction,
2530
+ groupId: context === null || context === void 0 ? void 0 : context.groupId
2531
+ };
2532
+ }
2533
+
2492
2534
  function getPanelElement(id, scope = document) {
2493
2535
  const element = scope.querySelector(`[data-panel-id="${id}"]`);
2494
2536
  if (element) {
@@ -2518,4 +2560,4 @@ function getIntersectingRectangle(rectOne, rectTwo, strict) {
2518
2560
  };
2519
2561
  }
2520
2562
 
2521
- export { Panel, PanelGroup, PanelResizeHandle, assert, disableGlobalCursorStyles, enableGlobalCursorStyles, getIntersectingRectangle, getPanelElement, getPanelElementsForGroup, getPanelGroupElement, getResizeHandleElement, getResizeHandleElementIndex, getResizeHandleElementsForGroup, getResizeHandlePanelIds, intersects, setNonce };
2563
+ export { DATA_ATTRIBUTES, Panel, PanelGroup, PanelResizeHandle, assert, disableGlobalCursorStyles, enableGlobalCursorStyles, getIntersectingRectangle, getPanelElement, getPanelElementsForGroup, getPanelGroupElement, getResizeHandleElement, getResizeHandleElementIndex, getResizeHandleElementsForGroup, getResizeHandlePanelIds, intersects, setNonce, usePanelGroupContext };