react-resizable-panels 2.1.1 → 2.1.3
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 +8 -0
- package/dist/declarations/src/PanelResizeHandleRegistry.d.ts +1 -1
- package/dist/react-resizable-panels.browser.cjs.js +9 -1
- package/dist/react-resizable-panels.browser.development.cjs.js +9 -1
- package/dist/react-resizable-panels.browser.development.esm.js +9 -1
- package/dist/react-resizable-panels.browser.esm.js +9 -1
- package/dist/react-resizable-panels.cjs.js +9 -1
- package/dist/react-resizable-panels.development.cjs.js +9 -1
- package/dist/react-resizable-panels.development.esm.js +9 -1
- package/dist/react-resizable-panels.development.node.cjs.js +9 -1
- package/dist/react-resizable-panels.development.node.esm.js +9 -1
- package/dist/react-resizable-panels.esm.js +9 -1
- package/dist/react-resizable-panels.node.cjs.js +9 -1
- package/dist/react-resizable-panels.node.esm.js +9 -1
- package/package.json +4 -1
- package/src/PanelGroup.test.tsx +21 -0
- package/src/PanelGroup.ts +1 -0
- package/src/PanelResizeHandle.ts +5 -1
- package/src/PanelResizeHandleRegistry.ts +5 -1
- package/src/utils/validatePanelGroupLayout.ts +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Direction, ResizeEvent } from "./types.js";
|
|
2
2
|
export type ResizeHandlerAction = "down" | "move" | "up";
|
|
3
|
-
export type SetResizeHandlerState = (action: ResizeHandlerAction, isActive: boolean, event: ResizeEvent) => void;
|
|
3
|
+
export type SetResizeHandlerState = (action: ResizeHandlerAction, isActive: boolean, event: ResizeEvent | null) => void;
|
|
4
4
|
export type PointerHitAreaMargins = {
|
|
5
5
|
coarse: number;
|
|
6
6
|
fine: number;
|
|
@@ -485,6 +485,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
485
485
|
intersectingHandles.splice(index, 1);
|
|
486
486
|
}
|
|
487
487
|
updateCursor();
|
|
488
|
+
|
|
489
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
490
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
491
|
+
setResizeHandlerState("up", true, null);
|
|
488
492
|
}
|
|
489
493
|
};
|
|
490
494
|
}
|
|
@@ -1542,7 +1546,7 @@ function validatePanelGroupLayout({
|
|
|
1542
1546
|
// Validate layout expectations
|
|
1543
1547
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1544
1548
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1545
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1549
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1546
1550
|
for (let index = 0; index < panelConstraints.length; index++) {
|
|
1547
1551
|
const unsafeSize = nextLayout[index];
|
|
1548
1552
|
assert(unsafeSize != null, `No layout data found for index ${index}`);
|
|
@@ -2082,6 +2086,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2082
2086
|
resizePanel(panelData, nextMaxSize);
|
|
2083
2087
|
}
|
|
2084
2088
|
}, [resizePanel]);
|
|
2089
|
+
|
|
2090
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2085
2091
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2086
2092
|
const {
|
|
2087
2093
|
direction
|
|
@@ -2312,6 +2318,7 @@ function PanelResizeHandle({
|
|
|
2312
2318
|
case "down":
|
|
2313
2319
|
{
|
|
2314
2320
|
setState("drag");
|
|
2321
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2315
2322
|
startDragging(resizeHandleId, event);
|
|
2316
2323
|
const {
|
|
2317
2324
|
onDragging
|
|
@@ -2329,6 +2336,7 @@ function PanelResizeHandle({
|
|
|
2329
2336
|
if (state !== "drag") {
|
|
2330
2337
|
setState("hover");
|
|
2331
2338
|
}
|
|
2339
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2332
2340
|
resizeHandler(event);
|
|
2333
2341
|
break;
|
|
2334
2342
|
}
|
|
@@ -491,6 +491,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
491
491
|
intersectingHandles.splice(index, 1);
|
|
492
492
|
}
|
|
493
493
|
updateCursor();
|
|
494
|
+
|
|
495
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
496
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
497
|
+
setResizeHandlerState("up", true, null);
|
|
494
498
|
}
|
|
495
499
|
};
|
|
496
500
|
}
|
|
@@ -1601,7 +1605,7 @@ function validatePanelGroupLayout({
|
|
|
1601
1605
|
// Validate layout expectations
|
|
1602
1606
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1603
1607
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1604
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1608
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1605
1609
|
// This is not ideal so we should warn about it, but it may be recoverable in some cases
|
|
1606
1610
|
// (especially if the amount is small)
|
|
1607
1611
|
{
|
|
@@ -2188,6 +2192,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2188
2192
|
resizePanel(panelData, nextMaxSize);
|
|
2189
2193
|
}
|
|
2190
2194
|
}, [resizePanel]);
|
|
2195
|
+
|
|
2196
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2191
2197
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2192
2198
|
const {
|
|
2193
2199
|
direction
|
|
@@ -2418,6 +2424,7 @@ function PanelResizeHandle({
|
|
|
2418
2424
|
case "down":
|
|
2419
2425
|
{
|
|
2420
2426
|
setState("drag");
|
|
2427
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2421
2428
|
startDragging(resizeHandleId, event);
|
|
2422
2429
|
const {
|
|
2423
2430
|
onDragging
|
|
@@ -2435,6 +2442,7 @@ function PanelResizeHandle({
|
|
|
2435
2442
|
if (state !== "drag") {
|
|
2436
2443
|
setState("hover");
|
|
2437
2444
|
}
|
|
2445
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2438
2446
|
resizeHandler(event);
|
|
2439
2447
|
break;
|
|
2440
2448
|
}
|
|
@@ -467,6 +467,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
467
467
|
intersectingHandles.splice(index, 1);
|
|
468
468
|
}
|
|
469
469
|
updateCursor();
|
|
470
|
+
|
|
471
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
472
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
473
|
+
setResizeHandlerState("up", true, null);
|
|
470
474
|
}
|
|
471
475
|
};
|
|
472
476
|
}
|
|
@@ -1577,7 +1581,7 @@ function validatePanelGroupLayout({
|
|
|
1577
1581
|
// Validate layout expectations
|
|
1578
1582
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1579
1583
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1580
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1584
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1581
1585
|
// This is not ideal so we should warn about it, but it may be recoverable in some cases
|
|
1582
1586
|
// (especially if the amount is small)
|
|
1583
1587
|
{
|
|
@@ -2164,6 +2168,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2164
2168
|
resizePanel(panelData, nextMaxSize);
|
|
2165
2169
|
}
|
|
2166
2170
|
}, [resizePanel]);
|
|
2171
|
+
|
|
2172
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2167
2173
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2168
2174
|
const {
|
|
2169
2175
|
direction
|
|
@@ -2394,6 +2400,7 @@ function PanelResizeHandle({
|
|
|
2394
2400
|
case "down":
|
|
2395
2401
|
{
|
|
2396
2402
|
setState("drag");
|
|
2403
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2397
2404
|
startDragging(resizeHandleId, event);
|
|
2398
2405
|
const {
|
|
2399
2406
|
onDragging
|
|
@@ -2411,6 +2418,7 @@ function PanelResizeHandle({
|
|
|
2411
2418
|
if (state !== "drag") {
|
|
2412
2419
|
setState("hover");
|
|
2413
2420
|
}
|
|
2421
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2414
2422
|
resizeHandler(event);
|
|
2415
2423
|
break;
|
|
2416
2424
|
}
|
|
@@ -461,6 +461,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
461
461
|
intersectingHandles.splice(index, 1);
|
|
462
462
|
}
|
|
463
463
|
updateCursor();
|
|
464
|
+
|
|
465
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
466
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
467
|
+
setResizeHandlerState("up", true, null);
|
|
464
468
|
}
|
|
465
469
|
};
|
|
466
470
|
}
|
|
@@ -1518,7 +1522,7 @@ function validatePanelGroupLayout({
|
|
|
1518
1522
|
// Validate layout expectations
|
|
1519
1523
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1520
1524
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1521
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1525
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1522
1526
|
for (let index = 0; index < panelConstraints.length; index++) {
|
|
1523
1527
|
const unsafeSize = nextLayout[index];
|
|
1524
1528
|
assert(unsafeSize != null, `No layout data found for index ${index}`);
|
|
@@ -2058,6 +2062,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2058
2062
|
resizePanel(panelData, nextMaxSize);
|
|
2059
2063
|
}
|
|
2060
2064
|
}, [resizePanel]);
|
|
2065
|
+
|
|
2066
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2061
2067
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2062
2068
|
const {
|
|
2063
2069
|
direction
|
|
@@ -2288,6 +2294,7 @@ function PanelResizeHandle({
|
|
|
2288
2294
|
case "down":
|
|
2289
2295
|
{
|
|
2290
2296
|
setState("drag");
|
|
2297
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2291
2298
|
startDragging(resizeHandleId, event);
|
|
2292
2299
|
const {
|
|
2293
2300
|
onDragging
|
|
@@ -2305,6 +2312,7 @@ function PanelResizeHandle({
|
|
|
2305
2312
|
if (state !== "drag") {
|
|
2306
2313
|
setState("hover");
|
|
2307
2314
|
}
|
|
2315
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2308
2316
|
resizeHandler(event);
|
|
2309
2317
|
break;
|
|
2310
2318
|
}
|
|
@@ -487,6 +487,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
487
487
|
intersectingHandles.splice(index, 1);
|
|
488
488
|
}
|
|
489
489
|
updateCursor();
|
|
490
|
+
|
|
491
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
492
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
493
|
+
setResizeHandlerState("up", true, null);
|
|
490
494
|
}
|
|
491
495
|
};
|
|
492
496
|
}
|
|
@@ -1544,7 +1548,7 @@ function validatePanelGroupLayout({
|
|
|
1544
1548
|
// Validate layout expectations
|
|
1545
1549
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1546
1550
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1547
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1551
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1548
1552
|
for (let index = 0; index < panelConstraints.length; index++) {
|
|
1549
1553
|
const unsafeSize = nextLayout[index];
|
|
1550
1554
|
assert(unsafeSize != null, `No layout data found for index ${index}`);
|
|
@@ -2084,6 +2088,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2084
2088
|
resizePanel(panelData, nextMaxSize);
|
|
2085
2089
|
}
|
|
2086
2090
|
}, [resizePanel]);
|
|
2091
|
+
|
|
2092
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2087
2093
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2088
2094
|
const {
|
|
2089
2095
|
direction
|
|
@@ -2314,6 +2320,7 @@ function PanelResizeHandle({
|
|
|
2314
2320
|
case "down":
|
|
2315
2321
|
{
|
|
2316
2322
|
setState("drag");
|
|
2323
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2317
2324
|
startDragging(resizeHandleId, event);
|
|
2318
2325
|
const {
|
|
2319
2326
|
onDragging
|
|
@@ -2331,6 +2338,7 @@ function PanelResizeHandle({
|
|
|
2331
2338
|
if (state !== "drag") {
|
|
2332
2339
|
setState("hover");
|
|
2333
2340
|
}
|
|
2341
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2334
2342
|
resizeHandler(event);
|
|
2335
2343
|
break;
|
|
2336
2344
|
}
|
|
@@ -498,6 +498,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
498
498
|
intersectingHandles.splice(index, 1);
|
|
499
499
|
}
|
|
500
500
|
updateCursor();
|
|
501
|
+
|
|
502
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
503
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
504
|
+
setResizeHandlerState("up", true, null);
|
|
501
505
|
}
|
|
502
506
|
};
|
|
503
507
|
}
|
|
@@ -1608,7 +1612,7 @@ function validatePanelGroupLayout({
|
|
|
1608
1612
|
// Validate layout expectations
|
|
1609
1613
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1610
1614
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1611
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1615
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1612
1616
|
// This is not ideal so we should warn about it, but it may be recoverable in some cases
|
|
1613
1617
|
// (especially if the amount is small)
|
|
1614
1618
|
{
|
|
@@ -2195,6 +2199,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2195
2199
|
resizePanel(panelData, nextMaxSize);
|
|
2196
2200
|
}
|
|
2197
2201
|
}, [resizePanel]);
|
|
2202
|
+
|
|
2203
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2198
2204
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2199
2205
|
const {
|
|
2200
2206
|
direction
|
|
@@ -2425,6 +2431,7 @@ function PanelResizeHandle({
|
|
|
2425
2431
|
case "down":
|
|
2426
2432
|
{
|
|
2427
2433
|
setState("drag");
|
|
2434
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2428
2435
|
startDragging(resizeHandleId, event);
|
|
2429
2436
|
const {
|
|
2430
2437
|
onDragging
|
|
@@ -2442,6 +2449,7 @@ function PanelResizeHandle({
|
|
|
2442
2449
|
if (state !== "drag") {
|
|
2443
2450
|
setState("hover");
|
|
2444
2451
|
}
|
|
2452
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2445
2453
|
resizeHandler(event);
|
|
2446
2454
|
break;
|
|
2447
2455
|
}
|
|
@@ -474,6 +474,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
474
474
|
intersectingHandles.splice(index, 1);
|
|
475
475
|
}
|
|
476
476
|
updateCursor();
|
|
477
|
+
|
|
478
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
479
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
480
|
+
setResizeHandlerState("up", true, null);
|
|
477
481
|
}
|
|
478
482
|
};
|
|
479
483
|
}
|
|
@@ -1584,7 +1588,7 @@ function validatePanelGroupLayout({
|
|
|
1584
1588
|
// Validate layout expectations
|
|
1585
1589
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1586
1590
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1587
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1591
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1588
1592
|
// This is not ideal so we should warn about it, but it may be recoverable in some cases
|
|
1589
1593
|
// (especially if the amount is small)
|
|
1590
1594
|
{
|
|
@@ -2171,6 +2175,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2171
2175
|
resizePanel(panelData, nextMaxSize);
|
|
2172
2176
|
}
|
|
2173
2177
|
}, [resizePanel]);
|
|
2178
|
+
|
|
2179
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2174
2180
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2175
2181
|
const {
|
|
2176
2182
|
direction
|
|
@@ -2401,6 +2407,7 @@ function PanelResizeHandle({
|
|
|
2401
2407
|
case "down":
|
|
2402
2408
|
{
|
|
2403
2409
|
setState("drag");
|
|
2410
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2404
2411
|
startDragging(resizeHandleId, event);
|
|
2405
2412
|
const {
|
|
2406
2413
|
onDragging
|
|
@@ -2418,6 +2425,7 @@ function PanelResizeHandle({
|
|
|
2418
2425
|
if (state !== "drag") {
|
|
2419
2426
|
setState("hover");
|
|
2420
2427
|
}
|
|
2428
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2421
2429
|
resizeHandler(event);
|
|
2422
2430
|
break;
|
|
2423
2431
|
}
|
|
@@ -460,6 +460,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
460
460
|
intersectingHandles.splice(index, 1);
|
|
461
461
|
}
|
|
462
462
|
updateCursor();
|
|
463
|
+
|
|
464
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
465
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
466
|
+
setResizeHandlerState("up", true, null);
|
|
463
467
|
}
|
|
464
468
|
};
|
|
465
469
|
}
|
|
@@ -1440,7 +1444,7 @@ function validatePanelGroupLayout({
|
|
|
1440
1444
|
// Validate layout expectations
|
|
1441
1445
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1442
1446
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1443
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1447
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1444
1448
|
// This is not ideal so we should warn about it, but it may be recoverable in some cases
|
|
1445
1449
|
// (especially if the amount is small)
|
|
1446
1450
|
{
|
|
@@ -1963,6 +1967,8 @@ function PanelGroupWithForwardedRef({
|
|
|
1963
1967
|
resizePanel(panelData, nextMaxSize);
|
|
1964
1968
|
}
|
|
1965
1969
|
}, [resizePanel]);
|
|
1970
|
+
|
|
1971
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
1966
1972
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
1967
1973
|
const {
|
|
1968
1974
|
direction
|
|
@@ -2190,6 +2196,7 @@ function PanelResizeHandle({
|
|
|
2190
2196
|
case "down":
|
|
2191
2197
|
{
|
|
2192
2198
|
setState("drag");
|
|
2199
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2193
2200
|
startDragging(resizeHandleId, event);
|
|
2194
2201
|
const {
|
|
2195
2202
|
onDragging
|
|
@@ -2207,6 +2214,7 @@ function PanelResizeHandle({
|
|
|
2207
2214
|
if (state !== "drag") {
|
|
2208
2215
|
setState("hover");
|
|
2209
2216
|
}
|
|
2217
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2210
2218
|
resizeHandler(event);
|
|
2211
2219
|
break;
|
|
2212
2220
|
}
|
|
@@ -436,6 +436,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
436
436
|
intersectingHandles.splice(index, 1);
|
|
437
437
|
}
|
|
438
438
|
updateCursor();
|
|
439
|
+
|
|
440
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
441
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
442
|
+
setResizeHandlerState("up", true, null);
|
|
439
443
|
}
|
|
440
444
|
};
|
|
441
445
|
}
|
|
@@ -1416,7 +1420,7 @@ function validatePanelGroupLayout({
|
|
|
1416
1420
|
// Validate layout expectations
|
|
1417
1421
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1418
1422
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1419
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1423
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1420
1424
|
// This is not ideal so we should warn about it, but it may be recoverable in some cases
|
|
1421
1425
|
// (especially if the amount is small)
|
|
1422
1426
|
{
|
|
@@ -1939,6 +1943,8 @@ function PanelGroupWithForwardedRef({
|
|
|
1939
1943
|
resizePanel(panelData, nextMaxSize);
|
|
1940
1944
|
}
|
|
1941
1945
|
}, [resizePanel]);
|
|
1946
|
+
|
|
1947
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
1942
1948
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
1943
1949
|
const {
|
|
1944
1950
|
direction
|
|
@@ -2166,6 +2172,7 @@ function PanelResizeHandle({
|
|
|
2166
2172
|
case "down":
|
|
2167
2173
|
{
|
|
2168
2174
|
setState("drag");
|
|
2175
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2169
2176
|
startDragging(resizeHandleId, event);
|
|
2170
2177
|
const {
|
|
2171
2178
|
onDragging
|
|
@@ -2183,6 +2190,7 @@ function PanelResizeHandle({
|
|
|
2183
2190
|
if (state !== "drag") {
|
|
2184
2191
|
setState("hover");
|
|
2185
2192
|
}
|
|
2193
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2186
2194
|
resizeHandler(event);
|
|
2187
2195
|
break;
|
|
2188
2196
|
}
|
|
@@ -463,6 +463,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
463
463
|
intersectingHandles.splice(index, 1);
|
|
464
464
|
}
|
|
465
465
|
updateCursor();
|
|
466
|
+
|
|
467
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
468
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
469
|
+
setResizeHandlerState("up", true, null);
|
|
466
470
|
}
|
|
467
471
|
};
|
|
468
472
|
}
|
|
@@ -1520,7 +1524,7 @@ function validatePanelGroupLayout({
|
|
|
1520
1524
|
// Validate layout expectations
|
|
1521
1525
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1522
1526
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1523
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1527
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1524
1528
|
for (let index = 0; index < panelConstraints.length; index++) {
|
|
1525
1529
|
const unsafeSize = nextLayout[index];
|
|
1526
1530
|
assert(unsafeSize != null, `No layout data found for index ${index}`);
|
|
@@ -2060,6 +2064,8 @@ function PanelGroupWithForwardedRef({
|
|
|
2060
2064
|
resizePanel(panelData, nextMaxSize);
|
|
2061
2065
|
}
|
|
2062
2066
|
}, [resizePanel]);
|
|
2067
|
+
|
|
2068
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
2063
2069
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
2064
2070
|
const {
|
|
2065
2071
|
direction
|
|
@@ -2290,6 +2296,7 @@ function PanelResizeHandle({
|
|
|
2290
2296
|
case "down":
|
|
2291
2297
|
{
|
|
2292
2298
|
setState("drag");
|
|
2299
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2293
2300
|
startDragging(resizeHandleId, event);
|
|
2294
2301
|
const {
|
|
2295
2302
|
onDragging
|
|
@@ -2307,6 +2314,7 @@ function PanelResizeHandle({
|
|
|
2307
2314
|
if (state !== "drag") {
|
|
2308
2315
|
setState("hover");
|
|
2309
2316
|
}
|
|
2317
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2310
2318
|
resizeHandler(event);
|
|
2311
2319
|
break;
|
|
2312
2320
|
}
|
|
@@ -449,6 +449,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
449
449
|
intersectingHandles.splice(index, 1);
|
|
450
450
|
}
|
|
451
451
|
updateCursor();
|
|
452
|
+
|
|
453
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
454
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
455
|
+
setResizeHandlerState("up", true, null);
|
|
452
456
|
}
|
|
453
457
|
};
|
|
454
458
|
}
|
|
@@ -1386,7 +1390,7 @@ function validatePanelGroupLayout({
|
|
|
1386
1390
|
// Validate layout expectations
|
|
1387
1391
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1388
1392
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1389
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1393
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1390
1394
|
for (let index = 0; index < panelConstraints.length; index++) {
|
|
1391
1395
|
const unsafeSize = nextLayout[index];
|
|
1392
1396
|
assert(unsafeSize != null, `No layout data found for index ${index}`);
|
|
@@ -1862,6 +1866,8 @@ function PanelGroupWithForwardedRef({
|
|
|
1862
1866
|
resizePanel(panelData, nextMaxSize);
|
|
1863
1867
|
}
|
|
1864
1868
|
}, [resizePanel]);
|
|
1869
|
+
|
|
1870
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
1865
1871
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
1866
1872
|
const {
|
|
1867
1873
|
direction
|
|
@@ -2089,6 +2095,7 @@ function PanelResizeHandle({
|
|
|
2089
2095
|
case "down":
|
|
2090
2096
|
{
|
|
2091
2097
|
setState("drag");
|
|
2098
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2092
2099
|
startDragging(resizeHandleId, event);
|
|
2093
2100
|
const {
|
|
2094
2101
|
onDragging
|
|
@@ -2106,6 +2113,7 @@ function PanelResizeHandle({
|
|
|
2106
2113
|
if (state !== "drag") {
|
|
2107
2114
|
setState("hover");
|
|
2108
2115
|
}
|
|
2116
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2109
2117
|
resizeHandler(event);
|
|
2110
2118
|
break;
|
|
2111
2119
|
}
|
|
@@ -425,6 +425,10 @@ function registerResizeHandle(resizeHandleId, element, direction, hitAreaMargins
|
|
|
425
425
|
intersectingHandles.splice(index, 1);
|
|
426
426
|
}
|
|
427
427
|
updateCursor();
|
|
428
|
+
|
|
429
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
430
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
431
|
+
setResizeHandlerState("up", true, null);
|
|
428
432
|
}
|
|
429
433
|
};
|
|
430
434
|
}
|
|
@@ -1362,7 +1366,7 @@ function validatePanelGroupLayout({
|
|
|
1362
1366
|
// Validate layout expectations
|
|
1363
1367
|
if (nextLayout.length !== panelConstraints.length) {
|
|
1364
1368
|
throw Error(`Invalid ${panelConstraints.length} panel layout: ${nextLayout.map(size => `${size}%`).join(", ")}`);
|
|
1365
|
-
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100)) {
|
|
1369
|
+
} else if (!fuzzyNumbersEqual(nextLayoutTotalSize, 100) && nextLayout.length > 0) {
|
|
1366
1370
|
for (let index = 0; index < panelConstraints.length; index++) {
|
|
1367
1371
|
const unsafeSize = nextLayout[index];
|
|
1368
1372
|
assert(unsafeSize != null, `No layout data found for index ${index}`);
|
|
@@ -1838,6 +1842,8 @@ function PanelGroupWithForwardedRef({
|
|
|
1838
1842
|
resizePanel(panelData, nextMaxSize);
|
|
1839
1843
|
}
|
|
1840
1844
|
}, [resizePanel]);
|
|
1845
|
+
|
|
1846
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
1841
1847
|
const startDragging = useCallback((dragHandleId, event) => {
|
|
1842
1848
|
const {
|
|
1843
1849
|
direction
|
|
@@ -2065,6 +2071,7 @@ function PanelResizeHandle({
|
|
|
2065
2071
|
case "down":
|
|
2066
2072
|
{
|
|
2067
2073
|
setState("drag");
|
|
2074
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
2068
2075
|
startDragging(resizeHandleId, event);
|
|
2069
2076
|
const {
|
|
2070
2077
|
onDragging
|
|
@@ -2082,6 +2089,7 @@ function PanelResizeHandle({
|
|
|
2082
2089
|
if (state !== "drag") {
|
|
2083
2090
|
setState("hover");
|
|
2084
2091
|
}
|
|
2092
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
2085
2093
|
resizeHandler(event);
|
|
2086
2094
|
break;
|
|
2087
2095
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-resizable-panels",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.3",
|
|
4
4
|
"description": "React components for resizable panel groups/layouts",
|
|
5
5
|
"author": "Brian Vaughn <brian.david.vaughn@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -61,6 +61,9 @@
|
|
|
61
61
|
},
|
|
62
62
|
"types": "dist/react-resizable-panels.cjs.d.ts",
|
|
63
63
|
"scripts": {
|
|
64
|
+
"clear": "pnpm run clear:builds & pnpm run clear:node_modules",
|
|
65
|
+
"clear:builds": "rm -rf ./packages/*/dist",
|
|
66
|
+
"clear:node_modules": "rm -rf ./node_modules",
|
|
64
67
|
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
|
65
68
|
"test": "jest --config=jest.config.js",
|
|
66
69
|
"test:watch": "jest --config=jest.config.js --watch",
|
package/src/PanelGroup.test.tsx
CHANGED
|
@@ -418,5 +418,26 @@ describe("PanelGroup", () => {
|
|
|
418
418
|
ref.current?.setLayout([60, 80]);
|
|
419
419
|
});
|
|
420
420
|
});
|
|
421
|
+
|
|
422
|
+
it("should warn about an empty layout", () => {
|
|
423
|
+
act(() => {
|
|
424
|
+
root.render(
|
|
425
|
+
<PanelGroup direction="horizontal" id="group-without-handle">
|
|
426
|
+
<Panel />
|
|
427
|
+
</PanelGroup>
|
|
428
|
+
);
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
// Since the layout is empty, no warning is expected (even though the sizes won't total 100%)
|
|
432
|
+
|
|
433
|
+
act(() => {
|
|
434
|
+
root.render(
|
|
435
|
+
<PanelGroup
|
|
436
|
+
direction="horizontal"
|
|
437
|
+
id="group-without-handle"
|
|
438
|
+
></PanelGroup>
|
|
439
|
+
);
|
|
440
|
+
});
|
|
441
|
+
});
|
|
421
442
|
});
|
|
422
443
|
});
|
package/src/PanelGroup.ts
CHANGED
|
@@ -816,6 +816,7 @@ function PanelGroupWithForwardedRef({
|
|
|
816
816
|
[resizePanel]
|
|
817
817
|
);
|
|
818
818
|
|
|
819
|
+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
|
|
819
820
|
const startDragging = useCallback(
|
|
820
821
|
(dragHandleId: string, event: ResizeEvent) => {
|
|
821
822
|
const { direction } = committedValuesRef.current;
|
package/src/PanelResizeHandle.ts
CHANGED
|
@@ -129,13 +129,15 @@ export function PanelResizeHandle({
|
|
|
129
129
|
const setResizeHandlerState = (
|
|
130
130
|
action: ResizeHandlerAction,
|
|
131
131
|
isActive: boolean,
|
|
132
|
-
event: ResizeEvent
|
|
132
|
+
event: ResizeEvent | null
|
|
133
133
|
) => {
|
|
134
134
|
if (isActive) {
|
|
135
135
|
switch (action) {
|
|
136
136
|
case "down": {
|
|
137
137
|
setState("drag");
|
|
138
138
|
|
|
139
|
+
assert(event, 'Expected event to be defined for "down" action');
|
|
140
|
+
|
|
139
141
|
startDragging(resizeHandleId, event);
|
|
140
142
|
|
|
141
143
|
const { onDragging } = callbacksRef.current;
|
|
@@ -151,6 +153,8 @@ export function PanelResizeHandle({
|
|
|
151
153
|
setState("hover");
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
assert(event, 'Expected event to be defined for "move" action');
|
|
157
|
+
|
|
154
158
|
resizeHandler(event);
|
|
155
159
|
break;
|
|
156
160
|
}
|
|
@@ -9,7 +9,7 @@ export type ResizeHandlerAction = "down" | "move" | "up";
|
|
|
9
9
|
export type SetResizeHandlerState = (
|
|
10
10
|
action: ResizeHandlerAction,
|
|
11
11
|
isActive: boolean,
|
|
12
|
-
event: ResizeEvent
|
|
12
|
+
event: ResizeEvent | null
|
|
13
13
|
) => void;
|
|
14
14
|
|
|
15
15
|
export type PointerHitAreaMargins = {
|
|
@@ -83,6 +83,10 @@ export function registerResizeHandle(
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
updateCursor();
|
|
86
|
+
|
|
87
|
+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
|
|
88
|
+
// See github.com/bvaughn/react-resizable-panels/issues/402
|
|
89
|
+
setResizeHandlerState("up", true, null);
|
|
86
90
|
}
|
|
87
91
|
};
|
|
88
92
|
}
|
|
@@ -25,7 +25,10 @@ export function validatePanelGroupLayout({
|
|
|
25
25
|
.map((size) => `${size}%`)
|
|
26
26
|
.join(", ")}`
|
|
27
27
|
);
|
|
28
|
-
} else if (
|
|
28
|
+
} else if (
|
|
29
|
+
!fuzzyNumbersEqual(nextLayoutTotalSize, 100) &&
|
|
30
|
+
nextLayout.length > 0
|
|
31
|
+
) {
|
|
29
32
|
// This is not ideal so we should warn about it, but it may be recoverable in some cases
|
|
30
33
|
// (especially if the amount is small)
|
|
31
34
|
if (isDevelopment) {
|