react-resizable-panels 2.0.15 → 2.0.17

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.17
4
+
5
+ - Prevent pointer events handled by resize handles from triggering elements behind/underneath (#338)
6
+
7
+ ## 2.0.16
8
+
9
+ - Replaced .toPrecision() with .toFixed() to avoid undesirable layout shift (#323)
10
+
3
11
  ## 2.0.15
4
12
 
5
13
  - Better account for high-precision sizes with `onCollapse` and `onExpand` callbacks (#325)
package/README.md CHANGED
@@ -6,7 +6,7 @@ React components for resizable panel groups/layouts
6
6
  import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
7
7
 
8
8
  <PanelGroup autoSaveId="example" direction="horizontal">
9
- <Panel defaultSizePercentage={25}>
9
+ <Panel defaultSize={25}>
10
10
  <SourcesExplorer />
11
11
  </Panel>
12
12
  <PanelResizeHandle />
@@ -14,7 +14,7 @@ import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
14
14
  <SourceViewer />
15
15
  </Panel>
16
16
  <PanelResizeHandle />
17
- <Panel defaultSizePercentage={25}>
17
+ <Panel defaultSize={25}>
18
18
  <Console />
19
19
  </Panel>
20
20
  </PanelGroup>;
@@ -74,7 +74,7 @@ import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
74
74
  `Panel` components also expose an imperative API for manual resizing:
75
75
  | method | description |
76
76
  | :----------------------- | :--------------------------------------------------------------------------------- |
77
- | `collapse()`v | If panel is `collapsible`, collapse it fully. |
77
+ | `collapse()` | If panel is `collapsible`, collapse it fully. |
78
78
  | `expand()` | If panel is currently _collapsed_, expand it to its most recent size. |
79
79
  | `getId(): string` | Gets the ID of the panel. |
80
80
  | `getSize(): number` | Gets the current size of the panel as a percentage (`1 - 100`). |
@@ -1,3 +1,3 @@
1
1
  export type Direction = "horizontal" | "vertical";
2
- export type ResizeEvent = KeyboardEvent | MouseEvent | TouchEvent;
2
+ export type ResizeEvent = KeyboardEvent | PointerEvent | MouseEvent;
3
3
  export type ResizeHandler = (event: ResizeEvent) => void;
@@ -47,6 +47,8 @@ const {
47
47
  const useId = React__namespace["useId".toString()];
48
48
  const useLayoutEffect_do_not_use_directly = useLayoutEffect;
49
49
 
50
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
51
+
50
52
  const PanelGroupContext = createContext(null);
51
53
  PanelGroupContext.displayName = "PanelGroupContext";
52
54
 
@@ -261,27 +263,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
261
263
  function isKeyDown(event) {
262
264
  return event.type === "keydown";
263
265
  }
266
+ function isPointerEvent(event) {
267
+ return event.type.startsWith("pointer");
268
+ }
264
269
  function isMouseEvent(event) {
265
270
  return event.type.startsWith("mouse");
266
271
  }
267
- function isTouchEvent(event) {
268
- return event.type.startsWith("touch");
269
- }
270
272
 
271
273
  function getResizeEventCoordinates(event) {
272
- if (isMouseEvent(event)) {
274
+ if (isPointerEvent(event)) {
275
+ if (event.isPrimary) {
276
+ return {
277
+ x: event.clientX,
278
+ y: event.clientY
279
+ };
280
+ }
281
+ } else if (isMouseEvent(event)) {
273
282
  return {
274
283
  x: event.clientX,
275
284
  y: event.clientY
276
285
  };
277
- } else if (isTouchEvent(event)) {
278
- const touch = event.touches[0];
279
- if (touch && touch.clientX && touch.clientY) {
280
- return {
281
- x: touch.clientX,
282
- y: touch.clientY
283
- };
284
- }
285
286
  }
286
287
  return {
287
288
  x: Infinity,
@@ -473,6 +474,7 @@ function handlePointerDown(event) {
473
474
  if (intersectingHandles.length > 0) {
474
475
  updateResizeHandlerStates("down", event);
475
476
  event.preventDefault();
477
+ event.stopPropagation();
476
478
  }
477
479
  }
478
480
  function handlePointerMove(event) {
@@ -621,15 +623,12 @@ function updateListeners() {
621
623
  body
622
624
  } = ownerDocument;
623
625
  body.removeEventListener("contextmenu", handlePointerUp);
624
- body.removeEventListener("mousedown", handlePointerDown);
625
- body.removeEventListener("mouseleave", handlePointerMove);
626
- body.removeEventListener("mousemove", handlePointerMove);
627
- body.removeEventListener("touchmove", handlePointerMove);
628
- body.removeEventListener("touchstart", handlePointerDown);
626
+ body.removeEventListener("pointerdown", handlePointerDown);
627
+ body.removeEventListener("pointerleave", handlePointerMove);
628
+ body.removeEventListener("pointermove", handlePointerMove);
629
629
  });
630
- window.removeEventListener("mouseup", handlePointerUp);
631
- window.removeEventListener("touchcancel", handlePointerUp);
632
- window.removeEventListener("touchend", handlePointerUp);
630
+ window.removeEventListener("pointerup", handlePointerUp);
631
+ window.removeEventListener("pointercancel", handlePointerUp);
633
632
  if (registeredResizeHandlers.size > 0) {
634
633
  if (isPointerDown) {
635
634
  if (intersectingHandles.length > 0) {
@@ -639,29 +638,23 @@ function updateListeners() {
639
638
  } = ownerDocument;
640
639
  if (count > 0) {
641
640
  body.addEventListener("contextmenu", handlePointerUp);
642
- body.addEventListener("mouseleave", handlePointerMove);
643
- body.addEventListener("mousemove", handlePointerMove);
644
- body.addEventListener("touchmove", handlePointerMove, {
645
- passive: false
646
- });
641
+ body.addEventListener("pointerleave", handlePointerMove);
642
+ body.addEventListener("pointermove", handlePointerMove);
647
643
  }
648
644
  });
649
645
  }
650
- window.addEventListener("mouseup", handlePointerUp);
651
- window.addEventListener("touchcancel", handlePointerUp);
652
- window.addEventListener("touchend", handlePointerUp);
646
+ window.addEventListener("pointerup", handlePointerUp);
647
+ window.addEventListener("pointercancel", handlePointerUp);
653
648
  } else {
654
649
  ownerDocumentCounts.forEach((count, ownerDocument) => {
655
650
  const {
656
651
  body
657
652
  } = ownerDocument;
658
653
  if (count > 0) {
659
- body.addEventListener("mousedown", handlePointerDown);
660
- body.addEventListener("mousemove", handlePointerMove);
661
- body.addEventListener("touchmove", handlePointerMove, {
662
- passive: false
654
+ body.addEventListener("pointerdown", handlePointerDown, {
655
+ capture: true
663
656
  });
664
- body.addEventListener("touchstart", handlePointerDown);
657
+ body.addEventListener("pointermove", handlePointerMove);
665
658
  }
666
659
  });
667
660
  }
@@ -1949,7 +1942,7 @@ function PanelGroupWithForwardedRef({
1949
1942
 
1950
1943
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
1951
1944
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
1952
- if (isMouseEvent(event) || isTouchEvent(event)) {
1945
+ if (isPointerEvent(event) || isMouseEvent(event)) {
1953
1946
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
1954
1947
  // In this case, Panel sizes might not change–
1955
1948
  // but updating cursor in this scenario would cause a flicker.
@@ -47,6 +47,8 @@ const {
47
47
  const useId = React__namespace["useId".toString()];
48
48
  const useLayoutEffect_do_not_use_directly = useLayoutEffect;
49
49
 
50
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
51
+
50
52
  const PanelGroupContext = createContext(null);
51
53
  PanelGroupContext.displayName = "PanelGroupContext";
52
54
 
@@ -267,27 +269,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
267
269
  function isKeyDown(event) {
268
270
  return event.type === "keydown";
269
271
  }
272
+ function isPointerEvent(event) {
273
+ return event.type.startsWith("pointer");
274
+ }
270
275
  function isMouseEvent(event) {
271
276
  return event.type.startsWith("mouse");
272
277
  }
273
- function isTouchEvent(event) {
274
- return event.type.startsWith("touch");
275
- }
276
278
 
277
279
  function getResizeEventCoordinates(event) {
278
- if (isMouseEvent(event)) {
280
+ if (isPointerEvent(event)) {
281
+ if (event.isPrimary) {
282
+ return {
283
+ x: event.clientX,
284
+ y: event.clientY
285
+ };
286
+ }
287
+ } else if (isMouseEvent(event)) {
279
288
  return {
280
289
  x: event.clientX,
281
290
  y: event.clientY
282
291
  };
283
- } else if (isTouchEvent(event)) {
284
- const touch = event.touches[0];
285
- if (touch && touch.clientX && touch.clientY) {
286
- return {
287
- x: touch.clientX,
288
- y: touch.clientY
289
- };
290
- }
291
292
  }
292
293
  return {
293
294
  x: Infinity,
@@ -479,6 +480,7 @@ function handlePointerDown(event) {
479
480
  if (intersectingHandles.length > 0) {
480
481
  updateResizeHandlerStates("down", event);
481
482
  event.preventDefault();
483
+ event.stopPropagation();
482
484
  }
483
485
  }
484
486
  function handlePointerMove(event) {
@@ -627,15 +629,12 @@ function updateListeners() {
627
629
  body
628
630
  } = ownerDocument;
629
631
  body.removeEventListener("contextmenu", handlePointerUp);
630
- body.removeEventListener("mousedown", handlePointerDown);
631
- body.removeEventListener("mouseleave", handlePointerMove);
632
- body.removeEventListener("mousemove", handlePointerMove);
633
- body.removeEventListener("touchmove", handlePointerMove);
634
- body.removeEventListener("touchstart", handlePointerDown);
632
+ body.removeEventListener("pointerdown", handlePointerDown);
633
+ body.removeEventListener("pointerleave", handlePointerMove);
634
+ body.removeEventListener("pointermove", handlePointerMove);
635
635
  });
636
- window.removeEventListener("mouseup", handlePointerUp);
637
- window.removeEventListener("touchcancel", handlePointerUp);
638
- window.removeEventListener("touchend", handlePointerUp);
636
+ window.removeEventListener("pointerup", handlePointerUp);
637
+ window.removeEventListener("pointercancel", handlePointerUp);
639
638
  if (registeredResizeHandlers.size > 0) {
640
639
  if (isPointerDown) {
641
640
  if (intersectingHandles.length > 0) {
@@ -645,29 +644,23 @@ function updateListeners() {
645
644
  } = ownerDocument;
646
645
  if (count > 0) {
647
646
  body.addEventListener("contextmenu", handlePointerUp);
648
- body.addEventListener("mouseleave", handlePointerMove);
649
- body.addEventListener("mousemove", handlePointerMove);
650
- body.addEventListener("touchmove", handlePointerMove, {
651
- passive: false
652
- });
647
+ body.addEventListener("pointerleave", handlePointerMove);
648
+ body.addEventListener("pointermove", handlePointerMove);
653
649
  }
654
650
  });
655
651
  }
656
- window.addEventListener("mouseup", handlePointerUp);
657
- window.addEventListener("touchcancel", handlePointerUp);
658
- window.addEventListener("touchend", handlePointerUp);
652
+ window.addEventListener("pointerup", handlePointerUp);
653
+ window.addEventListener("pointercancel", handlePointerUp);
659
654
  } else {
660
655
  ownerDocumentCounts.forEach((count, ownerDocument) => {
661
656
  const {
662
657
  body
663
658
  } = ownerDocument;
664
659
  if (count > 0) {
665
- body.addEventListener("mousedown", handlePointerDown);
666
- body.addEventListener("mousemove", handlePointerMove);
667
- body.addEventListener("touchmove", handlePointerMove, {
668
- passive: false
660
+ body.addEventListener("pointerdown", handlePointerDown, {
661
+ capture: true
669
662
  });
670
- body.addEventListener("touchstart", handlePointerDown);
663
+ body.addEventListener("pointermove", handlePointerMove);
671
664
  }
672
665
  });
673
666
  }
@@ -2055,7 +2048,7 @@ function PanelGroupWithForwardedRef({
2055
2048
 
2056
2049
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
2057
2050
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
2058
- if (isMouseEvent(event) || isTouchEvent(event)) {
2051
+ if (isPointerEvent(event) || isMouseEvent(event)) {
2059
2052
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
2060
2053
  // In this case, Panel sizes might not change–
2061
2054
  // but updating cursor in this scenario would cause a flicker.
@@ -23,6 +23,8 @@ const {
23
23
  const useId = React["useId".toString()];
24
24
  const useLayoutEffect_do_not_use_directly = useLayoutEffect;
25
25
 
26
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
27
+
26
28
  const PanelGroupContext = createContext(null);
27
29
  PanelGroupContext.displayName = "PanelGroupContext";
28
30
 
@@ -243,27 +245,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
243
245
  function isKeyDown(event) {
244
246
  return event.type === "keydown";
245
247
  }
248
+ function isPointerEvent(event) {
249
+ return event.type.startsWith("pointer");
250
+ }
246
251
  function isMouseEvent(event) {
247
252
  return event.type.startsWith("mouse");
248
253
  }
249
- function isTouchEvent(event) {
250
- return event.type.startsWith("touch");
251
- }
252
254
 
253
255
  function getResizeEventCoordinates(event) {
254
- if (isMouseEvent(event)) {
256
+ if (isPointerEvent(event)) {
257
+ if (event.isPrimary) {
258
+ return {
259
+ x: event.clientX,
260
+ y: event.clientY
261
+ };
262
+ }
263
+ } else if (isMouseEvent(event)) {
255
264
  return {
256
265
  x: event.clientX,
257
266
  y: event.clientY
258
267
  };
259
- } else if (isTouchEvent(event)) {
260
- const touch = event.touches[0];
261
- if (touch && touch.clientX && touch.clientY) {
262
- return {
263
- x: touch.clientX,
264
- y: touch.clientY
265
- };
266
- }
267
268
  }
268
269
  return {
269
270
  x: Infinity,
@@ -455,6 +456,7 @@ function handlePointerDown(event) {
455
456
  if (intersectingHandles.length > 0) {
456
457
  updateResizeHandlerStates("down", event);
457
458
  event.preventDefault();
459
+ event.stopPropagation();
458
460
  }
459
461
  }
460
462
  function handlePointerMove(event) {
@@ -603,15 +605,12 @@ function updateListeners() {
603
605
  body
604
606
  } = ownerDocument;
605
607
  body.removeEventListener("contextmenu", handlePointerUp);
606
- body.removeEventListener("mousedown", handlePointerDown);
607
- body.removeEventListener("mouseleave", handlePointerMove);
608
- body.removeEventListener("mousemove", handlePointerMove);
609
- body.removeEventListener("touchmove", handlePointerMove);
610
- body.removeEventListener("touchstart", handlePointerDown);
608
+ body.removeEventListener("pointerdown", handlePointerDown);
609
+ body.removeEventListener("pointerleave", handlePointerMove);
610
+ body.removeEventListener("pointermove", handlePointerMove);
611
611
  });
612
- window.removeEventListener("mouseup", handlePointerUp);
613
- window.removeEventListener("touchcancel", handlePointerUp);
614
- window.removeEventListener("touchend", handlePointerUp);
612
+ window.removeEventListener("pointerup", handlePointerUp);
613
+ window.removeEventListener("pointercancel", handlePointerUp);
615
614
  if (registeredResizeHandlers.size > 0) {
616
615
  if (isPointerDown) {
617
616
  if (intersectingHandles.length > 0) {
@@ -621,29 +620,23 @@ function updateListeners() {
621
620
  } = ownerDocument;
622
621
  if (count > 0) {
623
622
  body.addEventListener("contextmenu", handlePointerUp);
624
- body.addEventListener("mouseleave", handlePointerMove);
625
- body.addEventListener("mousemove", handlePointerMove);
626
- body.addEventListener("touchmove", handlePointerMove, {
627
- passive: false
628
- });
623
+ body.addEventListener("pointerleave", handlePointerMove);
624
+ body.addEventListener("pointermove", handlePointerMove);
629
625
  }
630
626
  });
631
627
  }
632
- window.addEventListener("mouseup", handlePointerUp);
633
- window.addEventListener("touchcancel", handlePointerUp);
634
- window.addEventListener("touchend", handlePointerUp);
628
+ window.addEventListener("pointerup", handlePointerUp);
629
+ window.addEventListener("pointercancel", handlePointerUp);
635
630
  } else {
636
631
  ownerDocumentCounts.forEach((count, ownerDocument) => {
637
632
  const {
638
633
  body
639
634
  } = ownerDocument;
640
635
  if (count > 0) {
641
- body.addEventListener("mousedown", handlePointerDown);
642
- body.addEventListener("mousemove", handlePointerMove);
643
- body.addEventListener("touchmove", handlePointerMove, {
644
- passive: false
636
+ body.addEventListener("pointerdown", handlePointerDown, {
637
+ capture: true
645
638
  });
646
- body.addEventListener("touchstart", handlePointerDown);
639
+ body.addEventListener("pointermove", handlePointerMove);
647
640
  }
648
641
  });
649
642
  }
@@ -2031,7 +2024,7 @@ function PanelGroupWithForwardedRef({
2031
2024
 
2032
2025
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
2033
2026
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
2034
- if (isMouseEvent(event) || isTouchEvent(event)) {
2027
+ if (isPointerEvent(event) || isMouseEvent(event)) {
2035
2028
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
2036
2029
  // In this case, Panel sizes might not change–
2037
2030
  // but updating cursor in this scenario would cause a flicker.
@@ -23,6 +23,8 @@ const {
23
23
  const useId = React["useId".toString()];
24
24
  const useLayoutEffect_do_not_use_directly = useLayoutEffect;
25
25
 
26
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
27
+
26
28
  const PanelGroupContext = createContext(null);
27
29
  PanelGroupContext.displayName = "PanelGroupContext";
28
30
 
@@ -237,27 +239,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
237
239
  function isKeyDown(event) {
238
240
  return event.type === "keydown";
239
241
  }
242
+ function isPointerEvent(event) {
243
+ return event.type.startsWith("pointer");
244
+ }
240
245
  function isMouseEvent(event) {
241
246
  return event.type.startsWith("mouse");
242
247
  }
243
- function isTouchEvent(event) {
244
- return event.type.startsWith("touch");
245
- }
246
248
 
247
249
  function getResizeEventCoordinates(event) {
248
- if (isMouseEvent(event)) {
250
+ if (isPointerEvent(event)) {
251
+ if (event.isPrimary) {
252
+ return {
253
+ x: event.clientX,
254
+ y: event.clientY
255
+ };
256
+ }
257
+ } else if (isMouseEvent(event)) {
249
258
  return {
250
259
  x: event.clientX,
251
260
  y: event.clientY
252
261
  };
253
- } else if (isTouchEvent(event)) {
254
- const touch = event.touches[0];
255
- if (touch && touch.clientX && touch.clientY) {
256
- return {
257
- x: touch.clientX,
258
- y: touch.clientY
259
- };
260
- }
261
262
  }
262
263
  return {
263
264
  x: Infinity,
@@ -449,6 +450,7 @@ function handlePointerDown(event) {
449
450
  if (intersectingHandles.length > 0) {
450
451
  updateResizeHandlerStates("down", event);
451
452
  event.preventDefault();
453
+ event.stopPropagation();
452
454
  }
453
455
  }
454
456
  function handlePointerMove(event) {
@@ -597,15 +599,12 @@ function updateListeners() {
597
599
  body
598
600
  } = ownerDocument;
599
601
  body.removeEventListener("contextmenu", handlePointerUp);
600
- body.removeEventListener("mousedown", handlePointerDown);
601
- body.removeEventListener("mouseleave", handlePointerMove);
602
- body.removeEventListener("mousemove", handlePointerMove);
603
- body.removeEventListener("touchmove", handlePointerMove);
604
- body.removeEventListener("touchstart", handlePointerDown);
602
+ body.removeEventListener("pointerdown", handlePointerDown);
603
+ body.removeEventListener("pointerleave", handlePointerMove);
604
+ body.removeEventListener("pointermove", handlePointerMove);
605
605
  });
606
- window.removeEventListener("mouseup", handlePointerUp);
607
- window.removeEventListener("touchcancel", handlePointerUp);
608
- window.removeEventListener("touchend", handlePointerUp);
606
+ window.removeEventListener("pointerup", handlePointerUp);
607
+ window.removeEventListener("pointercancel", handlePointerUp);
609
608
  if (registeredResizeHandlers.size > 0) {
610
609
  if (isPointerDown) {
611
610
  if (intersectingHandles.length > 0) {
@@ -615,29 +614,23 @@ function updateListeners() {
615
614
  } = ownerDocument;
616
615
  if (count > 0) {
617
616
  body.addEventListener("contextmenu", handlePointerUp);
618
- body.addEventListener("mouseleave", handlePointerMove);
619
- body.addEventListener("mousemove", handlePointerMove);
620
- body.addEventListener("touchmove", handlePointerMove, {
621
- passive: false
622
- });
617
+ body.addEventListener("pointerleave", handlePointerMove);
618
+ body.addEventListener("pointermove", handlePointerMove);
623
619
  }
624
620
  });
625
621
  }
626
- window.addEventListener("mouseup", handlePointerUp);
627
- window.addEventListener("touchcancel", handlePointerUp);
628
- window.addEventListener("touchend", handlePointerUp);
622
+ window.addEventListener("pointerup", handlePointerUp);
623
+ window.addEventListener("pointercancel", handlePointerUp);
629
624
  } else {
630
625
  ownerDocumentCounts.forEach((count, ownerDocument) => {
631
626
  const {
632
627
  body
633
628
  } = ownerDocument;
634
629
  if (count > 0) {
635
- body.addEventListener("mousedown", handlePointerDown);
636
- body.addEventListener("mousemove", handlePointerMove);
637
- body.addEventListener("touchmove", handlePointerMove, {
638
- passive: false
630
+ body.addEventListener("pointerdown", handlePointerDown, {
631
+ capture: true
639
632
  });
640
- body.addEventListener("touchstart", handlePointerDown);
633
+ body.addEventListener("pointermove", handlePointerMove);
641
634
  }
642
635
  });
643
636
  }
@@ -1925,7 +1918,7 @@ function PanelGroupWithForwardedRef({
1925
1918
 
1926
1919
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
1927
1920
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
1928
- if (isMouseEvent(event) || isTouchEvent(event)) {
1921
+ if (isPointerEvent(event) || isMouseEvent(event)) {
1929
1922
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
1930
1923
  // In this case, Panel sizes might not change–
1931
1924
  // but updating cursor in this scenario would cause a flicker.
@@ -49,6 +49,8 @@ const {
49
49
  const useId = React__namespace["useId".toString()];
50
50
  const useLayoutEffect_do_not_use_directly = useLayoutEffect;
51
51
 
52
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
53
+
52
54
  const PanelGroupContext = createContext(null);
53
55
  PanelGroupContext.displayName = "PanelGroupContext";
54
56
 
@@ -263,27 +265,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
263
265
  function isKeyDown(event) {
264
266
  return event.type === "keydown";
265
267
  }
268
+ function isPointerEvent(event) {
269
+ return event.type.startsWith("pointer");
270
+ }
266
271
  function isMouseEvent(event) {
267
272
  return event.type.startsWith("mouse");
268
273
  }
269
- function isTouchEvent(event) {
270
- return event.type.startsWith("touch");
271
- }
272
274
 
273
275
  function getResizeEventCoordinates(event) {
274
- if (isMouseEvent(event)) {
276
+ if (isPointerEvent(event)) {
277
+ if (event.isPrimary) {
278
+ return {
279
+ x: event.clientX,
280
+ y: event.clientY
281
+ };
282
+ }
283
+ } else if (isMouseEvent(event)) {
275
284
  return {
276
285
  x: event.clientX,
277
286
  y: event.clientY
278
287
  };
279
- } else if (isTouchEvent(event)) {
280
- const touch = event.touches[0];
281
- if (touch && touch.clientX && touch.clientY) {
282
- return {
283
- x: touch.clientX,
284
- y: touch.clientY
285
- };
286
- }
287
288
  }
288
289
  return {
289
290
  x: Infinity,
@@ -475,6 +476,7 @@ function handlePointerDown(event) {
475
476
  if (intersectingHandles.length > 0) {
476
477
  updateResizeHandlerStates("down", event);
477
478
  event.preventDefault();
479
+ event.stopPropagation();
478
480
  }
479
481
  }
480
482
  function handlePointerMove(event) {
@@ -623,15 +625,12 @@ function updateListeners() {
623
625
  body
624
626
  } = ownerDocument;
625
627
  body.removeEventListener("contextmenu", handlePointerUp);
626
- body.removeEventListener("mousedown", handlePointerDown);
627
- body.removeEventListener("mouseleave", handlePointerMove);
628
- body.removeEventListener("mousemove", handlePointerMove);
629
- body.removeEventListener("touchmove", handlePointerMove);
630
- body.removeEventListener("touchstart", handlePointerDown);
628
+ body.removeEventListener("pointerdown", handlePointerDown);
629
+ body.removeEventListener("pointerleave", handlePointerMove);
630
+ body.removeEventListener("pointermove", handlePointerMove);
631
631
  });
632
- window.removeEventListener("mouseup", handlePointerUp);
633
- window.removeEventListener("touchcancel", handlePointerUp);
634
- window.removeEventListener("touchend", handlePointerUp);
632
+ window.removeEventListener("pointerup", handlePointerUp);
633
+ window.removeEventListener("pointercancel", handlePointerUp);
635
634
  if (registeredResizeHandlers.size > 0) {
636
635
  if (isPointerDown) {
637
636
  if (intersectingHandles.length > 0) {
@@ -641,29 +640,23 @@ function updateListeners() {
641
640
  } = ownerDocument;
642
641
  if (count > 0) {
643
642
  body.addEventListener("contextmenu", handlePointerUp);
644
- body.addEventListener("mouseleave", handlePointerMove);
645
- body.addEventListener("mousemove", handlePointerMove);
646
- body.addEventListener("touchmove", handlePointerMove, {
647
- passive: false
648
- });
643
+ body.addEventListener("pointerleave", handlePointerMove);
644
+ body.addEventListener("pointermove", handlePointerMove);
649
645
  }
650
646
  });
651
647
  }
652
- window.addEventListener("mouseup", handlePointerUp);
653
- window.addEventListener("touchcancel", handlePointerUp);
654
- window.addEventListener("touchend", handlePointerUp);
648
+ window.addEventListener("pointerup", handlePointerUp);
649
+ window.addEventListener("pointercancel", handlePointerUp);
655
650
  } else {
656
651
  ownerDocumentCounts.forEach((count, ownerDocument) => {
657
652
  const {
658
653
  body
659
654
  } = ownerDocument;
660
655
  if (count > 0) {
661
- body.addEventListener("mousedown", handlePointerDown);
662
- body.addEventListener("mousemove", handlePointerMove);
663
- body.addEventListener("touchmove", handlePointerMove, {
664
- passive: false
656
+ body.addEventListener("pointerdown", handlePointerDown, {
657
+ capture: true
665
658
  });
666
- body.addEventListener("touchstart", handlePointerDown);
659
+ body.addEventListener("pointermove", handlePointerMove);
667
660
  }
668
661
  });
669
662
  }
@@ -1951,7 +1944,7 @@ function PanelGroupWithForwardedRef({
1951
1944
 
1952
1945
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
1953
1946
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
1954
- if (isMouseEvent(event) || isTouchEvent(event)) {
1947
+ if (isPointerEvent(event) || isMouseEvent(event)) {
1955
1948
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
1956
1949
  // In this case, Panel sizes might not change–
1957
1950
  // but updating cursor in this scenario would cause a flicker.