react-resizable-panels 2.0.16 → 2.0.18

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.
@@ -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);
@@ -110,6 +110,11 @@ export function PanelResizeHandle({
110
110
  }
111
111
  }, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
112
112
 
113
+ // Extract hit area margins before passing them to the effect's dependency array
114
+ // so that inline object values won't trigger re-renders
115
+ const coarseHitAreaMargins = hitAreaMargins?.coarse ?? 15;
116
+ const fineHitAreaMargins = hitAreaMargins?.fine ?? 5;
117
+
113
118
  useEffect(() => {
114
119
  if (disabled || resizeHandler == null) {
115
120
  return;
@@ -168,17 +173,16 @@ export function PanelResizeHandle({
168
173
  element,
169
174
  direction,
170
175
  {
171
- // Coarse inputs (e.g. finger/touch)
172
- coarse: hitAreaMargins?.coarse ?? 15,
173
- // Fine inputs (e.g. mouse)
174
- fine: hitAreaMargins?.fine ?? 5,
176
+ coarse: coarseHitAreaMargins,
177
+ fine: fineHitAreaMargins,
175
178
  },
176
179
  setResizeHandlerState
177
180
  );
178
181
  }, [
182
+ coarseHitAreaMargins,
179
183
  direction,
180
184
  disabled,
181
- hitAreaMargins,
185
+ fineHitAreaMargins,
182
186
  registerResizeHandleWithParentGroup,
183
187
  resizeHandleId,
184
188
  resizeHandler,
@@ -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;
@@ -200,8 +200,8 @@ export function adjustLayoutByDelta({
200
200
 
201
201
  if (
202
202
  deltaApplied
203
- .toFixed(3)
204
- .localeCompare(Math.abs(delta).toFixed(3), undefined, {
203
+ .toPrecision(3)
204
+ .localeCompare(Math.abs(delta).toPrecision(3), undefined, {
205
205
  numeric: true,
206
206
  }) >= 0
207
207
  ) {
@@ -26,12 +26,13 @@ export function computePanelFlexBoxStyle({
26
26
  if (size == null) {
27
27
  // Initial render (before panels have registered themselves)
28
28
  // In order to support server rendering, fall back to default size if provided
29
- flexGrow = defaultSize != undefined ? defaultSize.toFixed(precision) : "1";
29
+ flexGrow =
30
+ defaultSize != undefined ? defaultSize.toPrecision(precision) : "1";
30
31
  } else if (panelData.length === 1) {
31
32
  // Special case: Single panel group should always fill full width/height
32
33
  flexGrow = "1";
33
34
  } else {
34
- flexGrow = size.toFixed(precision);
35
+ flexGrow = size.toPrecision(precision);
35
36
  }
36
37
 
37
38
  return {
@@ -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);