UNPKG

@mui/system

Version:

MUI System is a set of CSS utilities to help you build custom designs more efficiently. It makes it possible to rapidly lay out custom designs.

79 lines (78 loc) 3.45 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = cssContainerQueries; exports.getContainerQuery = getContainerQuery; exports.isCqShorthand = isCqShorthand; exports.sortContainerQueries = sortContainerQueries; var _formatMuiErrorMessage = _interopRequireDefault(require("@mui/utils/formatMuiErrorMessage")); /** * For using in `sx` prop to sort the breakpoint from low to high. * Note: this function does not work and will not support multiple units. * e.g. input: { '@container (min-width:300px)': '1rem', '@container (min-width:40rem)': '2rem' } * output: { '@container (min-width:40rem)': '2rem', '@container (min-width:300px)': '1rem' } // since 40 < 300 eventhough 40rem > 300px */ function sortContainerQueries(theme, css) { if (!theme.containerQueries) { return css; } const sorted = Object.keys(css).filter(key => key.startsWith('@container')).sort((a, b) => { const regex = /min-width:\s*([0-9.]+)/; return +(a.match(regex)?.[1] || 0) - +(b.match(regex)?.[1] || 0); }); if (!sorted.length) { return css; } return sorted.reduce((acc, key) => { const value = css[key]; delete acc[key]; acc[key] = value; return acc; }, { ...css }); } function isCqShorthand(breakpointKeys, value) { return value === '@' || value.startsWith('@') && (breakpointKeys.some(key => value.startsWith(`@${key}`)) || !!value.match(/^@\d/)); } function getContainerQuery(theme, shorthand) { const matches = shorthand.match(/^@([^/]+)?\/?(.+)?$/); if (!matches) { if (process.env.NODE_ENV !== 'production') { throw new Error(process.env.NODE_ENV !== "production" ? `MUI: The provided shorthand ${`(${shorthand})`} is invalid. The format should be \`@<breakpoint | number>\` or \`@<breakpoint | number>/<container>\`.\n` + 'For example, `@sm` or `@600` or `@40rem/sidebar`.' : (0, _formatMuiErrorMessage.default)(18, `(${shorthand})`)); } return null; } const [, containerQuery, containerName] = matches; const value = Number.isNaN(+containerQuery) ? containerQuery || 0 : +containerQuery; return theme.containerQueries(containerName).up(value); } function cssContainerQueries(themeInput) { const toContainerQuery = (mediaQuery, name) => mediaQuery.replace('@media', name ? `@container ${name}` : '@container'); function attachCq(node, name) { node.up = (...args) => toContainerQuery(themeInput.breakpoints.up(...args), name); node.down = (...args) => toContainerQuery(themeInput.breakpoints.down(...args), name); node.between = (...args) => toContainerQuery(themeInput.breakpoints.between(...args), name); node.only = (...args) => toContainerQuery(themeInput.breakpoints.only(...args), name); node.not = (...args) => { const result = toContainerQuery(themeInput.breakpoints.not(...args), name); if (result.includes('not all and')) { // `@container` does not work with `not all and`, so need to invert the logic return result.replace('not all and ', '').replace('min-width:', 'width<').replace('max-width:', 'width>').replace('and', 'or'); } return result; }; } const node = {}; const containerQueries = name => { attachCq(node, name); return node; }; attachCq(containerQueries); return { ...themeInput, containerQueries }; }