UNPKG

@wordpress/components

Version:
110 lines (101 loc) 3.23 kB
/** * Parses and retrieves a number value. * * @param {unknown} value The incoming value. * * @return {number} The parsed number value. */ export function getNumber(value) { const number = Number(value); return isNaN(number) ? 0 : number; } /** * Safely adds 2 values. * * @param {Array<number|string>} args Values to add together. * * @return {number} The sum of values. */ export function add() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return args.reduce( /** @type {(sum:number, arg: number|string) => number} */ (sum, arg) => sum + getNumber(arg), 0); } /** * Safely subtracts 2 values. * * @param {Array<number|string>} args Values to subtract together. * * @return {number} The difference of the values. */ export function subtract() { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return args.reduce( /** @type {(diff:number, arg: number|string, index:number) => number} */ (diff, arg, index) => { const value = getNumber(arg); return index === 0 ? value : diff - value; }, 0); } /** * Determines the decimal position of a number value. * * @param {number} value The number to evaluate. * * @return {number} The number of decimal places. */ function getPrecision(value) { const split = (value + '').split('.'); return split[1] !== undefined ? split[1].length : 0; } /** * Clamps a value based on a min/max range. * * @param {number} value The value. * @param {number} min The minimum range. * @param {number} max The maximum range. * * @return {number} The clamped value. */ export function clamp(value, min, max) { const baseValue = getNumber(value); return Math.max(min, Math.min(baseValue, max)); } /** * Clamps a value based on a min/max range with rounding * * @param {number | string} value The value. * @param {number} min The minimum range. * @param {number} max The maximum range. * @param {number} step A multiplier for the value. * * @return {number} The rounded and clamped value. */ export function roundClamp() { let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; let min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity; let max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity; let step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; const baseValue = getNumber(value); const stepValue = getNumber(step); const precision = getPrecision(step); const rounded = Math.round(baseValue / stepValue) * stepValue; const clampedValue = clamp(rounded, min, max); return precision ? getNumber(clampedValue.toFixed(precision)) : clampedValue; } /** * Clamps a value based on a min/max range with rounding. * Returns a string. * * @param {Parameters<typeof roundClamp>} args Arguments for roundClamp(). * @return {string} The rounded and clamped value. */ export function roundClampString() { return roundClamp(...arguments).toString(); } //# sourceMappingURL=math.js.map