UNPKG

@cerberus-design/react

Version:

The Cerberus Design React component library.

72 lines (67 loc) 1.96 kB
'use client'; 'use strict'; Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const React = require('react'); const THEME_KEY = "cerberus-theme"; const MODE_KEY = "cerberus-mode"; function useTheme(defaultTheme = "cerberus", defaultColorMode = "light", options = {}) { const { updateMode, updateTheme, cache } = options; const [theme, setTheme] = React.useState(defaultTheme); const [colorMode, setColorMode] = React.useState(defaultColorMode); const handleThemeChange = React.useCallback( (newTheme) => { setTheme(newTheme); updateTheme?.(newTheme); }, [updateTheme] ); const handleColorModeChange = React.useCallback( (newMode) => { setColorMode(newMode); updateMode?.(newMode); }, [updateMode] ); React.useLayoutEffect(() => { const theme2 = localStorage.getItem(THEME_KEY); if (theme2) { setTheme(theme2); } }, []); React.useLayoutEffect(() => { const mode = localStorage.getItem(MODE_KEY); if (mode) { setColorMode(mode); } }, []); React.useEffect(() => { const root = document.documentElement; root.dataset.pandaTheme = theme; if (cache) { localStorage.setItem(THEME_KEY, theme); } }, [theme, cache]); React.useEffect(() => { const root = document.documentElement; if (colorMode === "system") { root.dataset.colorMode = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } else { root.dataset.colorMode = colorMode; } if (cache) { localStorage.setItem(MODE_KEY, colorMode); } }, [colorMode, cache]); return React.useMemo( () => ({ theme, mode: colorMode, updateTheme: handleThemeChange, updateMode: handleColorModeChange }), [theme, colorMode, handleThemeChange, handleColorModeChange] ); } exports.MODE_KEY = MODE_KEY; exports.THEME_KEY = THEME_KEY; exports.useTheme = useTheme;