Files
react-test/docs/data/system/experimental-api/css-theme-variables/CreateCssVarsProvider.js
how2ice 005cf56baf
Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
init project
2025-12-12 14:26:25 +09:00

137 lines
2.9 KiB
JavaScript

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>
);
}