@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
JavaScript
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;
;