react-resizable-panels 2.1.2 → 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 CHANGED
@@ -1,6 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.1.3
4
+
5
+ - Edge case bug fix for a resize handle unmounting while being dragged (#402)
6
+
3
7
  ## 2.1.2
8
+
4
9
  - Suppress invalid layout warning for empty panel groups (#396)
5
10
 
6
11
  ## 2.1.1
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -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.2",
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",
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;
@@ -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
  }