UNPKG

reka-ui

Version:

Vue port for Radix UI Primitives.

88 lines (87 loc) 3.7 kB
//#region src/Splitter/utils/units.ts function convertValueToPercent({ sizeUnit, groupSizeInPixels, value }) { if (value == null) return value; if (sizeUnit === "%") return value; if (groupSizeInPixels == null || groupSizeInPixels === 0) return void 0; return value / groupSizeInPixels * 100; } function convertPanelConstraintsToPercent({ panelDataArray, groupSizeInPixels }) { const requiresMeasurement = panelDataArray.some((panelData) => (panelData.constraints.sizeUnit ?? "%") === "px"); if (requiresMeasurement && (!groupSizeInPixels || Number.isNaN(groupSizeInPixels))) return null; return panelDataArray.map((panelData) => { const constraints = panelData.constraints; const sizeUnit = constraints.sizeUnit ?? "%"; const collapsedSize = convertValueToPercent({ groupSizeInPixels, sizeUnit, value: constraints.collapsedSize }); const defaultSize = convertValueToPercent({ groupSizeInPixels, sizeUnit, value: constraints.defaultSize }); const maxSize = convertValueToPercent({ groupSizeInPixels, sizeUnit, value: constraints.maxSize }); const minSize = convertValueToPercent({ groupSizeInPixels, sizeUnit, value: constraints.minSize }); return { ...constraints, collapsedSize: collapsedSize ?? constraints.collapsedSize ?? 0, defaultSize, maxSize: maxSize ?? 100, minSize: minSize ?? 0, sizeUnit: "%" }; }); } function hasPixelSizedPanel(panelDataArray) { return panelDataArray.some((panelData) => (panelData.constraints.sizeUnit ?? "%") === "px"); } function recalculateLayoutForPixelPanels({ layout, panelDataArray, prevGroupSize, nextGroupSize }) { if (!hasPixelSizedPanel(panelDataArray)) return null; if (prevGroupSize == null || nextGroupSize == null || prevGroupSize === 0 || nextGroupSize === 0 || Number.isNaN(prevGroupSize) || Number.isNaN(nextGroupSize)) return null; const pixelPanelIndices = panelDataArray.reduce((indices, panelData, index) => { if ((panelData.constraints.sizeUnit ?? "%") === "px") indices.push(index); return indices; }, []); if (pixelPanelIndices.length === 0) return null; const pixelIndexSet = new Set(pixelPanelIndices); const nextLayout = layout.map((size) => size ?? 0); const prevPercentForPixelPanels = pixelPanelIndices.reduce((sum, index) => sum + (layout[index] ?? 0), 0); const nextPixelPercents = pixelPanelIndices.map((index) => { const prevPercent = layout[index] ?? 0; const prevPixelSize = prevPercent / 100 * prevGroupSize; return prevPixelSize / nextGroupSize * 100; }); const totalNextPixelPercent = nextPixelPercents.reduce((sum, value) => sum + value, 0); const prevPercentForPercentPanels = layout.reduce((sum, size, index) => { if (pixelIndexSet.has(index)) return sum; return sum + (size ?? 0); }, 0); const availableNextPercent = Math.max(0, 100 - totalNextPixelPercent); const scaleFactor = prevPercentForPercentPanels > 0 ? availableNextPercent / prevPercentForPercentPanels : 0; pixelPanelIndices.forEach((panelIndex, arrayIndex) => { nextLayout[panelIndex] = nextPixelPercents[arrayIndex]; }); for (let index = 0; index < nextLayout.length; index++) { if (pixelIndexSet.has(index)) continue; const prevSize = layout[index] ?? 0; nextLayout[index] = prevSize * scaleFactor; } const total = nextLayout.reduce((sum, size) => sum + size, 0); if (total > 0 && Math.abs(total - 100) > 1e-9) { const factor = 100 / total; for (let index = 0; index < nextLayout.length; index++) nextLayout[index] = (nextLayout[index] ?? 0) * factor; } return nextLayout; } //#endregion export { convertPanelConstraintsToPercent, hasPixelSizedPanel, recalculateLayoutForPixelPanels }; //# sourceMappingURL=units.js.map