From 82d72402a7f0ae4357ab8dc99885a07d164b256b Mon Sep 17 00:00:00 2001 From: siriwatknp Date: Wed, 15 May 2024 09:13:22 -0400 Subject: [PATCH 01/21] add InitColorSchemeScript --- .../src/styles/CssVarsProvider.tsx | 47 +++++++++---------- .../src/cssVars/createCssVarsProvider.d.ts | 3 ++ .../src/cssVars/createCssVarsProvider.js | 6 ++- .../src/cssVars/getInitColorSchemeScript.tsx | 5 ++ 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/packages/mui-material/src/styles/CssVarsProvider.tsx b/packages/mui-material/src/styles/CssVarsProvider.tsx index e7779777a3094c..473e543c36eb72 100644 --- a/packages/mui-material/src/styles/CssVarsProvider.tsx +++ b/packages/mui-material/src/styles/CssVarsProvider.tsx @@ -14,35 +14,34 @@ import THEME_ID from './identifier'; const defaultTheme = experimental_extendTheme(); -const { CssVarsProvider, useColorScheme, getInitColorSchemeScript } = createCssVarsProvider< - SupportedColorScheme, - typeof THEME_ID ->({ - themeId: THEME_ID, - theme: defaultTheme, - attribute: 'data-mui-color-scheme', - modeStorageKey: 'mui-mode', - colorSchemeStorageKey: 'mui-color-scheme', - defaultColorScheme: { - light: 'light', - dark: 'dark', - }, - resolveTheme: (theme) => { - const newTheme = { - ...theme, - typography: createTypography(theme.palette, theme.typography), - }; +const { CssVarsProvider, useColorScheme, getInitColorSchemeScript, InitColorSchemeScript } = + createCssVarsProvider({ + themeId: THEME_ID, + theme: defaultTheme, + attribute: 'data-mui-color-scheme', + modeStorageKey: 'mui-mode', + colorSchemeStorageKey: 'mui-color-scheme', + defaultColorScheme: { + light: 'light', + dark: 'dark', + }, + resolveTheme: (theme) => { + const newTheme = { + ...theme, + typography: createTypography(theme.palette, theme.typography), + }; - newTheme.unstable_sx = function sx(props: SxProps) { - return styleFunctionSx({ sx: props, theme: this }); - }; + newTheme.unstable_sx = function sx(props: SxProps) { + return styleFunctionSx({ sx: props, theme: this }); + }; - return newTheme; - }, -}); + return newTheme; + }, + }); export { useColorScheme, getInitColorSchemeScript, CssVarsProvider as Experimental_CssVarsProvider, + InitColorSchemeScript, }; diff --git a/packages/mui-system/src/cssVars/createCssVarsProvider.d.ts b/packages/mui-system/src/cssVars/createCssVarsProvider.d.ts index b8dc3ff9a2d703..ca1c88caee85bf 100644 --- a/packages/mui-system/src/cssVars/createCssVarsProvider.d.ts +++ b/packages/mui-system/src/cssVars/createCssVarsProvider.d.ts @@ -93,6 +93,9 @@ export interface CreateCssVarsProviderResult< ) => React.ReactElement; useColorScheme: () => ColorSchemeContextValue; getInitColorSchemeScript: typeof getInitColorSchemeScript; + InitColorSchemeScript: ( + props: Parameters[0], + ) => React.ReactElement; } export default function createCssVarsProvider< diff --git a/packages/mui-system/src/cssVars/createCssVarsProvider.js b/packages/mui-system/src/cssVars/createCssVarsProvider.js index 22f781020af1a5..36137054fae962 100644 --- a/packages/mui-system/src/cssVars/createCssVarsProvider.js +++ b/packages/mui-system/src/cssVars/createCssVarsProvider.js @@ -368,5 +368,9 @@ export default function createCssVarsProvider(options) { ...params, }); - return { CssVarsProvider, useColorScheme, getInitColorSchemeScript }; + const InitColorSchemeScript = React.memo(function InitColorSchemeScript(props) { + return getInitColorSchemeScript(props); + }); + + return { CssVarsProvider, useColorScheme, getInitColorSchemeScript, InitColorSchemeScript }; } diff --git a/packages/mui-system/src/cssVars/getInitColorSchemeScript.tsx b/packages/mui-system/src/cssVars/getInitColorSchemeScript.tsx index d392ddbc8d053d..5094225f71dea9 100644 --- a/packages/mui-system/src/cssVars/getInitColorSchemeScript.tsx +++ b/packages/mui-system/src/cssVars/getInitColorSchemeScript.tsx @@ -40,6 +40,8 @@ export interface GetInitColorSchemeScriptOptions { * @default 'data-color-scheme' */ attribute?: string; + /** Nonce string to pass to the inline script for CSP headers */ + nonce?: string | undefined; } export default function getInitColorSchemeScript(options?: GetInitColorSchemeScriptOptions) { @@ -51,10 +53,13 @@ export default function getInitColorSchemeScript(options?: GetInitColorSchemeScr colorSchemeStorageKey = DEFAULT_COLOR_SCHEME_STORAGE_KEY, attribute = DEFAULT_ATTRIBUTE, colorSchemeNode = 'document.documentElement', + nonce, } = options || {}; return (