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.

160 lines (159 loc) 4.45 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _deepmerge = _interopRequireDefault(require("@mui/utils/deepmerge")); var _cssVarsParser = _interopRequireDefault(require("./cssVarsParser")); function prepareCssVars(theme, parserConfig = {}) { const { getSelector = defaultGetSelector, disableCssColorScheme, colorSchemeSelector: selector } = parserConfig; // @ts-ignore - ignore components do not exist const { colorSchemes = {}, components, defaultColorScheme = 'light', ...otherTheme } = theme; const { vars: rootVars, css: rootCss, varsWithDefaults: rootVarsWithDefaults } = (0, _cssVarsParser.default)(otherTheme, parserConfig); let themeVars = rootVarsWithDefaults; const colorSchemesMap = {}; const { [defaultColorScheme]: defaultScheme, ...otherColorSchemes } = colorSchemes; Object.entries(otherColorSchemes || {}).forEach(([key, scheme]) => { const { vars, css, varsWithDefaults } = (0, _cssVarsParser.default)(scheme, parserConfig); themeVars = (0, _deepmerge.default)(themeVars, varsWithDefaults); colorSchemesMap[key] = { css, vars }; }); if (defaultScheme) { // default color scheme vars should be merged last to set as default const { css, vars, varsWithDefaults } = (0, _cssVarsParser.default)(defaultScheme, parserConfig); themeVars = (0, _deepmerge.default)(themeVars, varsWithDefaults); colorSchemesMap[defaultColorScheme] = { css, vars }; } function defaultGetSelector(colorScheme, cssObject) { let rule = selector; if (selector === 'class') { rule = '.%s'; } if (selector === 'data') { rule = '[data-%s]'; } if (selector?.startsWith('data-') && !selector.includes('%s')) { // 'data-joy-color-scheme' -> '[data-joy-color-scheme="%s"]' rule = `[${selector}="%s"]`; } if (colorScheme) { if (rule === 'media') { if (theme.defaultColorScheme === colorScheme) { return ':root'; } const mode = colorSchemes[colorScheme]?.palette?.mode || colorScheme; return { [`@media (prefers-color-scheme: ${mode})`]: { ':root': cssObject } }; } if (rule) { if (theme.defaultColorScheme === colorScheme) { return `:root, ${rule.replace('%s', String(colorScheme))}`; } return rule.replace('%s', String(colorScheme)); } } return ':root'; } const generateThemeVars = () => { let vars = { ...rootVars }; Object.entries(colorSchemesMap).forEach(([, { vars: schemeVars }]) => { vars = (0, _deepmerge.default)(vars, schemeVars); }); return vars; }; const generateStyleSheets = () => { const stylesheets = []; const colorScheme = theme.defaultColorScheme || 'light'; function insertStyleSheet(key, css) { if (Object.keys(css).length) { stylesheets.push(typeof key === 'string' ? { [key]: { ...css } } : key); } } insertStyleSheet(getSelector(undefined, { ...rootCss }), rootCss); const { [colorScheme]: defaultSchemeVal, ...other } = colorSchemesMap; if (defaultSchemeVal) { // default color scheme has to come before other color schemes const { css } = defaultSchemeVal; const cssColorSheme = colorSchemes[colorScheme]?.palette?.mode; const finalCss = !disableCssColorScheme && cssColorSheme ? { colorScheme: cssColorSheme, ...css } : { ...css }; insertStyleSheet(getSelector(colorScheme, { ...finalCss }), finalCss); } Object.entries(other).forEach(([key, { css }]) => { const cssColorSheme = colorSchemes[key]?.palette?.mode; const finalCss = !disableCssColorScheme && cssColorSheme ? { colorScheme: cssColorSheme, ...css } : { ...css }; insertStyleSheet(getSelector(key, { ...finalCss }), finalCss); }); return stylesheets; }; return { vars: themeVars, generateThemeVars, generateStyleSheets }; } var _default = exports.default = prepareCssVars;