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.
@@ -25,6 +25,8 @@ const {
25
25
  const useId = React["useId".toString()];
26
26
  const useLayoutEffect_do_not_use_directly = useLayoutEffect;
27
27
 
28
+ // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
29
+
28
30
  const PanelGroupContext = createContext(null);
29
31
  PanelGroupContext.displayName = "PanelGroupContext";
30
32
 
@@ -239,27 +241,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
239
241
  function isKeyDown(event) {
240
242
  return event.type === "keydown";
241
243
  }
244
+ function isPointerEvent(event) {
245
+ return event.type.startsWith("pointer");
246
+ }
242
247
  function isMouseEvent(event) {
243
248
  return event.type.startsWith("mouse");
244
249
  }
245
- function isTouchEvent(event) {
246
- return event.type.startsWith("touch");
247
- }
248
250
 
249
251
  function getResizeEventCoordinates(event) {
250
- if (isMouseEvent(event)) {
252
+ if (isPointerEvent(event)) {
253
+ if (event.isPrimary) {
254
+ return {
255
+ x: event.clientX,
256
+ y: event.clientY
257
+ };
258
+ }
259
+ } else if (isMouseEvent(event)) {
251
260
  return {
252
261
  x: event.clientX,
253
262
  y: event.clientY
254
263
  };
255
- } else if (isTouchEvent(event)) {
256
- const touch = event.touches[0];
257
- if (touch && touch.clientX && touch.clientY) {
258
- return {
259
- x: touch.clientX,
260
- y: touch.clientY
261
- };
262
- }
263
264
  }
264
265
  return {
265
266
  x: Infinity,
@@ -451,6 +452,7 @@ function handlePointerDown(event) {
451
452
  if (intersectingHandles.length > 0) {
452
453
  updateResizeHandlerStates("down", event);
453
454
  event.preventDefault();
455
+ event.stopPropagation();
454
456
  }
455
457
  }
456
458
  function handlePointerMove(event) {
@@ -599,15 +601,12 @@ function updateListeners() {
599
601
  body
600
602
  } = ownerDocument;
601
603
  body.removeEventListener("contextmenu", handlePointerUp);
602
- body.removeEventListener("mousedown", handlePointerDown);
603
- body.removeEventListener("mouseleave", handlePointerMove);
604
- body.removeEventListener("mousemove", handlePointerMove);
605
- body.removeEventListener("touchmove", handlePointerMove);
606
- body.removeEventListener("touchstart", handlePointerDown);
604
+ body.removeEventListener("pointerdown", handlePointerDown);
605
+ body.removeEventListener("pointerleave", handlePointerMove);
606
+ body.removeEventListener("pointermove", handlePointerMove);
607
607
  });
608
- window.removeEventListener("mouseup", handlePointerUp);
609
- window.removeEventListener("touchcancel", handlePointerUp);
610
- window.removeEventListener("touchend", handlePointerUp);
608
+ window.removeEventListener("pointerup", handlePointerUp);
609
+ window.removeEventListener("pointercancel", handlePointerUp);
611
610
  if (registeredResizeHandlers.size > 0) {
612
611
  if (isPointerDown) {
613
612
  if (intersectingHandles.length > 0) {
@@ -617,29 +616,23 @@ function updateListeners() {
617
616
  } = ownerDocument;
618
617
  if (count > 0) {
619
618
  body.addEventListener("contextmenu", handlePointerUp);
620
- body.addEventListener("mouseleave", handlePointerMove);
621
- body.addEventListener("mousemove", handlePointerMove);
622
- body.addEventListener("touchmove", handlePointerMove, {
623
- passive: false
624
- });
619
+ body.addEventListener("pointerleave", handlePointerMove);
620
+ body.addEventListener("pointermove", handlePointerMove);
625
621
  }
626
622
  });
627
623
  }
628
- window.addEventListener("mouseup", handlePointerUp);
629
- window.addEventListener("touchcancel", handlePointerUp);
630
- window.addEventListener("touchend", handlePointerUp);
624
+ window.addEventListener("pointerup", handlePointerUp);
625
+ window.addEventListener("pointercancel", handlePointerUp);
631
626
  } else {
632
627
  ownerDocumentCounts.forEach((count, ownerDocument) => {
633
628
  const {
634
629
  body
635
630
  } = ownerDocument;
636
631
  if (count > 0) {
637
- body.addEventListener("mousedown", handlePointerDown);
638
- body.addEventListener("mousemove", handlePointerMove);
639
- body.addEventListener("touchmove", handlePointerMove, {
640
- passive: false
632
+ body.addEventListener("pointerdown", handlePointerDown, {
633
+ capture: true
641
634
  });
642
- body.addEventListener("touchstart", handlePointerDown);
635
+ body.addEventListener("pointermove", handlePointerMove);
643
636
  }
644
637
  });
645
638
  }
@@ -878,7 +871,7 @@ function adjustLayoutByDelta({
878
871
  if (!fuzzyNumbersEqual(prevSize, safeSize)) {
879
872
  deltaApplied += prevSize - safeSize;
880
873
  nextLayout[index] = safeSize;
881
- if (deltaApplied.toFixed(3).localeCompare(Math.abs(delta).toFixed(3), undefined, {
874
+ if (deltaApplied.toPrecision(3).localeCompare(Math.abs(delta).toPrecision(3), undefined, {
882
875
  numeric: true
883
876
  }) >= 0) {
884
877
  break;
@@ -1358,12 +1351,12 @@ function computePanelFlexBoxStyle({
1358
1351
  if (size == null) {
1359
1352
  // Initial render (before panels have registered themselves)
1360
1353
  // In order to support server rendering, fall back to default size if provided
1361
- flexGrow = defaultSize != undefined ? defaultSize.toFixed(precision) : "1";
1354
+ flexGrow = defaultSize != undefined ? defaultSize.toPrecision(precision) : "1";
1362
1355
  } else if (panelData.length === 1) {
1363
1356
  // Special case: Single panel group should always fill full width/height
1364
1357
  flexGrow = "1";
1365
1358
  } else {
1366
- flexGrow = size.toFixed(precision);
1359
+ flexGrow = size.toPrecision(precision);
1367
1360
  }
1368
1361
  return {
1369
1362
  flexBasis: 0,
@@ -1927,7 +1920,7 @@ function PanelGroupWithForwardedRef({
1927
1920
 
1928
1921
  // Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
1929
1922
  // Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
1930
- if (isMouseEvent(event) || isTouchEvent(event)) {
1923
+ if (isPointerEvent(event) || isMouseEvent(event)) {
1931
1924
  // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
1932
1925
  // In this case, Panel sizes might not change–
1933
1926
  // but updating cursor in this scenario would cause a flicker.
@@ -2193,6 +2186,7 @@ function PanelResizeHandle({
2193
2186
  tagName: Type = "div",
2194
2187
  ...rest
2195
2188
  }) {
2189
+ var _hitAreaMargins$coars, _hitAreaMargins$fine;
2196
2190
  const elementRef = useRef(null);
2197
2191
 
2198
2192
  // Use a ref to guard against users passing inline props
@@ -2232,8 +2226,12 @@ function PanelResizeHandle({
2232
2226
  setResizeHandler(() => resizeHandler);
2233
2227
  }
2234
2228
  }, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
2229
+
2230
+ // Extract hit area margins before passing them to the effect's dependency array
2231
+ // so that inline object values won't trigger re-renders
2232
+ const coarseHitAreaMargins = (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15;
2233
+ const fineHitAreaMargins = (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5;
2235
2234
  useEffect(() => {
2236
- var _hitAreaMargins$coars, _hitAreaMargins$fine;
2237
2235
  if (disabled || resizeHandler == null) {
2238
2236
  return;
2239
2237
  }
@@ -2283,12 +2281,10 @@ function PanelResizeHandle({
2283
2281
  }
2284
2282
  };
2285
2283
  return registerResizeHandle(resizeHandleId, element, direction, {
2286
- // Coarse inputs (e.g. finger/touch)
2287
- coarse: (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15,
2288
- // Fine inputs (e.g. mouse)
2289
- fine: (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5
2284
+ coarse: coarseHitAreaMargins,
2285
+ fine: fineHitAreaMargins
2290
2286
  }, setResizeHandlerState);
2291
- }, [direction, disabled, hitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
2287
+ }, [coarseHitAreaMargins, direction, disabled, fineHitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
2292
2288
  useWindowSplitterResizeHandlerBehavior({
2293
2289
  disabled,
2294
2290
  handleId: resizeHandleId,
@@ -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
  }
@@ -864,7 +857,7 @@ function adjustLayoutByDelta({
864
857
  if (!fuzzyNumbersEqual(prevSize, safeSize)) {
865
858
  deltaApplied += prevSize - safeSize;
866
859
  nextLayout[index] = safeSize;
867
- if (deltaApplied.toFixed(3).localeCompare(Math.abs(delta).toFixed(3), undefined, {
860
+ if (deltaApplied.toPrecision(3).localeCompare(Math.abs(delta).toPrecision(3), undefined, {
868
861
  numeric: true
869
862
  }) >= 0) {
870
863
  break;
@@ -1230,12 +1223,12 @@ function computePanelFlexBoxStyle({
1230
1223
  if (size == null) {
1231
1224
  // Initial render (before panels have registered themselves)
1232
1225
  // In order to support server rendering, fall back to default size if provided
1233
- flexGrow = defaultSize != undefined ? defaultSize.toFixed(precision) : "1";
1226
+ flexGrow = defaultSize != undefined ? defaultSize.toPrecision(precision) : "1";
1234
1227
  } else if (panelData.length === 1) {
1235
1228
  // Special case: Single panel group should always fill full width/height
1236
1229
  flexGrow = "1";
1237
1230
  } else {
1238
- flexGrow = size.toFixed(precision);
1231
+ flexGrow = size.toPrecision(precision);
1239
1232
  }
1240
1233
  return {
1241
1234
  flexBasis: 0,
@@ -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.
@@ -1995,6 +1988,7 @@ function PanelResizeHandle({
1995
1988
  tagName: Type = "div",
1996
1989
  ...rest
1997
1990
  }) {
1991
+ var _hitAreaMargins$coars, _hitAreaMargins$fine;
1998
1992
  const elementRef = useRef(null);
1999
1993
 
2000
1994
  // Use a ref to guard against users passing inline props
@@ -2031,8 +2025,12 @@ function PanelResizeHandle({
2031
2025
  setResizeHandler(() => resizeHandler);
2032
2026
  }
2033
2027
  }, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
2028
+
2029
+ // Extract hit area margins before passing them to the effect's dependency array
2030
+ // so that inline object values won't trigger re-renders
2031
+ const coarseHitAreaMargins = (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15;
2032
+ const fineHitAreaMargins = (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5;
2034
2033
  useEffect(() => {
2035
- var _hitAreaMargins$coars, _hitAreaMargins$fine;
2036
2034
  if (disabled || resizeHandler == null) {
2037
2035
  return;
2038
2036
  }
@@ -2082,12 +2080,10 @@ function PanelResizeHandle({
2082
2080
  }
2083
2081
  };
2084
2082
  return registerResizeHandle(resizeHandleId, element, direction, {
2085
- // Coarse inputs (e.g. finger/touch)
2086
- coarse: (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15,
2087
- // Fine inputs (e.g. mouse)
2088
- fine: (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5
2083
+ coarse: coarseHitAreaMargins,
2084
+ fine: fineHitAreaMargins
2089
2085
  }, setResizeHandlerState);
2090
- }, [direction, disabled, hitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
2086
+ }, [coarseHitAreaMargins, direction, disabled, fineHitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
2091
2087
  useWindowSplitterResizeHandlerBehavior({
2092
2088
  disabled,
2093
2089
  handleId: resizeHandleId,
@@ -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
  }
@@ -840,7 +833,7 @@ function adjustLayoutByDelta({
840
833
  if (!fuzzyNumbersEqual(prevSize, safeSize)) {
841
834
  deltaApplied += prevSize - safeSize;
842
835
  nextLayout[index] = safeSize;
843
- if (deltaApplied.toFixed(3).localeCompare(Math.abs(delta).toFixed(3), undefined, {
836
+ if (deltaApplied.toPrecision(3).localeCompare(Math.abs(delta).toPrecision(3), undefined, {
844
837
  numeric: true
845
838
  }) >= 0) {
846
839
  break;
@@ -1206,12 +1199,12 @@ function computePanelFlexBoxStyle({
1206
1199
  if (size == null) {
1207
1200
  // Initial render (before panels have registered themselves)
1208
1201
  // In order to support server rendering, fall back to default size if provided
1209
- flexGrow = defaultSize != undefined ? defaultSize.toFixed(precision) : "1";
1202
+ flexGrow = defaultSize != undefined ? defaultSize.toPrecision(precision) : "1";
1210
1203
  } else if (panelData.length === 1) {
1211
1204
  // Special case: Single panel group should always fill full width/height
1212
1205
  flexGrow = "1";
1213
1206
  } else {
1214
- flexGrow = size.toFixed(precision);
1207
+ flexGrow = size.toPrecision(precision);
1215
1208
  }
1216
1209
  return {
1217
1210
  flexBasis: 0,
@@ -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.
@@ -1971,6 +1964,7 @@ function PanelResizeHandle({
1971
1964
  tagName: Type = "div",
1972
1965
  ...rest
1973
1966
  }) {
1967
+ var _hitAreaMargins$coars, _hitAreaMargins$fine;
1974
1968
  const elementRef = useRef(null);
1975
1969
 
1976
1970
  // Use a ref to guard against users passing inline props
@@ -2007,8 +2001,12 @@ function PanelResizeHandle({
2007
2001
  setResizeHandler(() => resizeHandler);
2008
2002
  }
2009
2003
  }, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
2004
+
2005
+ // Extract hit area margins before passing them to the effect's dependency array
2006
+ // so that inline object values won't trigger re-renders
2007
+ const coarseHitAreaMargins = (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15;
2008
+ const fineHitAreaMargins = (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5;
2010
2009
  useEffect(() => {
2011
- var _hitAreaMargins$coars, _hitAreaMargins$fine;
2012
2010
  if (disabled || resizeHandler == null) {
2013
2011
  return;
2014
2012
  }
@@ -2058,12 +2056,10 @@ function PanelResizeHandle({
2058
2056
  }
2059
2057
  };
2060
2058
  return registerResizeHandle(resizeHandleId, element, direction, {
2061
- // Coarse inputs (e.g. finger/touch)
2062
- coarse: (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15,
2063
- // Fine inputs (e.g. mouse)
2064
- fine: (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5
2059
+ coarse: coarseHitAreaMargins,
2060
+ fine: fineHitAreaMargins
2065
2061
  }, setResizeHandlerState);
2066
- }, [direction, disabled, hitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
2062
+ }, [coarseHitAreaMargins, direction, disabled, fineHitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
2067
2063
  useWindowSplitterResizeHandlerBehavior({
2068
2064
  disabled,
2069
2065
  handleId: resizeHandleId,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-resizable-panels",
3
- "version": "2.0.16",
3
+ "version": "2.0.18",
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 = {