UNPKG

@cerberus-design/react

Version:

The Cerberus Design React component library.

118 lines (115 loc) 3.85 kB
"use strict"; "use client"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/context/theme.tsx var theme_exports = {}; __export(theme_exports, { ThemeProvider: () => ThemeProvider, useThemeContext: () => useThemeContext }); module.exports = __toCommonJS(theme_exports); var import_react2 = require("react"); // src/hooks/useTheme.ts var import_react = require("react"); var THEME_KEY = "cerberus-theme"; var MODE_KEY = "cerberus-mode"; function useTheme(defaultTheme = "cerberus", defaultColorMode = "light", options = {}) { const { updateMode, updateTheme, cache } = options; const [theme, setTheme] = (0, import_react.useState)(defaultTheme); const [colorMode, setColorMode] = (0, import_react.useState)(defaultColorMode); const handleThemeChange = (0, import_react.useCallback)( (newTheme) => { setTheme(newTheme); updateTheme == null ? void 0 : updateTheme(newTheme); }, [updateTheme] ); const handleColorModeChange = (0, import_react.useCallback)( (newMode) => { setColorMode(newMode); updateMode == null ? void 0 : updateMode(newMode); }, [updateMode] ); (0, import_react.useLayoutEffect)(() => { const theme2 = localStorage.getItem(THEME_KEY); if (theme2) { setTheme(theme2); } }, []); (0, import_react.useLayoutEffect)(() => { const mode = localStorage.getItem(MODE_KEY); if (mode) { setColorMode(mode); } }, []); (0, import_react.useEffect)(() => { const root = document.documentElement; root.dataset.pandaTheme = theme; if (cache) { localStorage.setItem(THEME_KEY, theme); } }, [theme, cache]); (0, import_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 (0, import_react.useMemo)( () => ({ theme, mode: colorMode, updateTheme: handleThemeChange, updateMode: handleColorModeChange }), [theme, colorMode, handleThemeChange, handleColorModeChange] ); } // src/context/theme.tsx var import_jsx_runtime = require("react/jsx-runtime"); var ThemeContext = (0, import_react2.createContext)( null ); function ThemeProvider(props) { const state = useTheme(props.defaultTheme, props.defaultColorMode, { cache: props.cache, updateMode: props.updateMode, updateTheme: props.updateTheme }); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: state, children: props.children }); } function useThemeContext() { const context = (0, import_react2.useContext)(ThemeContext); if (!context) { throw new Error("useThemeContext must be used within a ThemeProvider"); } return context; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ThemeProvider, useThemeContext }); //# sourceMappingURL=theme.cjs.map