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.
- package/CHANGELOG.md +5 -0
- package/README.md +12 -10
- package/dist/react-resizable-panels.d.ts +32 -7
- package/dist/react-resizable-panels.d.ts.map +1 -1
- package/dist/react-resizable-panels.js +95 -54
- package/dist/react-resizable-panels.js.map +1 -1
- package/dist/react-resizable-panels.module.js +94 -53
- package/dist/react-resizable-panels.module.js.map +1 -1
- package/package.json +1 -1
- package/src/{Panel.tsx → Panel.ts} +58 -40
- package/src/{PanelGroup.tsx → PanelGroup.ts} +40 -22
- package/src/{PanelResizeHandle.tsx → PanelResizeHandle.ts} +44 -44
- package/src/hooks/useWindowSplitterBehavior.ts +19 -7
- package/src/types.ts +6 -0
- package/src/utils/coordinates.ts +2 -10
- package/src/utils/group.ts +31 -1
|
@@ -51,15 +51,27 @@ export function useWindowSplitterPanelGroupBehavior({
|
|
|
51
51
|
return () => {};
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
59
|
-
}, 100);
|
|
68
|
+
});
|
|
60
69
|
|
|
61
|
-
const
|
|
62
|
-
|
|
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
|
|
package/src/utils/coordinates.ts
CHANGED
|
@@ -64,17 +64,9 @@ export function getMovement(
|
|
|
64
64
|
case "ArrowUp":
|
|
65
65
|
return isHorizontal ? 0 : -delta;
|
|
66
66
|
case "End":
|
|
67
|
-
|
|
68
|
-
return size;
|
|
69
|
-
} else {
|
|
70
|
-
return size;
|
|
71
|
-
}
|
|
67
|
+
return size;
|
|
72
68
|
case "Home":
|
|
73
|
-
|
|
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);
|
package/src/utils/group.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
+
}
|