achery-ui 0.14.0 → 0.14.1

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.
package/dist/index.cjs CHANGED
@@ -47,6 +47,7 @@ var AppBarSearchProvider = ({ children }) => {
47
47
  };
48
48
  var useAppBarSearch = () => react.useContext(AppBarSearchContext);
49
49
  var STORAGE_KEY = "achery-theme-mode";
50
+ var ACCENT_STORAGE_KEY = "achery-accent";
50
51
  var ThemeContext = react.createContext(null);
51
52
  function getSystemTheme() {
52
53
  if (typeof window === "undefined") return "light";
@@ -64,6 +65,14 @@ function readStoredMode(fallback) {
64
65
  }
65
66
  return fallback;
66
67
  }
68
+ function readStoredAccent(fallback) {
69
+ try {
70
+ const stored = localStorage.getItem(ACCENT_STORAGE_KEY);
71
+ if (stored) return stored;
72
+ } catch {
73
+ }
74
+ return fallback;
75
+ }
67
76
  function AcheryProvider({
68
77
  children,
69
78
  defaultTheme = "system",
@@ -75,24 +84,25 @@ function AcheryProvider({
75
84
  style
76
85
  }) {
77
86
  const [mode, setModeState] = react.useState(() => readStoredMode(defaultTheme));
78
- const [accent, setAccentState] = react.useState(defaultAccent);
87
+ const [accent, setAccentState] = react.useState(() => readStoredAccent(defaultAccent));
79
88
  const [dial, setDialState] = react.useState(defaultDial);
80
89
  const [material, setMaterialState] = react.useState(defaultMaterial);
81
90
  const [surfaceOrigin] = react.useState(defaultSurfaceOrigin);
82
91
  const [resolvedTheme, setResolvedTheme] = react.useState(() => resolveTheme(readStoredMode(defaultTheme)));
92
+ const mounted = react.useRef(false);
83
93
  react.useEffect(() => {
84
- setModeState(defaultTheme);
85
- setResolvedTheme(resolveTheme(defaultTheme));
86
- }, [defaultTheme]);
87
- react.useEffect(() => {
94
+ if (!mounted.current) {
95
+ mounted.current = true;
96
+ return;
97
+ }
98
+ if (defaultTheme === "light" || defaultTheme === "dark") {
99
+ setModeState(defaultTheme);
100
+ setResolvedTheme(resolveTheme(defaultTheme));
101
+ }
88
102
  setAccentState(defaultAccent);
89
- }, [defaultAccent]);
90
- react.useEffect(() => {
91
103
  setDialState(defaultDial);
92
- }, [defaultDial]);
93
- react.useEffect(() => {
94
104
  setMaterialState(defaultMaterial);
95
- }, [defaultMaterial]);
105
+ }, [defaultTheme, defaultAccent, defaultDial, defaultMaterial]);
96
106
  const setTheme = react.useCallback((next) => {
97
107
  setModeState(next);
98
108
  setResolvedTheme(resolveTheme(next));
@@ -104,7 +114,13 @@ function AcheryProvider({
104
114
  const toggleTheme = react.useCallback(() => {
105
115
  setTheme(resolvedTheme === "light" ? "dark" : "light");
106
116
  }, [resolvedTheme, setTheme]);
107
- const setAccent = react.useCallback((next) => setAccentState(next), []);
117
+ const setAccent = react.useCallback((next) => {
118
+ setAccentState(next);
119
+ try {
120
+ localStorage.setItem(ACCENT_STORAGE_KEY, next);
121
+ } catch {
122
+ }
123
+ }, []);
108
124
  const setDial = react.useCallback((next) => setDialState(next), []);
109
125
  const setMaterial = react.useCallback((next) => setMaterialState(next), []);
110
126
  react.useEffect(() => {