UNPKG

3.38 kBJavaScriptView Raw
1import createPalette from "./createPalette.js";
2import createThemeWithVars from "./createThemeWithVars.js";
3import createThemeNoVars from "./createThemeNoVars.js";
4export { createMuiTheme } from "./createThemeNoVars.js";
5// eslint-disable-next-line consistent-return
6function attachColorScheme(theme, scheme, colorScheme) {
7 if (!theme.colorSchemes) {
8 return undefined;
9 }
10 if (colorScheme) {
11 theme.colorSchemes[scheme] = {
12 ...(colorScheme !== true && colorScheme),
13 palette: createPalette({
14 ...(colorScheme === true ? {} : colorScheme.palette),
15 mode: scheme
16 }) // cast type to skip module augmentation test
17 };
18 }
19}
20
21/**
22 * Generate a theme base on the options received.
23 * @param options Takes an incomplete theme object and adds the missing parts.
24 * @param args Deep merge the arguments with the about to be returned theme.
25 * @returns A complete, ready-to-use theme object.
26 */
27export default function createTheme(options = {},
28// cast type to skip module augmentation test
29...args) {
30 const {
31 palette,
32 cssVariables = false,
33 colorSchemes: initialColorSchemes = !palette ? {
34 light: true
35 } : undefined,
36 defaultColorScheme: initialDefaultColorScheme = palette?.mode,
37 ...rest
38 } = options;
39 const defaultColorSchemeInput = initialDefaultColorScheme || 'light';
40 const defaultScheme = initialColorSchemes?.[defaultColorSchemeInput];
41 const colorSchemesInput = {
42 ...initialColorSchemes,
43 ...(palette ? {
44 [defaultColorSchemeInput]: {
45 ...(typeof defaultScheme !== 'boolean' && defaultScheme),
46 palette
47 }
48 } : undefined)
49 };
50 if (cssVariables === false) {
51 if (!('colorSchemes' in options)) {
52 // Behaves exactly as v5
53 return createThemeNoVars(options, ...args);
54 }
55 let paletteOptions = palette;
56 if (!('palette' in options)) {
57 if (colorSchemesInput[defaultColorSchemeInput]) {
58 if (colorSchemesInput[defaultColorSchemeInput] !== true) {
59 paletteOptions = colorSchemesInput[defaultColorSchemeInput].palette;
60 } else if (defaultColorSchemeInput === 'dark') {
61 // @ts-ignore to prevent the module augmentation test from failing
62 paletteOptions = {
63 mode: 'dark'
64 };
65 }
66 }
67 }
68 const theme = createThemeNoVars({
69 ...options,
70 palette: paletteOptions
71 }, ...args);
72 theme.defaultColorScheme = defaultColorSchemeInput;
73 theme.colorSchemes = colorSchemesInput;
74 if (theme.palette.mode === 'light') {
75 theme.colorSchemes.light = {
76 ...(colorSchemesInput.light !== true && colorSchemesInput.light),
77 palette: theme.palette
78 };
79 attachColorScheme(theme, 'dark', colorSchemesInput.dark);
80 }
81 if (theme.palette.mode === 'dark') {
82 theme.colorSchemes.dark = {
83 ...(colorSchemesInput.dark !== true && colorSchemesInput.dark),
84 palette: theme.palette
85 };
86 attachColorScheme(theme, 'light', colorSchemesInput.light);
87 }
88 return theme;
89 }
90 if (!palette && !('light' in colorSchemesInput) && defaultColorSchemeInput === 'light') {
91 colorSchemesInput.light = true;
92 }
93 return createThemeWithVars({
94 ...rest,
95 colorSchemes: colorSchemesInput,
96 defaultColorScheme: defaultColorSchemeInput,
97 ...(typeof cssVariables !== 'boolean' && cssVariables)
98 }, ...args);
99}
\No newline at end of file