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.
@@ -46,6 +46,8 @@ const {
46
46
  // `toString()` prevents bundlers from trying to `import { useId } from 'react'`
47
47
  const useId = React__namespace["useId".toString()];
48
48
 
49
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
50
+
49
51
  const PanelGroupContext = createContext(null);
50
52
  PanelGroupContext.displayName = "PanelGroupContext";
51
53
 
@@ -225,27 +227,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
225
227
  function isKeyDown(event) {
226
228
  return event.type === "keydown";
227
229
  }
230
+ function isPointerEvent(event) {
231
+ return event.type.startsWith("pointer");
232
+ }
228
233
  function isMouseEvent(event) {
229
234
  return event.type.startsWith("mouse");
230
235
  }
231
- function isTouchEvent(event) {
232
- return event.type.startsWith("touch");
233
- }
234
236
 
235
237
  function getResizeEventCoordinates(event) {
236
- if (isMouseEvent(event)) {
238
+ if (isPointerEvent(event)) {
239
+ if (event.isPrimary) {
240
+ return {
241
+ x: event.clientX,
242
+ y: event.clientY
243
+ };
244
+ }
245
+ } else if (isMouseEvent(event)) {
237
246
  return {
238
247
  x: event.clientX,
239
248
  y: event.clientY
240
249
  };
241
- } else if (isTouchEvent(event)) {
242
- const touch = event.touches[0];
243
- if (touch && touch.clientX && touch.clientY) {
244
- return {
245
- x: touch.clientX,
246
- y: touch.clientY
247
- };
248
- }
249
250
  }
250
251
  return {
251
252
  x: Infinity,
@@ -437,6 +438,7 @@ function handlePointerDown(event) {
437
438
  if (intersectingHandles.length > 0) {
438
439
  updateResizeHandlerStates("down", event);
439
440
  event.preventDefault();
441
+ event.stopPropagation();
440
442
  }
441
443
  }
442
444
  function handlePointerMove(event) {
@@ -585,15 +587,12 @@ function updateListeners() {
585
587
  body
586
588
  } = ownerDocument;
587
589
  body.removeEventListener("contextmenu", handlePointerUp);
588
- body.removeEventListener("mousedown", handlePointerDown);
589
- body.removeEventListener("mouseleave", handlePointerMove);
590
- body.removeEventListener("mousemove", handlePointerMove);
591
- body.removeEventListener("touchmove", handlePointerMove);
592
- body.removeEventListener("touchstart", handlePointerDown);
590
+ body.removeEventListener("pointerdown", handlePointerDown);
591
+ body.removeEventListener("pointerleave", handlePointerMove);
592
+ body.removeEventListener("pointermove", handlePointerMove);
593
593
  });
594
- window.removeEventListener("mouseup", handlePointerUp);
595
- window.removeEventListener("touchcancel", handlePointerUp);
596
- window.removeEventListener("touchend", handlePointerUp);
594
+ window.removeEventListener("pointerup", handlePointerUp);
595
+ window.removeEventListener("pointercancel", handlePointerUp);
597
596
  if (registeredResizeHandlers.size > 0) {
598
597
  if (isPointerDown) {
599
598
  if (intersectingHandles.length > 0) {
@@ -603,29 +602,23 @@ function updateListeners() {
603
602
  } = ownerDocument;
604
603
  if (count > 0) {
605
604
  body.addEventListener("contextmenu", handlePointerUp);
606
- body.addEventListener("mouseleave", handlePointerMove);
607
- body.addEventListener("mousemove", handlePointerMove);
608
- body.addEventListener("touchmove", handlePointerMove, {
609
- passive: false
610
- });
605
+ body.addEventListener("pointerleave", handlePointerMove);
606
+ body.addEventListener("pointermove", handlePointerMove);
611
607
  }
612
608
  });
613
609
  }
614
- window.addEventListener("mouseup", handlePointerUp);
615
- window.addEventListener("touchcancel", handlePointerUp);
616
- window.addEventListener("touchend", handlePointerUp);
610
+ window.addEventListener("pointerup", handlePointerUp);
611
+ window.addEventListener("pointercancel", handlePointerUp);
617
612
  } else {
618
613
  ownerDocumentCounts.forEach((count, ownerDocument) => {
619
614
  const {
620
615
  body
621
616
  } = ownerDocument;
622
617
  if (count > 0) {
623
- body.addEventListener("mousedown", handlePointerDown);
624
- body.addEventListener("mousemove", handlePointerMove);
625
- body.addEventListener("touchmove", handlePointerMove, {
626
- passive: false
618
+ body.addEventListener("pointerdown", handlePointerDown, {
619
+ capture: true
627
620
  });
628
- body.addEventListener("touchstart", handlePointerDown);
621
+ body.addEventListener("pointermove", handlePointerMove);
629
622
  }
630
623
  });
631
624
  }
@@ -1729,7 +1722,7 @@ function PanelGroupWithForwardedRef({
1729
1722
 
1730
1723
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
1731
1724
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
1732
- if (isMouseEvent(event) || isTouchEvent(event)) {
1725
+ if (isPointerEvent(event) || isMouseEvent(event)) {
1733
1726
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
1734
1727
  // In this case, Panel sizes might not change–
1735
1728
  // but updating cursor in this scenario would cause a flicker.
@@ -22,6 +22,8 @@ const {
22
22
  // `toString()` prevents bundlers from trying to `import { useId } from 'react'`
23
23
  const useId = React["useId".toString()];
24
24
 
25
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
26
+
25
27
  const PanelGroupContext = createContext(null);
26
28
  PanelGroupContext.displayName = "PanelGroupContext";
27
29
 
@@ -201,27 +203,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
201
203
  function isKeyDown(event) {
202
204
  return event.type === "keydown";
203
205
  }
206
+ function isPointerEvent(event) {
207
+ return event.type.startsWith("pointer");
208
+ }
204
209
  function isMouseEvent(event) {
205
210
  return event.type.startsWith("mouse");
206
211
  }
207
- function isTouchEvent(event) {
208
- return event.type.startsWith("touch");
209
- }
210
212
 
211
213
  function getResizeEventCoordinates(event) {
212
- if (isMouseEvent(event)) {
214
+ if (isPointerEvent(event)) {
215
+ if (event.isPrimary) {
216
+ return {
217
+ x: event.clientX,
218
+ y: event.clientY
219
+ };
220
+ }
221
+ } else if (isMouseEvent(event)) {
213
222
  return {
214
223
  x: event.clientX,
215
224
  y: event.clientY
216
225
  };
217
- } else if (isTouchEvent(event)) {
218
- const touch = event.touches[0];
219
- if (touch && touch.clientX && touch.clientY) {
220
- return {
221
- x: touch.clientX,
222
- y: touch.clientY
223
- };
224
- }
225
226
  }
226
227
  return {
227
228
  x: Infinity,
@@ -413,6 +414,7 @@ function handlePointerDown(event) {
413
414
  if (intersectingHandles.length > 0) {
414
415
  updateResizeHandlerStates("down", event);
415
416
  event.preventDefault();
417
+ event.stopPropagation();
416
418
  }
417
419
  }
418
420
  function handlePointerMove(event) {
@@ -561,15 +563,12 @@ function updateListeners() {
561
563
  body
562
564
  } = ownerDocument;
563
565
  body.removeEventListener("contextmenu", handlePointerUp);
564
- body.removeEventListener("mousedown", handlePointerDown);
565
- body.removeEventListener("mouseleave", handlePointerMove);
566
- body.removeEventListener("mousemove", handlePointerMove);
567
- body.removeEventListener("touchmove", handlePointerMove);
568
- body.removeEventListener("touchstart", handlePointerDown);
566
+ body.removeEventListener("pointerdown", handlePointerDown);
567
+ body.removeEventListener("pointerleave", handlePointerMove);
568
+ body.removeEventListener("pointermove", handlePointerMove);
569
569
  });
570
- window.removeEventListener("mouseup", handlePointerUp);
571
- window.removeEventListener("touchcancel", handlePointerUp);
572
- window.removeEventListener("touchend", handlePointerUp);
570
+ window.removeEventListener("pointerup", handlePointerUp);
571
+ window.removeEventListener("pointercancel", handlePointerUp);
573
572
  if (registeredResizeHandlers.size > 0) {
574
573
  if (isPointerDown) {
575
574
  if (intersectingHandles.length > 0) {
@@ -579,29 +578,23 @@ function updateListeners() {
579
578
  } = ownerDocument;
580
579
  if (count > 0) {
581
580
  body.addEventListener("contextmenu", handlePointerUp);
582
- body.addEventListener("mouseleave", handlePointerMove);
583
- body.addEventListener("mousemove", handlePointerMove);
584
- body.addEventListener("touchmove", handlePointerMove, {
585
- passive: false
586
- });
581
+ body.addEventListener("pointerleave", handlePointerMove);
582
+ body.addEventListener("pointermove", handlePointerMove);
587
583
  }
588
584
  });
589
585
  }
590
- window.addEventListener("mouseup", handlePointerUp);
591
- window.addEventListener("touchcancel", handlePointerUp);
592
- window.addEventListener("touchend", handlePointerUp);
586
+ window.addEventListener("pointerup", handlePointerUp);
587
+ window.addEventListener("pointercancel", handlePointerUp);
593
588
  } else {
594
589
  ownerDocumentCounts.forEach((count, ownerDocument) => {
595
590
  const {
596
591
  body
597
592
  } = ownerDocument;
598
593
  if (count > 0) {
599
- body.addEventListener("mousedown", handlePointerDown);
600
- body.addEventListener("mousemove", handlePointerMove);
601
- body.addEventListener("touchmove", handlePointerMove, {
602
- passive: false
594
+ body.addEventListener("pointerdown", handlePointerDown, {
595
+ capture: true
603
596
  });
604
- body.addEventListener("touchstart", handlePointerDown);
597
+ body.addEventListener("pointermove", handlePointerMove);
605
598
  }
606
599
  });
607
600
  }
@@ -1705,7 +1698,7 @@ function PanelGroupWithForwardedRef({
1705
1698
 
1706
1699
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
1707
1700
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
1708
- if (isMouseEvent(event) || isTouchEvent(event)) {
1701
+ if (isPointerEvent(event) || isMouseEvent(event)) {
1709
1702
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
1710
1703
  // In this case, Panel sizes might not change–
1711
1704
  // but updating cursor in this scenario would cause a flicker.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-resizable-panels",
3
- "version": "2.0.15",
3
+ "version": "2.0.17",
4
4
  "description": "React components for resizable panel groups/layouts",
5
5
  "author": "Brian Vaughn <brian.david.vaughn@gmail.com>",
6
6
  "license": "MIT",
package/src/PanelGroup.ts CHANGED
@@ -28,7 +28,7 @@ import { computePanelFlexBoxStyle } from "./utils/computePanelFlexBoxStyle";
28
28
  import debounce from "./utils/debounce";
29
29
  import { determinePivotIndices } from "./utils/determinePivotIndices";
30
30
  import { getResizeHandleElement } from "./utils/dom/getResizeHandleElement";
31
- import { isKeyDown, isMouseEvent, isTouchEvent } from "./utils/events";
31
+ import { isKeyDown, isMouseEvent, isPointerEvent } from "./utils/events";
32
32
  import { getResizeEventCursorPosition } from "./utils/events/getResizeEventCursorPosition";
33
33
  import { initializeDefaultStorage } from "./utils/initializeDefaultStorage";
34
34
  import {
@@ -658,7 +658,7 @@ function PanelGroupWithForwardedRef({
658
658
 
659
659
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
660
660
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
661
- if (isMouseEvent(event) || isTouchEvent(event)) {
661
+ if (isPointerEvent(event) || isMouseEvent(event)) {
662
662
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
663
663
  // In this case, Panel sizes might not change–
664
664
  // but updating cursor in this scenario would cause a flicker.
@@ -1,7 +1,8 @@
1
1
  import { PanelConstraints, PanelData } from "./Panel";
2
2
  import { CSSProperties, createContext } from "./vendor/react";
3
3
 
4
- export type ResizeEvent = KeyboardEvent | MouseEvent | TouchEvent;
4
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
5
+ export type ResizeEvent = KeyboardEvent | PointerEvent | MouseEvent;
5
6
  export type ResizeHandler = (event: ResizeEvent) => void;
6
7
 
7
8
  export type DragState = {
@@ -127,18 +127,18 @@ describe("PanelResizeHandle", () => {
127
127
  });
128
128
 
129
129
  act(() => {
130
- dispatchPointerEvent("mousemove", leftElement);
130
+ dispatchPointerEvent("pointermove", leftElement);
131
131
  });
132
132
  expect(onDragging).not.toHaveBeenCalled();
133
133
 
134
134
  act(() => {
135
- dispatchPointerEvent("mousedown", leftElement);
135
+ dispatchPointerEvent("pointerdown", leftElement);
136
136
  });
137
137
  expect(onDragging).toHaveBeenCalledTimes(1);
138
138
  expect(onDragging).toHaveBeenCalledWith(true);
139
139
 
140
140
  act(() => {
141
- dispatchPointerEvent("mouseup", leftElement);
141
+ dispatchPointerEvent("pointerup", leftElement);
142
142
  });
143
143
  expect(onDragging).toHaveBeenCalledTimes(2);
144
144
  expect(onDragging).toHaveBeenCalledWith(false);
@@ -154,20 +154,20 @@ describe("PanelResizeHandle", () => {
154
154
  });
155
155
 
156
156
  act(() => {
157
- dispatchPointerEvent("mousemove", leftElement);
157
+ dispatchPointerEvent("pointermove", leftElement);
158
158
  });
159
159
  expect(onDraggingLeft).not.toHaveBeenCalled();
160
160
  expect(onDraggingRight).not.toHaveBeenCalled();
161
161
 
162
162
  act(() => {
163
- dispatchPointerEvent("mousedown", leftElement);
163
+ dispatchPointerEvent("pointerdown", leftElement);
164
164
  });
165
165
  expect(onDraggingLeft).toHaveBeenCalledTimes(1);
166
166
  expect(onDraggingLeft).toHaveBeenCalledWith(true);
167
167
  expect(onDraggingRight).not.toHaveBeenCalled();
168
168
 
169
169
  act(() => {
170
- dispatchPointerEvent("mouseup", leftElement);
170
+ dispatchPointerEvent("pointerup", leftElement);
171
171
  });
172
172
  expect(onDraggingLeft).toHaveBeenCalledTimes(2);
173
173
  expect(onDraggingLeft).toHaveBeenCalledWith(false);
@@ -209,7 +209,7 @@ describe("PanelResizeHandle", () => {
209
209
  verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
210
210
 
211
211
  act(() => {
212
- dispatchPointerEvent("mousemove", leftElement);
212
+ dispatchPointerEvent("pointermove", leftElement);
213
213
  });
214
214
  verifyAttribute(leftElement, "data-resize-handle-active", null);
215
215
  verifyAttribute(rightElement, "data-resize-handle-active", null);
@@ -217,7 +217,7 @@ describe("PanelResizeHandle", () => {
217
217
  verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
218
218
 
219
219
  act(() => {
220
- dispatchPointerEvent("mousedown", leftElement);
220
+ dispatchPointerEvent("pointerdown", leftElement);
221
221
  });
222
222
  verifyAttribute(leftElement, "data-resize-handle-active", "pointer");
223
223
  verifyAttribute(rightElement, "data-resize-handle-active", null);
@@ -225,7 +225,7 @@ describe("PanelResizeHandle", () => {
225
225
  verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
226
226
 
227
227
  act(() => {
228
- dispatchPointerEvent("mousemove", leftElement);
228
+ dispatchPointerEvent("pointermove", leftElement);
229
229
  });
230
230
  verifyAttribute(leftElement, "data-resize-handle-active", "pointer");
231
231
  verifyAttribute(rightElement, "data-resize-handle-active", null);
@@ -233,7 +233,7 @@ describe("PanelResizeHandle", () => {
233
233
  verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
234
234
 
235
235
  act(() => {
236
- dispatchPointerEvent("mouseup", leftElement);
236
+ dispatchPointerEvent("pointerup", leftElement);
237
237
  });
238
238
  verifyAttribute(leftElement, "data-resize-handle-active", null);
239
239
  verifyAttribute(rightElement, "data-resize-handle-active", null);
@@ -241,7 +241,7 @@ describe("PanelResizeHandle", () => {
241
241
  verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
242
242
 
243
243
  act(() => {
244
- dispatchPointerEvent("mousemove", rightElement);
244
+ dispatchPointerEvent("pointermove", rightElement);
245
245
  });
246
246
  verifyAttribute(leftElement, "data-resize-handle-active", null);
247
247
  verifyAttribute(rightElement, "data-resize-handle-active", null);
@@ -89,6 +89,7 @@ function handlePointerDown(event: ResizeEvent) {
89
89
  updateResizeHandlerStates("down", event);
90
90
 
91
91
  event.preventDefault();
92
+ event.stopPropagation();
92
93
  }
93
94
  }
94
95
 
@@ -258,16 +259,13 @@ function updateListeners() {
258
259
  const { body } = ownerDocument;
259
260
 
260
261
  body.removeEventListener("contextmenu", handlePointerUp);
261
- body.removeEventListener("mousedown", handlePointerDown);
262
- body.removeEventListener("mouseleave", handlePointerMove);
263
- body.removeEventListener("mousemove", handlePointerMove);
264
- body.removeEventListener("touchmove", handlePointerMove);
265
- body.removeEventListener("touchstart", handlePointerDown);
262
+ body.removeEventListener("pointerdown", handlePointerDown);
263
+ body.removeEventListener("pointerleave", handlePointerMove);
264
+ body.removeEventListener("pointermove", handlePointerMove);
266
265
  });
267
266
 
268
- window.removeEventListener("mouseup", handlePointerUp);
269
- window.removeEventListener("touchcancel", handlePointerUp);
270
- window.removeEventListener("touchend", handlePointerUp);
267
+ window.removeEventListener("pointerup", handlePointerUp);
268
+ window.removeEventListener("pointercancel", handlePointerUp);
271
269
 
272
270
  if (registeredResizeHandlers.size > 0) {
273
271
  if (isPointerDown) {
@@ -277,29 +275,23 @@ function updateListeners() {
277
275
 
278
276
  if (count > 0) {
279
277
  body.addEventListener("contextmenu", handlePointerUp);
280
- body.addEventListener("mouseleave", handlePointerMove);
281
- body.addEventListener("mousemove", handlePointerMove);
282
- body.addEventListener("touchmove", handlePointerMove, {
283
- passive: false,
284
- });
278
+ body.addEventListener("pointerleave", handlePointerMove);
279
+ body.addEventListener("pointermove", handlePointerMove);
285
280
  }
286
281
  });
287
282
  }
288
283
 
289
- window.addEventListener("mouseup", handlePointerUp);
290
- window.addEventListener("touchcancel", handlePointerUp);
291
- window.addEventListener("touchend", handlePointerUp);
284
+ window.addEventListener("pointerup", handlePointerUp);
285
+ window.addEventListener("pointercancel", handlePointerUp);
292
286
  } else {
293
287
  ownerDocumentCounts.forEach((count, ownerDocument) => {
294
288
  const { body } = ownerDocument;
295
289
 
296
290
  if (count > 0) {
297
- body.addEventListener("mousedown", handlePointerDown);
298
- body.addEventListener("mousemove", handlePointerMove);
299
- body.addEventListener("touchmove", handlePointerMove, {
300
- passive: false,
291
+ body.addEventListener("pointerdown", handlePointerDown, {
292
+ capture: true,
301
293
  });
302
- body.addEventListener("touchstart", handlePointerDown);
294
+ body.addEventListener("pointermove", handlePointerMove);
303
295
  }
304
296
  });
305
297
  }
package/src/types.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export type Direction = "horizontal" | "vertical";
2
2
 
3
- export type ResizeEvent = KeyboardEvent | MouseEvent | TouchEvent;
3
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
4
+ export type ResizeEvent = KeyboardEvent | PointerEvent | MouseEvent;
4
5
  export type ResizeHandler = (event: ResizeEvent) => void;
@@ -1,20 +1,19 @@
1
1
  import { ResizeEvent } from "../../types";
2
- import { isMouseEvent, isTouchEvent } from ".";
2
+ import { isMouseEvent, isPointerEvent } from ".";
3
3
 
4
4
  export function getResizeEventCoordinates(event: ResizeEvent) {
5
- if (isMouseEvent(event)) {
5
+ if (isPointerEvent(event)) {
6
+ if (event.isPrimary) {
7
+ return {
8
+ x: event.clientX,
9
+ y: event.clientY,
10
+ };
11
+ }
12
+ } else if (isMouseEvent(event)) {
6
13
  return {
7
14
  x: event.clientX,
8
15
  y: event.clientY,
9
16
  };
10
- } else if (isTouchEvent(event)) {
11
- const touch = event.touches[0];
12
- if (touch && touch.clientX && touch.clientY) {
13
- return {
14
- x: touch.clientX,
15
- y: touch.clientY,
16
- };
17
- }
18
17
  }
19
18
 
20
19
  return {
@@ -4,10 +4,10 @@ export function isKeyDown(event: ResizeEvent): event is KeyboardEvent {
4
4
  return event.type === "keydown";
5
5
  }
6
6
 
7
- export function isMouseEvent(event: ResizeEvent): event is MouseEvent {
8
- return event.type.startsWith("mouse");
7
+ export function isPointerEvent(event: ResizeEvent): event is PointerEvent {
8
+ return event.type.startsWith("pointer");
9
9
  }
10
10
 
11
- export function isTouchEvent(event: ResizeEvent): event is TouchEvent {
12
- return event.type.startsWith("touch");
11
+ export function isMouseEvent(event: ResizeEvent): event is MouseEvent {
12
+ return event.type.startsWith("mouse");
13
13
  }
@@ -24,6 +24,9 @@ export function dispatchPointerEvent(type: string, target: HTMLElement) {
24
24
  return clientY;
25
25
  },
26
26
  },
27
+ isPrimary: {
28
+ value: true,
29
+ },
27
30
  });
28
31
 
29
32
  target.dispatchEvent(event);