UNPKG

@chakra-v2/styled-system

Version:

Style function for css-in-js building component libraries

40 lines (37 loc) 1.3 kB
import { isObject } from '@chakra-v2/utils'; function resolveReference(operand) { if (isObject(operand) && operand.reference) { return operand.reference; } return String(operand); } const toExpression = (operator, ...operands) => operands.map(resolveReference).join(` ${operator} `).replace(/calc/g, ""); const add = (...operands) => `calc(${toExpression("+", ...operands)})`; const subtract = (...operands) => `calc(${toExpression("-", ...operands)})`; const multiply = (...operands) => `calc(${toExpression("*", ...operands)})`; const divide = (...operands) => `calc(${toExpression("/", ...operands)})`; const negate = (x) => { const value = resolveReference(x); if (value != null && !Number.isNaN(parseFloat(value))) { return String(value).startsWith("-") ? String(value).slice(1) : `-${value}`; } return multiply(value, -1); }; const calc = Object.assign( (x) => ({ add: (...operands) => calc(add(x, ...operands)), subtract: (...operands) => calc(subtract(x, ...operands)), multiply: (...operands) => calc(multiply(x, ...operands)), divide: (...operands) => calc(divide(x, ...operands)), negate: () => calc(negate(x)), toString: () => x.toString() }), { add, subtract, multiply, divide, negate } ); export { calc };