react-resizable-panels 0.0.63 → 1.0.0-rc.1

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.
Files changed (72) hide show
  1. package/.eslintrc.cjs +1 -0
  2. package/CHANGELOG.md +5 -0
  3. package/dist/declarations/src/Panel.d.ts +19 -34
  4. package/dist/declarations/src/PanelGroup.d.ts +9 -13
  5. package/dist/declarations/src/PanelResizeHandle.d.ts +5 -7
  6. package/dist/declarations/src/index.d.ts +2 -2
  7. package/dist/declarations/src/types.d.ts +0 -7
  8. package/dist/declarations/src/utils/assert.d.ts +1 -0
  9. package/dist/declarations/src/vendor/react.d.ts +2 -2
  10. package/dist/react-resizable-panels.browser.cjs.js +252 -517
  11. package/dist/react-resizable-panels.browser.cjs.mjs +2 -1
  12. package/dist/react-resizable-panels.browser.development.cjs.js +278 -573
  13. package/dist/react-resizable-panels.browser.development.cjs.mjs +2 -1
  14. package/dist/react-resizable-panels.browser.development.esm.js +278 -574
  15. package/dist/react-resizable-panels.browser.esm.js +252 -518
  16. package/dist/react-resizable-panels.cjs.js +252 -517
  17. package/dist/react-resizable-panels.cjs.js.map +1 -1
  18. package/dist/react-resizable-panels.cjs.mjs +2 -1
  19. package/dist/react-resizable-panels.development.cjs.js +280 -575
  20. package/dist/react-resizable-panels.development.cjs.mjs +2 -1
  21. package/dist/react-resizable-panels.development.esm.js +280 -576
  22. package/dist/react-resizable-panels.development.node.cjs.js +266 -501
  23. package/dist/react-resizable-panels.development.node.cjs.mjs +2 -1
  24. package/dist/react-resizable-panels.development.node.esm.js +266 -502
  25. package/dist/react-resizable-panels.esm.js +252 -518
  26. package/dist/react-resizable-panels.esm.js.map +1 -1
  27. package/dist/react-resizable-panels.node.cjs.js +238 -443
  28. package/dist/react-resizable-panels.node.cjs.mjs +2 -1
  29. package/dist/react-resizable-panels.node.esm.js +238 -444
  30. package/package.json +1 -1
  31. package/src/Panel.test.tsx +74 -73
  32. package/src/Panel.ts +44 -68
  33. package/src/PanelGroup.test.tsx +43 -42
  34. package/src/PanelGroup.ts +189 -403
  35. package/src/PanelGroupContext.ts +2 -3
  36. package/src/PanelResizeHandle.test.tsx +68 -0
  37. package/src/PanelResizeHandle.ts +31 -22
  38. package/src/hooks/useWindowSplitterBehavior.ts +2 -1
  39. package/src/hooks/useWindowSplitterPanelGroupBehavior.ts +22 -33
  40. package/src/index.ts +4 -3
  41. package/src/types.ts +0 -9
  42. package/src/utils/adjustLayoutByDelta.test.ts +206 -336
  43. package/src/utils/adjustLayoutByDelta.ts +59 -51
  44. package/src/utils/assert.ts +1 -1
  45. package/src/utils/calculateAriaValues.test.ts +6 -11
  46. package/src/utils/calculateAriaValues.ts +7 -29
  47. package/src/utils/calculateDeltaPercentage.ts +8 -15
  48. package/src/utils/calculateDragOffsetPercentage.ts +11 -5
  49. package/src/utils/calculateUnsafeDefaultLayout.test.ts +4 -9
  50. package/src/utils/calculateUnsafeDefaultLayout.ts +13 -18
  51. package/src/utils/callPanelCallbacks.ts +11 -46
  52. package/src/utils/getResizeEventCursorPosition.ts +2 -0
  53. package/src/utils/resizePanel.test.ts +6 -52
  54. package/src/utils/resizePanel.ts +24 -46
  55. package/src/utils/test-utils.ts +6 -7
  56. package/src/utils/validatePanelConstraints.test.ts +12 -65
  57. package/src/utils/validatePanelConstraints.ts +26 -67
  58. package/src/utils/validatePanelGroupLayout.test.ts +27 -142
  59. package/src/utils/validatePanelGroupLayout.ts +17 -13
  60. package/src/vendor/react.ts +2 -0
  61. package/src/utils/computePercentagePanelConstraints.test.ts +0 -98
  62. package/src/utils/computePercentagePanelConstraints.ts +0 -56
  63. package/src/utils/convertPercentageToPixels.test.ts +0 -9
  64. package/src/utils/convertPercentageToPixels.ts +0 -6
  65. package/src/utils/convertPixelConstraintsToPercentages.test.ts +0 -47
  66. package/src/utils/convertPixelConstraintsToPercentages.ts +0 -72
  67. package/src/utils/convertPixelsToPercentage.test.ts +0 -9
  68. package/src/utils/convertPixelsToPercentage.ts +0 -6
  69. package/src/utils/getPercentageSizeFromMixedSizes.test.ts +0 -47
  70. package/src/utils/getPercentageSizeFromMixedSizes.ts +0 -15
  71. package/src/utils/shouldMonitorPixelBasedConstraints.test.ts +0 -23
  72. package/src/utils/shouldMonitorPixelBasedConstraints.ts +0 -13
