UNPKG

@chakra-ui/react

Version:

Responsive and accessible React UI components built with React and Emotion

108 lines (105 loc) 2.82 kB
"use strict"; import { toRem, toPx } from './unit-conversion.js'; const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1); function createBreakpoints(breakpoints) { const sorted = sort(breakpoints); const values = Object.fromEntries(sorted); function get(name) { return values[name]; } function only(name) { return build(get(name)); } function getRanges() { const breakpoints2 = Object.keys(values); const permuations = getPermutations(breakpoints2); const results = breakpoints2.flatMap((name) => { const value = get(name); const down2 = [ `${name}Down`, build({ max: adjust(value.min) }) ]; const up2 = [name, build({ min: value.min })]; const _only = [`${name}Only`, only(name)]; return [up2, _only, down2]; }).filter(([, value]) => value !== "").concat( permuations.map(([min, max]) => { const minValue = get(min); const maxValue = get(max); return [ `${min}To${capitalize(max)}`, build({ min: minValue.min, max: adjust(maxValue.min) }) ]; }) ); return Object.fromEntries(results); } function toConditions() { const ranges = getRanges(); return Object.fromEntries(Object.entries(ranges)); } const conditions = toConditions(); const getCondition = (key) => { return conditions[key]; }; function keys() { return ["base", ...Object.keys(values)]; } function up(name) { return build({ min: get(name).min }); } function down(name) { return build({ max: adjust(get(name).min) }); } return { values: Object.values(values), only, keys, conditions, getCondition, up, down }; } function adjust(value) { const computedMax = parseFloat(toPx(value) ?? "") - 0.04; return toRem(`${computedMax}px`); } function sort(breakpoints) { const entries = Object.entries(breakpoints).sort(([, minA], [, minB]) => { return parseInt(minA, 10) < parseInt(minB, 10) ? -1 : 1; }); return entries.map(([name, min], index, entries2) => { let max = null; if (index <= entries2.length - 1) { max = entries2[index + 1]?.[1]; } if (max != null) { max = adjust(max); } return [name, { name, min: toRem(min), max }]; }); } function getPermutations(values) { const result = []; values.forEach((current, index) => { let idx = index; idx++; let next = values[idx]; while (next) { result.push([current, next]); idx++; next = values[idx]; } }); return result; } function build({ min, max }) { if (min == null && max == null) return ""; return [ "@media screen", min && `(min-width: ${min})`, max && `(max-width: ${max})` ].filter(Boolean).join(" and "); } export { createBreakpoints };