blob: 6790c3fad2eaf3b14221680831bad9f47d3e291d [file] [log] [blame]
import getTextDimension, { GetTextDimensionInput } from './getTextDimension';
import { Dimension } from './types';
function decreaseSizeUntil(
startSize: number,
computeDimension: (size: number) => Dimension,
condition: (dimension: Dimension) => boolean,
): number {
let size = startSize;
let dimension = computeDimension(size);
while (!condition(dimension)) {
size -= 1;
dimension = computeDimension(size);
}
return size;
}
export default function computeMaxFontSize(
input: GetTextDimensionInput & {
maxWidth?: number;
maxHeight?: number;
idealFontSize?: number;
},
) {
const { idealFontSize, maxWidth, maxHeight, style, ...rest } = input;
let size: number;
if (idealFontSize !== undefined && idealFontSize !== null) {
size = idealFontSize;
} else if (maxHeight === undefined || maxHeight === null) {
throw new Error('You must specify at least one of maxHeight or idealFontSize');
} else {
size = Math.floor(maxHeight);
}
function computeDimension(fontSize: number) {
return getTextDimension({
...rest,
style: { ...style, fontSize: `${fontSize}px` },
});
}
if (maxWidth !== undefined && maxWidth !== null) {
size = decreaseSizeUntil(size, computeDimension, dim => dim.width <= maxWidth);
}
if (maxHeight !== undefined && maxHeight !== null) {
size = decreaseSizeUntil(size, computeDimension, dim => dim.height <= maxHeight);
}
return size;
}