@cerberus-design/react 0.9.2-next-76e34cc → 0.9.2-next-cf82128

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -282,7 +282,7 @@ export { CollisionDescriptor }
282
282
 
283
283
  export { CollisionDetection }
284
284
 
285
- declare type ColorModes = 'light' | 'dark';
285
+ declare type ColorModes = 'light' | 'dark' | 'system';
286
286
  export { ColorModes }
287
287
  export { ColorModes as ColorModes_alias_1 }
288
288
 
@@ -349,7 +349,7 @@ export declare const defaultIcons: DefinedIcons;
349
349
 
350
350
  export { defaultScreenReaderInstructions }
351
351
 
352
- declare type DefaultThemes = 'cerberus';
352
+ declare type DefaultThemes = 'cerberus' | 'acheron';
353
353
  export { DefaultThemes }
354
354
  export { DefaultThemes as DefaultThemes_alias_1 }
355
355
 
@@ -1603,7 +1603,7 @@ declare interface ThemeContextValue<T extends string = DefaultThemes> {
1603
1603
  theme: CustomThemes<T>;
1604
1604
  mode: ColorModes;
1605
1605
  updateTheme: (theme: T) => void;
1606
- updateMode: () => void;
1606
+ updateMode: (mode: ColorModes) => void;
1607
1607
  }
1608
1608
  export { ThemeContextValue }
1609
1609
  export { ThemeContextValue as ThemeContextValue_alias_1 }
@@ -1617,10 +1617,17 @@ export { ThemeContextValue as ThemeContextValue_alias_1 }
1617
1617
  * </ThemeProvider>
