UNPKG

@zag-js/splitter

Version:

Core logic for the splitter widget implemented as a state machine

50 lines (48 loc) 1.89 kB
import "../chunk-QZ7TP4HQ.mjs"; // src/utils/validate-sizes.ts import { ensure } from "@zag-js/utils"; import { fuzzyNumbersEqual } from "./fuzzy.mjs"; import { resizePanel } from "./resize-panel.mjs"; function validateSizes({ size: prevSize, panels }) { const nextSize = [...prevSize]; const nextSizeTotalSize = nextSize.reduce((accumulated, current) => accumulated + current, 0); if (nextSize.length !== panels.length) { throw Error(`Invalid ${panels.length} panel size: ${nextSize.map((size) => `${size}%`).join(", ")}`); } else if (!fuzzyNumbersEqual(nextSizeTotalSize, 100) && nextSize.length > 0) { for (let index = 0; index < panels.length; index++) { const unsafeSize = nextSize[index]; ensure(unsafeSize, () => `No size data found for index ${index}`); const safeSize = 100 / nextSizeTotalSize * unsafeSize; nextSize[index] = safeSize; } } let remainingSize = 0; for (let index = 0; index < panels.length; index++) { const unsafeSize = nextSize[index]; ensure(unsafeSize, () => `No size data found for index ${index}`); const safeSize = resizePanel({ panels, index, size: unsafeSize }); if (unsafeSize != safeSize) { remainingSize += unsafeSize - safeSize; nextSize[index] = safeSize; } } if (!fuzzyNumbersEqual(remainingSize, 0)) { for (let index = 0; index < panels.length; index++) { const prevSize2 = nextSize[index]; ensure(prevSize2, () => `No size data found for index ${index}`); const unsafeSize = prevSize2 + remainingSize; const safeSize = resizePanel({ panels, index, size: unsafeSize }); if (prevSize2 !== safeSize) { remainingSize -= safeSize - prevSize2; nextSize[index] = safeSize; if (fuzzyNumbersEqual(remainingSize, 0)) { break; } } } } return nextSize; } export { validateSizes };