/
githubmirror
/
material-ui
Обзор
Документация
Войти
/
githubmirror
/
material-ui
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
docs/data/system/experimental-api/css-theme-variables/CreateCssVarsProvider.js
136 строк
3 KB
Siriwat K
[material-ui] Refine `extendTheme` and `CssVarsProvider` API (#42839)
18 июл 2024, 04:46
Не верифицирован
18 июл 2024, 04:46
8f30a53
Код
Авторство
О чём код?
import * as React from 'react'; import { unstable_createCssVarsProvider as createCssVarsProvider, unstable_prepareCssVars as prepareCssVars, styled, } from '@mui/system'; const lightColorScheme = { palette: { mode: 'light', primary: { default: '#3990FF', dark: '#02367D', }, text: { default: '#111111', }, // ... other colors }, }; const darkColorScheme = { palette: { mode: 'dark', primary: { default: '#265D97', dark: '#132F4C', main: '#5090D3', }, text: { default: '#ffffff', }, // ... other colors }, }; function extendTheme({ cssVarPrefix = 'system-demo' } = {}) { const colorSchemeSelector = 'data-system-demo-color-scheme'; const { vars: themeVars, ...params } = prepareCssVars( { colorSchemes: { light: lightColorScheme, dark: darkColorScheme, }, }, { prefix: cssVarPrefix, colorSchemeSelector, }, ); const theme = { colorSchemeSelector, colorSchemes: { light: lightColorScheme, dark: darkColorScheme, }, // ... any other objects independent of color-scheme, // like fontSizes, spacing etc vars: themeVars, palette: { ...lightColorScheme.palette, colorScheme: 'light', }, ...params, }; return theme; } const myCustomDefaultTheme = extendTheme(); const { CssVarsProvider, useColorScheme } = createCssVarsProvider({ theme: myCustomDefaultTheme, modeStorageKey: 'system-demo-mode', defaultColorScheme: { light: 'light', dark: 'dark', }, }); const Button = styled('button')(({ theme }) => ({ backgroundColor: theme.vars.palette.primary.default, border: `1px solid ${theme.vars.palette.primary.dark}`, color: theme.vars.palette.text.default, padding: 10, borderRadius: 5, fontWeight: 'bold', })); const WrapperDiv = styled('div')(({ theme }) => ({ width: '100%', minHeight: 100, padding: 20, color: theme.vars.palette.text.default, backgroundColor: '#fff', '[data-system-demo-color-scheme="dark"] &': { backgroundColor: '#111', }, })); function App() { // changes specific to this demo. const [shouldRender, setShouldRender] = React.useState(false); const { setMode, mode } = useColorScheme(); const toggleMode = () => { setMode(mode === 'dark' ? 'light' : 'dark'); }; // to avoid hydration error in demo. unrelated to the actual implementation React.useEffect(() => { setShouldRender(true); }, []); if (!shouldRender) { return null; } return ( <WrapperDiv className="App"> <div className="card"> <h2>Current mode: {mode}</h2> <Button type="button" onClick={toggleMode}> Toggle Mode </Button> </div> </WrapperDiv> ); } export default function CreateCssVarsProvider() { return ( <CssVarsProvider> <App /> </CssVarsProvider> ); }