achery-ui 0.14.0 → 0.15.0

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(() => {
@@ -2438,6 +2454,7 @@ var searchSpacer = "AppBar_searchSpacer__uqki995";
2438
2454
  function AppBar({
2439
2455
  brandName: brandName2 = "Achery",
2440
2456
  brandSub: brandSub2,
2457
+ brandLogo,
2441
2458
  showSearch = true,
2442
2459
  searchPlaceholder = "Search\u2026",
2443
2460
  searchKbd: searchKbd2,
@@ -2476,7 +2493,7 @@ function AppBar({
2476
2493
  }
2477
2494
  ),
2478
2495
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: brand, children: [
2479
- /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: "hex", size: 20, "aria-hidden": "true" }),
2496
+ brandLogo ?? /* @__PURE__ */ jsxRuntime.jsx(Glyph, { name: "hex", size: 20, "aria-hidden": "true" }),
2480
2497
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: brandName, children: brandName2 }),
2481
2498
  brandSub2 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2482
2499
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: brandDivider }),