171 lines
No EOL
4.8 KiB
JavaScript
171 lines
No EOL
4.8 KiB
JavaScript
"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,
|
|
enableContrastVars
|
|
} = 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);
|
|
});
|
|
if (enableContrastVars) {
|
|
stylesheets.push({
|
|
':root': {
|
|
// use double underscore to indicate that these are private variables
|
|
'--__l-threshold': '0.7',
|
|
'--__l': 'clamp(0, (l / var(--__l-threshold) - 1) * -infinity, 1)',
|
|
'--__a': 'clamp(0.87, (l / var(--__l-threshold) - 1) * -infinity, 1)' // 0.87 is the default alpha value for black text.
|
|
}
|
|
});
|
|
}
|
|
return stylesheets;
|
|
};
|
|
return {
|
|
vars: themeVars,
|
|
generateThemeVars,
|
|
generateStyleSheets
|
|
};
|
|
}
|
|
var _default = exports.default = prepareCssVars; |