🎭Theme/Style Configuration
Defines core of theme. How theme is being set using Material-UI.
Customise Able Pro with your theme. You can change the colours, the typography, and much more. Material-UI offers the flexibility to change the project's style in a single place. Additionally, we have centralised and made it more consistent with a proper file structure.
Theme configuration
The whole theme can be configured from the folder src\themes
. Theme initialisation starts, where the palette, typography, and components' overridable style exist.
import { ReactNode, useMemo } from 'react';
// material-ui
import { createTheme, ThemeOptions, ThemeProvider, Theme, TypographyVariantsOptions } from '@mui/material/styles';
import CssBaseline from '@mui/material/CssBaseline';
import StyledEngineProvider from '@mui/material/StyledEngineProvider';
// project-imports
import Palette from './palette';
import Typography from './typography';
import CustomShadows from './shadows';
import componentsOverride from './overrides';
import GlobalStyles from './GlobalStyles';
import { NextAppDirEmotionCacheProvider } from './emotionCache';
import { HEADER_HEIGHT, ThemeMode } from 'config';
import useConfig from 'hooks/useConfig';
import getWindowScheme from 'utils/getWindowScheme';
// types
import { CustomShadowProps } from 'types/theme';
type ThemeCustomizationProps = {
children: ReactNode;
};
// ==============================|| DEFAULT THEME - MAIN ||============================== //
export default function ThemeCustomization({ children }: ThemeCustomizationProps) {
const { themeDirection, mode, presetColor, fontFamily, themeContrast } = useConfig();
let themeMode: any = mode;
if (themeMode === ThemeMode.AUTO) {
const autoMode = getWindowScheme();
if (autoMode) {
themeMode = ThemeMode.DARK;
} else {
themeMode = ThemeMode.LIGHT;
}
}
const theme: Theme = useMemo<Theme>(() => Palette(themeMode, presetColor, themeContrast), [themeMode, presetColor, themeContrast]);
const themeTypography: TypographyVariantsOptions = useMemo<TypographyVariantsOptions>(
() => Typography(themeMode, fontFamily, theme),
[themeMode, fontFamily, theme]
);
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: HEADER_HEIGHT,
paddingTop: 8,
paddingBottom: 8
}
},
palette: theme.palette,
shape: {
borderRadius: 8
},
customShadows: themeCustomShadows,
typography: themeTypography
}),
[themeDirection, theme, themeTypography, themeCustomShadows]
);
const themes: Theme = createTheme(themeOptions);
themes.components = componentsOverride(themes);
return (
<StyledEngineProvider injectFirst>
<NextAppDirEmotionCacheProvider options={{ key: 'mui' }}>
<ThemeProvider theme={themes}>
<CssBaseline enableColorScheme />
<GlobalStyles />
{children}
</ThemeProvider>
</NextAppDirEmotionCacheProvider>
</StyledEngineProvider>
);
}
You can check other settings like theme typography, palette, and component style override in the same folder. src\themes
How to customise it?
You might come across questions like how to change a theme's primary colour. How to change the textbox or other components that can be applied to an entire theme?
Customize Theme Colors
To change the colour of the theme, you can apply colour directly to src\theme\palette
For instance, if you want to change colour where theme.palette.primary.light
is being used in a theme then update the following in src\themes\palette
// material-ui
import { alpha, createTheme } from '@mui/material/styles';
import { PaletteMode } from '@mui/material';
// project-imports
import ThemeOption from './theme';
import { ThemeMode } from 'config';
// types
import { PresetColor } from 'types/config';
import { PaletteThemeProps } from 'types/theme';
// ==============================|| DEFAULT THEME - PALETTE ||============================== //
export default function Palette(mode: ThemeMode, presetColor: PresetColor, themeContrast: boolean) {
const paletteColor: PaletteThemeProps = ThemeOption(presetColor, mode);
return createTheme({
palette: {
mode: mode as PaletteMode,
common: {
black: '#000',
white: '#fff'
},
...paletteColor,
text: {
primary: mode === ThemeMode.DARK ? alpha(paletteColor.secondary.darker!, 0.87) : paletteColor.secondary[800],
secondary: mode === ThemeMode.DARK ? alpha(paletteColor.secondary.darker!, 0.45) : paletteColor.secondary.main,
disabled: mode === ThemeMode.DARK ? alpha(paletteColor.secondary.darker!, 0.1) : paletteColor.secondary[400]
},
action: {
disabled: paletteColor.secondary.light
},
divider: mode === ThemeMode.DARK ? alpha(paletteColor.secondary.darker!, 0.05) : alpha(paletteColor.secondary.light!, 0.65),
background: {
paper: mode === ThemeMode.DARK ? paletteColor.secondary[100] : '#fff',
default: themeContrast && mode !== ThemeMode.DARK ? '#fff' : paletteColor.secondary.lighter
}
}
});
}
Customise Theme Typography
You can customise the typography used in the theme from a central place.
For instance, if you want to change font-weight
the typography h5
to 900
. To do that, open src\themes\typography
and update as below:
// material-ui
import { Theme, TypographyVariantsOptions } from '@mui/material/styles';
// project-imports
import { ThemeMode } from 'config';
// types
import { FontFamily } from 'types/config';
// ==============================|| DEFAULT THEME - TYPOGRAPHY ||============================== //
export default function Typography(mode: ThemeMode, fontFamily: FontFamily, theme: Theme): TypographyVariantsOptions {
return {
....
h5: {
fontWeight: 600,
fontSize: '1rem',
lineHeight: 1.5
},
...
}
}
This will apply to all places where you used Typography variants as h5
<Typography variant="h5"...>
Customise MUI Component style
We have provided a central location to override any default style of any component. All the override styles exist in src\themes\overrides
// material-ui
import { Theme } from '@mui/material/styles';
// ==============================|| OVERRIDES - ACCORDION ||============================== //
export default function Accordion(theme: Theme) {
return {
MuiAccordion: {
defaultProps: {
disableGutters: true,
square: true,
elevation: 0
},
styleOverrides: {
root: {
border: `1px solid ${theme.palette.divider}`,
'&: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 overridden in the same file. Feel free to change it as per your needs.
Last updated