@mui/material
Version:
Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.
105 lines (103 loc) • 3.64 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createTheme;
var _createPalette = _interopRequireDefault(require("./createPalette"));
var _createThemeWithVars = _interopRequireDefault(require("./createThemeWithVars"));
var _createThemeNoVars = _interopRequireDefault(require("./createThemeNoVars"));
// eslint-disable-next-line consistent-return
function attachColorScheme(theme, scheme, colorScheme) {
if (!theme.colorSchemes) {
return undefined;
}
if (colorScheme) {
theme.colorSchemes[scheme] = {
...(colorScheme !== true && colorScheme),
palette: (0, _createPalette.default)({
...(colorScheme === true ? {} : colorScheme.palette),
mode: scheme
}) // cast type to skip module augmentation test
};
}
}
/**
* Generate a theme base on the options received.
* @param options Takes an incomplete theme object and adds the missing parts.
* @param args Deep merge the arguments with the about to be returned theme.
* @returns A complete, ready-to-use theme object.
*/
function createTheme(options = {},
// cast type to skip module augmentation test
...args) {
const {
palette,
cssVariables = false,
colorSchemes: initialColorSchemes = !palette ? {
light: true
} : undefined,
defaultColorScheme: initialDefaultColorScheme = palette?.mode,
...rest
} = options;
const defaultColorSchemeInput = initialDefaultColorScheme || 'light';
const defaultScheme = initialColorSchemes?.[defaultColorSchemeInput];
const colorSchemesInput = {
...initialColorSchemes,
...(palette ? {
[defaultColorSchemeInput]: {
...(typeof defaultScheme !== 'boolean' && defaultScheme),
palette
}
} : undefined)
};
if (cssVariables === false) {
if (!('colorSchemes' in options)) {
// Behaves exactly as v5
return (0, _createThemeNoVars.default)(options, ...args);
}
let paletteOptions = palette;
if (!('palette' in options)) {
if (colorSchemesInput[defaultColorSchemeInput]) {
if (colorSchemesInput[defaultColorSchemeInput] !== true) {
paletteOptions = colorSchemesInput[defaultColorSchemeInput].palette;
} else if (defaultColorSchemeInput === 'dark') {
// @ts-ignore to prevent the module augmentation test from failing
paletteOptions = {
mode: 'dark'
};
}
}
}
const theme = (0, _createThemeNoVars.default)({
...options,
palette: paletteOptions
}, ...args);
theme.defaultColorScheme = defaultColorSchemeInput;
theme.colorSchemes = colorSchemesInput;
if (theme.palette.mode === 'light') {
theme.colorSchemes.light = {
...(colorSchemesInput.light !== true && colorSchemesInput.light),
palette: theme.palette
};
attachColorScheme(theme, 'dark', colorSchemesInput.dark);
}
if (theme.palette.mode === 'dark') {
theme.colorSchemes.dark = {
...(colorSchemesInput.dark !== true && colorSchemesInput.dark),
palette: theme.palette
};
attachColorScheme(theme, 'light', colorSchemesInput.light);
}
return theme;
}
if (!palette && !('light' in colorSchemesInput) && defaultColorSchemeInput === 'light') {
colorSchemesInput.light = true;
}
return (0, _createThemeWithVars.default)({
...rest,
colorSchemes: colorSchemesInput,
defaultColorScheme: defaultColorSchemeInput,
...(typeof cssVariables !== 'boolean' && cssVariables)
}, ...args);
}
;