react-resizable-panels 0.0.56 → 0.0.58
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 +11 -0
- package/dist/declarations/src/Panel.d.ts +7 -3
- package/dist/declarations/src/PanelGroup.d.ts +3 -1
- package/dist/declarations/src/PanelResizeHandle.d.ts +3 -1
- package/dist/declarations/src/types.d.ts +3 -0
- package/dist/react-resizable-panels.browser.cjs.js +186 -87
- package/dist/react-resizable-panels.browser.development.cjs.js +186 -87
- package/dist/react-resizable-panels.browser.development.esm.js +186 -87
- package/dist/react-resizable-panels.browser.esm.js +186 -87
- package/dist/react-resizable-panels.cjs.js +186 -87
- package/dist/react-resizable-panels.cjs.js.map +1 -1
- package/dist/react-resizable-panels.development.cjs.js +186 -87
- package/dist/react-resizable-panels.development.esm.js +186 -87
- package/dist/react-resizable-panels.development.node.cjs.js +175 -82
- package/dist/react-resizable-panels.development.node.esm.js +175 -82
- package/dist/react-resizable-panels.esm.js +186 -87
- package/dist/react-resizable-panels.esm.js.map +1 -1
- package/dist/react-resizable-panels.node.cjs.js +175 -82
- package/dist/react-resizable-panels.node.esm.js +175 -82
- package/package.json +3 -1
- package/src/Panel.ts +9 -3
- package/src/PanelGroup.ts +11 -5
- package/src/PanelResizeHandle.ts +17 -13
- package/src/types.ts +4 -0
- package/src/utils/adjustLayoutByDelta.test.ts +238 -8
- package/src/utils/adjustLayoutByDelta.ts +122 -72
- package/src/utils/computePercentagePanelConstraints.test.ts +27 -0
- package/src/utils/convertPixelConstraintsToPercentages.test.ts +47 -0
- package/src/utils/convertPixelConstraintsToPercentages.ts +17 -0
- package/src/utils/dom/getPanelGroupElement.ts +3 -1
- package/src/utils/resizePanel.test.ts +105 -0
- package/src/utils/resizePanel.ts +26 -1
- package/src/utils/validatePanelGroupLayout.test.ts +36 -6
|
@@ -21,6 +21,23 @@ export function convertPixelConstraintsToPercentages(
|
|
|
21
21
|
minSizePixels,
|
|
22
22
|
} = panelConstraints;
|
|
23
23
|
|
|
24
|
+
const hasPixelConstraints =
|
|
25
|
+
collapsedSizePixels != null ||
|
|
26
|
+
defaultSizePixels != null ||
|
|
27
|
+
minSizePixels != null ||
|
|
28
|
+
maxSizePixels != null;
|
|
29
|
+
|
|
30
|
+
if (hasPixelConstraints && groupSizePixels <= 0) {
|
|
31
|
+
console.warn(`WARNING: Invalid group size: ${groupSizePixels}px`);
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
collapsedSizePercentage: 0,
|
|
35
|
+
defaultSizePercentage,
|
|
36
|
+
maxSizePercentage: 0,
|
|
37
|
+
minSizePercentage: 0,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
24
41
|
if (collapsedSizePixels != null) {
|
|
25
42
|
collapsedSizePercentage = convertPixelsToPercentage(
|
|
26
43
|
collapsedSizePixels,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export function getPanelGroupElement(id: string): HTMLDivElement | null {
|
|
2
|
-
const element = document.querySelector(
|
|
2
|
+
const element = document.querySelector(
|
|
3
|
+
`[data-panel-group][data-panel-group-id="${id}"]`
|
|
4
|
+
);
|
|
3
5
|
if (element) {
|
|
4
6
|
return element as HTMLDivElement;
|
|
5
7
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { resizePanel } from "./resizePanel";
|
|
2
|
+
|
|
3
|
+
describe("resizePanel", () => {
|
|
4
|
+
it("should not collapse (or expand) until a panel size dips below the halfway point between min size and collapsed size", () => {
|
|
5
|
+
expect(
|
|
6
|
+
resizePanel({
|
|
7
|
+
groupSizePixels: 100,
|
|
8
|
+
panelConstraints: [
|
|
9
|
+
{
|
|
10
|
+
collapsible: true,
|
|
11
|
+
collapsedSizePercentage: 10,
|
|
12
|
+
minSizePercentage: 20,
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
panelIndex: 0,
|
|
16
|
+
size: 15,
|
|
17
|
+
})
|
|
18
|
+
).toBe(20);
|
|
19
|
+
|
|
20
|
+
expect(
|
|
21
|
+
resizePanel({
|
|
22
|
+
groupSizePixels: 100,
|
|
23
|
+
panelConstraints: [
|
|
24
|
+
{
|
|
25
|
+
collapsible: true,
|
|
26
|
+
collapsedSizePercentage: 10,
|
|
27
|
+
minSizePercentage: 20,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
panelIndex: 0,
|
|
31
|
+
size: 14,
|
|
32
|
+
})
|
|
33
|
+
).toBe(10);
|
|
34
|
+
|
|
35
|
+
expect(
|
|
36
|
+
resizePanel({
|
|
37
|
+
groupSizePixels: 100,
|
|
38
|
+
panelConstraints: [
|
|
39
|
+
{
|
|
40
|
+
collapsible: true,
|
|
41
|
+
minSizePercentage: 20,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
panelIndex: 0,
|
|
45
|
+
size: 10,
|
|
46
|
+
})
|
|
47
|
+
).toBe(20);
|
|
48
|
+
|
|
49
|
+
expect(
|
|
50
|
+
resizePanel({
|
|
51
|
+
groupSizePixels: 100,
|
|
52
|
+
panelConstraints: [
|
|
53
|
+
{
|
|
54
|
+
collapsible: true,
|
|
55
|
+
minSizePercentage: 20,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
panelIndex: 0,
|
|
59
|
+
size: 9,
|
|
60
|
+
})
|
|
61
|
+
).toBe(0);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Edge case test (issues/206)
|
|
65
|
+
it("should respect percentage panel constraints if group size is negative", () => {
|
|
66
|
+
jest.spyOn(console, "warn").mockImplementation(() => {});
|
|
67
|
+
|
|
68
|
+
expect(
|
|
69
|
+
resizePanel({
|
|
70
|
+
groupSizePixels: -100,
|
|
71
|
+
panelConstraints: [
|
|
72
|
+
{
|
|
73
|
+
minSizePercentage: 25,
|
|
74
|
+
maxSizePercentage: 75,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
panelIndex: 0,
|
|
78
|
+
size: 50,
|
|
79
|
+
})
|
|
80
|
+
).toBe(50);
|
|
81
|
+
|
|
82
|
+
expect(console.warn).toHaveBeenCalledTimes(0);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Edge case test (issues/206)
|
|
86
|
+
it("should handle pixel panel constraints if group size is negative", () => {
|
|
87
|
+
jest.spyOn(console, "warn").mockImplementation(() => {});
|
|
88
|
+
|
|
89
|
+
expect(
|
|
90
|
+
resizePanel({
|
|
91
|
+
groupSizePixels: -100,
|
|
92
|
+
panelConstraints: [
|
|
93
|
+
{
|
|
94
|
+
minSizePixels: 25,
|
|
95
|
+
maxSizePixels: 75,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
panelIndex: 0,
|
|
99
|
+
size: 50,
|
|
100
|
+
})
|
|
101
|
+
).toBe(0);
|
|
102
|
+
|
|
103
|
+
expect(console.warn).toHaveBeenCalledTimes(1);
|
|
104
|
+
});
|
|
105
|
+
});
|
package/src/utils/resizePanel.ts
CHANGED
|
@@ -14,6 +14,25 @@ export function resizePanel({
|
|
|
14
14
|
panelIndex: number;
|
|
15
15
|
size: number;
|
|
16
16
|
}) {
|
|
17
|
+
const hasPixelConstraints = panelConstraints.some(
|
|
18
|
+
({
|
|
19
|
+
collapsedSizePixels,
|
|
20
|
+
defaultSizePixels,
|
|
21
|
+
minSizePixels,
|
|
22
|
+
maxSizePixels,
|
|
23
|
+
}) =>
|
|
24
|
+
collapsedSizePixels != null ||
|
|
25
|
+
defaultSizePixels != null ||
|
|
26
|
+
minSizePixels != null ||
|
|
27
|
+
maxSizePixels != null
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
if (hasPixelConstraints && groupSizePixels <= 0) {
|
|
31
|
+
console.warn(`WARNING: Invalid group size: ${groupSizePixels}px`);
|
|
32
|
+
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
17
36
|
let { collapsible } = panelConstraints[panelIndex]!;
|
|
18
37
|
|
|
19
38
|
const { collapsedSizePercentage, maxSizePercentage, minSizePercentage } =
|
|
@@ -26,7 +45,13 @@ export function resizePanel({
|
|
|
26
45
|
if (minSizePercentage != null) {
|
|
27
46
|
if (fuzzyCompareNumbers(size, minSizePercentage) < 0) {
|
|
28
47
|
if (collapsible) {
|
|
29
|
-
|
|
48
|
+
// Collapsible panels should snap closed or open only once they cross the halfway point between collapsed and min size.
|
|
49
|
+
const halfwayPoint = (collapsedSizePercentage + minSizePercentage) / 2;
|
|
50
|
+
if (fuzzyCompareNumbers(size, halfwayPoint) < 0) {
|
|
51
|
+
size = collapsedSizePercentage;
|
|
52
|
+
} else {
|
|
53
|
+
size = minSizePercentage;
|
|
54
|
+
}
|
|
30
55
|
} else {
|
|
31
56
|
size = minSizePercentage;
|
|
32
57
|
}
|
|
@@ -156,16 +156,31 @@ describe("validatePanelGroupLayout", () => {
|
|
|
156
156
|
).toEqual([25, 75]);
|
|
157
157
|
});
|
|
158
158
|
|
|
159
|
-
it("should collapse a panel
|
|
159
|
+
it("should collapse a panel once it drops below the halfway point between collapsed and minimum percentage sizes", () => {
|
|
160
160
|
expect(
|
|
161
161
|
validatePanelGroupLayout({
|
|
162
162
|
groupSizePixels: NaN,
|
|
163
|
-
layout: [
|
|
163
|
+
layout: [15, 85],
|
|
164
164
|
panelConstraints: [
|
|
165
165
|
{
|
|
166
166
|
collapsible: true,
|
|
167
167
|
collapsedSizePercentage: 10,
|
|
168
|
-
minSizePercentage:
|
|
168
|
+
minSizePercentage: 20,
|
|
169
|
+
},
|
|
170
|
+
{},
|
|
171
|
+
],
|
|
172
|
+
})
|
|
173
|
+
).toEqual([20, 80]);
|
|
174
|
+
|
|
175
|
+
expect(
|
|
176
|
+
validatePanelGroupLayout({
|
|
177
|
+
groupSizePixels: NaN,
|
|
178
|
+
layout: [14, 86],
|
|
179
|
+
panelConstraints: [
|
|
180
|
+
{
|
|
181
|
+
collapsible: true,
|
|
182
|
+
collapsedSizePercentage: 10,
|
|
183
|
+
minSizePercentage: 20,
|
|
169
184
|
},
|
|
170
185
|
{},
|
|
171
186
|
],
|
|
@@ -173,7 +188,7 @@ describe("validatePanelGroupLayout", () => {
|
|
|
173
188
|
).toEqual([10, 90]);
|
|
174
189
|
});
|
|
175
190
|
|
|
176
|
-
it("should collapse a panel
|
|
191
|
+
it("should collapse a panel once it drops below the halfway point between collapsed and minimum pixel sizes", () => {
|
|
177
192
|
expect(
|
|
178
193
|
validatePanelGroupLayout({
|
|
179
194
|
groupSizePixels: 400,
|
|
@@ -181,13 +196,28 @@ describe("validatePanelGroupLayout", () => {
|
|
|
181
196
|
panelConstraints: [
|
|
182
197
|
{
|
|
183
198
|
collapsible: true,
|
|
184
|
-
collapsedSizePixels:
|
|
199
|
+
collapsedSizePixels: 0,
|
|
185
200
|
minSizePixels: 100,
|
|
186
201
|
},
|
|
187
202
|
{},
|
|
188
203
|
],
|
|
189
204
|
})
|
|
190
|
-
).toEqual([
|
|
205
|
+
).toEqual([25, 75]);
|
|
206
|
+
|
|
207
|
+
expect(
|
|
208
|
+
validatePanelGroupLayout({
|
|
209
|
+
groupSizePixels: 400,
|
|
210
|
+
layout: [10, 90],
|
|
211
|
+
panelConstraints: [
|
|
212
|
+
{
|
|
213
|
+
collapsible: true,
|
|
214
|
+
collapsedSizePixels: 0,
|
|
215
|
+
minSizePixels: 100,
|
|
216
|
+
},
|
|
217
|
+
{},
|
|
218
|
+
],
|
|
219
|
+
})
|
|
220
|
+
).toEqual([0, 100]);
|
|
191
221
|
});
|
|
192
222
|
});
|
|
193
223
|
|