All files / src/theme/ui createUiTheme.js

100% Statements 9/9
100% Branches 12/12
100% Functions 1/1
100% Lines 9/9

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58                                    91x       91x   91x 91x 91x 91x   91x                                             91x 91x        
import { createTheme } from "@mui/material/styles";
import { colorPresets } from "@/theme/ThemePresets";
import { palette } from "@/theme/ui/palette";
import { shadows } from "@/theme/ui/shadows";
import { typography } from "@/theme/ui/typography";
import { customShadows } from "@/theme/ui/custom-shadows";
import { componentsOverrides } from "@/theme/ui/overrides";
import { createPresets } from "@/theme/ui/options/presets";
import { resolveThemePreset } from "@/theme/ui/presetMap";
 
/**
 * Build the Erudition UI MUI theme from shared tokens and component overrides.
 * @param {"light" | "dark" | { mode?: "light" | "dark", preset?: string, direction?: "ltr" | "rtl" }} modeOrOptions
 * @param {string} [presetName] — app preset when first arg is a mode string
 * @param {"ltr" | "rtl"} [direction]
 */
export function createUiTheme(modeOrOptions = "light", presetName = "default", direction = "ltr") {
    const options =
        typeof modeOrOptions === "object" && modeOrOptions !== null
            ? modeOrOptions
            : { mode: modeOrOptions, preset: presetName, direction };
 
    const { mode = "light", preset = "default", direction: dir = "ltr" } = options;
 
    const palettePreset = resolveThemePreset(preset);
    const presets = createPresets(palettePreset);
    const basePalette = palette(mode);
    const appPreset = colorPresets[preset] || colorPresets.default;
 
    const theme = createTheme({
        palette: {
            ...basePalette,
            ...presets.palette,
            colorTheme: {
                main: presets.palette.primary.main,
                light: presets.palette.primary.light,
                dark: presets.palette.primary.dark,
                contrastText: presets.palette.primary.contrastText,
            },
            presetName: preset,
        },
        customShadows: {
            ...customShadows(mode),
            ...presets.customShadows,
        },
        direction: dir,
        shadows: shadows(mode),
        shape: { borderRadius: 4 },
        typography,
        presetGradient: appPreset.gradient,
    });
 
    theme.components = componentsOverrides(theme);
    return theme;
}
 
export default createUiTheme;