@@ -4,12 +4,11 @@ describe("resizePanel", () => {
4
4
  it("should not collapse (or expand) until a panel size dips below the halfway point between min size and collapsed size", () => {
5
5
  expect(
6
6
  resizePanel({
7
- groupSizePixels: 100,
8
7
  panelConstraints: [
9
8
  {
10
9
  collapsible: true,
11
- collapsedSizePercentage: 10,
12
- minSizePercentage: 20,
10
+ collapsedSize: 10,
11
+ minSize: 20,
13
12
  },
14
13
  ],
15
14
  panelIndex: 0,
@@ -19,12 +18,11 @@ describe("resizePanel", () => {
19
18
 
20
19
  expect(
21
20
  resizePanel({
22
- groupSizePixels: 100,
23
21
  panelConstraints: [
24
22
  {
25
23
  collapsible: true,
26
- collapsedSizePercentage: 10,
27
- minSizePercentage: 20,
24
+ collapsedSize: 10,
25
+ minSize: 20,
28
26
  },
29
27
  ],
30
28
  panelIndex: 0,
@@ -34,11 +32,10 @@ describe("resizePanel", () => {
34
32
 
35
33
  expect(
36
34
  resizePanel({
37
- groupSizePixels: 100,
38
35
  panelConstraints: [
39
36
  {
40
37
  collapsible: true,
41
- minSizePercentage: 20,
38
+ minSize: 20,
42
39
  },
43
40
  ],
44
41
  panelIndex: 0,
@@ -48,11 +45,10 @@ describe("resizePanel", () => {
48
45
 
49
46
  expect(
50
47
  resizePanel({
51
- groupSizePixels: 100,
52
48
  panelConstraints: [
53
49
  {
54
50
  collapsible: true,
55
- minSizePercentage: 20,
51
+ minSize: 20,
56
52
  },
57
53
  ],
58
54
  panelIndex: 0,
@@ -60,46 +56,4 @@ describe("resizePanel", () => {
60
56
  })
61
57
  ).toBe(0);
62
58
  });
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
59
  });
@@ -1,66 +1,44 @@
1
1
  import { PanelConstraints } from "../Panel";
2
- import { computePercentagePanelConstraints } from "./computePercentagePanelConstraints";
2
+ import { PRECISION } from "../constants";
3
+ import { assert } from "./assert";
3
4
  import { fuzzyCompareNumbers } from "./numbers/fuzzyCompareNumbers";
4
5
 
5
6
  // Panel size must be in percentages; pixel values should be pre-converted
6
7
  export function resizePanel({
7
- groupSizePixels,
8
- panelConstraints,
8
+ panelConstraints: panelConstraintsArray,
9
9
  panelIndex,
10
10
  size,
11
11
  }: {
12
- groupSizePixels: number;
13
12
  panelConstraints: PanelConstraints[];
14
13
  panelIndex: number;
15
14
  size: number;
16
15
  }) {
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
-
36
- let { collapsible } = panelConstraints[panelIndex]!;
37
-
38
- const { collapsedSizePercentage, maxSizePercentage, minSizePercentage } =
39
- computePercentagePanelConstraints(
40
- panelConstraints,
41
- panelIndex,
42
- groupSizePixels
43
- );
44
-
45
- if (minSizePercentage != null) {
46
- if (fuzzyCompareNumbers(size, minSizePercentage) < 0) {
47
- if (collapsible) {
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
- }
16
+ const panelConstraints = panelConstraintsArray[panelIndex];
17
+ assert(panelConstraints != null);
18
+
19
+ let {
20
+ collapsedSize = 0,
21
+ collapsible,
22
+ maxSize = 100,
23
+ minSize = 0,
24
+ } = panelConstraints;
25
+
26
+ if (fuzzyCompareNumbers(size, minSize) < 0) {
27
+ if (collapsible) {
28
+ // Collapsible panels should snap closed or open only once they cross the halfway point between collapsed and min size.
29
+ const halfwayPoint = (collapsedSize + minSize) / 2;
30
+ if (fuzzyCompareNumbers(size, halfwayPoint) < 0) {
31
+ size = collapsedSize;
55
32
  } else {
56
- size = minSizePercentage;
33
+ size = minSize;
57
34
  }
35
+ } else {
36
+ size = minSize;
58
37
  }
59
38
  }
60
39
 
61
- if (maxSizePercentage != null) {
62
- size = Math.min(maxSizePercentage, size);
63
- }
40
+ size = Math.min(maxSize, size);
41
+ size = parseFloat(size.toFixed(PRECISION));
64
42
 
65
43
  return size;
66
44
  }
@@ -1,4 +1,4 @@
1
- import { MixedSizes } from "../types";
1
+ import { assert } from "./assert";
2
2
 
3
3
  const util = require("util");
4
4
 
@@ -11,6 +11,8 @@ export function expectToBeCloseToArray(
11
11
  try {
12
12
  actualNumbers.forEach((actualNumber, index) => {
13
13
  const expectedNumber = expectedNumbers[index];
14
+ assert(expectedNumber != null);
15
+
14
16
  expect(actualNumber).toBeCloseTo(expectedNumber, 1);
15
17
  });
16
18
  } catch (error) {
@@ -74,13 +76,10 @@ export function mockPanelGroupOffsetWidthAndHeight(
74
76
  }
75
77
 
76
78
  export function verifyExpandedPanelGroupLayout(
77
- actualLayout: MixedSizes[],
78
- expectedPercentages: number[]
79
+ actualLayout: number[],
80
+ expectedLayout: number[]
79
81
  ) {
80
- expect(actualLayout).toHaveLength(expectedPercentages.length);
81
- expect(actualLayout.map(({ sizePercentage }) => sizePercentage)).toEqual(
82
- expectedPercentages
83
- );
82
+ expect(actualLayout).toEqual(expectedLayout);
84
83
  }
85
84
 
86
85
  export function verifyExpectedWarnings(
@@ -5,7 +5,6 @@ describe("validatePanelConstraints", () => {
5
5
  it("should not warn if there are no validation errors", () => {
6
6
  verifyExpectedWarnings(() => {
7
7
  validatePanelConstraints({
8
- groupSizePixels: 100_000,
9
8
  panelConstraints: [{}],
10
9
  panelIndex: 0,
11
10
  panelId: "test",
@@ -13,60 +12,13 @@ describe("validatePanelConstraints", () => {
13
12
  });
14
13
  });
15
14
 
16
- it("should warn about conflicting percentages and pixels", () => {
17
- verifyExpectedWarnings(() => {
18
- validatePanelConstraints({
19
- groupSizePixels: 100_000,
20
- panelConstraints: [
21
- {
22
- collapsedSizePercentage: 5,
23
- collapsedSizePixels: 10,
24
- },
25
- ],
26
- panelIndex: 0,
27
- panelId: "test",
28
- });
29
- }, "should not specify both percentage and pixel units for: collapsed size");
30
-
31
- verifyExpectedWarnings(() => {
32
- validatePanelConstraints({
33
- groupSizePixels: 100_000,
34
- panelConstraints: [
35
- {
36
- maxSizePercentage: 5,
37
- maxSizePixels: 10,
38
- minSizePercentage: 5,
39
- minSizePixels: 10,
40
- },
41
- ],
42
- panelIndex: 0,
43
- panelId: "test",
44
- });
45
- }, "should not specify both percentage and pixel units for: max size, min size");
46
-
47
- verifyExpectedWarnings(() => {
48
- validatePanelConstraints({
49
- groupSizePixels: 100_000,
50
- panelConstraints: [
51
- {
52
- defaultSizePercentage: 5,
53
- defaultSizePixels: 10,
54
- },
55
- ],
56
- panelIndex: 0,
57
- panelId: "test",
58
- });
59
- }, "should not specify both percentage and pixel units for: default size");
60
- });
61
-
62
15
  it("should warn about conflicting min/max sizes", () => {
63
16
  verifyExpectedWarnings(() => {
64
17
  validatePanelConstraints({
65
- groupSizePixels: 100_000,
66
18
  panelConstraints: [
67
19
  {
68
- maxSizePercentage: 5,
69
- minSizePercentage: 10,
20
+ maxSize: 5,
21
+ minSize: 10,
70
22
  },
71
23
  ],
72
24
  panelIndex: 0,
@@ -78,11 +30,10 @@ describe("validatePanelConstraints", () => {
78
30
  it("should warn about conflicting collapsed and min sizes", () => {
79
31
  verifyExpectedWarnings(() => {
80
32
  validatePanelConstraints({
81
- groupSizePixels: 100_000,
82
33
  panelConstraints: [
83
34
  {
84
- collapsedSizePercentage: 15,
85
- minSizePercentage: 10,
35
+ collapsedSize: 15,
36
+ minSize: 10,
86
37
  },
87
38
  ],
88
39
  panelIndex: 0,
@@ -94,11 +45,10 @@ describe("validatePanelConstraints", () => {
94
45
  it("should warn about conflicting default and min/max sizes", () => {
95
46
  verifyExpectedWarnings(() => {
96
47
  validatePanelConstraints({
97
- groupSizePixels: 100_000,
98
48
  panelConstraints: [
99
49
  {
100
- defaultSizePercentage: -1,
101
- minSizePercentage: 10,
50
+ defaultSize: -1,
51
+ minSize: 10,
102
52
  },
103
53
  ],
104
54
  panelIndex: 0,
@@ -108,11 +58,10 @@ describe("validatePanelConstraints", () => {
108
58
 
109
59
  verifyExpectedWarnings(() => {
110
60
  validatePanelConstraints({
111
- groupSizePixels: 100_000,
112
61
  panelConstraints: [
113
62
  {
114
- defaultSizePercentage: 5,
115
- minSizePercentage: 10,
63
+ defaultSize: 5,
64
+ minSize: 10,
116
65
  },
117
66
  ],
118
67
  panelIndex: 0,
@@ -122,11 +71,10 @@ describe("validatePanelConstraints", () => {
122
71
 
123
72
  verifyExpectedWarnings(() => {
124
73
  validatePanelConstraints({
125
- groupSizePixels: 100_000,
126
74
  panelConstraints: [
127
75
  {
128
- defaultSizePercentage: 101,
129
- maxSizePercentage: 10,
76
+ defaultSize: 101,
77
+ maxSize: 10,
130
78
  },
131
79
  ],
132
80
  panelIndex: 0,
@@ -136,11 +84,10 @@ describe("validatePanelConstraints", () => {
136
84
 
137
85
  verifyExpectedWarnings(() => {
138
86
  validatePanelConstraints({
139
- groupSizePixels: 100_000,
140
87
  panelConstraints: [
141
88
  {
142
- defaultSizePercentage: 15,
143
- maxSizePercentage: 10,
89
+ defaultSize: 15,
90
+ maxSize: 10,
144
91
  },
145
92
  ],
146
93
  panelIndex: 0,
@@ -1,14 +1,12 @@
1
1
  import { isDevelopment } from "#is-development";
2
2
  import { PanelConstraints } from "../Panel";
3
- import { computePercentagePanelConstraints } from "./computePercentagePanelConstraints";
3
+ import { assert } from "./assert";
4
4
 
5
5
  export function validatePanelConstraints({
6
- groupSizePixels,
7
- panelConstraints,
6
+ panelConstraints: panelConstraintsArray,
8
7
  panelId,
9
8
  panelIndex,
10
9
  }: {
11
- groupSizePixels: number;
12
10
  panelConstraints: PanelConstraints[];
13
11
  panelId: string | undefined;
14
12
  panelIndex: number;
@@ -16,77 +14,38 @@ export function validatePanelConstraints({
16
14
  if (isDevelopment) {
17
15
  const warnings = [];
18
16
 
19
- {
20
- const {
21
- collapsedSizePercentage,
22
- collapsedSizePixels,
23
- defaultSizePercentage,
24
- defaultSizePixels,
25
- maxSizePercentage,
26
- maxSizePixels,
27
- minSizePercentage,
28
- minSizePixels,
29
- } = panelConstraints[panelIndex]!;
17
+ const panelConstraints = panelConstraintsArray[panelIndex];
18
+ assert(panelConstraints);
30
19
 
31
- const conflictingUnits: string[] = [];
20
+ const {
21
+ collapsedSize = 0,
22
+ defaultSize,
23
+ maxSize = 100,
24
+ minSize = 0,
25
+ } = panelConstraints;
32
26
 
33
- if (collapsedSizePercentage != null && collapsedSizePixels != null) {
34
- conflictingUnits.push("collapsed size");
35
- }
36
- if (defaultSizePercentage != null && defaultSizePixels != null) {
37
- conflictingUnits.push("default size");
38
- }
39
- if (maxSizePercentage != null && maxSizePixels != null) {
40
- conflictingUnits.push("max size");
41
- }
42
- if (minSizePercentage != null && minSizePixels != null) {
43
- conflictingUnits.push("min size");
44
- }
45
-
46
- if (conflictingUnits.length > 0) {
47
- warnings.push(
48
- `should not specify both percentage and pixel units for: ${conflictingUnits.join(
49
- ", "
50
- )}`
51
- );
52
- }
53
- }
54
-
55
- {
56
- const {
57
- collapsedSizePercentage,
58
- defaultSizePercentage,
59
- maxSizePercentage,
60
- minSizePercentage,
61
- } = computePercentagePanelConstraints(
62
- panelConstraints,
63
- panelIndex,
64
- groupSizePixels
27
+ if (minSize > maxSize) {
28
+ warnings.push(
29
+ `min size (${minSize}%) should not be greater than max size (${maxSize}%)`
65
30
  );
31
+ }
66
32
 
67
- if (minSizePercentage > maxSizePercentage) {
68
- warnings.push(
69
- `min size (${minSizePercentage}%) should not be greater than max size (${maxSizePercentage}%)`
70
- );
33
+ if (defaultSize != null) {
34
+ if (defaultSize < 0) {
35
+ warnings.push("default size should not be less than 0");
36
+ } else if (defaultSize < minSize) {
37
+ warnings.push("default size should not be less than min size");
71
38
  }
72
39
 
73
- if (defaultSizePercentage != null) {
74
- if (defaultSizePercentage < 0) {
75
- warnings.push("default size should not be less than 0");
76
- } else if (defaultSizePercentage < minSizePercentage) {
77
- warnings.push("default size should not be less than min size");
78
- }
79
-
80
- if (defaultSizePercentage > 100) {
81
- warnings.push("default size should not be greater than 100");
82
- } else if (defaultSizePercentage > maxSizePercentage) {
83
- warnings.push("default size should not be greater than max size");
84
- }
40
+ if (defaultSize > 100) {
41
+ warnings.push("default size should not be greater than 100");
42
+ } else if (defaultSize > maxSize) {
43
+ warnings.push("default size should not be greater than max size");
85
44
  }
45
+ }
86
46
 
87
- if (collapsedSizePercentage > minSizePercentage) {
88
- warnings.push("collapsed size should not be greater than min size");
89
- }
47
+ if (collapsedSize > minSize) {
48
+ warnings.push("collapsed size should not be greater than min size");
90
49
  }
91
50
 
92
51
  if (warnings.length > 0) {