1618
1618
  * ```
1619
1619
  */
1620
- declare function ThemeProvider(props: PropsWithChildren<unknown>): JSX.Element;
1620
+ declare function ThemeProvider(props: PropsWithChildren<ThemeProviderProps>): JSX.Element;
1621
1621
  export { ThemeProvider }
1622
1622
  export { ThemeProvider as ThemeProvider_alias_1 }
1623
1623
 
1624
+ declare interface ThemeProviderProps extends UseThemeOptions {
1625
+ defaultTheme?: DefaultThemes;
1626
+ defaultColorMode?: ColorModes;
1627
+ }
1628
+ export { ThemeProviderProps }
1629
+ export { ThemeProviderProps as ThemeProviderProps_alias_1 }
1630
+
1624
1631
  declare type ThProps = ThBaseProps & ThVariantProps;
1625
1632
  export { ThProps }
1626
1633
  export { ThProps as ThProps_alias_1 }
@@ -1759,7 +1766,7 @@ declare function useTabsKeyboardNavigation(): {
1759
1766
  export { useTabsKeyboardNavigation }
1760
1767
  export { useTabsKeyboardNavigation as useTabsKeyboardNavigation_alias_1 }
1761
1768
 
1762
- declare function useTheme<C extends string = DefaultThemes>(defaultTheme?: CustomThemes<C>, defaultColorMode?: ColorModes): ThemeContextValue<C>;
1769
+ declare function useTheme<C extends string = DefaultThemes>(defaultTheme?: CustomThemes<C>, defaultColorMode?: ColorModes, options?: UseThemeOptions<C>): ThemeContextValue<C>;
1763
1770
  export { useTheme }
1764
1771
  export { useTheme as useTheme_alias_1 }
1765
1772
 
@@ -1767,6 +1774,14 @@ declare function useThemeContext(): ThemeContextValue<DefaultThemes>;
1767
1774
  export { useThemeContext }
1768
1775
  export { useThemeContext as useThemeContext_alias_1 }
1769
1776
 
1777
+ declare interface UseThemeOptions<T extends string = DefaultThemes> {
1778
+ cache?: boolean;
1779
+ updateTheme?: (theme: T) => void;
1780
+ updateMode?: (mode: ColorModes) => void;
1781
+ }
1782
+ export { UseThemeOptions }
1783
+ export { UseThemeOptions as UseThemeOptions_alias_1 }
1784
+
1770
1785
  declare function useToggle(options?: UseToggleOptions): ToggleHookReturn;
1771
1786
  export { useToggle }
1772
1787
  export { useToggle as useToggle_alias_1 }
@@ -21,8 +21,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  // src/context/theme.tsx
22
22
  var theme_exports = {};
23
23
  __export(theme_exports, {
24
- MODE_KEY: () => MODE_KEY,
25
- THEME_KEY: () => THEME_KEY,
26
24
  ThemeProvider: () => ThemeProvider,
27
25
  useThemeContext: () => useThemeContext
28
26
  });
@@ -31,20 +29,26 @@ var import_react2 = require("react");
31
29
 
32
30
  // src/hooks/useTheme.ts
33
31
  var import_react = require("react");
34
- function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
32
+ var THEME_KEY = "cerberus-theme";
33
+ var MODE_KEY = "cerberus-mode";
34
+ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light", options = {}) {
35
+ const { updateMode, updateTheme, cache } = options;
35
36
  const [theme, setTheme] = (0, import_react.useState)(defaultTheme);
36
37
  const [colorMode, setColorMode] = (0, import_react.useState)(defaultColorMode);
37
- const handleThemeChange = (0, import_react.useCallback)((newTheme) => {
38
- setTheme(newTheme);
39
- localStorage.setItem(THEME_KEY, newTheme);
40
- }, []);
41
- const handleColorModeChange = (0, import_react.useCallback)(() => {
42
- setColorMode((prev) => {
43
- const newMode = prev === "light" ? "dark" : "light";
44
- localStorage.setItem(MODE_KEY, newMode);
45
- return newMode;
46
- });
47
- }, []);
38
+ const handleThemeChange = (0, import_react.useCallback)(
39
+ (newTheme) => {
40
+ setTheme(newTheme);
41
+ updateTheme == null ? void 0 : updateTheme(newTheme);
42
+ },
43
+ [updateTheme]
44
+ );
45
+ const handleColorModeChange = (0, import_react.useCallback)(
46
+ (newMode) => {
47
+ setColorMode(newMode);
48
+ updateMode == null ? void 0 : updateMode(newMode);
49
+ },
50
+ [updateMode]
51
+ );
48
52
  (0, import_react.useLayoutEffect)(() => {
49
53
  const theme2 = localStorage.getItem(THEME_KEY);
50
54
  if (theme2) {
@@ -58,13 +62,19 @@ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
58
62
  }
59
63
  }, []);
60
64
  (0, import_react.useEffect)(() => {
61
- const root = document.documentElement;
62
- root.dataset.theme = theme;
63
- }, [theme]);
65
+ if (cache) {
66
+ const root = document.documentElement;
67
+ root.dataset.pandaTheme = theme;
68
+ localStorage.setItem(THEME_KEY, theme);
69
+ }
70
+ }, [theme, cache]);
64
71
  (0, import_react.useEffect)(() => {
65
- const root = document.documentElement;
66
- root.dataset.colorMode = colorMode;
67
- }, [colorMode]);
72
+ if (cache) {
73
+ const root = document.documentElement;
74
+ root.dataset.colorMode = colorMode;
75
+ localStorage.setItem(MODE_KEY, colorMode);
76
+ }
77
+ }, [colorMode, cache]);
68
78
  return (0, import_react.useMemo)(
69
79
  () => ({
70
80
  theme,
@@ -78,13 +88,15 @@ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
78
88
 
79
89
  // src/context/theme.tsx
80
90
  var import_jsx_runtime = require("react/jsx-runtime");
81
- var THEME_KEY = "cerberus-theme";
82
- var MODE_KEY = "cerberus-mode";
83
91
  var ThemeContext = (0, import_react2.createContext)(
84
92
  null
85
93
  );
86
94
  function ThemeProvider(props) {
87
- const state = useTheme();
95
+ const state = useTheme(props.defaultTheme, props.defaultColorMode, {
96
+ cache: props.cache,
97
+ updateMode: props.updateMode,
98
+ updateTheme: props.updateTheme
99
+ });
88
100
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value: state, children: props.children });
89
101
  }
90
102
  function useThemeContext() {
@@ -96,8 +108,6 @@ function useThemeContext() {
96
108
  }
97
109
  // Annotate the CommonJS export names for ESM import in node:
98
110
  0 && (module.exports = {
99
- MODE_KEY,
100
- THEME_KEY,
101
111
  ThemeProvider,
102
112
  useThemeContext
103
113
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/context/theme.tsx","../../../src/hooks/useTheme.ts"],"sourcesContent":["'use client'\n\nimport { createContext, useContext, type PropsWithChildren } from 'react'\nimport { useTheme } from '../hooks/useTheme'\n\nexport type DefaultThemes = 'cerberus'\nexport type CustomThemes<K extends string = DefaultThemes> = 'cerberus' | K\nexport type ColorModes = 'light' | 'dark'\n\nexport interface ThemeContextValue<T extends string = DefaultThemes> {\n theme: CustomThemes<T>\n mode: ColorModes\n updateTheme: (theme: T) => void\n updateMode: () => void\n}\n\nexport const THEME_KEY = 'cerberus-theme'\nexport const MODE_KEY = 'cerberus-mode'\n\nconst ThemeContext = createContext<ThemeContextValue<DefaultThemes> | null>(\n null,\n)\n\n/**\n * A context provider that allows the user to set the theme and mode of the application.\n * @example\n * ```tsx\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport function ThemeProvider(props: PropsWithChildren<unknown>): JSX.Element {\n const state = useTheme()\n return (\n <ThemeContext.Provider value={state}>\n {props.children}\n </ThemeContext.Provider>\n )\n}\n\nexport function useThemeContext(): ThemeContextValue<DefaultThemes> {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useThemeContext must be used within a ThemeProvider')\n }\n return context\n}\n","'use client'\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react'\nimport {\n MODE_KEY,\n THEME_KEY,\n type ColorModes,\n type CustomThemes,\n type DefaultThemes,\n type ThemeContextValue,\n} from '../context/theme'\n\nexport function useTheme<C extends string = DefaultThemes>(\n defaultTheme: CustomThemes<C> = 'cerberus',\n defaultColorMode: ColorModes = 'light',\n): ThemeContextValue<C> {\n const [theme, setTheme] = useState<CustomThemes<C>>(defaultTheme)\n const [colorMode, setColorMode] = useState<ColorModes>(defaultColorMode)\n\n const handleThemeChange = useCallback((newTheme: CustomThemes<C>) => {\n setTheme(newTheme)\n localStorage.setItem(THEME_KEY, newTheme)\n }, [])\n\n const handleColorModeChange = useCallback(() => {\n setColorMode((prev) => {\n const newMode = prev === 'light' ? 'dark' : 'light'\n localStorage.setItem(MODE_KEY, newMode)\n return newMode\n })\n }, [])\n\n useLayoutEffect(() => {\n const theme = localStorage.getItem(THEME_KEY)\n if (theme) {\n setTheme(theme as CustomThemes<C>)\n }\n }, [])\n\n useLayoutEffect(() => {\n const mode = localStorage.getItem(MODE_KEY)\n if (mode) {\n setColorMode(mode as ColorModes)\n }\n }, [])\n\n useEffect(() => {\n const root = document.documentElement\n root.dataset.theme = theme\n }, [theme])\n\n useEffect(() => {\n const root = document.documentElement\n root.dataset.colorMode = colorMode\n }, [colorMode])\n\n return useMemo(\n () => ({\n theme,\n mode: colorMode,\n updateTheme: handleThemeChange,\n updateMode: handleColorModeChange,\n }),\n [theme, colorMode, handleThemeChange, handleColorModeChange],\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAAA,gBAAkE;;;ACAlE,mBAMO;AAUA,SAAS,SACd,eAAgC,YAChC,mBAA+B,SACT;AACtB,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA0B,YAAY;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAqB,gBAAgB;AAEvE,QAAM,wBAAoB,0BAAY,CAAC,aAA8B;AACnE,aAAS,QAAQ;AACjB,iBAAa,QAAQ,WAAW,QAAQ;AAAA,EAC1C,GAAG,CAAC,CAAC;AAEL,QAAM,4BAAwB,0BAAY,MAAM;AAC9C,iBAAa,CAAC,SAAS;AACrB,YAAM,UAAU,SAAS,UAAU,SAAS;AAC5C,mBAAa,QAAQ,UAAU,OAAO;AACtC,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,oCAAgB,MAAM;AACpB,UAAMC,SAAQ,aAAa,QAAQ,SAAS;AAC5C,QAAIA,QAAO;AACT,eAASA,MAAwB;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,oCAAgB,MAAM;AACpB,UAAM,OAAO,aAAa,QAAQ,QAAQ;AAC1C,QAAI,MAAM;AACR,mBAAa,IAAkB;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,UAAM,OAAO,SAAS;AACtB,SAAK,QAAQ,QAAQ;AAAA,EACvB,GAAG,CAAC,KAAK,CAAC;AAEV,8BAAU,MAAM;AACd,UAAM,OAAO,SAAS;AACtB,SAAK,QAAQ,YAAY;AAAA,EAC3B,GAAG,CAAC,SAAS,CAAC;AAEd,aAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAAA,IACA,CAAC,OAAO,WAAW,mBAAmB,qBAAqB;AAAA,EAC7D;AACF;;;ADpCI;AAnBG,IAAM,YAAY;AAClB,IAAM,WAAW;AAExB,IAAM,mBAAe;AAAA,EACnB;AACF;AAWO,SAAS,cAAc,OAAgD;AAC5E,QAAM,QAAQ,SAAS;AACvB,SACE,4CAAC,aAAa,UAAb,EAAsB,OAAO,OAC3B,gBAAM,UACT;AAEJ;AAEO,SAAS,kBAAoD;AAClE,QAAM,cAAU,0BAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;","names":["import_react","theme"]}
1
+ {"version":3,"sources":["../../../src/context/theme.tsx","../../../src/hooks/useTheme.ts"],"sourcesContent":["'use client'\n\nimport { createContext, useContext, type PropsWithChildren } from 'react'\nimport { useTheme, type UseThemeOptions } from '../hooks/useTheme'\n\nexport type DefaultThemes = 'cerberus' | 'acheron'\nexport type CustomThemes<K extends string = DefaultThemes> = 'cerberus' | K\nexport type ColorModes = 'light' | 'dark' | 'system'\n\nexport interface ThemeContextValue<T extends string = DefaultThemes> {\n theme: CustomThemes<T>\n mode: ColorModes\n updateTheme: (theme: T) => void\n updateMode: (mode: ColorModes) => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue<DefaultThemes> | null>(\n null,\n)\n\nexport interface ThemeProviderProps extends UseThemeOptions {\n defaultTheme?: DefaultThemes\n defaultColorMode?: ColorModes\n}\n\n/**\n * A context provider that allows the user to set the theme and mode of the application.\n * @example\n * ```tsx\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport function ThemeProvider(\n props: PropsWithChildren<ThemeProviderProps>,\n): JSX.Element {\n const state = useTheme(props.defaultTheme, props.defaultColorMode, {\n cache: props.cache,\n updateMode: props.updateMode,\n updateTheme: props.updateTheme,\n }) as ThemeContextValue<DefaultThemes>\n\n return (\n <ThemeContext.Provider value={state}>\n {props.children}\n </ThemeContext.Provider>\n )\n}\n\nexport function useThemeContext(): ThemeContextValue<DefaultThemes> {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useThemeContext must be used within a ThemeProvider')\n }\n return context\n}\n","'use client'\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react'\nimport {\n type ColorModes,\n type CustomThemes,\n type DefaultThemes,\n type ThemeContextValue,\n} from '../context/theme'\n\nexport const THEME_KEY = 'cerberus-theme'\nexport const MODE_KEY = 'cerberus-mode'\n\nexport interface UseThemeOptions<T extends string = DefaultThemes> {\n cache?: boolean\n updateTheme?: (theme: T) => void\n updateMode?: (mode: ColorModes) => void\n}\n\nexport function useTheme<C extends string = DefaultThemes>(\n defaultTheme: CustomThemes<C> = 'cerberus',\n defaultColorMode: ColorModes = 'light',\n options: UseThemeOptions<C> = {},\n): ThemeContextValue<C> {\n const { updateMode, updateTheme, cache } = options\n const [theme, setTheme] = useState<CustomThemes<C>>(defaultTheme)\n const [colorMode, setColorMode] = useState<ColorModes>(defaultColorMode)\n\n const handleThemeChange = useCallback(\n (newTheme: C) => {\n setTheme(newTheme)\n updateTheme?.(newTheme)\n },\n [updateTheme],\n )\n\n const handleColorModeChange = useCallback(\n (newMode: ColorModes) => {\n setColorMode(newMode)\n updateMode?.(newMode)\n },\n [updateMode],\n )\n\n useLayoutEffect(() => {\n const theme = localStorage.getItem(THEME_KEY)\n if (theme) {\n setTheme(theme as CustomThemes<C>)\n }\n }, [])\n\n useLayoutEffect(() => {\n const mode = localStorage.getItem(MODE_KEY)\n if (mode) {\n setColorMode(mode as ColorModes)\n }\n }, [])\n\n useEffect(() => {\n if (cache) {\n const root = document.documentElement\n root.dataset.pandaTheme = theme\n localStorage.setItem(THEME_KEY, theme)\n }\n }, [theme, cache])\n\n useEffect(() => {\n if (cache) {\n const root = document.documentElement\n root.dataset.colorMode = colorMode\n localStorage.setItem(MODE_KEY, colorMode)\n }\n }, [colorMode, cache])\n\n return useMemo(\n () => ({\n theme,\n mode: colorMode,\n updateTheme: handleThemeChange,\n updateMode: handleColorModeChange,\n }),\n [theme, colorMode, handleThemeChange, handleColorModeChange],\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAAA,gBAAkE;;;ACAlE,mBAMO;AAQA,IAAM,YAAY;AAClB,IAAM,WAAW;AAQjB,SAAS,SACd,eAAgC,YAChC,mBAA+B,SAC/B,UAA8B,CAAC,GACT;AACtB,QAAM,EAAE,YAAY,aAAa,MAAM,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA0B,YAAY;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAqB,gBAAgB;AAEvE,QAAM,wBAAoB;AAAA,IACxB,CAAC,aAAgB;AACf,eAAS,QAAQ;AACjB,iDAAc;AAAA,IAChB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,4BAAwB;AAAA,IAC5B,CAAC,YAAwB;AACvB,mBAAa,OAAO;AACpB,+CAAa;AAAA,IACf;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,oCAAgB,MAAM;AACpB,UAAMC,SAAQ,aAAa,QAAQ,SAAS;AAC5C,QAAIA,QAAO;AACT,eAASA,MAAwB;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,oCAAgB,MAAM;AACpB,UAAM,OAAO,aAAa,QAAQ,QAAQ;AAC1C,QAAI,MAAM;AACR,mBAAa,IAAkB;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,QAAI,OAAO;AACT,YAAM,OAAO,SAAS;AACtB,WAAK,QAAQ,aAAa;AAC1B,mBAAa,QAAQ,WAAW,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,8BAAU,MAAM;AACd,QAAI,OAAO;AACT,YAAM,OAAO,SAAS;AACtB,WAAK,QAAQ,YAAY;AACzB,mBAAa,QAAQ,UAAU,SAAS;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAErB,aAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAAA,IACA,CAAC,OAAO,WAAW,mBAAmB,qBAAqB;AAAA,EAC7D;AACF;;;AD7CI;AA5BJ,IAAM,mBAAe;AAAA,EACnB;AACF;AAgBO,SAAS,cACd,OACa;AACb,QAAM,QAAQ,SAAS,MAAM,cAAc,MAAM,kBAAkB;AAAA,IACjE,OAAO,MAAM;AAAA,IACb,YAAY,MAAM;AAAA,IAClB,aAAa,MAAM;AAAA,EACrB,CAAC;AAED,SACE,4CAAC,aAAa,UAAb,EAAsB,OAAO,OAC3B,gBAAM,UACT;AAEJ;AAEO,SAAS,kBAAoD;AAClE,QAAM,cAAU,0BAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;","names":["import_react","theme"]}
@@ -21,56 +21,59 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  // src/hooks/useTheme.ts
22
22
  var useTheme_exports = {};
23
23
  __export(useTheme_exports, {
24
+ MODE_KEY: () => MODE_KEY,
25
+ THEME_KEY: () => THEME_KEY,
24
26
  useTheme: () => useTheme
25
27
  });
26
28
  module.exports = __toCommonJS(useTheme_exports);
27
- var import_react2 = require("react");
28
-
29
- // src/context/theme.tsx
30
29
  var import_react = require("react");
31
- var import_jsx_runtime = require("react/jsx-runtime");
32
30
  var THEME_KEY = "cerberus-theme";
33
31
  var MODE_KEY = "cerberus-mode";
34
- var ThemeContext = (0, import_react.createContext)(
35
- null
36
- );
37
-
38
- // src/hooks/useTheme.ts
39
- function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
40
- const [theme, setTheme] = (0, import_react2.useState)(defaultTheme);
41
- const [colorMode, setColorMode] = (0, import_react2.useState)(defaultColorMode);
42
- const handleThemeChange = (0, import_react2.useCallback)((newTheme) => {
43
- setTheme(newTheme);
44
- localStorage.setItem(THEME_KEY, newTheme);
45
- }, []);
46
- const handleColorModeChange = (0, import_react2.useCallback)(() => {
47
- setColorMode((prev) => {
48
- const newMode = prev === "light" ? "dark" : "light";
49
- localStorage.setItem(MODE_KEY, newMode);
50
- return newMode;
51
- });
52
- }, []);
53
- (0, import_react2.useLayoutEffect)(() => {
32
+ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light", options = {}) {
33
+ const { updateMode, updateTheme, cache } = options;
34
+ const [theme, setTheme] = (0, import_react.useState)(defaultTheme);
35
+ const [colorMode, setColorMode] = (0, import_react.useState)(defaultColorMode);
36
+ const handleThemeChange = (0, import_react.useCallback)(
37
+ (newTheme) => {
38
+ setTheme(newTheme);
39
+ updateTheme == null ? void 0 : updateTheme(newTheme);
40
+ },
41
+ [updateTheme]
42
+ );
43
+ const handleColorModeChange = (0, import_react.useCallback)(
44
+ (newMode) => {
45
+ setColorMode(newMode);
46
+ updateMode == null ? void 0 : updateMode(newMode);
47
+ },
48
+ [updateMode]
49
+ );
50
+ (0, import_react.useLayoutEffect)(() => {
54
51
  const theme2 = localStorage.getItem(THEME_KEY);
55
52
  if (theme2) {
56
53
  setTheme(theme2);
57
54
  }
58
55
  }, []);
59
- (0, import_react2.useLayoutEffect)(() => {
56
+ (0, import_react.useLayoutEffect)(() => {
60
57
  const mode = localStorage.getItem(MODE_KEY);
61
58
  if (mode) {
62
59
  setColorMode(mode);
63
60
  }
64
61
  }, []);
65
- (0, import_react2.useEffect)(() => {
66
- const root = document.documentElement;
67
- root.dataset.theme = theme;
68
- }, [theme]);
69
- (0, import_react2.useEffect)(() => {
70
- const root = document.documentElement;
71
- root.dataset.colorMode = colorMode;
72
- }, [colorMode]);
73
- return (0, import_react2.useMemo)(
62
+ (0, import_react.useEffect)(() => {
63
+ if (cache) {
64
+ const root = document.documentElement;
65
+ root.dataset.pandaTheme = theme;
66
+ localStorage.setItem(THEME_KEY, theme);
67
+ }
68
+ }, [theme, cache]);
69
+ (0, import_react.useEffect)(() => {
70
+ if (cache) {
71
+ const root = document.documentElement;
72
+ root.dataset.colorMode = colorMode;
73
+ localStorage.setItem(MODE_KEY, colorMode);
74
+ }
75
+ }, [colorMode, cache]);
76
+ return (0, import_react.useMemo)(
74
77
  () => ({
75
78
  theme,
76
79
  mode: colorMode,
@@ -82,6 +85,8 @@ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
82
85
  }
83
86
  // Annotate the CommonJS export names for ESM import in node:
84
87
  0 && (module.exports = {
88
+ MODE_KEY,
89
+ THEME_KEY,
85
90
  useTheme
86
91
  });
87
92
  //# sourceMappingURL=useTheme.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useTheme.ts","../../../src/context/theme.tsx"],"sourcesContent":["'use client'\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react'\nimport {\n MODE_KEY,\n THEME_KEY,\n type ColorModes,\n type CustomThemes,\n type DefaultThemes,\n type ThemeContextValue,\n} from '../context/theme'\n\nexport function useTheme<C extends string = DefaultThemes>(\n defaultTheme: CustomThemes<C> = 'cerberus',\n defaultColorMode: ColorModes = 'light',\n): ThemeContextValue<C> {\n const [theme, setTheme] = useState<CustomThemes<C>>(defaultTheme)\n const [colorMode, setColorMode] = useState<ColorModes>(defaultColorMode)\n\n const handleThemeChange = useCallback((newTheme: CustomThemes<C>) => {\n setTheme(newTheme)\n localStorage.setItem(THEME_KEY, newTheme)\n }, [])\n\n const handleColorModeChange = useCallback(() => {\n setColorMode((prev) => {\n const newMode = prev === 'light' ? 'dark' : 'light'\n localStorage.setItem(MODE_KEY, newMode)\n return newMode\n })\n }, [])\n\n useLayoutEffect(() => {\n const theme = localStorage.getItem(THEME_KEY)\n if (theme) {\n setTheme(theme as CustomThemes<C>)\n }\n }, [])\n\n useLayoutEffect(() => {\n const mode = localStorage.getItem(MODE_KEY)\n if (mode) {\n setColorMode(mode as ColorModes)\n }\n }, [])\n\n useEffect(() => {\n const root = document.documentElement\n root.dataset.theme = theme\n }, [theme])\n\n useEffect(() => {\n const root = document.documentElement\n root.dataset.colorMode = colorMode\n }, [colorMode])\n\n return useMemo(\n () => ({\n theme,\n mode: colorMode,\n updateTheme: handleThemeChange,\n updateMode: handleColorModeChange,\n }),\n [theme, colorMode, handleThemeChange, handleColorModeChange],\n )\n}\n","'use client'\n\nimport { createContext, useContext, type PropsWithChildren } from 'react'\nimport { useTheme } from '../hooks/useTheme'\n\nexport type DefaultThemes = 'cerberus'\nexport type CustomThemes<K extends string = DefaultThemes> = 'cerberus' | K\nexport type ColorModes = 'light' | 'dark'\n\nexport interface ThemeContextValue<T extends string = DefaultThemes> {\n theme: CustomThemes<T>\n mode: ColorModes\n updateTheme: (theme: T) => void\n updateMode: () => void\n}\n\nexport const THEME_KEY = 'cerberus-theme'\nexport const MODE_KEY = 'cerberus-mode'\n\nconst ThemeContext = createContext<ThemeContextValue<DefaultThemes> | null>(\n null,\n)\n\n/**\n * A context provider that allows the user to set the theme and mode of the application.\n * @example\n * ```tsx\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport function ThemeProvider(props: PropsWithChildren<unknown>): JSX.Element {\n const state = useTheme()\n return (\n <ThemeContext.Provider value={state}>\n {props.children}\n </ThemeContext.Provider>\n )\n}\n\nexport function useThemeContext(): ThemeContextValue<DefaultThemes> {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useThemeContext must be used within a ThemeProvider')\n }\n return context\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAAA,gBAMO;;;ACNP,mBAAkE;AAiC9D;AAnBG,IAAM,YAAY;AAClB,IAAM,WAAW;AAExB,IAAM,mBAAe;AAAA,EACnB;AACF;;;ADHO,SAAS,SACd,eAAgC,YAChC,mBAA+B,SACT;AACtB,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAA0B,YAAY;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAqB,gBAAgB;AAEvE,QAAM,wBAAoB,2BAAY,CAAC,aAA8B;AACnE,aAAS,QAAQ;AACjB,iBAAa,QAAQ,WAAW,QAAQ;AAAA,EAC1C,GAAG,CAAC,CAAC;AAEL,QAAM,4BAAwB,2BAAY,MAAM;AAC9C,iBAAa,CAAC,SAAS;AACrB,YAAM,UAAU,SAAS,UAAU,SAAS;AAC5C,mBAAa,QAAQ,UAAU,OAAO;AACtC,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,qCAAgB,MAAM;AACpB,UAAMC,SAAQ,aAAa,QAAQ,SAAS;AAC5C,QAAIA,QAAO;AACT,eAASA,MAAwB;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,qCAAgB,MAAM;AACpB,UAAM,OAAO,aAAa,QAAQ,QAAQ;AAC1C,QAAI,MAAM;AACR,mBAAa,IAAkB;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,+BAAU,MAAM;AACd,UAAM,OAAO,SAAS;AACtB,SAAK,QAAQ,QAAQ;AAAA,EACvB,GAAG,CAAC,KAAK,CAAC;AAEV,+BAAU,MAAM;AACd,UAAM,OAAO,SAAS;AACtB,SAAK,QAAQ,YAAY;AAAA,EAC3B,GAAG,CAAC,SAAS,CAAC;AAEd,aAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAAA,IACA,CAAC,OAAO,WAAW,mBAAmB,qBAAqB;AAAA,EAC7D;AACF;","names":["import_react","theme"]}
1
+ {"version":3,"sources":["../../../src/hooks/useTheme.ts"],"sourcesContent":["'use client'\n\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react'\nimport {\n type ColorModes,\n type CustomThemes,\n type DefaultThemes,\n type ThemeContextValue,\n} from '../context/theme'\n\nexport const THEME_KEY = 'cerberus-theme'\nexport const MODE_KEY = 'cerberus-mode'\n\nexport interface UseThemeOptions<T extends string = DefaultThemes> {\n cache?: boolean\n updateTheme?: (theme: T) => void\n updateMode?: (mode: ColorModes) => void\n}\n\nexport function useTheme<C extends string = DefaultThemes>(\n defaultTheme: CustomThemes<C> = 'cerberus',\n defaultColorMode: ColorModes = 'light',\n options: UseThemeOptions<C> = {},\n): ThemeContextValue<C> {\n const { updateMode, updateTheme, cache } = options\n const [theme, setTheme] = useState<CustomThemes<C>>(defaultTheme)\n const [colorMode, setColorMode] = useState<ColorModes>(defaultColorMode)\n\n const handleThemeChange = useCallback(\n (newTheme: C) => {\n setTheme(newTheme)\n updateTheme?.(newTheme)\n },\n [updateTheme],\n )\n\n const handleColorModeChange = useCallback(\n (newMode: ColorModes) => {\n setColorMode(newMode)\n updateMode?.(newMode)\n },\n [updateMode],\n )\n\n useLayoutEffect(() => {\n const theme = localStorage.getItem(THEME_KEY)\n if (theme) {\n setTheme(theme as CustomThemes<C>)\n }\n }, [])\n\n useLayoutEffect(() => {\n const mode = localStorage.getItem(MODE_KEY)\n if (mode) {\n setColorMode(mode as ColorModes)\n }\n }, [])\n\n useEffect(() => {\n if (cache) {\n const root = document.documentElement\n root.dataset.pandaTheme = theme\n localStorage.setItem(THEME_KEY, theme)\n }\n }, [theme, cache])\n\n useEffect(() => {\n if (cache) {\n const root = document.documentElement\n root.dataset.colorMode = colorMode\n localStorage.setItem(MODE_KEY, colorMode)\n }\n }, [colorMode, cache])\n\n return useMemo(\n () => ({\n theme,\n mode: colorMode,\n updateTheme: handleThemeChange,\n updateMode: handleColorModeChange,\n }),\n [theme, colorMode, handleThemeChange, handleColorModeChange],\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAMO;AAQA,IAAM,YAAY;AAClB,IAAM,WAAW;AAQjB,SAAS,SACd,eAAgC,YAChC,mBAA+B,SAC/B,UAA8B,CAAC,GACT;AACtB,QAAM,EAAE,YAAY,aAAa,MAAM,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA0B,YAAY;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAqB,gBAAgB;AAEvE,QAAM,wBAAoB;AAAA,IACxB,CAAC,aAAgB;AACf,eAAS,QAAQ;AACjB,iDAAc;AAAA,IAChB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,4BAAwB;AAAA,IAC5B,CAAC,YAAwB;AACvB,mBAAa,OAAO;AACpB,+CAAa;AAAA,IACf;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,oCAAgB,MAAM;AACpB,UAAMA,SAAQ,aAAa,QAAQ,SAAS;AAC5C,QAAIA,QAAO;AACT,eAASA,MAAwB;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,oCAAgB,MAAM;AACpB,UAAM,OAAO,aAAa,QAAQ,QAAQ;AAC1C,QAAI,MAAM;AACR,mBAAa,IAAkB;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,QAAI,OAAO;AACT,YAAM,OAAO,SAAS;AACtB,WAAK,QAAQ,aAAa;AAC1B,mBAAa,QAAQ,WAAW,KAAK;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,8BAAU,MAAM;AACd,QAAI,OAAO;AACT,YAAM,OAAO,SAAS;AACtB,WAAK,QAAQ,YAAY;AACzB,mBAAa,QAAQ,UAAU,SAAS;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAErB,aAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,IACd;AAAA,IACA,CAAC,OAAO,WAAW,mBAAmB,qBAAqB;AAAA,EAC7D;AACF;","names":["theme"]}
@@ -2133,20 +2133,26 @@ var import_react20 = require("react");
2133
2133
 
2134
2134
  // src/hooks/useTheme.ts
2135
2135
  var import_react19 = require("react");
2136
- function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
2136
+ var THEME_KEY = "cerberus-theme";
2137
+ var MODE_KEY = "cerberus-mode";
2138
+ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light", options = {}) {
2139
+ const { updateMode, updateTheme, cache } = options;
2137
2140
  const [theme, setTheme] = (0, import_react19.useState)(defaultTheme);
2138
2141
  const [colorMode, setColorMode] = (0, import_react19.useState)(defaultColorMode);
2139
- const handleThemeChange = (0, import_react19.useCallback)((newTheme) => {
2140
- setTheme(newTheme);
2141
- localStorage.setItem(THEME_KEY, newTheme);
2142
- }, []);
2143
- const handleColorModeChange = (0, import_react19.useCallback)(() => {
2144
- setColorMode((prev) => {
2145
- const newMode = prev === "light" ? "dark" : "light";
2146
- localStorage.setItem(MODE_KEY, newMode);
2147
- return newMode;
2148
- });
2149
- }, []);
2142
+ const handleThemeChange = (0, import_react19.useCallback)(
2143
+ (newTheme) => {
2144
+ setTheme(newTheme);
2145
+ updateTheme == null ? void 0 : updateTheme(newTheme);
2146
+ },
2147
+ [updateTheme]
2148
+ );
2149
+ const handleColorModeChange = (0, import_react19.useCallback)(
2150
+ (newMode) => {
2151
+ setColorMode(newMode);
2152
+ updateMode == null ? void 0 : updateMode(newMode);
2153
+ },
2154
+ [updateMode]
2155
+ );
2150
2156
  (0, import_react19.useLayoutEffect)(() => {
2151
2157
  const theme2 = localStorage.getItem(THEME_KEY);
2152
2158
  if (theme2) {
@@ -2160,13 +2166,19 @@ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
2160
2166
  }
2161
2167
  }, []);
2162
2168
  (0, import_react19.useEffect)(() => {
2163
- const root = document.documentElement;
2164
- root.dataset.theme = theme;
2165
- }, [theme]);
2169
+ if (cache) {
2170
+ const root = document.documentElement;
2171
+ root.dataset.pandaTheme = theme;
2172
+ localStorage.setItem(THEME_KEY, theme);
2173
+ }
2174
+ }, [theme, cache]);
2166
2175
  (0, import_react19.useEffect)(() => {
2167
- const root = document.documentElement;
2168
- root.dataset.colorMode = colorMode;
2169
- }, [colorMode]);
2176
+ if (cache) {
2177
+ const root = document.documentElement;
2178
+ root.dataset.colorMode = colorMode;
2179
+ localStorage.setItem(MODE_KEY, colorMode);
2180
+ }
2181
+ }, [colorMode, cache]);
2170
2182
  return (0, import_react19.useMemo)(
2171
2183
  () => ({
2172
2184
  theme,
@@ -2180,13 +2192,15 @@ function useTheme(defaultTheme = "cerberus", defaultColorMode = "light") {
2180
2192
 
2181
2193
  // src/context/theme.tsx
2182
2194
  var import_jsx_runtime44 = require("react/jsx-runtime");
2183
- var THEME_KEY = "cerberus-theme";
2184
- var MODE_KEY = "cerberus-mode";
2185
2195
  var ThemeContext = (0, import_react20.createContext)(
2186
2196
  null
2187
2197
  );
2188
2198
  function ThemeProvider(props) {
2189
- const state = useTheme();
2199
+ const state = useTheme(props.defaultTheme, props.defaultColorMode, {
2200
+ cache: props.cache,
2201
+ updateMode: props.updateMode,
2202
+ updateTheme: props.updateTheme
2203
+ });
2190
2204
  return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(ThemeContext.Provider, { value: state, children: props.children });
2191
2205
  }
2192
2206
  function useThemeContext() {