UNPKG

@hitachivantara/uikit-react-core

Version:

Core React components for the NEXT Design System.

115 lines (114 loc) 3.47 kB
import { jsx } from "react/jsx-runtime"; import { useState, useEffect, useCallback, useMemo } from "react"; import { createTheme, ThemeProvider } from "@mui/material/styles"; import { HvThemeContext, EmotionContext } from "@hitachivantara/uikit-react-shared"; import { EmotionContext as EmotionContext2, HvThemeContext as HvThemeContext2, defaultCacheKey, defaultEmotionCache } from "@hitachivantara/uikit-react-shared"; import { parseTheme } from "@hitachivantara/uikit-styles"; import { setElementAttrs } from "../utils/theme.js"; const HvThemeProvider = ({ children, themes: themesList, theme: themeProp, emotionCache, colorMode: colorModeProp, themeRootId: rootId }) => { const [theme, setTheme] = useState(themeProp); const [colorMode, setColorMode] = useState(colorModeProp); const { theme: activeTheme, selectedTheme, selectedMode, colorModes, colorScheme } = parseTheme(themesList, theme, colorMode); const themes = themesList.map((t) => t.name); useEffect(() => { setTheme(themeProp); setColorMode(colorModeProp); }, [colorModeProp, themeProp]); useEffect(() => { setElementAttrs(selectedTheme, selectedMode, colorScheme, rootId); }, [colorScheme, rootId, selectedMode, selectedTheme]); const changeTheme = useCallback( (newTheme = selectedTheme, newMode = selectedMode) => { setTheme(newTheme); setColorMode(newMode); }, [selectedMode, selectedTheme] ); const value = useMemo( () => ({ themes, colorModes, activeTheme, selectedTheme, selectedMode, changeTheme, rootId }), [ themes, colorModes, activeTheme, selectedTheme, selectedMode, changeTheme, rootId ] ); const muiTheme = useMemo(() => { const colors = activeTheme.colors.modes[colorMode]; return createTheme({ spacing: activeTheme.space.base, typography: { fontFamily: activeTheme.fontFamily.body }, palette: { primary: { main: colors.primary }, success: { main: colors.positive }, warning: { main: colors.warning }, error: { main: colors.negative }, info: { main: colors.info }, text: { primary: colors.text, secondary: colors.textSubtle, disabled: colors.textDisabled }, background: { default: colors.bgPage, paper: colors.bgContainer }, divider: colors.border, action: { active: colors.primary, hover: colors.primaryStrong, selected: colors.primaryStrong, disabled: colors.textDisabled, disabledBackground: colors.bgDisabled } }, components: { MuiButtonBase: { defaultProps: { disableRipple: true, disableTouchRipple: true } } }, breakpoints: activeTheme.breakpoints }); }, [activeTheme, colorMode]); const emotionCacheValue = useMemo( () => ({ cache: emotionCache }), [emotionCache] ); return /* @__PURE__ */ jsx(ThemeProvider, { theme: muiTheme, children: /* @__PURE__ */ jsx(HvThemeContext.Provider, { value, children: /* @__PURE__ */ jsx(EmotionContext.Provider, { value: emotionCacheValue, children }) }) }); }; export { EmotionContext2 as EmotionContext, HvThemeContext2 as HvThemeContext, HvThemeProvider, defaultCacheKey, defaultEmotionCache };