/
githubmirror
/
material-ui
Обзор
Документация
Войти
/
githubmirror
/
material-ui
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
packages/mui-material/src/styles/createTheme.ts
146 строк
4 KB
Brijesh Bittu
[code-infra] Enable undefined addition to optional properties (#47750)
19 фев 2026, 12:14
Не верифицирован
19 фев 2026, 12:14
09f4536
Код
Авторство
О чём код?
import createPalette, { PaletteOptions } from './createPalette'; import { ColorSystemOptions } from './createThemeFoundation'; import createThemeWithVars, { CssVarsThemeOptions, ColorSystem, DefaultColorScheme, } from './createThemeWithVars'; import createThemeNoVars, { Theme, CssThemeVariables, ThemeOptions as ThemeNoVarsOptions, } from './createThemeNoVars'; export type { Theme, CssThemeVariables } from './createThemeNoVars'; type CssVarsOptions = CssThemeVariables extends { enabled: true; } ? ColorSystemOptions : {}; type CssVarsConfigList = | 'colorSchemeSelector' | 'rootSelector' | 'disableCssColorScheme' | 'cssVarPrefix' | 'shouldSkipGeneratingVar' | 'nativeColor'; export interface ThemeOptions extends CssVarsOptions, Omit<CssVarsThemeOptions, CssVarsConfigList> { cssVariables?: boolean | Pick<CssVarsThemeOptions, CssVarsConfigList> | undefined; palette?: PaletteOptions | undefined; } // eslint-disable-next-line consistent-return function attachColorScheme( theme: { colorSchemes?: Partial<Record<string, any>> | undefined }, scheme: 'light' | 'dark', colorScheme: boolean | Record<string, any> | undefined, ) { if (!theme.colorSchemes) { return undefined; } if (colorScheme) { theme.colorSchemes[scheme] = { ...(colorScheme !== true && colorScheme), palette: createPalette({ ...(colorScheme === true ? {} : colorScheme.palette), mode: scheme, } as any), // 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. */ export default function createTheme( options: ThemeOptions = {} as any, // cast type to skip module augmentation test ...args: object[] ): Theme { const { palette, cssVariables = false, colorSchemes: initialColorSchemes = !palette ? { light: true } : undefined, defaultColorScheme: initialDefaultColorScheme = palette?.mode, ...other } = options; const defaultColorSchemeInput = (initialDefaultColorScheme as DefaultColorScheme) || '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 createThemeNoVars(options as ThemeNoVarsOptions, ...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 = createThemeNoVars( { ...options, palette: paletteOptions } as ThemeNoVarsOptions, ...args, ) as unknown as Theme & { defaultColorScheme?: 'light' | 'dark' | undefined; colorSchemes?: Partial<Record<string, any>> | undefined; }; theme.defaultColorScheme = defaultColorSchemeInput; theme.colorSchemes = colorSchemesInput as Record<string, ColorSystem>; if (theme.palette.mode === 'light') { theme.colorSchemes.light = { ...(colorSchemesInput.light !== true && colorSchemesInput.light), palette: theme.palette, } as ColorSystem; attachColorScheme(theme, 'dark', colorSchemesInput.dark); } if (theme.palette.mode === 'dark') { theme.colorSchemes.dark = { ...(colorSchemesInput.dark !== true && colorSchemesInput.dark), palette: theme.palette, } as ColorSystem; attachColorScheme(theme, 'light', colorSchemesInput.light); } return theme; } if (!palette && !('light' in colorSchemesInput) && defaultColorSchemeInput === 'light') { colorSchemesInput.light = true; } return createThemeWithVars( { ...other, colorSchemes: colorSchemesInput, defaultColorScheme: defaultColorSchemeInput, ...(typeof cssVariables !== 'boolean' && cssVariables), }, ...args, ); }