got new theme system to work without re-rendering

This commit is contained in:
Carter 2025-04-14 16:25:50 -06:00
parent 3454d16f36
commit 6cae8d3658
2 changed files with 142 additions and 0 deletions

View file

@ -0,0 +1,62 @@
import React, { createContext, useContext, useMemo, useState, useEffect } from "react";
import { ThemeProvider, createTheme, PaletteMode } from "@mui/material/styles";
import useMediaQuery from "@mui/material/useMediaQuery";
// --- You can import your own makePaletteColor() here if needed ---
type ThemeMode = "light" | "dark" | "system";
interface ThemeModeContextType {
mode: ThemeMode;
resolvedMode: PaletteMode; // actual value used
toggleMode: () => void;
setMode: (mode: ThemeMode) => void;
}
const ThemeModeContext = createContext<ThemeModeContextType | undefined>(undefined);
export const useThemeMode = () => {
const context = useContext(ThemeModeContext);
if (!context) {
throw new Error("useThemeMode must be used within ThemeModeProvider");
}
return context;
};
export const AppThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [mode, setMode] = useState<ThemeMode>("system");
const prefersDark = useMediaQuery("(prefers-color-scheme: dark)");
const resolvedMode: PaletteMode = mode === "system" ? (prefersDark ? "dark" : "light") : mode;
const theme = useMemo(() => createTheme({
palette: {
mode: resolvedMode,
primary: { main: "#1976d2" }, // Or use makePaletteColor()
secondary: { main: "#e91e63" },
},
}), [resolvedMode]);
const toggleMode = () => {
setMode(prev =>
prev === "light" ? "dark" :
prev === "dark" ? "system" :
"light"
);
};
const contextValue = useMemo(() => ({
mode,
resolvedMode,
toggleMode,
setMode,
}), [mode, resolvedMode]);
return (
<ThemeModeContext.Provider value={contextValue}>
<ThemeProvider theme={theme}>
{children}
</ThemeProvider>
</ThemeModeContext.Provider>
);
};

80
src/theme/theme_old.ts Normal file
View file

@ -0,0 +1,80 @@
import { createTheme, responsiveFontSizes, ThemeOptions } from "@mui/material";
export const options = (themeType: "light" | "dark"): ThemeOptions => ({
palette: {
mode: themeType,
...(themeType === "light"
? {
background: {
default: "#f5f5f5",
paper: "#fff"
},
}
: {
background: {
default: "#0c101b",
paper: "#1c1f26"
},
}),
primary: {
main: "#00AEEF"
},
secondary: {
main: "#F39200"
},
error: {
main: "#e53935"
},
warning: {
main: "#fdd835"
},
info: {
main: "#29b6f6"
},
success: {
main: "#43a047"
},
divider: "rgba(0, 0, 0, 0.12)"
},
typography: {
fontFamily: `"Roboto", "Helvetica", "Arial", sans-serif`,
fontSize: 14,
h1: {
fontSize: "2.5rem"
},
h2: {
fontSize: "2rem"
},
h3: {
fontSize: "1.75rem"
},
h4: {
fontSize: "1.5rem"
},
h5: {
fontSize: "1.25rem"
},
h6: {
fontSize: "1rem"
},
button: {
textTransform: "none"
}
},
components: {
MuiCssBaseline: {
styleOverrides: {
body: {
margin: 0,
padding: 0,
}
}
}
},
cssVarPrefix: "mui", // optional prefix for CSS vars
cssVariables: true
});
// Create both themes once for reuse
export const lightTheme = responsiveFontSizes(createTheme(options("light")));
export const darkTheme = responsiveFontSizes(createTheme(options("dark")));