react-resizable-panels 2.0.16 → 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 +5 -1
- package/README.md +3 -3
- package/dist/declarations/src/types.d.ts +1 -1
- package/dist/react-resizable-panels.browser.cjs.js +30 -37
- package/dist/react-resizable-panels.browser.development.cjs.js +30 -37
- package/dist/react-resizable-panels.browser.development.esm.js +30 -37
- package/dist/react-resizable-panels.browser.esm.js +30 -37
- package/dist/react-resizable-panels.cjs.js +30 -37
- package/dist/react-resizable-panels.development.cjs.js +30 -37
- package/dist/react-resizable-panels.development.esm.js +30 -37
- package/dist/react-resizable-panels.development.node.cjs.js +30 -37
- package/dist/react-resizable-panels.development.node.esm.js +30 -37
- package/dist/react-resizable-panels.esm.js +30 -37
- package/dist/react-resizable-panels.node.cjs.js +30 -37
- package/dist/react-resizable-panels.node.esm.js +30 -37
- package/package.json +1 -1
- package/src/PanelGroup.ts +2 -2
- package/src/PanelGroupContext.ts +2 -1
- package/src/PanelResizeHandle.test.tsx +11 -11
- package/src/PanelResizeHandleRegistry.ts +13 -21
- package/src/types.ts +2 -1
- package/src/utils/adjustLayoutByDelta.ts +2 -2
- package/src/utils/computePanelFlexBoxStyle.ts +3 -2
- package/src/utils/events/getResizeEventCoordinates.ts +9 -10
- package/src/utils/events/index.ts +4 -4
- package/src/utils/test-utils.ts +3 -0
|
@@ -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
|
|
|
@@ -212,27 +214,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
|
|
|
212
214
|
function isKeyDown(event) {
|
|
213
215
|
return event.type === "keydown";
|
|
214
216
|
}
|
|
217
|
+
function isPointerEvent(event) {
|
|
218
|
+
return event.type.startsWith("pointer");
|
|
219
|
+
}
|
|
215
220
|
function isMouseEvent(event) {
|
|
216
221
|
return event.type.startsWith("mouse");
|
|
217
222
|
}
|
|
218
|
-
function isTouchEvent(event) {
|
|
219
|
-
return event.type.startsWith("touch");
|
|
220
|
-
}
|
|
221
223
|
|
|
222
224
|
function getResizeEventCoordinates(event) {
|
|
223
|
-
if (
|
|
225
|
+
if (isPointerEvent(event)) {
|
|
226
|
+
if (event.isPrimary) {
|
|
227
|
+
return {
|
|
228
|
+
x: event.clientX,
|
|
229
|
+
y: event.clientY
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
} else if (isMouseEvent(event)) {
|
|
224
233
|
return {
|
|
225
234
|
x: event.clientX,
|
|
226
235
|
y: event.clientY
|
|
227
236
|
};
|
|
228
|
-
} else if (isTouchEvent(event)) {
|
|
229
|
-
const touch = event.touches[0];
|
|
230
|
-
if (touch && touch.clientX && touch.clientY) {
|
|
231
|
-
return {
|
|
232
|
-
x: touch.clientX,
|
|
233
|
-
y: touch.clientY
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
237
|
}
|
|
237
238
|
return {
|
|
238
239
|
x: Infinity,
|
|
@@ -424,6 +425,7 @@ function handlePointerDown(event) {
|
|
|
424
425
|
if (intersectingHandles.length > 0) {
|
|
425
426
|
updateResizeHandlerStates("down", event);
|
|
426
427
|
event.preventDefault();
|
|
428
|
+
event.stopPropagation();
|
|
427
429
|
}
|
|
428
430
|
}
|
|
429
431
|
function handlePointerMove(event) {
|
|
@@ -572,15 +574,12 @@ function updateListeners() {
|
|
|
572
574
|
body
|
|
573
575
|
} = ownerDocument;
|
|
574
576
|
body.removeEventListener("contextmenu", handlePointerUp);
|
|
575
|
-
body.removeEventListener("
|
|
576
|
-
body.removeEventListener("
|
|
577
|
-
body.removeEventListener("
|
|
578
|
-
body.removeEventListener("touchmove", handlePointerMove);
|
|
579
|
-
body.removeEventListener("touchstart", handlePointerDown);
|
|
577
|
+
body.removeEventListener("pointerdown", handlePointerDown);
|
|
578
|
+
body.removeEventListener("pointerleave", handlePointerMove);
|
|
579
|
+
body.removeEventListener("pointermove", handlePointerMove);
|
|
580
580
|
});
|
|
581
|
-
window.removeEventListener("
|
|
582
|
-
window.removeEventListener("
|
|
583
|
-
window.removeEventListener("touchend", handlePointerUp);
|
|
581
|
+
window.removeEventListener("pointerup", handlePointerUp);
|
|
582
|
+
window.removeEventListener("pointercancel", handlePointerUp);
|
|
584
583
|
if (registeredResizeHandlers.size > 0) {
|
|
585
584
|
if (isPointerDown) {
|
|
586
585
|
if (intersectingHandles.length > 0) {
|
|
@@ -590,29 +589,23 @@ function updateListeners() {
|
|
|
590
589
|
} = ownerDocument;
|
|
591
590
|
if (count > 0) {
|
|
592
591
|
body.addEventListener("contextmenu", handlePointerUp);
|
|
593
|
-
body.addEventListener("
|
|
594
|
-
body.addEventListener("
|
|
595
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
596
|
-
passive: false
|
|
597
|
-
});
|
|
592
|
+
body.addEventListener("pointerleave", handlePointerMove);
|
|
593
|
+
body.addEventListener("pointermove", handlePointerMove);
|
|
598
594
|
}
|
|
599
595
|
});
|
|
600
596
|
}
|
|
601
|
-
window.addEventListener("
|
|
602
|
-
window.addEventListener("
|
|
603
|
-
window.addEventListener("touchend", handlePointerUp);
|
|
597
|
+
window.addEventListener("pointerup", handlePointerUp);
|
|
598
|
+
window.addEventListener("pointercancel", handlePointerUp);
|
|
604
599
|
} else {
|
|
605
600
|
ownerDocumentCounts.forEach((count, ownerDocument) => {
|
|
606
601
|
const {
|
|
607
602
|
body
|
|
608
603
|
} = ownerDocument;
|
|
609
604
|
if (count > 0) {
|
|
610
|
-
body.addEventListener("
|
|
611
|
-
|
|
612
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
613
|
-
passive: false
|
|
605
|
+
body.addEventListener("pointerdown", handlePointerDown, {
|
|
606
|
+
capture: true
|
|
614
607
|
});
|
|
615
|
-
body.addEventListener("
|
|
608
|
+
body.addEventListener("pointermove", handlePointerMove);
|
|
616
609
|
}
|
|
617
610
|
});
|
|
618
611
|
}
|
|
@@ -851,7 +844,7 @@ function adjustLayoutByDelta({
|
|
|
851
844
|
if (!fuzzyNumbersEqual(prevSize, safeSize)) {
|
|
852
845
|
deltaApplied += prevSize - safeSize;
|
|
853
846
|
nextLayout[index] = safeSize;
|
|
854
|
-
if (deltaApplied.
|
|
847
|
+
if (deltaApplied.toPrecision(3).localeCompare(Math.abs(delta).toPrecision(3), undefined, {
|
|
855
848
|
numeric: true
|
|
856
849
|
}) >= 0) {
|
|
857
850
|
break;
|
|
@@ -1217,12 +1210,12 @@ function computePanelFlexBoxStyle({
|
|
|
1217
1210
|
if (size == null) {
|
|
1218
1211
|
// Initial render (before panels have registered themselves)
|
|
1219
1212
|
// In order to support server rendering, fall back to default size if provided
|
|
1220
|
-
flexGrow = defaultSize != undefined ? defaultSize.
|
|
1213
|
+
flexGrow = defaultSize != undefined ? defaultSize.toPrecision(precision) : "1";
|
|
1221
1214
|
} else if (panelData.length === 1) {
|
|
1222
1215
|
// Special case: Single panel group should always fill full width/height
|
|
1223
1216
|
flexGrow = "1";
|
|
1224
1217
|
} else {
|
|
1225
|
-
flexGrow = size.
|
|
1218
|
+
flexGrow = size.toPrecision(precision);
|
|
1226
1219
|
}
|
|
1227
1220
|
return {
|
|
1228
1221
|
flexBasis: 0,
|
|
@@ -1806,7 +1799,7 @@ function PanelGroupWithForwardedRef({
|
|
|
1806
1799
|
|
|
1807
1800
|
// Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
|
|
1808
1801
|
// Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
|
|
1809
|
-
if (
|
|
1802
|
+
if (isPointerEvent(event) || isMouseEvent(event)) {
|
|
1810
1803
|
// Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
|
|
1811
1804
|
// In this case, Panel sizes might not change–
|
|
1812
1805
|
// but updating cursor in this scenario would cause a flicker.
|
|
@@ -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 (
|
|
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("
|
|
603
|
-
body.removeEventListener("
|
|
604
|
-
body.removeEventListener("
|
|
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("
|
|
609
|
-
window.removeEventListener("
|
|
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("
|
|
621
|
-
body.addEventListener("
|
|
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("
|
|
629
|
-
window.addEventListener("
|
|
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("
|
|
638
|
-
|
|
639
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
640
|
-
passive: false
|
|
632
|
+
body.addEventListener("pointerdown", handlePointerDown, {
|
|
633
|
+
capture: true
|
|
641
634
|
});
|
|
642
|
-
body.addEventListener("
|
|
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.
|
|
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.
|
|
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.
|
|
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 (
|
|
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.
|
|
@@ -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 (
|
|
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("
|
|
589
|
-
body.removeEventListener("
|
|
590
|
-
body.removeEventListener("
|
|
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("
|
|
595
|
-
window.removeEventListener("
|
|
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("
|
|
607
|
-
body.addEventListener("
|
|
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("
|
|
615
|
-
window.addEventListener("
|
|
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("
|
|
624
|
-
|
|
625
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
626
|
-
passive: false
|
|
618
|
+
body.addEventListener("pointerdown", handlePointerDown, {
|
|
619
|
+
capture: true
|
|
627
620
|
});
|
|
628
|
-
body.addEventListener("
|
|
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.
|
|
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.
|
|
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.
|
|
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 (
|
|
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 (
|
|
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("
|
|
565
|
-
body.removeEventListener("
|
|
566
|
-
body.removeEventListener("
|
|
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("
|
|
571
|
-
window.removeEventListener("
|
|
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("
|
|
583
|
-
body.addEventListener("
|
|
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("
|
|
591
|
-
window.addEventListener("
|
|
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("
|
|
600
|
-
|
|
601
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
602
|
-
passive: false
|
|
594
|
+
body.addEventListener("pointerdown", handlePointerDown, {
|
|
595
|
+
capture: true
|
|
603
596
|
});
|
|
604
|
-
body.addEventListener("
|
|
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.
|
|
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.
|
|
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.
|
|
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 (
|
|
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
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,
|
|
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 (
|
|
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.
|
package/src/PanelGroupContext.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { PanelConstraints, PanelData } from "./Panel";
|
|
2
2
|
import { CSSProperties, createContext } from "./vendor/react";
|
|
3
3
|
|
|
4
|
-
|
|
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 = {
|