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.
- package/CHANGELOG.md +9 -1
- package/README.md +3 -3
- package/dist/declarations/src/types.d.ts +1 -1
- package/dist/react-resizable-panels.browser.cjs.js +39 -43
- package/dist/react-resizable-panels.browser.development.cjs.js +39 -43
- package/dist/react-resizable-panels.browser.development.esm.js +39 -43
- package/dist/react-resizable-panels.browser.esm.js +39 -43
- package/dist/react-resizable-panels.cjs.js +39 -43
- package/dist/react-resizable-panels.development.cjs.js +39 -43
- package/dist/react-resizable-panels.development.esm.js +39 -43
- package/dist/react-resizable-panels.development.node.cjs.js +39 -43
- package/dist/react-resizable-panels.development.node.esm.js +39 -43
- package/dist/react-resizable-panels.esm.js +39 -43
- package/dist/react-resizable-panels.node.cjs.js +39 -43
- package/dist/react-resizable-panels.node.esm.js +39 -43
- 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/PanelResizeHandle.ts +9 -5
- 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
|
@@ -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
|
|
|
@@ -250,27 +252,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
|
|
|
250
252
|
function isKeyDown(event) {
|
|
251
253
|
return event.type === "keydown";
|
|
252
254
|
}
|
|
255
|
+
function isPointerEvent(event) {
|
|
256
|
+
return event.type.startsWith("pointer");
|
|
257
|
+
}
|
|
253
258
|
function isMouseEvent(event) {
|
|
254
259
|
return event.type.startsWith("mouse");
|
|
255
260
|
}
|
|
256
|
-
function isTouchEvent(event) {
|
|
257
|
-
return event.type.startsWith("touch");
|
|
258
|
-
}
|
|
259
261
|
|
|
260
262
|
function getResizeEventCoordinates(event) {
|
|
261
|
-
if (
|
|
263
|
+
if (isPointerEvent(event)) {
|
|
264
|
+
if (event.isPrimary) {
|
|
265
|
+
return {
|
|
266
|
+
x: event.clientX,
|
|
267
|
+
y: event.clientY
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
} else if (isMouseEvent(event)) {
|
|
262
271
|
return {
|
|
263
272
|
x: event.clientX,
|
|
264
273
|
y: event.clientY
|
|
265
274
|
};
|
|
266
|
-
} else if (isTouchEvent(event)) {
|
|
267
|
-
const touch = event.touches[0];
|
|
268
|
-
if (touch && touch.clientX && touch.clientY) {
|
|
269
|
-
return {
|
|
270
|
-
x: touch.clientX,
|
|
271
|
-
y: touch.clientY
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
275
|
}
|
|
275
276
|
return {
|
|
276
277
|
x: Infinity,
|
|
@@ -462,6 +463,7 @@ function handlePointerDown(event) {
|
|
|
462
463
|
if (intersectingHandles.length > 0) {
|
|
463
464
|
updateResizeHandlerStates("down", event);
|
|
464
465
|
event.preventDefault();
|
|
466
|
+
event.stopPropagation();
|
|
465
467
|
}
|
|
466
468
|
}
|
|
467
469
|
function handlePointerMove(event) {
|
|
@@ -610,15 +612,12 @@ function updateListeners() {
|
|
|
610
612
|
body
|
|
611
613
|
} = ownerDocument;
|
|
612
614
|
body.removeEventListener("contextmenu", handlePointerUp);
|
|
613
|
-
body.removeEventListener("
|
|
614
|
-
body.removeEventListener("
|
|
615
|
-
body.removeEventListener("
|
|
616
|
-
body.removeEventListener("touchmove", handlePointerMove);
|
|
617
|
-
body.removeEventListener("touchstart", handlePointerDown);
|
|
615
|
+
body.removeEventListener("pointerdown", handlePointerDown);
|
|
616
|
+
body.removeEventListener("pointerleave", handlePointerMove);
|
|
617
|
+
body.removeEventListener("pointermove", handlePointerMove);
|
|
618
618
|
});
|
|
619
|
-
window.removeEventListener("
|
|
620
|
-
window.removeEventListener("
|
|
621
|
-
window.removeEventListener("touchend", handlePointerUp);
|
|
619
|
+
window.removeEventListener("pointerup", handlePointerUp);
|
|
620
|
+
window.removeEventListener("pointercancel", handlePointerUp);
|
|
622
621
|
if (registeredResizeHandlers.size > 0) {
|
|
623
622
|
if (isPointerDown) {
|
|
624
623
|
if (intersectingHandles.length > 0) {
|
|
@@ -628,29 +627,23 @@ function updateListeners() {
|
|
|
628
627
|
} = ownerDocument;
|
|
629
628
|
if (count > 0) {
|
|
630
629
|
body.addEventListener("contextmenu", handlePointerUp);
|
|
631
|
-
body.addEventListener("
|
|
632
|
-
body.addEventListener("
|
|
633
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
634
|
-
passive: false
|
|
635
|
-
});
|
|
630
|
+
body.addEventListener("pointerleave", handlePointerMove);
|
|
631
|
+
body.addEventListener("pointermove", handlePointerMove);
|
|
636
632
|
}
|
|
637
633
|
});
|
|
638
634
|
}
|
|
639
|
-
window.addEventListener("
|
|
640
|
-
window.addEventListener("
|
|
641
|
-
window.addEventListener("touchend", handlePointerUp);
|
|
635
|
+
window.addEventListener("pointerup", handlePointerUp);
|
|
636
|
+
window.addEventListener("pointercancel", handlePointerUp);
|
|
642
637
|
} else {
|
|
643
638
|
ownerDocumentCounts.forEach((count, ownerDocument) => {
|
|
644
639
|
const {
|
|
645
640
|
body
|
|
646
641
|
} = ownerDocument;
|
|
647
642
|
if (count > 0) {
|
|
648
|
-
body.addEventListener("
|
|
649
|
-
|
|
650
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
651
|
-
passive: false
|
|
643
|
+
body.addEventListener("pointerdown", handlePointerDown, {
|
|
644
|
+
capture: true
|
|
652
645
|
});
|
|
653
|
-
body.addEventListener("
|
|
646
|
+
body.addEventListener("pointermove", handlePointerMove);
|
|
654
647
|
}
|
|
655
648
|
});
|
|
656
649
|
}
|
|
@@ -889,7 +882,7 @@ function adjustLayoutByDelta({
|
|
|
889
882
|
if (!fuzzyNumbersEqual(prevSize, safeSize)) {
|
|
890
883
|
deltaApplied += prevSize - safeSize;
|
|
891
884
|
nextLayout[index] = safeSize;
|
|
892
|
-
if (deltaApplied.
|
|
885
|
+
if (deltaApplied.toPrecision(3).localeCompare(Math.abs(delta).toPrecision(3), undefined, {
|
|
893
886
|
numeric: true
|
|
894
887
|
}) >= 0) {
|
|
895
888
|
break;
|
|
@@ -1379,12 +1372,12 @@ function computePanelFlexBoxStyle({
|
|
|
1379
1372
|
if (size == null) {
|
|
1380
1373
|
// Initial render (before panels have registered themselves)
|
|
1381
1374
|
// In order to support server rendering, fall back to default size if provided
|
|
1382
|
-
flexGrow = defaultSize != undefined ? defaultSize.
|
|
1375
|
+
flexGrow = defaultSize != undefined ? defaultSize.toPrecision(precision) : "1";
|
|
1383
1376
|
} else if (panelData.length === 1) {
|
|
1384
1377
|
// Special case: Single panel group should always fill full width/height
|
|
1385
1378
|
flexGrow = "1";
|
|
1386
1379
|
} else {
|
|
1387
|
-
flexGrow = size.
|
|
1380
|
+
flexGrow = size.toPrecision(precision);
|
|
1388
1381
|
}
|
|
1389
1382
|
return {
|
|
1390
1383
|
flexBasis: 0,
|
|
@@ -2038,7 +2031,7 @@ function PanelGroupWithForwardedRef({
|
|
|
2038
2031
|
|
|
2039
2032
|
// Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
|
|
2040
2033
|
// Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
|
|
2041
|
-
if (
|
|
2034
|
+
if (isPointerEvent(event) || isMouseEvent(event)) {
|
|
2042
2035
|
// Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
|
|
2043
2036
|
// In this case, Panel sizes might not change–
|
|
2044
2037
|
// but updating cursor in this scenario would cause a flicker.
|
|
@@ -2304,6 +2297,7 @@ function PanelResizeHandle({
|
|
|
2304
2297
|
tagName: Type = "div",
|
|
2305
2298
|
...rest
|
|
2306
2299
|
}) {
|
|
2300
|
+
var _hitAreaMargins$coars, _hitAreaMargins$fine;
|
|
2307
2301
|
const elementRef = useRef(null);
|
|
2308
2302
|
|
|
2309
2303
|
// Use a ref to guard against users passing inline props
|
|
@@ -2343,8 +2337,12 @@ function PanelResizeHandle({
|
|
|
2343
2337
|
setResizeHandler(() => resizeHandler);
|
|
2344
2338
|
}
|
|
2345
2339
|
}, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
|
|
2340
|
+
|
|
2341
|
+
// Extract hit area margins before passing them to the effect's dependency array
|
|
2342
|
+
// so that inline object values won't trigger re-renders
|
|
2343
|
+
const coarseHitAreaMargins = (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15;
|
|
2344
|
+
const fineHitAreaMargins = (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5;
|
|
2346
2345
|
useEffect(() => {
|
|
2347
|
-
var _hitAreaMargins$coars, _hitAreaMargins$fine;
|
|
2348
2346
|
if (disabled || resizeHandler == null) {
|
|
2349
2347
|
return;
|
|
2350
2348
|
}
|
|
@@ -2394,12 +2392,10 @@ function PanelResizeHandle({
|
|
|
2394
2392
|
}
|
|
2395
2393
|
};
|
|
2396
2394
|
return registerResizeHandle(resizeHandleId, element, direction, {
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
// Fine inputs (e.g. mouse)
|
|
2400
|
-
fine: (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5
|
|
2395
|
+
coarse: coarseHitAreaMargins,
|
|
2396
|
+
fine: fineHitAreaMargins
|
|
2401
2397
|
}, setResizeHandlerState);
|
|
2402
|
-
}, [direction, disabled,
|
|
2398
|
+
}, [coarseHitAreaMargins, direction, disabled, fineHitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
|
|
2403
2399
|
useWindowSplitterResizeHandlerBehavior({
|
|
2404
2400
|
disabled,
|
|
2405
2401
|
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
|
|
|
@@ -236,27 +238,26 @@ function setGlobalCursorStyle(state, constraintFlags) {
|
|
|
236
238
|
function isKeyDown(event) {
|
|
237
239
|
return event.type === "keydown";
|
|
238
240
|
}
|
|
241
|
+
function isPointerEvent(event) {
|
|
242
|
+
return event.type.startsWith("pointer");
|
|
243
|
+
}
|
|
239
244
|
function isMouseEvent(event) {
|
|
240
245
|
return event.type.startsWith("mouse");
|
|
241
246
|
}
|
|
242
|
-
function isTouchEvent(event) {
|
|
243
|
-
return event.type.startsWith("touch");
|
|
244
|
-
}
|
|
245
247
|
|
|
246
248
|
function getResizeEventCoordinates(event) {
|
|
247
|
-
if (
|
|
249
|
+
if (isPointerEvent(event)) {
|
|
250
|
+
if (event.isPrimary) {
|
|
251
|
+
return {
|
|
252
|
+
x: event.clientX,
|
|
253
|
+
y: event.clientY
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
} else if (isMouseEvent(event)) {
|
|
248
257
|
return {
|
|
249
258
|
x: event.clientX,
|
|
250
259
|
y: event.clientY
|
|
251
260
|
};
|
|
252
|
-
} else if (isTouchEvent(event)) {
|
|
253
|
-
const touch = event.touches[0];
|
|
254
|
-
if (touch && touch.clientX && touch.clientY) {
|
|
255
|
-
return {
|
|
256
|
-
x: touch.clientX,
|
|
257
|
-
y: touch.clientY
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
261
|
}
|
|
261
262
|
return {
|
|
262
263
|
x: Infinity,
|
|
@@ -448,6 +449,7 @@ function handlePointerDown(event) {
|
|
|
448
449
|
if (intersectingHandles.length > 0) {
|
|
449
450
|
updateResizeHandlerStates("down", event);
|
|
450
451
|
event.preventDefault();
|
|
452
|
+
event.stopPropagation();
|
|
451
453
|
}
|
|
452
454
|
}
|
|
453
455
|
function handlePointerMove(event) {
|
|
@@ -596,15 +598,12 @@ function updateListeners() {
|
|
|
596
598
|
body
|
|
597
599
|
} = ownerDocument;
|
|
598
600
|
body.removeEventListener("contextmenu", handlePointerUp);
|
|
599
|
-
body.removeEventListener("
|
|
600
|
-
body.removeEventListener("
|
|
601
|
-
body.removeEventListener("
|
|
602
|
-
body.removeEventListener("touchmove", handlePointerMove);
|
|
603
|
-
body.removeEventListener("touchstart", handlePointerDown);
|
|
601
|
+
body.removeEventListener("pointerdown", handlePointerDown);
|
|
602
|
+
body.removeEventListener("pointerleave", handlePointerMove);
|
|
603
|
+
body.removeEventListener("pointermove", handlePointerMove);
|
|
604
604
|
});
|
|
605
|
-
window.removeEventListener("
|
|
606
|
-
window.removeEventListener("
|
|
607
|
-
window.removeEventListener("touchend", handlePointerUp);
|
|
605
|
+
window.removeEventListener("pointerup", handlePointerUp);
|
|
606
|
+
window.removeEventListener("pointercancel", handlePointerUp);
|
|
608
607
|
if (registeredResizeHandlers.size > 0) {
|
|
609
608
|
if (isPointerDown) {
|
|
610
609
|
if (intersectingHandles.length > 0) {
|
|
@@ -614,29 +613,23 @@ function updateListeners() {
|
|
|
614
613
|
} = ownerDocument;
|
|
615
614
|
if (count > 0) {
|
|
616
615
|
body.addEventListener("contextmenu", handlePointerUp);
|
|
617
|
-
body.addEventListener("
|
|
618
|
-
body.addEventListener("
|
|
619
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
620
|
-
passive: false
|
|
621
|
-
});
|
|
616
|
+
body.addEventListener("pointerleave", handlePointerMove);
|
|
617
|
+
body.addEventListener("pointermove", handlePointerMove);
|
|
622
618
|
}
|
|
623
619
|
});
|
|
624
620
|
}
|
|
625
|
-
window.addEventListener("
|
|
626
|
-
window.addEventListener("
|
|
627
|
-
window.addEventListener("touchend", handlePointerUp);
|
|
621
|
+
window.addEventListener("pointerup", handlePointerUp);
|
|
622
|
+
window.addEventListener("pointercancel", handlePointerUp);
|
|
628
623
|
} else {
|
|
629
624
|
ownerDocumentCounts.forEach((count, ownerDocument) => {
|
|
630
625
|
const {
|
|
631
626
|
body
|
|
632
627
|
} = ownerDocument;
|
|
633
628
|
if (count > 0) {
|
|
634
|
-
body.addEventListener("
|
|
635
|
-
|
|
636
|
-
body.addEventListener("touchmove", handlePointerMove, {
|
|
637
|
-
passive: false
|
|
629
|
+
body.addEventListener("pointerdown", handlePointerDown, {
|
|
630
|
+
capture: true
|
|
638
631
|
});
|
|
639
|
-
body.addEventListener("
|
|
632
|
+
body.addEventListener("pointermove", handlePointerMove);
|
|
640
633
|
}
|
|
641
634
|
});
|
|
642
635
|
}
|
|
@@ -875,7 +868,7 @@ function adjustLayoutByDelta({
|
|
|
875
868
|
if (!fuzzyNumbersEqual(prevSize, safeSize)) {
|
|
876
869
|
deltaApplied += prevSize - safeSize;
|
|
877
870
|
nextLayout[index] = safeSize;
|
|
878
|
-
if (deltaApplied.
|
|
871
|
+
if (deltaApplied.toPrecision(3).localeCompare(Math.abs(delta).toPrecision(3), undefined, {
|
|
879
872
|
numeric: true
|
|
880
873
|
}) >= 0) {
|
|
881
874
|
break;
|
|
@@ -1241,12 +1234,12 @@ function computePanelFlexBoxStyle({
|
|
|
1241
1234
|
if (size == null) {
|
|
1242
1235
|
// Initial render (before panels have registered themselves)
|
|
1243
1236
|
// In order to support server rendering, fall back to default size if provided
|
|
1244
|
-
flexGrow = defaultSize != undefined ? defaultSize.
|
|
1237
|
+
flexGrow = defaultSize != undefined ? defaultSize.toPrecision(precision) : "1";
|
|
1245
1238
|
} else if (panelData.length === 1) {
|
|
1246
1239
|
// Special case: Single panel group should always fill full width/height
|
|
1247
1240
|
flexGrow = "1";
|
|
1248
1241
|
} else {
|
|
1249
|
-
flexGrow = size.
|
|
1242
|
+
flexGrow = size.toPrecision(precision);
|
|
1250
1243
|
}
|
|
1251
1244
|
return {
|
|
1252
1245
|
flexBasis: 0,
|
|
@@ -1830,7 +1823,7 @@ function PanelGroupWithForwardedRef({
|
|
|
1830
1823
|
|
|
1831
1824
|
// Only update the cursor for layout changes triggered by touch/mouse events (not keyboard)
|
|
1832
1825
|
// Update the cursor even if the layout hasn't changed (we may need to show an invalid cursor state)
|
|
1833
|
-
if (
|
|
1826
|
+
if (isPointerEvent(event) || isMouseEvent(event)) {
|
|
1834
1827
|
// Watch for multiple subsequent deltas; this might occur for tiny cursor movements.
|
|
1835
1828
|
// In this case, Panel sizes might not change–
|
|
1836
1829
|
// but updating cursor in this scenario would cause a flicker.
|
|
@@ -2096,6 +2089,7 @@ function PanelResizeHandle({
|
|
|
2096
2089
|
tagName: Type = "div",
|
|
2097
2090
|
...rest
|
|
2098
2091
|
}) {
|
|
2092
|
+
var _hitAreaMargins$coars, _hitAreaMargins$fine;
|
|
2099
2093
|
const elementRef = useRef(null);
|
|
2100
2094
|
|
|
2101
2095
|
// Use a ref to guard against users passing inline props
|
|
@@ -2132,8 +2126,12 @@ function PanelResizeHandle({
|
|
|
2132
2126
|
setResizeHandler(() => resizeHandler);
|
|
2133
2127
|
}
|
|
2134
2128
|
}, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
|
|
2129
|
+
|
|
2130
|
+
// Extract hit area margins before passing them to the effect's dependency array
|
|
2131
|
+
// so that inline object values won't trigger re-renders
|
|
2132
|
+
const coarseHitAreaMargins = (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15;
|
|
2133
|
+
const fineHitAreaMargins = (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5;
|
|
2135
2134
|
useEffect(() => {
|
|
2136
|
-
var _hitAreaMargins$coars, _hitAreaMargins$fine;
|
|
2137
2135
|
if (disabled || resizeHandler == null) {
|
|
2138
2136
|
return;
|
|
2139
2137
|
}
|
|
@@ -2183,12 +2181,10 @@ function PanelResizeHandle({
|
|
|
2183
2181
|
}
|
|
2184
2182
|
};
|
|
2185
2183
|
return registerResizeHandle(resizeHandleId, element, direction, {
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
// Fine inputs (e.g. mouse)
|
|
2189
|
-
fine: (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5
|
|
2184
|
+
coarse: coarseHitAreaMargins,
|
|
2185
|
+
fine: fineHitAreaMargins
|
|
2190
2186
|
}, setResizeHandlerState);
|
|
2191
|
-
}, [direction, disabled,
|
|
2187
|
+
}, [coarseHitAreaMargins, direction, disabled, fineHitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
|
|
2192
2188
|
useWindowSplitterResizeHandlerBehavior({
|
|
2193
2189
|
disabled,
|
|
2194
2190
|
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
|
|
|
@@ -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.
|
|
@@ -2072,6 +2065,7 @@ function PanelResizeHandle({
|
|
|
2072
2065
|
tagName: Type = "div",
|
|
2073
2066
|
...rest
|
|
2074
2067
|
}) {
|
|
2068
|
+
var _hitAreaMargins$coars, _hitAreaMargins$fine;
|
|
2075
2069
|
const elementRef = useRef(null);
|
|
2076
2070
|
|
|
2077
2071
|
// Use a ref to guard against users passing inline props
|
|
@@ -2108,8 +2102,12 @@ function PanelResizeHandle({
|
|
|
2108
2102
|
setResizeHandler(() => resizeHandler);
|
|
2109
2103
|
}
|
|
2110
2104
|
}, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
|
|
2105
|
+
|
|
2106
|
+
// Extract hit area margins before passing them to the effect's dependency array
|
|
2107
|
+
// so that inline object values won't trigger re-renders
|
|
2108
|
+
const coarseHitAreaMargins = (_hitAreaMargins$coars = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.coarse) !== null && _hitAreaMargins$coars !== void 0 ? _hitAreaMargins$coars : 15;
|
|
2109
|
+
const fineHitAreaMargins = (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5;
|
|
2111
2110
|
useEffect(() => {
|
|
2112
|
-
var _hitAreaMargins$coars, _hitAreaMargins$fine;
|
|
2113
2111
|
if (disabled || resizeHandler == null) {
|
|
2114
2112
|
return;
|
|
2115
2113
|
}
|
|
@@ -2159,12 +2157,10 @@ function PanelResizeHandle({
|
|
|
2159
2157
|
}
|
|
2160
2158
|
};
|
|
2161
2159
|
return registerResizeHandle(resizeHandleId, element, direction, {
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
// Fine inputs (e.g. mouse)
|
|
2165
|
-
fine: (_hitAreaMargins$fine = hitAreaMargins === null || hitAreaMargins === void 0 ? void 0 : hitAreaMargins.fine) !== null && _hitAreaMargins$fine !== void 0 ? _hitAreaMargins$fine : 5
|
|
2160
|
+
coarse: coarseHitAreaMargins,
|
|
2161
|
+
fine: fineHitAreaMargins
|
|
2166
2162
|
}, setResizeHandlerState);
|
|
2167
|
-
}, [direction, disabled,
|
|
2163
|
+
}, [coarseHitAreaMargins, direction, disabled, fineHitAreaMargins, registerResizeHandleWithParentGroup, resizeHandleId, resizeHandler, startDragging, stopDragging]);
|
|
2168
2164
|
useWindowSplitterResizeHandlerBehavior({
|
|
2169
2165
|
disabled,
|
|
2170
2166
|
handleId: resizeHandleId,
|