react-resizable-panels
Version:
React components for resizable panel groups/layouts
48 lines (42 loc) • 1.26 kB
text/typescript
import { PanelConstraints } from "../Panel";
import { PRECISION } from "../constants";
import { assert } from "./assert";
import { fuzzyCompareNumbers } from "./numbers/fuzzyCompareNumbers";
// Panel size must be in percentages; pixel values should be pre-converted
export function resizePanel({
panelConstraints: panelConstraintsArray,
panelIndex,
size,
}: {
panelConstraints: PanelConstraints[];
panelIndex: number;
size: number;
}) {
const panelConstraints = panelConstraintsArray[panelIndex];
assert(
panelConstraints != null,
`Panel constraints not found for index ${panelIndex}`
);
let {
collapsedSize = 0,
collapsible,
maxSize = 100,
minSize = 0,
} = panelConstraints;
if (fuzzyCompareNumbers(size, minSize) < 0) {
if (collapsible) {
// Collapsible panels should snap closed or open only once they cross the halfway point between collapsed and min size.
const halfwayPoint = (collapsedSize + minSize) / 2;
if (fuzzyCompareNumbers(size, halfwayPoint) < 0) {
size = collapsedSize;
} else {
size = minSize;
}
} else {
size = minSize;
}
}
size = Math.min(maxSize, size);
size = parseFloat(size.toFixed(PRECISION));
return size;
}