@cerberus-design/react
Version:
The Cerberus Design React component library.
118 lines (115 loc) • 3.85 kB
JavaScript
;
"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