@manafishrov/ui 1.3.8 → 1.3.9
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/Theme.d.ts +5 -0
- package/dist/Theme.js +31 -26
- package/dist/Theme.js.map +1 -1
- package/package.json +1 -1
- package/src/Theme.tsx +10 -4
package/dist/Theme.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { Component, JSXElement } from 'solid-js';
|
|
2
2
|
export type Theme = 'light' | 'dark' | 'system';
|
|
3
|
+
export declare const Theme: {
|
|
4
|
+
readonly light: "light";
|
|
5
|
+
readonly dark: "dark";
|
|
6
|
+
readonly system: "system";
|
|
7
|
+
};
|
|
3
8
|
export type ThemeProviderProps = {
|
|
4
9
|
theme?: Theme;
|
|
5
10
|
defaultTheme?: Theme;
|
package/dist/Theme.js
CHANGED
|
@@ -1,52 +1,57 @@
|
|
|
1
|
-
import { createComponent as
|
|
2
|
-
import { createSignal as
|
|
3
|
-
const
|
|
1
|
+
import { createComponent as y } from "solid-js/web";
|
|
2
|
+
import { createSignal as h, onMount as E, createEffect as i, on as m, useContext as b, createContext as S } from "solid-js";
|
|
3
|
+
const n = {
|
|
4
|
+
light: "light",
|
|
5
|
+
dark: "dark",
|
|
6
|
+
system: "system"
|
|
7
|
+
}, l = S(), k = "theme", g = "(prefers-color-scheme: dark)", d = () => typeof globalThis.matchMedia != "function" ? "light" : globalThis.matchMedia(g).matches ? "dark" : "light", v = (e, t) => {
|
|
4
8
|
if (!("localStorage" in globalThis))
|
|
5
9
|
return t;
|
|
6
10
|
const o = globalThis.localStorage.getItem(e);
|
|
7
|
-
return o ===
|
|
8
|
-
},
|
|
9
|
-
|
|
11
|
+
return o === n.light || o === n.dark || o === n.system ? o : t;
|
|
12
|
+
}, C = (e) => {
|
|
13
|
+
i(m(e, (t) => {
|
|
10
14
|
document.documentElement.classList.toggle("dark", t === "dark");
|
|
11
15
|
}));
|
|
12
|
-
},
|
|
16
|
+
}, M = (e) => {
|
|
13
17
|
if (typeof globalThis.matchMedia != "function")
|
|
14
18
|
return () => {
|
|
15
|
-
e(
|
|
19
|
+
e(d());
|
|
16
20
|
};
|
|
17
|
-
const t = globalThis.matchMedia(
|
|
18
|
-
e(
|
|
21
|
+
const t = globalThis.matchMedia(g), o = (s) => {
|
|
22
|
+
e(s.matches ? "dark" : "light");
|
|
19
23
|
};
|
|
20
24
|
return t.addEventListener("change", o), () => {
|
|
21
25
|
t.removeEventListener("change", o);
|
|
22
26
|
};
|
|
23
|
-
},
|
|
24
|
-
const t = () => e.storageKey ??
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
const r =
|
|
28
|
-
return r ===
|
|
27
|
+
}, K = (e) => {
|
|
28
|
+
const t = () => e.storageKey ?? k, o = () => e.defaultTheme ?? n.system, [s, a] = h(e.theme ?? v(t(), o())), [u, T] = h(d()), f = (r) => {
|
|
29
|
+
a(r), "localStorage" in globalThis && globalThis.localStorage.setItem(t(), r);
|
|
30
|
+
}, c = () => {
|
|
31
|
+
const r = s();
|
|
32
|
+
return r === n.system ? u() : r;
|
|
29
33
|
};
|
|
30
|
-
return
|
|
31
|
-
typeof r == "string" &&
|
|
32
|
-
})),
|
|
34
|
+
return E(() => M(T)), i(m(() => e.theme, (r) => {
|
|
35
|
+
typeof r == "string" && a(r);
|
|
36
|
+
})), C(c), y(l.Provider, {
|
|
33
37
|
value: {
|
|
34
|
-
theme:
|
|
35
|
-
setTheme:
|
|
36
|
-
resolvedTheme:
|
|
38
|
+
theme: s,
|
|
39
|
+
setTheme: f,
|
|
40
|
+
resolvedTheme: c
|
|
37
41
|
},
|
|
38
42
|
get children() {
|
|
39
43
|
return e.children;
|
|
40
44
|
}
|
|
41
45
|
});
|
|
42
|
-
},
|
|
43
|
-
const e =
|
|
46
|
+
}, R = () => {
|
|
47
|
+
const e = b(l);
|
|
44
48
|
if (!e)
|
|
45
49
|
throw new Error("useTheme must be used within a ThemeProvider");
|
|
46
50
|
return e;
|
|
47
51
|
};
|
|
48
52
|
export {
|
|
49
|
-
|
|
50
|
-
K as
|
|
53
|
+
n as Theme,
|
|
54
|
+
K as ThemeProvider,
|
|
55
|
+
R as useTheme
|
|
51
56
|
};
|
|
52
57
|
//# sourceMappingURL=Theme.js.map
|
package/dist/Theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Theme.js","sources":["../src/Theme.tsx"],"sourcesContent":["import type { Component, JSXElement } from 'solid-js';\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport type ThemeProviderProps = {\n theme?: Theme;\n defaultTheme?: Theme;\n storageKey?: string;\n children: JSXElement;\n};\n\ntype ThemeContextValue = {\n theme: () => Theme;\n setTheme: (theme: Theme) => void;\n resolvedTheme: () => 'light' | 'dark';\n};\n\nconst ThemeContext = createContext<ThemeContextValue>();\nconst DEFAULT_STORAGE_KEY = 'theme';\nconst DARK_THEME_QUERY = '(prefers-color-scheme: dark)';\n\nconst getSystemTheme = (): 'light' | 'dark' => {\n if (typeof globalThis.matchMedia !== 'function') {\n return 'light';\n }\n return globalThis.matchMedia(DARK_THEME_QUERY).matches ? 'dark' : 'light';\n};\n\nconst readStoredTheme = (storageKey: string, defaultTheme: Theme): Theme => {\n if (!('localStorage' in globalThis)) {\n return defaultTheme;\n }\n const stored = globalThis.localStorage.getItem(storageKey);\n if (stored ===
|
|
1
|
+
{"version":3,"file":"Theme.js","sources":["../src/Theme.tsx"],"sourcesContent":["import type { Component, JSXElement } from 'solid-js';\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport const Theme = {\n light: 'light',\n dark: 'dark',\n system: 'system',\n} as const;\n\nexport type ThemeProviderProps = {\n theme?: Theme;\n defaultTheme?: Theme;\n storageKey?: string;\n children: JSXElement;\n};\n\ntype ThemeContextValue = {\n theme: () => Theme;\n setTheme: (theme: Theme) => void;\n resolvedTheme: () => 'light' | 'dark';\n};\n\nconst ThemeContext = createContext<ThemeContextValue>();\nconst DEFAULT_STORAGE_KEY = 'theme';\nconst DARK_THEME_QUERY = '(prefers-color-scheme: dark)';\n\nconst getSystemTheme = (): 'light' | 'dark' => {\n if (typeof globalThis.matchMedia !== 'function') {\n return 'light';\n }\n return globalThis.matchMedia(DARK_THEME_QUERY).matches ? 'dark' : 'light';\n};\n\nconst readStoredTheme = (storageKey: string, defaultTheme: Theme): Theme => {\n if (!('localStorage' in globalThis)) {\n return defaultTheme;\n }\n const stored = globalThis.localStorage.getItem(storageKey);\n if (stored === Theme.light || stored === Theme.dark || stored === Theme.system) {\n return stored as Theme;\n }\n return defaultTheme;\n};\n\nconst applyRootThemeClass = (resolvedTheme: () => 'light' | 'dark'): void => {\n createEffect(\n on(resolvedTheme, (resolved) => {\n const root = document.documentElement;\n root.classList.toggle('dark', resolved === 'dark');\n }),\n );\n};\n\nconst createSystemThemeListener = (\n setSystemTheme: (theme: 'light' | 'dark') => void,\n): (() => void) => {\n if (typeof globalThis.matchMedia !== 'function') {\n return (): void => {\n setSystemTheme(getSystemTheme());\n };\n }\n const mediaQuery = globalThis.matchMedia(DARK_THEME_QUERY);\n const handleChange = (mediaQueryEvent: MediaQueryListEvent): void => {\n setSystemTheme(mediaQueryEvent.matches ? 'dark' : 'light');\n };\n mediaQuery.addEventListener('change', handleChange);\n return (): void => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n};\n\nexport const ThemeProvider: Component<ThemeProviderProps> = (props) => {\n const storageKey = (): string => props.storageKey ?? DEFAULT_STORAGE_KEY;\n const fallbackTheme = (): Theme => props.defaultTheme ?? Theme.system;\n const [theme, setThemeState] = createSignal<Theme>(\n props.theme ?? readStoredTheme(storageKey(), fallbackTheme()),\n );\n const [systemTheme, setSystemTheme] = createSignal<'light' | 'dark'>(getSystemTheme());\n\n const setTheme = (newTheme: Theme): void => {\n setThemeState(newTheme);\n if ('localStorage' in globalThis) {\n globalThis.localStorage.setItem(storageKey(), newTheme);\n }\n };\n\n const resolvedTheme = (): 'light' | 'dark' => {\n const current = theme();\n return current === Theme.system ? systemTheme() : current;\n };\n\n onMount(() => createSystemThemeListener(setSystemTheme));\n\n createEffect(\n on(\n () => props.theme,\n (propTheme) => {\n if (typeof propTheme === 'string') {\n setThemeState(propTheme);\n }\n },\n ),\n );\n applyRootThemeClass(resolvedTheme);\n\n return (\n <ThemeContext.Provider value={{ theme, setTheme, resolvedTheme }}>\n {props.children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n};\n"],"names":["Theme","light","dark","system","ThemeContext","createContext","DEFAULT_STORAGE_KEY","DARK_THEME_QUERY","getSystemTheme","globalThis","matchMedia","matches","readStoredTheme","storageKey","defaultTheme","stored","localStorage","getItem","applyRootThemeClass","resolvedTheme","createEffect","on","resolved","root","document","documentElement","classList","toggle","createSystemThemeListener","setSystemTheme","mediaQuery","handleChange","mediaQueryEvent","addEventListener","removeEventListener","ThemeProvider","props","fallbackTheme","theme","setThemeState","createSignal","systemTheme","setTheme","newTheme","setItem","current","onMount","propTheme","_$createComponent","Provider","value","children","useTheme","context","useContext","Error"],"mappings":";;AAIO,MAAMA,IAAQ;AAAA,EACnBC,OAAO;AAAA,EACPC,MAAM;AAAA,EACNC,QAAQ;AACV,GAeMC,IAAeC,EAAAA,GACfC,IAAsB,SACtBC,IAAmB,gCAEnBC,IAAiBA,MACjB,OAAOC,WAAWC,cAAe,aAC5B,UAEFD,WAAWC,WAAWH,CAAgB,EAAEI,UAAU,SAAS,SAG9DC,IAAkBA,CAACC,GAAoBC,MAA+B;AAC1E,MAAI,EAAE,kBAAkBL;AACtB,WAAOK;AAET,QAAMC,IAASN,WAAWO,aAAaC,QAAQJ,CAAU;AACzD,SAAIE,MAAWf,EAAMC,SAASc,MAAWf,EAAME,QAAQa,MAAWf,EAAMG,SAC/DY,IAEFD;AACT,GAEMI,IAAsBA,CAACC,MAAgD;AAC3EC,EAAAA,EACEC,EAAGF,GAAgBG,CAAAA,MAAa;AAE9BC,IADaC,SAASC,gBACjBC,UAAUC,OAAO,QAAQL,MAAa,MAAM;AAAA,EACnD,CAAC,CACH;AACF,GAEMM,IAA4BA,CAChCC,MACiB;AACjB,MAAI,OAAOpB,WAAWC,cAAe;AACnC,WAAO,MAAY;AACjBmB,MAAAA,EAAerB,GAAgB;AAAA,IACjC;AAEF,QAAMsB,IAAarB,WAAWC,WAAWH,CAAgB,GACnDwB,IAAeA,CAACC,MAA+C;AACnEH,IAAAA,EAAeG,EAAgBrB,UAAU,SAAS,OAAO;AAAA,EAC3D;AACAmB,SAAAA,EAAWG,iBAAiB,UAAUF,CAAY,GAC3C,MAAY;AACjBD,IAAAA,EAAWI,oBAAoB,UAAUH,CAAY;AAAA,EACvD;AACF,GAEaI,IAAgDC,CAAAA,MAAU;AACrE,QAAMvB,IAAaA,MAAcuB,EAAMvB,cAAcP,GAC/C+B,IAAgBA,MAAaD,EAAMtB,gBAAgBd,EAAMG,QACzD,CAACmC,GAAOC,CAAa,IAAIC,EAC7BJ,EAAME,SAAS1B,EAAgBC,KAAcwB,EAAAA,CAAe,CAC9D,GACM,CAACI,GAAaZ,CAAc,IAAIW,EAA+BhC,GAAgB,GAE/EkC,IAAWA,CAACC,MAA0B;AAC1CJ,IAAAA,EAAcI,CAAQ,GAClB,kBAAkBlC,cACpBA,WAAWO,aAAa4B,QAAQ/B,EAAAA,GAAc8B,CAAQ;AAAA,EAE1D,GAEMxB,IAAgBA,MAAwB;AAC5C,UAAM0B,IAAUP,EAAAA;AAChB,WAAOO,MAAY7C,EAAMG,SAASsC,EAAAA,IAAgBI;AAAAA,EACpD;AAEAC,SAAAA,EAAQ,MAAMlB,EAA0BC,CAAc,CAAC,GAEvDT,EACEC,EACE,MAAMe,EAAME,OACXS,CAAAA,MAAc;AACb,IAAI,OAAOA,KAAc,YACvBR,EAAcQ,CAAS;AAAA,EAE3B,CACF,CACF,GACA7B,EAAoBC,CAAa,GAEjC6B,EACG5C,EAAa6C,UAAQ;AAAA,IAACC,OAAO;AAAA,MAAEZ,OAAAA;AAAAA,MAAOI,UAAAA;AAAAA,MAAUvB,eAAAA;AAAAA,IAAAA;AAAAA,IAAe,IAAAgC,WAAA;AAAA,aAC7Df,EAAMe;AAAAA,IAAQ;AAAA,EAAA,CAAA;AAGrB,GAEaC,IAAWA,MAAyB;AAC/C,QAAMC,IAAUC,EAAWlD,CAAY;AACvC,MAAI,CAACiD;AACH,UAAM,IAAIE,MAAM,8CAA8C;AAEhE,SAAOF;AACT;"}
|
package/package.json
CHANGED
package/src/Theme.tsx
CHANGED
|
@@ -2,6 +2,12 @@ import type { Component, JSXElement } from 'solid-js';
|
|
|
2
2
|
|
|
3
3
|
export type Theme = 'light' | 'dark' | 'system';
|
|
4
4
|
|
|
5
|
+
export const Theme = {
|
|
6
|
+
light: 'light',
|
|
7
|
+
dark: 'dark',
|
|
8
|
+
system: 'system',
|
|
9
|
+
} as const;
|
|
10
|
+
|
|
5
11
|
export type ThemeProviderProps = {
|
|
6
12
|
theme?: Theme;
|
|
7
13
|
defaultTheme?: Theme;
|
|
@@ -31,8 +37,8 @@ const readStoredTheme = (storageKey: string, defaultTheme: Theme): Theme => {
|
|
|
31
37
|
return defaultTheme;
|
|
32
38
|
}
|
|
33
39
|
const stored = globalThis.localStorage.getItem(storageKey);
|
|
34
|
-
if (stored ===
|
|
35
|
-
return stored;
|
|
40
|
+
if (stored === Theme.light || stored === Theme.dark || stored === Theme.system) {
|
|
41
|
+
return stored as Theme;
|
|
36
42
|
}
|
|
37
43
|
return defaultTheme;
|
|
38
44
|
};
|
|
@@ -66,7 +72,7 @@ const createSystemThemeListener = (
|
|
|
66
72
|
|
|
67
73
|
export const ThemeProvider: Component<ThemeProviderProps> = (props) => {
|
|
68
74
|
const storageKey = (): string => props.storageKey ?? DEFAULT_STORAGE_KEY;
|
|
69
|
-
const fallbackTheme = (): Theme => props.defaultTheme ??
|
|
75
|
+
const fallbackTheme = (): Theme => props.defaultTheme ?? Theme.system;
|
|
70
76
|
const [theme, setThemeState] = createSignal<Theme>(
|
|
71
77
|
props.theme ?? readStoredTheme(storageKey(), fallbackTheme()),
|
|
72
78
|
);
|
|
@@ -81,7 +87,7 @@ export const ThemeProvider: Component<ThemeProviderProps> = (props) => {
|
|
|
81
87
|
|
|
82
88
|
const resolvedTheme = (): 'light' | 'dark' => {
|
|
83
89
|
const current = theme();
|
|
84
|
-
return current ===
|
|
90
|
+
return current === Theme.system ? systemTheme() : current;
|
|
85
91
|
};
|
|
86
92
|
|
|
87
93
|
onMount(() => createSystemThemeListener(setSystemTheme));
|