react-resizable-panels 0.0.22 → 0.0.23

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.
@@ -51,15 +51,27 @@ export function useWindowSplitterPanelGroupBehavior({
51
51
  return () => {};
52
52
  }
53
53
 
54
- const ariaValueMax = panelsArray.reduce((difference, panel) => {
55
- if (panel.id !== idBefore) {
56
- return difference - panel.minSize;
54
+ let minSize = 0;
55
+ let maxSize = 100;
56
+ let totalMinSize = 0;
57
+ let totalMaxSize = 0;
58
+
59
+ // A panel's effective min/max sizes also need to account for other panel's sizes.
60
+ panelsArray.forEach((panelData) => {
61
+ if (panelData.id === idBefore) {
62
+ maxSize = panelData.maxSize;
63
+ minSize = panelData.minSize;
64
+ } else {
65
+ totalMinSize += panelData.minSize;
66
+ totalMaxSize += panelData.maxSize;
57
67
  }
58
- return difference;
59
- }, 100);
68
+ });
60
69
 
61
- const ariaValueMin =
62
- panelsArray.find((panel) => panel.id == idBefore)?.minSize ?? 0;
70
+ const ariaValueMax = Math.min(maxSize, 100 - totalMinSize);
71
+ const ariaValueMin = Math.max(
72
+ minSize,
73
+ (panelsArray.length - 1) * 100 - totalMaxSize
74
+ );
63
75
 
64
76
  const flexGrow = getFlexGrow(panels, idBefore, sizes);
65
77
 
package/src/types.ts CHANGED
@@ -1,9 +1,15 @@
1
+ import { RefObject } from "react";
2
+
1
3
  export type Direction = "horizontal" | "vertical";
2
4
 
5
+ export type PanelOnResize = (size: number) => void;
6
+
3
7
  export type PanelData = {
4
8
  defaultSize: number;
5
9
  id: string;
10
+ maxSize: number;
6
11
  minSize: number;
12
+ onResizeRef: RefObject<PanelOnResize | null>;
7
13
  order: number | null;
8
14
  };
9
15
 
@@ -64,17 +64,9 @@ export function getMovement(
64
64
  case "ArrowUp":
65
65
  return isHorizontal ? 0 : -delta;
66
66
  case "End":
67
- if (isHorizontal) {
68
- return size;
69
- } else {
70
- return size;
71
- }
67
+ return size;
72
68
  case "Home":
73
- if (isHorizontal) {
74
- return -size;
75
- } else {
76
- return -size;
77
- }
69
+ return -size;
78
70
  }
79
71
  } else {
80
72
  return getDragOffset(event, handleId, direction, initialOffset);
@@ -25,12 +25,29 @@ export function adjustByDelta(
25
25
  //
26
26
  // A positive delta means the panel immediately before the resizer should "expand".
27
27
  // This is accomplished by shrinking/contracting (and shifting) one or more of the panels after the resizer.
28
+
29
+ // Max-bounds check the panel being expanded first.
30
+ {
31
+ const pivotId = delta < 0 ? idAfter : idBefore;
32
+ const index = panelsArray.findIndex((panel) => panel.id === pivotId);
33
+ const panel = panelsArray[index];
34
+ const prevSize = prevSizes[index];
35
+
36
+ const nextSize = safeResizePanel(panel, Math.abs(delta), prevSize);
37
+ if (prevSize === nextSize) {
38
+ return prevSizes;
39
+ } else {
40
+ delta = delta < 0 ? prevSize - nextSize : nextSize - prevSize;
41
+ }
42
+ }
43
+
28
44
  let pivotId = delta < 0 ? idBefore : idAfter;
29
45
  let index = panelsArray.findIndex((panel) => panel.id === pivotId);
30
46
  while (true) {
31
47
  const panel = panelsArray[index];
32
48
  const prevSize = prevSizes[index];
33
- const nextSize = Math.max(prevSize - Math.abs(delta), panel.minSize);
49
+
50
+ const nextSize = safeResizePanel(panel, 0 - Math.abs(delta), prevSize);
34
51
  if (prevSize !== nextSize) {
35
52
  deltaApplied += prevSize - nextSize;
36
53
 
@@ -154,3 +171,16 @@ export function panelsMapToSortedArray(
154
171
  ): PanelData[] {
155
172
  return Array.from(panels.values()).sort((a, b) => a.order - b.order);
156
173
  }
174
+
175
+ function safeResizePanel(
176
+ panel: PanelData,
177
+ delta: number,
178
+ prevSize: number
179
+ ): number {
180
+ const nextSizeUnsafe = prevSize + delta;
181
+ const nextSize = Math.min(
182
+ panel.maxSize,
183
+ Math.max(panel.minSize, nextSizeUnsafe)
184
+ );
185
+ return nextSize;
186
+ }