@brightweblabs/ui 1.5.4 → 1.5.6

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@brightweblabs/ui",
3
3
  "private": false,
4
- "version": "1.5.4",
4
+ "version": "1.5.6",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
7
7
  "files": [
@@ -16,6 +16,7 @@
16
16
  "access": "public"
17
17
  },
18
18
  "exports": {
19
+ "./utils": "./src/lib/utils.ts",
19
20
  ".": "./src/index.ts",
20
21
  "./action": "./src/components/action.tsx",
21
22
  "./activity-format": "./src/lib/activity-format.ts",
@@ -80,7 +81,7 @@
80
81
  "recharts": "^2.15.4",
81
82
  "sonner": "^2.0.7",
82
83
  "tailwind-merge": "^3.6.0",
83
- "@brightweblabs/theme": "0.8.3"
84
+ "@brightweblabs/theme": "0.8.4"
84
85
  },
85
86
  "peerDependencies": {
86
87
  "lucide-react": "^1.8.0",
@@ -1,6 +1,5 @@
1
1
  "use client";
2
2
 
3
- import * as React from "react";
4
3
  import { cn } from "../lib/utils";
5
4
 
6
5
  export type PasswordStrengthLevel = "weak" | "medium" | "strong" | null;
@@ -15,6 +15,7 @@ import {
15
15
  BW_THEME_MEDIA_QUERY,
16
16
  BW_THEME_STORAGE_KEY,
17
17
  getSystemTheme,
18
+ getThemeStorage,
18
19
  persistTheme,
19
20
  readStoredTheme,
20
21
  resolveTheme,
@@ -77,7 +78,7 @@ export function ThemeProvider({
77
78
 
78
79
  useLayoutEffect(() => {
79
80
  const mediaQuery = window.matchMedia(BW_THEME_MEDIA_QUERY);
80
- setThemeState(readStoredTheme(window.localStorage, defaultTheme));
81
+ setThemeState(readStoredTheme(getThemeStorage(), defaultTheme));
81
82
  setSystemTheme(getSystemTheme(mediaQuery));
82
83
  setIsReady(true);
83
84
  }, [defaultTheme]);
@@ -96,7 +97,7 @@ export function ThemeProvider({
96
97
  useEffect(() => {
97
98
  const handleStorage = (event: StorageEvent) => {
98
99
  if (event.key !== BW_THEME_STORAGE_KEY) return;
99
- setThemeState(readStoredTheme(window.localStorage, defaultTheme));
100
+ setThemeState(readStoredTheme(getThemeStorage(), defaultTheme));
100
101
  };
101
102
  window.addEventListener("storage", handleStorage);
102
103
  return () => window.removeEventListener("storage", handleStorage);
@@ -104,7 +105,7 @@ export function ThemeProvider({
104
105
 
105
106
  const setTheme = useCallback((nextTheme: ThemeMode) => {
106
107
  setThemeState(nextTheme);
107
- persistTheme(window.localStorage, nextTheme);
108
+ persistTheme(getThemeStorage(), nextTheme);
108
109
  }, []);
109
110
 
110
111
  const value = useMemo<ThemeContextValue>(
@@ -18,6 +18,14 @@ export function resolveTheme(mode: ThemeMode, systemTheme: ResolvedTheme, enable
18
18
  return mode;
19
19
  }
20
20
 
21
+ export function getThemeStorage(): ThemeStorage | null {
22
+ try {
23
+ return typeof window === "undefined" ? null : window.localStorage;
24
+ } catch {
25
+ return null;
26
+ }
27
+ }
28
+
21
29
  export function readStoredTheme(
22
30
  storage: Pick<ThemeStorage, "getItem"> | null | undefined,
23
31
  defaultTheme: ThemeMode = "system",