Themed components
You can customize a component's styles, default props, and more by using its component key inside the theme.
The components
key in the theme helps to achieve styling consistency across your application.
However, the theme isn't tree-shakable, prefer creating new components for heavy customizations.
Theme default props
Every Material UI component has default values for each of its props.
To change these default values, use the defaultProps
key exposed in the theme's components
key:
const theme = createTheme({
components: {
// Name of the component
MuiButtonBase: {
defaultProps: {
// The props to change the default for.
disableRipple: true, // No more ripple, on the whole application 💣!
},
},
},
});
If you're using TypeScript and lab components, check this article to learn how to override their styles.
Theme style overrides
The theme's styleOverrides
key makes it possible to potentially change every single style injected by Material UI into the DOM.
This is useful if you want to apply a fully custom design system to Material UI's components.
const theme = createTheme({
components: {
// Name of the component
MuiButton: {
styleOverrides: {
// Name of the slot
root: {
// Some CSS
fontSize: '1rem',
},
},
},
},
});
Each component is composed of several different parts.
These parts correspond to classes that are available to the component—see the CSS section of the component's API page for a detailed list.
You can use these classes inside the styleOverrides
key to modify the corresponding parts of the component.
const theme = createTheme({
components: {
MuiButton: {
styleOverrides: {
root: ({ ownerState }) => ({
...(ownerState.variant === 'contained' &&
ownerState.color === 'primary' && {
backgroundColor: '#202020',
color: '#fff',
}),
}),
},
},
},
});
Overrides based on props
You can pass a callback as a value in each slot of the component's styleOverrides
to apply styles based on props.
The ownerState
prop is a combination of public props that you pass to the component + internal state of the component.
const finalTheme = createTheme({
components: {
MuiSlider: {
styleOverrides: {
valueLabel: ({ ownerState, theme }) => ({
...(ownerState.orientation === 'vertical' && {
backgroundColor: 'transparent',
color: theme.palette.grey[500],
}),
}),
},
},
},
});
The sx
syntax (experimental)
The sx
prop acts as a shortcut for defining custom styles that access the theme object.
This prop lets you write inline styles using a superset of CSS.
Learn more about the concept behind the sx
prop and how sx
differs from the styled
utility.
You can use the sx
prop inside the styleOverrides
key to modify styles within the theme using shorthand CSS notation.
This is especially handy if you're already using the sx
prop with your components, because you can use the same syntax in your theme and quickly transfer styles between the two.
const finalTheme = createTheme({
components: {
MuiChip: {
styleOverrides: {
root: ({ theme }) =>
theme.unstable_sx({
px: 1,
py: 0.25,
borderRadius: 1,
}),
label: {
padding: 'initial',
},
icon: ({ theme }) =>
theme.unstable_sx({
mr: 0.5,
ml: '-2px',
}),
},
},
},
});
Specificity
If you use the theming approach to customize the components, you'll still be able to override them using the sx
prop as it has a higher CSS specificity, even if you're using the experimental sx
syntax within the theme.
Creating new component variants
You can use the variants
key in the theme's components
section to create new variants to Material UI components. These new variants can specify what styles the component should have when that specific variant prop value is applied.
The definitions are specified in an array, under the component's name. For each of them a CSS class is added to the HTML <head>
. The order is important, so make sure that the styles that should win are specified last.
const theme = createTheme({
components: {
MuiButton: {
variants: [
{
props: { variant: 'dashed' },
style: {
textTransform: 'none',
border: `2px dashed ${blue[500]}`,
},
},
{
props: { variant: 'dashed', color: 'secondary' },
style: {
border: `4px dashed ${red[500]}`,
},
},
],
},
},
});
If you're using TypeScript, you'll need to specify your new variants/colors, using module augmentation.
declare module '@mui/material/Button' {
interface ButtonPropsVariantOverrides {
dashed: true;
}
}
The variant props
can also be defined as a callback.
This is useful if you want to apply styles when using negation in the condition.
In other words, applying a different style if a particular property doesn't have a specific value.
const theme = createTheme({
components: {
MuiButton: {
variants: [
{
props: (props) =>
props.variant === 'dashed' && props.color !== 'secondary',
style: {
textTransform: 'none',
border: `2px dashed ${blue[500]}`,
},
},
],
},
},
});
Theme variables
Another way to override the look of all component instances is to adjust the theme configuration variables.
const theme = createTheme({
typography: {
button: {
fontSize: '1rem',
},
},
});