diff --git a/src/AppTheme.tsx b/src/AppTheme.tsx deleted file mode 100644 index 288cd45..0000000 --- a/src/AppTheme.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import * as React from "react"; -import { ThemeProvider, createTheme } from "@mui/material/styles"; -import { getDesignTokens } from "./shared-theme/themePrimitives"; -import { inputsCustomizations } from "./shared-theme/customizations/inputs"; -import { dataDisplayCustomizations } from "./shared-theme/customizations/dataDisplay"; -import { feedbackCustomizations } from "./shared-theme/customizations/feedback"; -import { navigationCustomizations } from "./shared-theme/customizations/navigation"; -import { surfacesCustomizations } from "./shared-theme/customizations/surfaces"; - -export const ColorModeContext = React.createContext({ - toggleColorMode: () => {}, - mode: "light" as "light" | "dark", -}); - -export default function AppTheme({ children }: { children: React.ReactNode }) { - const [mode, setMode] = React.useState<"light" | "dark">("light"); - - const colorMode = React.useMemo( - () => ({ - toggleColorMode: () => { - setMode((prevMode) => (prevMode === "light" ? "dark" : "light")); - }, - mode, - }), - [mode] - ); - - const theme = React.useMemo( - () => - createTheme({ - ...getDesignTokens(mode), - components: { - ...inputsCustomizations, - ...dataDisplayCustomizations, - ...feedbackCustomizations, - ...navigationCustomizations, - ...surfacesCustomizations, - }, - }), - [mode] - ); - - return ( - - {children} - - ); -} diff --git a/src/Header.tsx b/src/Header.tsx index 58ad72b..d7aca2c 100644 --- a/src/Header.tsx +++ b/src/Header.tsx @@ -20,7 +20,7 @@ import DarkModeIcon from "@mui/icons-material/DarkMode"; import LightModeIcon from "@mui/icons-material/LightMode"; import { useNavigate } from "react-router-dom"; import { useAuth } from "../react-auth"; -import { ColorModeContext } from "./AppTheme"; +import { ColorModeContext } from "./shared-theme/AppTheme"; interface HeaderProps { routerMapping: { diff --git a/src/main.jsx b/src/main.jsx index cf64145..503363c 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -19,7 +19,7 @@ import process from 'process'; import { AuthProvider } from "../react-auth"; import Header from './Header'; import Footer from './Footer'; -import AppTheme from './AppTheme'; +import AppTheme from './shared-theme/AppTheme'; window.Buffer = Buffer; window.process = process; diff --git a/src/shared-theme/AppTheme.tsx b/src/shared-theme/AppTheme.tsx index a4a512c..42a1549 100644 --- a/src/shared-theme/AppTheme.tsx +++ b/src/shared-theme/AppTheme.tsx @@ -1,53 +1,82 @@ -import * as React from 'react'; -import { ThemeProvider, createTheme } from '@mui/material/styles'; -import type { ThemeOptions } from '@mui/material/styles'; -import { inputsCustomizations } from './customizations/inputs'; -import { dataDisplayCustomizations } from './customizations/dataDisplay'; -import { feedbackCustomizations } from './customizations/feedback'; -import { navigationCustomizations } from './customizations/navigation'; -import { surfacesCustomizations } from './customizations/surfaces'; -import { colorSchemes, typography, shadows, shape } from './themePrimitives'; +import * as React from "react"; +import { + ThemeProvider, + createTheme, + CssBaseline, +} from "@mui/material"; -interface AppThemeProps { +import { getDesignTokens } from "./themePrimitives"; + +import { inputsCustomizations } from "./customizations/inputs"; +import { dataDisplayCustomizations } from "./customizations/dataDisplay"; +import { feedbackCustomizations } from "./customizations/feedback"; +import { navigationCustomizations } from "./customizations/navigation"; +import { surfacesCustomizations } from "./customizations/surfaces"; + +export type ColorMode = "light" | "dark"; + +type ColorModeContextValue = { + mode: ColorMode; + setMode: (mode: ColorMode) => void; + toggleColorMode: () => void; +}; + +export const ColorModeContext = + React.createContext({ + mode: "light", + setMode: () => {}, + toggleColorMode: () => {}, + }); + +type AppThemeProps = { children: React.ReactNode; - /** - * This is for the docs site. You can ignore it or remove it. - */ - disableCustomTheme?: boolean; - themeComponents?: ThemeOptions['components']; -} + defaultMode?: ColorMode; +}; + +export default function AppTheme({ + children, + defaultMode = "dark", +}: AppThemeProps) { + const [mode, setMode] = + React.useState(defaultMode); + + const toggleColorMode = React.useCallback(() => { + setMode((prev) => + prev === "light" ? "dark" : "light" + ); + }, []); + + const contextValue = React.useMemo( + () => ({ + mode, + setMode, + toggleColorMode, + }), + [mode, toggleColorMode] + ); + + const theme = React.useMemo( + () => + createTheme({ + ...getDesignTokens(mode), + + components: { + ...inputsCustomizations, + ...dataDisplayCustomizations, + ...feedbackCustomizations, + ...navigationCustomizations, + ...surfacesCustomizations, + }, + }), + [mode] + ); -export default function AppTheme(props: AppThemeProps) { - const { children, disableCustomTheme, themeComponents } = props; - const theme = React.useMemo(() => { - return disableCustomTheme - ? {} - : createTheme({ - // For more details about CSS variables configuration, see https://mui.com/material-ui/customization/css-theme-variables/configuration/ - cssVariables: { - colorSchemeSelector: 'data-mui-color-scheme', - cssVarPrefix: 'template', - }, - colorSchemes, // Recently added in v6 for building light & dark mode app, see https://mui.com/material-ui/customization/palette/#color-schemes - typography, - shadows, - shape, - components: { - ...inputsCustomizations, - ...dataDisplayCustomizations, - ...feedbackCustomizations, - ...navigationCustomizations, - ...surfacesCustomizations, - ...themeComponents, - }, - }); - }, [disableCustomTheme, themeComponents]); - if (disableCustomTheme) { - return {children}; - } return ( - - {children} - + + + + {children} + + ); }