UNPKG

vcc-ui

Version:

A React library for building user interfaces at Volvo Cars

82 lines (80 loc) 2.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.arrayifyResponsiveValue = arrayifyResponsiveValue; exports.getBaseStyle = getBaseStyle; exports.getRenderedElement = getRenderedElement; exports.getStylesForEachBreakpoint = getStylesForEachBreakpoint; exports.mergeStyles = mergeStyles; exports.normalizeResponsiveValue = normalizeResponsiveValue; exports.populateResponsiveArray = populateResponsiveArray; exports.stripFlowElement = stripFlowElement; function stripFlowElement(el) { return /^(p|h[1-6])$/.test(el) ? 'span' : el; } // TODO: can we refactor this to not look that ugly? function arrayifyResponsiveValue(value) { if (typeof value === 'object') { if (!Array.isArray(value)) { const { default: defaultValue, fromM, fromL, fromXL } = value; return [defaultValue, fromM, fromL, fromXL]; } const [defaultValue, fromM, fromL, fromXL] = value; return [defaultValue, fromM, fromL, fromXL]; } return [value, value, value, value]; } function populateResponsiveArray(value) { return value.reduce((filled, item, index) => [...filled, item || filled[index - 1]], []); } function normalizeResponsiveValue(value) { return populateResponsiveArray(arrayifyResponsiveValue(value)); } function getBaseStyle() { let style = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; const { fromM, fromL, fromXL, ...baseStyle } = style; return baseStyle; } const breakpoints = ['fromM', 'fromL', 'fromXL']; function getStylesForEachBreakpoint(styles, breakpoint) { const breakpointSpan = breakpoints.indexOf(breakpoint) + 1; return breakpoints.slice(0, breakpointSpan).reduce((mergedStyles, breakpoint) => { if (styles[breakpoint]) { return { ...mergedStyles, ...styles[breakpoint] }; } return mergedStyles; }, {}); } function mergeStyles(_ref, subStyle, breakpoint) { let { standard: { styles }, ...subStyles } = _ref; const baseStyle = getBaseStyle(styles); const baseSubStyle = getBaseStyle(subStyles[subStyle] ? subStyles[subStyle].styles : {}); return { ...baseStyle, ...baseSubStyle, ...getStylesForEachBreakpoint(styles, breakpoint) }; } function getRenderedElement(isRootElement, as, variant, subStyle, theme) { let defaultElement = as || typeof variant === 'string' && typeof subStyle === 'string' && theme.typeScale[variant][subStyle] && theme.typeScale[variant][subStyle].element || 'p'; return isRootElement ? defaultElement : stripFlowElement(defaultElement); }