Using CSS variables
Learn how to use CSS variables to customize Joy UI components.
Introduction
To use CSS variables, you must wrap your app with the <CssVarsProvider /> utility.
import { CssVarsProvider } from '@mui/joy/styles';
function App() {
return <CssVarsProvider>...</CssVarsProvider>;
}
Then you can apply styles based on CSS variables using the theme.vars.* notation.
This notation is available to all styling APIs that Joy UI supports, including the styled() function and the sx prop.
Styling APIs
Use the theme.vars.* notation with any styling APIs supported by Joy UI:
styled function
const Div = styled('div')(({ theme }) => ({
// Outputs 'var(--joy-palette-primary-500)'
color: theme.vars.palette.primary[500],
}));
sx prop
// Outputs 'var(--joy-shadow-sm)'
<Chip sx={(theme) => ({ boxShadow: theme.vars.shadow.sm })} />
You can also use a short-hand syntax to resolve the values from the theme.vars.* the same way the example above does.
<Chip
sx={{
border: '1px solid',
// For color properties, lookup from `theme.vars.palette`
color: 'neutral.800', // 'var(--joy-palette-neutral-800)'
borderColor: 'neutral.400', // 'var(--joy-palette-neutral-400)'
// lookup from `theme.vars.shadow`
shadow: 'sm', // 'var(--joy-shadow-sm)'
// lookup from `theme.vars.fontSize`
fontSize: 'sm', // 'var(--joy-fontSize-sm)'
}}
/>
Themed components
extendTheme({
components: {
JoyButton: {
root: ({ theme }) => ({
// Outputs 'var(--joy-fontFamily-display)'
fontFamily: theme.vars.fontFamily.display,
}),
},
},
});
useTheme hook
import { useTheme } from '@mui/joy/styles';
const SomeComponent = () => {
const theme = useTheme(); // The runtime theme.
return (
<div>
<p style={{ color: {theme.vars.palette.primary[500]} }}>Some text here.</p>
</div>
);
};
Creating new variables
To create new CSS variables, use raw theme values (theme.* as opposed to theme.vars.*). The code below shows an example of how to create a new shadow theme value:
const Div = styled('div')(({ theme }) => ({
// Note that it's using `theme.shadow`, not `theme.vars.shadow`
boxShadow: theme.shadow.sm.replace(/,/g, ', inset'),
}));
Adjust color opacity
Use the automatically generated opacity channel tokens (mainChannel, lightChannel and darkChannel), together with the rgba color notation, to adjust color opacity in all available palettes in Joy UI.
const Div = styled('div')(({ theme }) => ({
backgroundColor: `rgba(${theme.vars.palette.primary.mainChannel} / 0.2)`,
}));
Custom prefixes
Every Joy UI CSS variable is prefixed with joy by default.
To change this prefix, use the cssVarPrefix property inside an extendTheme function on the <CssVarsProvider /> component.
import { CssVarsProvider, extendTheme } from '@mui/joy/styles';
function App() {
return (
<CssVarsProvider theme={extendTheme({ cssVarPrefix: 'company' })}>
...
</CssVarsProvider>
);
}
The generated CSS variables will then be:
- --joy-fontSize-md: 1rem;
+ --company-fontSize-md: 1rem;
Removing the default prefix
Use an empty value ('') in the cssVarPrefix property to remove the default joy prefix from the generated CSS variables:
import { CssVarsProvider, extendTheme } from '@mui/joy/styles';
function App() {
return (
<CssVarsProvider theme={extendTheme({ cssVarPrefix: '' })}>...</CssVarsProvider>
);
}
- --joy-fontSize-md: 1rem;
+ --fontSize-md: 1rem;