@zag-js/splitter 1.34.0 → 1.35.0
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/dist/index.d.mts +9 -254
- package/dist/index.d.ts +9 -254
- package/dist/index.js +37 -1158
- package/dist/index.mjs +11 -1151
- package/dist/splitter.anatomy.d.mts +6 -0
- package/dist/splitter.anatomy.d.ts +6 -0
- package/dist/splitter.anatomy.js +34 -0
- package/dist/splitter.anatomy.mjs +8 -0
- package/dist/splitter.connect.d.mts +7 -0
- package/dist/splitter.connect.d.ts +7 -0
- package/dist/splitter.connect.js +298 -0
- package/dist/splitter.connect.mjs +263 -0
- package/dist/splitter.dom.d.mts +19 -0
- package/dist/splitter.dom.d.ts +19 -0
- package/dist/splitter.dom.js +89 -0
- package/dist/splitter.dom.mjs +52 -0
- package/dist/splitter.machine.d.mts +7 -0
- package/dist/splitter.machine.d.ts +7 -0
- package/dist/splitter.machine.js +509 -0
- package/dist/splitter.machine.mjs +482 -0
- package/dist/splitter.props.d.mts +12 -0
- package/dist/splitter.props.d.ts +12 -0
- package/dist/splitter.props.js +63 -0
- package/dist/splitter.props.mjs +33 -0
- package/dist/splitter.types.d.mts +237 -0
- package/dist/splitter.types.d.ts +237 -0
- package/dist/splitter.types.js +18 -0
- package/dist/splitter.types.mjs +0 -0
- package/dist/utils/aria.d.mts +27 -0
- package/dist/utils/aria.d.ts +27 -0
- package/dist/utils/aria.js +79 -0
- package/dist/utils/aria.mjs +53 -0
- package/dist/utils/fuzzy.d.mts +10 -0
- package/dist/utils/fuzzy.d.ts +10 -0
- package/dist/utils/fuzzy.js +60 -0
- package/dist/utils/fuzzy.mjs +32 -0
- package/dist/utils/panel.d.mts +34 -0
- package/dist/utils/panel.d.ts +34 -0
- package/dist/utils/panel.js +147 -0
- package/dist/utils/panel.mjs +114 -0
- package/dist/utils/resize-by-delta.d.mts +20 -0
- package/dist/utils/resize-by-delta.d.ts +20 -0
- package/dist/utils/resize-by-delta.js +165 -0
- package/dist/utils/resize-by-delta.mjs +140 -0
- package/dist/utils/resize-panel.d.mts +16 -0
- package/dist/utils/resize-panel.d.ts +16 -0
- package/dist/utils/resize-panel.js +51 -0
- package/dist/utils/resize-panel.mjs +26 -0
- package/dist/utils/validate-sizes.d.mts +15 -0
- package/dist/utils/validate-sizes.d.ts +15 -0
- package/dist/utils/validate-sizes.js +72 -0
- package/dist/utils/validate-sizes.mjs +47 -0
- package/package.json +17 -7
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// src/utils/resize-by-delta.ts
|
|
2
|
+
import { ensure } from "@zag-js/utils";
|
|
3
|
+
import { fuzzyCompareNumbers, fuzzySizeEqual, fuzzyNumbersEqual } from "./fuzzy.mjs";
|
|
4
|
+
import { resizePanel } from "./resize-panel.mjs";
|
|
5
|
+
function resizeByDelta(props) {
|
|
6
|
+
let { delta, initialSize, panels, pivotIndices, prevSize, trigger } = props;
|
|
7
|
+
if (fuzzyNumbersEqual(delta, 0)) {
|
|
8
|
+
return initialSize;
|
|
9
|
+
}
|
|
10
|
+
const nextSize = [...initialSize];
|
|
11
|
+
const [firstPivotIndex, secondPivotIndex] = pivotIndices;
|
|
12
|
+
ensure(firstPivotIndex, () => "Invalid first pivot index");
|
|
13
|
+
ensure(secondPivotIndex, () => "Invalid second pivot index");
|
|
14
|
+
let deltaApplied = 0;
|
|
15
|
+
{
|
|
16
|
+
if (trigger === "keyboard") {
|
|
17
|
+
{
|
|
18
|
+
const index = delta < 0 ? secondPivotIndex : firstPivotIndex;
|
|
19
|
+
const panel = panels[index];
|
|
20
|
+
ensure(panel, () => `Panel data not found for index ${index}`);
|
|
21
|
+
const { collapsedSize = 0, collapsible, minSize = 0 } = panel;
|
|
22
|
+
if (collapsible) {
|
|
23
|
+
const prevSize2 = initialSize[index];
|
|
24
|
+
ensure(prevSize2, () => `Previous size not found for panel index ${index}`);
|
|
25
|
+
if (fuzzyNumbersEqual(prevSize2, collapsedSize)) {
|
|
26
|
+
const localDelta = minSize - prevSize2;
|
|
27
|
+
if (fuzzyCompareNumbers(localDelta, Math.abs(delta)) > 0) {
|
|
28
|
+
delta = delta < 0 ? 0 - localDelta : localDelta;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
{
|
|
34
|
+
const index = delta < 0 ? firstPivotIndex : secondPivotIndex;
|
|
35
|
+
const panel = panels[index];
|
|
36
|
+
ensure(panel, () => `No panel data found for index ${index}`);
|
|
37
|
+
const { collapsedSize = 0, collapsible, minSize = 0 } = panel;
|
|
38
|
+
if (collapsible) {
|
|
39
|
+
const prevSize2 = initialSize[index];
|
|
40
|
+
ensure(prevSize2, () => `Previous size not found for panel index ${index}`);
|
|
41
|
+
if (fuzzyNumbersEqual(prevSize2, minSize)) {
|
|
42
|
+
const localDelta = prevSize2 - collapsedSize;
|
|
43
|
+
if (fuzzyCompareNumbers(localDelta, Math.abs(delta)) > 0) {
|
|
44
|
+
delta = delta < 0 ? 0 - localDelta : localDelta;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
{
|
|
52
|
+
const increment = delta < 0 ? 1 : -1;
|
|
53
|
+
let index = delta < 0 ? secondPivotIndex : firstPivotIndex;
|
|
54
|
+
let maxAvailableDelta = 0;
|
|
55
|
+
while (true) {
|
|
56
|
+
const prevSize2 = initialSize[index];
|
|
57
|
+
ensure(prevSize2, () => `Previous size not found for panel index ${index}`);
|
|
58
|
+
const maxSafeSize = resizePanel({
|
|
59
|
+
panels,
|
|
60
|
+
index,
|
|
61
|
+
size: 100
|
|
62
|
+
});
|
|
63
|
+
const delta2 = maxSafeSize - prevSize2;
|
|
64
|
+
maxAvailableDelta += delta2;
|
|
65
|
+
index += increment;
|
|
66
|
+
if (index < 0 || index >= panels.length) {
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const minAbsDelta = Math.min(Math.abs(delta), Math.abs(maxAvailableDelta));
|
|
71
|
+
delta = delta < 0 ? 0 - minAbsDelta : minAbsDelta;
|
|
72
|
+
}
|
|
73
|
+
{
|
|
74
|
+
const pivotIndex = delta < 0 ? firstPivotIndex : secondPivotIndex;
|
|
75
|
+
let index = pivotIndex;
|
|
76
|
+
while (index >= 0 && index < panels.length) {
|
|
77
|
+
const deltaRemaining = Math.abs(delta) - Math.abs(deltaApplied);
|
|
78
|
+
const prevSize2 = initialSize[index];
|
|
79
|
+
ensure(prevSize2, () => `Previous size not found for panel index ${index}`);
|
|
80
|
+
const unsafeSize = prevSize2 - deltaRemaining;
|
|
81
|
+
const safeSize = resizePanel({ panels, index, size: unsafeSize });
|
|
82
|
+
if (!fuzzyNumbersEqual(prevSize2, safeSize)) {
|
|
83
|
+
deltaApplied += prevSize2 - safeSize;
|
|
84
|
+
nextSize[index] = safeSize;
|
|
85
|
+
if (deltaApplied.toPrecision(3).localeCompare(Math.abs(delta).toPrecision(3), void 0, {
|
|
86
|
+
numeric: true
|
|
87
|
+
}) >= 0) {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (delta < 0) {
|
|
92
|
+
index--;
|
|
93
|
+
} else {
|
|
94
|
+
index++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (fuzzySizeEqual(prevSize, nextSize)) {
|
|
99
|
+
return prevSize;
|
|
100
|
+
}
|
|
101
|
+
{
|
|
102
|
+
const pivotIndex = delta < 0 ? secondPivotIndex : firstPivotIndex;
|
|
103
|
+
const prevSize2 = initialSize[pivotIndex];
|
|
104
|
+
ensure(prevSize2, () => `Previous size not found for panel index ${pivotIndex}`);
|
|
105
|
+
const unsafeSize = prevSize2 + deltaApplied;
|
|
106
|
+
const safeSize = resizePanel({ panels, index: pivotIndex, size: unsafeSize });
|
|
107
|
+
nextSize[pivotIndex] = safeSize;
|
|
108
|
+
if (!fuzzyNumbersEqual(safeSize, unsafeSize)) {
|
|
109
|
+
let deltaRemaining = unsafeSize - safeSize;
|
|
110
|
+
const pivotIndex2 = delta < 0 ? secondPivotIndex : firstPivotIndex;
|
|
111
|
+
let index = pivotIndex2;
|
|
112
|
+
while (index >= 0 && index < panels.length) {
|
|
113
|
+
const prevSize3 = nextSize[index];
|
|
114
|
+
ensure(prevSize3, () => `Previous size not found for panel index ${index}`);
|
|
115
|
+
const unsafeSize2 = prevSize3 + deltaRemaining;
|
|
116
|
+
const safeSize2 = resizePanel({ panels, index, size: unsafeSize2 });
|
|
117
|
+
if (!fuzzyNumbersEqual(prevSize3, safeSize2)) {
|
|
118
|
+
deltaRemaining -= safeSize2 - prevSize3;
|
|
119
|
+
nextSize[index] = safeSize2;
|
|
120
|
+
}
|
|
121
|
+
if (fuzzyNumbersEqual(deltaRemaining, 0)) {
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
if (delta > 0) {
|
|
125
|
+
index--;
|
|
126
|
+
} else {
|
|
127
|
+
index++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const totalSize = nextSize.reduce((total, size) => size + total, 0);
|
|
133
|
+
if (!fuzzyNumbersEqual(totalSize, 100)) {
|
|
134
|
+
return prevSize;
|
|
135
|
+
}
|
|
136
|
+
return nextSize;
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
resizeByDelta
|
|
140
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PanelData } from '../splitter.types.mjs';
|
|
2
|
+
import '@zag-js/core';
|
|
3
|
+
import '@zag-js/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This code was modified from react-resizable-panels by Brian Vaughn
|
|
7
|
+
* @see https://github.com/bvaughn/react-resizable-panels
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare function resizePanel({ panels, index, size }: {
|
|
11
|
+
panels: PanelData[];
|
|
12
|
+
index: number;
|
|
13
|
+
size: number;
|
|
14
|
+
}): number;
|
|
15
|
+
|
|
16
|
+
export { resizePanel };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PanelData } from '../splitter.types.js';
|
|
2
|
+
import '@zag-js/core';
|
|
3
|
+
import '@zag-js/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This code was modified from react-resizable-panels by Brian Vaughn
|
|
7
|
+
* @see https://github.com/bvaughn/react-resizable-panels
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare function resizePanel({ panels, index, size }: {
|
|
11
|
+
panels: PanelData[];
|
|
12
|
+
index: number;
|
|
13
|
+
size: number;
|
|
14
|
+
}): number;
|
|
15
|
+
|
|
16
|
+
export { resizePanel };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/utils/resize-panel.ts
|
|
21
|
+
var resize_panel_exports = {};
|
|
22
|
+
__export(resize_panel_exports, {
|
|
23
|
+
resizePanel: () => resizePanel
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(resize_panel_exports);
|
|
26
|
+
var import_utils = require("@zag-js/utils");
|
|
27
|
+
var import_fuzzy = require("./fuzzy.cjs");
|
|
28
|
+
function resizePanel({ panels, index, size }) {
|
|
29
|
+
const panel = panels[index];
|
|
30
|
+
(0, import_utils.ensure)(panel, () => `Panel data not found for index ${index}`);
|
|
31
|
+
let { collapsedSize = 0, collapsible, maxSize = 100, minSize = 0 } = panel;
|
|
32
|
+
if ((0, import_fuzzy.fuzzyCompareNumbers)(size, minSize) < 0) {
|
|
33
|
+
if (collapsible) {
|
|
34
|
+
const halfwayPoint = (collapsedSize + minSize) / 2;
|
|
35
|
+
if ((0, import_fuzzy.fuzzyCompareNumbers)(size, halfwayPoint) < 0) {
|
|
36
|
+
size = collapsedSize;
|
|
37
|
+
} else {
|
|
38
|
+
size = minSize;
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
size = minSize;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
size = Math.min(maxSize, size);
|
|
45
|
+
size = parseFloat(size.toFixed(import_fuzzy.PRECISION));
|
|
46
|
+
return size;
|
|
47
|
+
}
|
|
48
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
49
|
+
0 && (module.exports = {
|
|
50
|
+
resizePanel
|
|
51
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// src/utils/resize-panel.ts
|
|
2
|
+
import { ensure } from "@zag-js/utils";
|
|
3
|
+
import { fuzzyCompareNumbers, PRECISION } from "./fuzzy.mjs";
|
|
4
|
+
function resizePanel({ panels, index, size }) {
|
|
5
|
+
const panel = panels[index];
|
|
6
|
+
ensure(panel, () => `Panel data not found for index ${index}`);
|
|
7
|
+
let { collapsedSize = 0, collapsible, maxSize = 100, minSize = 0 } = panel;
|
|
8
|
+
if (fuzzyCompareNumbers(size, minSize) < 0) {
|
|
9
|
+
if (collapsible) {
|
|
10
|
+
const halfwayPoint = (collapsedSize + minSize) / 2;
|
|
11
|
+
if (fuzzyCompareNumbers(size, halfwayPoint) < 0) {
|
|
12
|
+
size = collapsedSize;
|
|
13
|
+
} else {
|
|
14
|
+
size = minSize;
|
|
15
|
+
}
|
|
16
|
+
} else {
|
|
17
|
+
size = minSize;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
size = Math.min(maxSize, size);
|
|
21
|
+
size = parseFloat(size.toFixed(PRECISION));
|
|
22
|
+
return size;
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
resizePanel
|
|
26
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PanelData } from '../splitter.types.mjs';
|
|
2
|
+
import '@zag-js/core';
|
|
3
|
+
import '@zag-js/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This code was modified from react-resizable-panels by Brian Vaughn
|
|
7
|
+
* @see https://github.com/bvaughn/react-resizable-panels
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare function validateSizes({ size: prevSize, panels }: {
|
|
11
|
+
size: number[];
|
|
12
|
+
panels: PanelData[];
|
|
13
|
+
}): number[];
|
|
14
|
+
|
|
15
|
+
export { validateSizes };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PanelData } from '../splitter.types.js';
|
|
2
|
+
import '@zag-js/core';
|
|
3
|
+
import '@zag-js/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This code was modified from react-resizable-panels by Brian Vaughn
|
|
7
|
+
* @see https://github.com/bvaughn/react-resizable-panels
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare function validateSizes({ size: prevSize, panels }: {
|
|
11
|
+
size: number[];
|
|
12
|
+
panels: PanelData[];
|
|
13
|
+
}): number[];
|
|
14
|
+
|
|
15
|
+
export { validateSizes };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/utils/validate-sizes.ts
|
|
21
|
+
var validate_sizes_exports = {};
|
|
22
|
+
__export(validate_sizes_exports, {
|
|
23
|
+
validateSizes: () => validateSizes
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(validate_sizes_exports);
|
|
26
|
+
var import_utils = require("@zag-js/utils");
|
|
27
|
+
var import_fuzzy = require("./fuzzy.cjs");
|
|
28
|
+
var import_resize_panel = require("./resize-panel.cjs");
|
|
29
|
+
function validateSizes({ size: prevSize, panels }) {
|
|
30
|
+
const nextSize = [...prevSize];
|
|
31
|
+
const nextSizeTotalSize = nextSize.reduce((accumulated, current) => accumulated + current, 0);
|
|
32
|
+
if (nextSize.length !== panels.length) {
|
|
33
|
+
throw Error(`Invalid ${panels.length} panel size: ${nextSize.map((size) => `${size}%`).join(", ")}`);
|
|
34
|
+
} else if (!(0, import_fuzzy.fuzzyNumbersEqual)(nextSizeTotalSize, 100) && nextSize.length > 0) {
|
|
35
|
+
for (let index = 0; index < panels.length; index++) {
|
|
36
|
+
const unsafeSize = nextSize[index];
|
|
37
|
+
(0, import_utils.ensure)(unsafeSize, () => `No size data found for index ${index}`);
|
|
38
|
+
const safeSize = 100 / nextSizeTotalSize * unsafeSize;
|
|
39
|
+
nextSize[index] = safeSize;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
let remainingSize = 0;
|
|
43
|
+
for (let index = 0; index < panels.length; index++) {
|
|
44
|
+
const unsafeSize = nextSize[index];
|
|
45
|
+
(0, import_utils.ensure)(unsafeSize, () => `No size data found for index ${index}`);
|
|
46
|
+
const safeSize = (0, import_resize_panel.resizePanel)({ panels, index, size: unsafeSize });
|
|
47
|
+
if (unsafeSize != safeSize) {
|
|
48
|
+
remainingSize += unsafeSize - safeSize;
|
|
49
|
+
nextSize[index] = safeSize;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!(0, import_fuzzy.fuzzyNumbersEqual)(remainingSize, 0)) {
|
|
53
|
+
for (let index = 0; index < panels.length; index++) {
|
|
54
|
+
const prevSize2 = nextSize[index];
|
|
55
|
+
(0, import_utils.ensure)(prevSize2, () => `No size data found for index ${index}`);
|
|
56
|
+
const unsafeSize = prevSize2 + remainingSize;
|
|
57
|
+
const safeSize = (0, import_resize_panel.resizePanel)({ panels, index, size: unsafeSize });
|
|
58
|
+
if (prevSize2 !== safeSize) {
|
|
59
|
+
remainingSize -= safeSize - prevSize2;
|
|
60
|
+
nextSize[index] = safeSize;
|
|
61
|
+
if ((0, import_fuzzy.fuzzyNumbersEqual)(remainingSize, 0)) {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return nextSize;
|
|
68
|
+
}
|
|
69
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
70
|
+
0 && (module.exports = {
|
|
71
|
+
validateSizes
|
|
72
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// src/utils/validate-sizes.ts
|
|
2
|
+
import { ensure } from "@zag-js/utils";
|
|
3
|
+
import { fuzzyNumbersEqual } from "./fuzzy.mjs";
|
|
4
|
+
import { resizePanel } from "./resize-panel.mjs";
|
|
5
|
+
function validateSizes({ size: prevSize, panels }) {
|
|
6
|
+
const nextSize = [...prevSize];
|
|
7
|
+
const nextSizeTotalSize = nextSize.reduce((accumulated, current) => accumulated + current, 0);
|
|
8
|
+
if (nextSize.length !== panels.length) {
|
|
9
|
+
throw Error(`Invalid ${panels.length} panel size: ${nextSize.map((size) => `${size}%`).join(", ")}`);
|
|
10
|
+
} else if (!fuzzyNumbersEqual(nextSizeTotalSize, 100) && nextSize.length > 0) {
|
|
11
|
+
for (let index = 0; index < panels.length; index++) {
|
|
12
|
+
const unsafeSize = nextSize[index];
|
|
13
|
+
ensure(unsafeSize, () => `No size data found for index ${index}`);
|
|
14
|
+
const safeSize = 100 / nextSizeTotalSize * unsafeSize;
|
|
15
|
+
nextSize[index] = safeSize;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
let remainingSize = 0;
|
|
19
|
+
for (let index = 0; index < panels.length; index++) {
|
|
20
|
+
const unsafeSize = nextSize[index];
|
|
21
|
+
ensure(unsafeSize, () => `No size data found for index ${index}`);
|
|
22
|
+
const safeSize = resizePanel({ panels, index, size: unsafeSize });
|
|
23
|
+
if (unsafeSize != safeSize) {
|
|
24
|
+
remainingSize += unsafeSize - safeSize;
|
|
25
|
+
nextSize[index] = safeSize;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (!fuzzyNumbersEqual(remainingSize, 0)) {
|
|
29
|
+
for (let index = 0; index < panels.length; index++) {
|
|
30
|
+
const prevSize2 = nextSize[index];
|
|
31
|
+
ensure(prevSize2, () => `No size data found for index ${index}`);
|
|
32
|
+
const unsafeSize = prevSize2 + remainingSize;
|
|
33
|
+
const safeSize = resizePanel({ panels, index, size: unsafeSize });
|
|
34
|
+
if (prevSize2 !== safeSize) {
|
|
35
|
+
remainingSize -= safeSize - prevSize2;
|
|
36
|
+
nextSize[index] = safeSize;
|
|
37
|
+
if (fuzzyNumbersEqual(remainingSize, 0)) {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return nextSize;
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
validateSizes
|
|
47
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/splitter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.35.0",
|
|
4
4
|
"description": "Core logic for the splitter widget implemented as a state machine",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -27,16 +27,16 @@
|
|
|
27
27
|
"url": "https://github.com/chakra-ui/zag/issues"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@zag-js/anatomy": "1.
|
|
31
|
-
"@zag-js/core": "1.
|
|
32
|
-
"@zag-js/types": "1.
|
|
33
|
-
"@zag-js/dom-query": "1.
|
|
34
|
-
"@zag-js/utils": "1.
|
|
30
|
+
"@zag-js/anatomy": "1.35.0",
|
|
31
|
+
"@zag-js/core": "1.35.0",
|
|
32
|
+
"@zag-js/types": "1.35.0",
|
|
33
|
+
"@zag-js/dom-query": "1.35.0",
|
|
34
|
+
"@zag-js/utils": "1.35.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"clean-package": "2.2.0"
|
|
38
38
|
},
|
|
39
|
-
"clean-package": "
|
|
39
|
+
"clean-package": "./clean-package.config.json",
|
|
40
40
|
"main": "dist/index.js",
|
|
41
41
|
"module": "dist/index.mjs",
|
|
42
42
|
"types": "dist/index.d.ts",
|
|
@@ -51,6 +51,16 @@
|
|
|
51
51
|
"default": "./dist/index.js"
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
|
+
"./anatomy": {
|
|
55
|
+
"import": {
|
|
56
|
+
"types": "./dist/splitter.anatomy.d.mts",
|
|
57
|
+
"default": "./dist/splitter.anatomy.mjs"
|
|
58
|
+
},
|
|
59
|
+
"require": {
|
|
60
|
+
"types": "./dist/splitter.anatomy.d.ts",
|
|
61
|
+
"default": "./dist/splitter.anatomy.js"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
54
64
|
"./package.json": "./package.json"
|
|
55
65
|
},
|
|
56
66
|
"scripts": {
|