Theme/Style Configuration Defines core of theme. How theme is being set using Material-UI.
Customize Mantis with your theme. You can change the colors, the typography, and much more. Material-UI provides flexibility to change the style of the project in a single place and on top of it, we made it more centralized and consistent with the proper file structure.
Theme configuration
The whole theme can be configured from the folder ..\src\themes
. Theme initialization starts in index.js
, where palette, typography, and component's overridable style exist.
JavaScript Typescript nextJS
Copy import PropTypes from 'prop-types' ;
import { useMemo } from 'react' ;
// material-ui
import { CssBaseline , StyledEngineProvider } from '@mui/material' ;
import { createTheme , ThemeProvider } from '@mui/material/styles' ;
// project import
import useConfig from 'hooks/useConfig' ;
import Palette from './palette' ;
import Typography from './typography' ;
import CustomShadows from './shadows' ;
import componentsOverride from './overrides' ;
// ==============================|| DEFAULT THEME - MAIN ||============================== //
export default function ThemeCustomization ({ children }) {
const { themeDirection , mode , presetColor , fontFamily } = useConfig ();
const theme = useMemo (() => Palette (mode , presetColor) , [mode , presetColor]);
// eslint-disable-next-line react-hooks/exhaustive-deps
const themeTypography = useMemo (() => Typography (fontFamily) , [fontFamily]);
const themeCustomShadows = useMemo (() => CustomShadows (theme) , [theme]);
const themeOptions = useMemo (
() => ({
breakpoints : {
values : {
xs : 0 ,
sm : 768 ,
md : 1024 ,
lg : 1266 ,
xl : 1536
}
} ,
direction : themeDirection ,
mixins : {
toolbar : {
minHeight : 60 ,
paddingTop : 8 ,
paddingBottom : 8
}
} ,
palette : theme .palette ,
customShadows : themeCustomShadows ,
typography : themeTypography
}) ,
[themeDirection , theme , themeTypography , themeCustomShadows]
);
const themes = createTheme (themeOptions);
themes .components = componentsOverride (themes);
return (
< StyledEngineProvider injectFirst >
< ThemeProvider theme = {themes}>
< CssBaseline />
{children}
</ ThemeProvider >
</ StyledEngineProvider >
);
}
ThemeCustomization .propTypes = {
children : PropTypes .node
};
Copy import { ReactNode , useMemo } from 'react' ;
// material-ui
import { CssBaseline , StyledEngineProvider } from '@mui/material' ;
import { createTheme , ThemeOptions , ThemeProvider , Theme , TypographyVariantsOptions } from '@mui/material/styles' ;
// project import
import useConfig from 'hooks/useConfig' ;
import Palette from './palette' ;
import Typography from './typography' ;
import CustomShadows from './shadows' ;
import componentsOverride from './overrides' ;
// types
import { CustomShadowProps } from 'types/theme' ;
// types
type ThemeCustomizationProps = {
children : ReactNode ;
};
// ==============================|| DEFAULT THEME - MAIN ||============================== //
export default function ThemeCustomization ({ children } : ThemeCustomizationProps ) {
const { themeDirection , mode , presetColor , fontFamily } = useConfig ();
const theme : Theme = useMemo < Theme >(() => Palette (mode , presetColor) , [mode , presetColor]);
const themeTypography : TypographyVariantsOptions = useMemo < TypographyVariantsOptions >(
() => Typography (mode , fontFamily , theme) ,
// eslint-disable-next-line react-hooks/exhaustive-deps
[mode , fontFamily]
);
const themeCustomShadows : CustomShadowProps = useMemo < CustomShadowProps >(() => CustomShadows (theme) , [theme]);
const themeOptions : ThemeOptions = useMemo (
() => ({
breakpoints : {
values : {
xs : 0 ,
sm : 768 ,
md : 1024 ,
lg : 1266 ,
xl : 1536
}
} ,
direction : themeDirection ,
mixins : {
toolbar : {
minHeight : 60 ,
paddingTop : 8 ,
paddingBottom : 8
}
} ,
palette : theme .palette ,
customShadows : themeCustomShadows ,
typography : themeTypography
}) ,
[themeDirection , theme , themeTypography , themeCustomShadows]
);
const themes : Theme = createTheme (themeOptions);
themes .components = componentsOverride (themes);
return (
< StyledEngineProvider injectFirst >
< ThemeProvider theme = {themes} >
< CssBaseline />
{children}
</ ThemeProvider >
</ StyledEngineProvider >
);
}
Copy import { ReactNode , useMemo } from 'react' ;
// material-ui
import { CssBaseline } from '@mui/material' ;
import { createTheme , ThemeOptions , ThemeProvider , Theme , TypographyVariantsOptions } from '@mui/material/styles' ;
// project import
import useConfig from 'hooks/useConfig' ;
import Palette from './palette' ;
import Typography from './typography' ;
import CustomShadows from './shadows' ;
import componentsOverride from './overrides' ;
import { NextAppDirEmotionCacheProvider } from './emotionCache' ;
// types
import { CustomShadowProps } from 'types/theme' ;
// types
type ThemeCustomizationProps = {
children : ReactNode ;
};
// ==============================|| DEFAULT THEME - MAIN ||============================== //
export default function ThemeCustomization ({ children } : ThemeCustomizationProps ) {
const { themeDirection , mode , presetColor , fontFamily } = useConfig ();
const theme : Theme = useMemo < Theme >(() => Palette (mode , presetColor) , [mode , presetColor]);
const themeTypography : TypographyVariantsOptions = useMemo < TypographyVariantsOptions >(
() => Typography (fontFamily) ,
// eslint-disable-next-line react-hooks/exhaustive-deps
[mode , fontFamily]
);
const themeCustomShadows : CustomShadowProps = useMemo < CustomShadowProps >(() => CustomShadows (theme) , [theme]);
const themeOptions : ThemeOptions = useMemo (
() => ({
breakpoints : {
values : {
xs : 0 ,
sm : 768 ,
md : 1024 ,
lg : 1266 ,
xl : 1440
}
} ,
direction : themeDirection ,
mixins : {
toolbar : {
minHeight : 60 ,
paddingTop : 8 ,
paddingBottom : 8
}
} ,
palette : theme .palette ,
customShadows : themeCustomShadows ,
typography : themeTypography
}) ,
[themeDirection , theme , themeTypography , themeCustomShadows]
);
const themes : Theme = createTheme (themeOptions);
themes .components = componentsOverride (themes);
return (
< NextAppDirEmotionCacheProvider options = {{ key : 'mui' }} >
< ThemeProvider theme = {themes} >
< CssBaseline />
{children}
</ ThemeProvider >
</ NextAppDirEmotionCacheProvider >
);
}
You can check other settings like theme typography, palette, and components style override in the same folder. ..src\themes
How to customize it?
You might come across questions like how to change a theme's primary color? How to change the textbox or other components which can apply to an entire theme?
Customize Theme Colors
To change the color of the theme, you can apply color directly to ..src\theme\palatte.js
For instance, if you want to change color where theme.palette.primary.light
is being used in a theme then, update following in ..src\themes\palatte.js
Copy ...
// ==============================|| DEFAULT THEME - PALETTE ||============================== //
const Palette = (mode , presetColor) => {
...
return createTheme ({
palette : {
...
text: {
primary : mode === 'dark' ? alpha ( paletteColor .grey[ 900 ] , 0.87 ) : paletteColor .grey[ 700 ] ,
...
} ,
...
}
});
};
export default Palette;
Customize Theme Typography
You can customize the typography used in the theme as well from the central place.
For instance, If you want to change font-weight
the typography h5
to 900
. To do that, open ..src\themes\typography.js
and update as below:
Copy /**
* Typography used in theme
*/
export function themeTypography (theme) {
return {
...
h5: {
...
fontWeight: 900 // changed this to make it 900 from 500
} ,
...
};
}
This will apply to all places where you used Typography variants as h5
<Typography variant="h5"...>
Customize MUI Component style
We have provided a central location to override any default style of any component. All the overrides styles exist in src\themes\overrides
Copy export default function Accordion (theme) {
return {
MuiAccordion : {
defaultProps : {
disableGutters : true ,
square : true ,
elevation : 0
} ,
styleOverrides : {
root : {
border : `1px solid ${ theme . palette . secondary .light } ` ,
'&:not(:last-child)' : {
borderBottom : 0
} ,
'&:before' : {
display : 'none'
} ,
'&.Mui-disabled' : {
backgroundColor : theme . palette . secondary .lighter
}
}
}
}
};
}
You can add a default property for any MUI component and it will be applied everywhere. We emitted lines to view it better in the above code block but you can see many controls' styles overriden in the same file. Feel free to change it as per your need.
Last updated 6 months ago