@ankjs/react-ui 1.0.13 → 1.0.15
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/constants/colors.d.ts +4 -4
- package/dist/index.cjs +99 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +101 -13
- package/dist/index.esm.js.map +1 -1
- package/dist/providers/MainUiView.d.ts +3 -0
- package/dist/types/mainViewType.d.ts +8 -0
- package/dist/types/themeTypes.d.ts +4 -1
- package/package.json +1 -1
- package/src/constants/colors.ts +5 -5
- package/src/hook/useSystemTheme.ts +8 -6
- package/src/hook/useThemeColors.ts +7 -1
- package/src/providers/AnkThemeProvider.tsx +32 -84
- package/src/providers/MainUiView.tsx +48 -0
- package/src/types/mainViewType.ts +14 -0
- package/src/types/themeTypes.ts +4 -1
- package/src/providers/MainUiView.jsx +0 -33
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
export declare const light: {
|
|
2
2
|
primary: string;
|
|
3
3
|
primaryColor: string;
|
|
4
|
+
pageBg: string;
|
|
4
5
|
mainBgColor: string;
|
|
5
6
|
backgroundColor: string;
|
|
6
7
|
secondryBgColor: string;
|
|
7
|
-
pageBg: string;
|
|
8
8
|
color: string;
|
|
9
9
|
};
|
|
10
10
|
export declare const dark: {
|
|
11
11
|
primary: string;
|
|
12
12
|
primaryColor: string;
|
|
13
13
|
mainBgColor: string;
|
|
14
|
-
secondryBgColor: string;
|
|
15
14
|
pageBg: string;
|
|
16
15
|
backgroundColor: string;
|
|
16
|
+
secondryBgColor: string;
|
|
17
17
|
color: string;
|
|
18
18
|
};
|
|
19
19
|
declare const colors: {
|
|
20
20
|
light: {
|
|
21
21
|
primary: string;
|
|
22
22
|
primaryColor: string;
|
|
23
|
+
pageBg: string;
|
|
23
24
|
mainBgColor: string;
|
|
24
25
|
backgroundColor: string;
|
|
25
26
|
secondryBgColor: string;
|
|
26
|
-
pageBg: string;
|
|
27
27
|
color: string;
|
|
28
28
|
};
|
|
29
29
|
dark: {
|
|
30
30
|
primary: string;
|
|
31
31
|
primaryColor: string;
|
|
32
32
|
mainBgColor: string;
|
|
33
|
-
secondryBgColor: string;
|
|
34
33
|
pageBg: string;
|
|
35
34
|
backgroundColor: string;
|
|
35
|
+
secondryBgColor: string;
|
|
36
36
|
color: string;
|
|
37
37
|
};
|
|
38
38
|
};
|
package/dist/index.cjs
CHANGED
|
@@ -12,24 +12,106 @@ const AnkThemeContext = react.createContext(undefined);
|
|
|
12
12
|
const ColorContext = react.createContext(undefined);
|
|
13
13
|
|
|
14
14
|
const useSystemTheme = () => {
|
|
15
|
-
const
|
|
15
|
+
const theme = window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
16
16
|
? "dark"
|
|
17
|
-
: "light"
|
|
17
|
+
: "light";
|
|
18
|
+
const [sysTheme, setSysTheme] = react.useState(theme);
|
|
18
19
|
react.useEffect(() => {
|
|
19
20
|
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
|
20
21
|
const handleChange = () => {
|
|
21
22
|
setSysTheme(media.matches ? "dark" : "light");
|
|
22
23
|
};
|
|
24
|
+
handleChange();
|
|
23
25
|
media.addEventListener("change", handleChange);
|
|
24
26
|
return () => media.removeEventListener("change", handleChange);
|
|
25
|
-
}, []);
|
|
27
|
+
}, [theme, setSysTheme]);
|
|
26
28
|
return sysTheme;
|
|
27
29
|
};
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
const light = {
|
|
32
|
+
primary: 'red',
|
|
33
|
+
primaryColor: 'red',
|
|
34
|
+
pageBg: '#8d8d8d',
|
|
35
|
+
mainBgColor: '#fff',
|
|
36
|
+
backgroundColor: '#f0f0f0',
|
|
37
|
+
secondryBgColor: '#808080',
|
|
38
|
+
color: '#000',
|
|
39
|
+
};
|
|
40
|
+
const dark = {
|
|
41
|
+
primary: 'red',
|
|
42
|
+
primaryColor: 'red',
|
|
43
|
+
mainBgColor: '#000',
|
|
44
|
+
pageBg: '#333',
|
|
45
|
+
backgroundColor: '#444',
|
|
46
|
+
secondryBgColor: '808080',
|
|
47
|
+
color: '#eee',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const defaultColorsObject = {
|
|
51
|
+
light: light,
|
|
52
|
+
dark: dark,
|
|
53
|
+
};
|
|
54
|
+
const useThemeColors = () => {
|
|
55
|
+
const context = react.useContext(AnkThemeContext);
|
|
56
|
+
if (!context) {
|
|
57
|
+
throw new Error(` * useThemeColors must be used within a AnkThemeProvider * \n like this - \n import AnkThemeProvider from '@ankjs/react-ui;
|
|
58
|
+
|
|
59
|
+
<AnkThemeProvider>
|
|
60
|
+
<App />
|
|
61
|
+
</AnkThemeProvider>
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
const { light: light$1, dark: dark$1 } = react.useContext(ColorContext) ?? defaultColorsObject;
|
|
65
|
+
const reLight = light$1 ?? light;
|
|
66
|
+
const reDark = dark$1 ?? dark;
|
|
67
|
+
const theme = context.theme || undefined;
|
|
68
|
+
const themeMode = context.themeType || undefined;
|
|
69
|
+
if (theme === undefined || themeMode === undefined) {
|
|
70
|
+
throw new Error(` * useThemeColors must be used within a AnkThemeProvider * \n like this - \n import AnkThemeProvider from '@ankjs/react-ui;
|
|
71
|
+
|
|
72
|
+
<AnkThemeProvider>
|
|
73
|
+
<App />
|
|
74
|
+
</AnkThemeProvider>
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
else if (context.theme === "light") {
|
|
78
|
+
return {
|
|
79
|
+
...reLight,
|
|
80
|
+
themeMode,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
else if (context.theme === "dark") {
|
|
84
|
+
return {
|
|
85
|
+
...reDark,
|
|
86
|
+
themeMode,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
...reLight,
|
|
91
|
+
themeMode: "light"
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const MainUiView = (props) => {
|
|
96
|
+
const { children, autoApply, style, overflow, backgroundColor, fontolor } = props;
|
|
97
|
+
const colors = useThemeColors();
|
|
98
|
+
const { mainBgColor, color } = useThemeColors();
|
|
99
|
+
const bg = autoApply ? mainBgColor : backgroundColor;
|
|
100
|
+
const text = autoApply ? color : fontolor;
|
|
101
|
+
const styleContener = {
|
|
102
|
+
backgroundColor: bg,
|
|
103
|
+
color: text,
|
|
104
|
+
height: "100dvh",
|
|
105
|
+
width: "100%",
|
|
106
|
+
overflow,
|
|
107
|
+
...style
|
|
108
|
+
};
|
|
109
|
+
return (jsxRuntime.jsxs("div", { style: styleContener, children: [JSON.stringify(colors), children] }));
|
|
110
|
+
};
|
|
111
|
+
|
|
30
112
|
const AnkThemeProvider = (props) => {
|
|
31
113
|
//PROPERTY
|
|
32
|
-
const { children, colorsObjectProvide = "", colorsObject = "", defaultThemeMode = "system", style = {} } = props;
|
|
114
|
+
const { children, colorsObjectProvide = "", colorsObject = "", defaultThemeMode = "system", autoApply = true, style = {}, overflow = 'scroll', backgroundColor = "pink", color = "black" } = props;
|
|
33
115
|
// SYSTEM THEME MODE 🪝
|
|
34
116
|
// Assumed returns 'light' | 'dark'
|
|
35
117
|
const system = useSystemTheme();
|
|
@@ -39,24 +121,30 @@ const AnkThemeProvider = (props) => {
|
|
|
39
121
|
const [theme, setTheme] = react.useState(initialActiveTheme);
|
|
40
122
|
// State for the user's selected preference
|
|
41
123
|
const [themeType, setThemeType] = react.useState(defaultThemeMode);
|
|
124
|
+
react.useEffect(() => {
|
|
125
|
+
if (defaultThemeMode === 'system') {
|
|
126
|
+
setTheme(initialActiveTheme);
|
|
127
|
+
return setThemeType('system');
|
|
128
|
+
}
|
|
129
|
+
}, [defaultThemeMode, initialActiveTheme, setTheme, setThemeType]);
|
|
42
130
|
const setDarkTheme = react.useCallback(() => {
|
|
43
131
|
if (theme === 'dark')
|
|
44
132
|
return;
|
|
45
133
|
setThemeType('dark');
|
|
46
|
-
setTheme('dark');
|
|
134
|
+
return setTheme('dark');
|
|
47
135
|
}, [theme, setThemeType, setTheme]);
|
|
48
136
|
const setLightTheme = react.useCallback(() => {
|
|
49
137
|
if (theme === 'light')
|
|
50
138
|
return;
|
|
51
139
|
setThemeType('light');
|
|
52
|
-
setTheme('light');
|
|
140
|
+
return setTheme('light');
|
|
53
141
|
}, [theme, setThemeType, setTheme]);
|
|
54
142
|
const setSystemTheme = react.useCallback(() => {
|
|
55
143
|
if (themeType === 'system')
|
|
56
144
|
return;
|
|
57
145
|
setThemeType('system');
|
|
58
|
-
setTheme(system);
|
|
59
|
-
}, [
|
|
146
|
+
return setTheme(system);
|
|
147
|
+
}, [themeType, setTheme, system, setThemeType]);
|
|
60
148
|
// Memoize the context value to prevent unnecessary re-renders in consumers
|
|
61
149
|
const contextValue = react.useMemo(() => ({
|
|
62
150
|
theme,
|
|
@@ -65,13 +153,13 @@ const AnkThemeProvider = (props) => {
|
|
|
65
153
|
setDarkTheme,
|
|
66
154
|
setLightTheme,
|
|
67
155
|
setSystemTheme,
|
|
68
|
-
}), [theme, setTheme, setDarkTheme, setLightTheme, setSystemTheme]);
|
|
156
|
+
}), [theme, themeType, setTheme, setDarkTheme, setLightTheme, setSystemTheme]);
|
|
69
157
|
// WONER COLOUR OBJECT
|
|
70
158
|
const colorObj = react.useMemo(() => ({
|
|
71
159
|
...colorsObject,
|
|
72
160
|
...colorsObjectProvide,
|
|
73
161
|
}), [colorsObject, colorsObjectProvide]);
|
|
74
|
-
return (jsxRuntime.jsx(AnkThemeContext.Provider, { value: contextValue, children: jsxRuntime.jsx(ColorContext.Provider, { value: colorObj, children: children }) }));
|
|
162
|
+
return (jsxRuntime.jsx(AnkThemeContext.Provider, { value: contextValue, children: jsxRuntime.jsx(ColorContext.Provider, { value: colorObj, children: jsxRuntime.jsx(MainUiView, { autoApply: autoApply, style: style, overflow: overflow, backgroundColor: backgroundColor, fontolor: color, children: children }) }) }));
|
|
75
163
|
};
|
|
76
164
|
|
|
77
165
|
exports.default = AnkThemeProvider;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/contexts/AnkThemeContext.ts","../src/hook/useSystemTheme.ts","../src/providers/AnkThemeProvider.tsx"],"sourcesContent":[null,null,null],"names":["createContext","useState","useEffect","useCallback","useMemo","_jsx"],"mappings":";;;;;;;AAAA;;AAEG;AASI,MAAM,eAAe,GAAGA,mBAAa,CAA+B,SAAS,CAAC;AAG9E,MAAM,YAAY,GAAGA,mBAAa,CAA2B,SAAS,CAAC;;
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/contexts/AnkThemeContext.ts","../src/hook/useSystemTheme.ts","../src/constants/colors.ts","../src/hook/useThemeColors.ts","../src/providers/MainUiView.tsx","../src/providers/AnkThemeProvider.tsx"],"sourcesContent":[null,null,null,null,null,null],"names":["createContext","useState","useEffect","defaultLight","defaultDark","useContext","light","dark","_jsxs","useCallback","useMemo","_jsx"],"mappings":";;;;;;;AAAA;;AAEG;AASI,MAAM,eAAe,GAAGA,mBAAa,CAA+B,SAAS,CAAC;AAG9E,MAAM,YAAY,GAAGA,mBAAa,CAA2B,SAAS,CAAC;;ACR9E,MAAM,cAAc,GAAG,MAAK;IAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC;AAC9D,UAAE;UACA,OAAO;IAEX,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGC,cAAQ,CACtC,KAAK,CACN;IAEDC,eAAS,CAAC,MAAK;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAC/D,MAAM,YAAY,GAAG,MAAK;AACxB,YAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAC/C,QAAA,CAAC;AACD,QAAA,YAAY,EAAE;AACd,QAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;QAC9C,OAAO,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;AAChE,IAAA,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAExB,IAAA,OAAO,QAAQ;AACjB,CAAC;;ACxBM,MAAM,KAAK,GAAG;AACnB,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,WAAW,EAAE,MAAM;AACnB,IAAA,eAAe,EAAE,SAAS;AAC1B,IAAA,eAAe,EAAE,SAAS;AAC1B,IAAA,KAAK,EAAE,MAAM;CACd;AAEM,MAAM,IAAI,GAAG;AAClB,IAAA,OAAO,EAAE,KAAK;AACd,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,WAAW,EAAE,MAAM;AACnB,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,eAAe,EAAE,MAAM;AACvB,IAAA,eAAe,EAAE,QAAQ;AACzB,IAAA,KAAK,EAAE,MAAM;CACd;;ACdD,MAAM,mBAAmB,GAAG;AAC1B,IAAA,KAAK,EAAEC,KAAY;AACnB,IAAA,IAAI,EAAEC,IAAW;CAClB;AAID,MAAM,cAAc,GAAG,MAAmC;AACxD,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,eAAe,CAAC;IAG3C,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CAAC,CAAA;;;;;AAKf,IAAA,CAAA,CAAC;IACJ;AAGA,IAAA,MAAM,SAAEC,OAAK,QAAEC,MAAI,EAAE,GAAGF,gBAAU,CAAC,YAAY,CAAC,IAAI,mBAAmB;AAEvE,IAAA,MAAM,OAAO,GAAGC,OAAK,IAAIH,KAAY;AACrC,IAAA,MAAM,MAAM,GAAGI,MAAI,IAAIH,IAAW;AAElC,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,SAAS;AACxC,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS;IAKhD,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE;QAClD,MAAM,IAAI,KAAK,CAAC,CAAA;;;;;AAKf,IAAA,CAAA,CAAC;IACJ;AAAO,SAAA,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE;QACpC,OAAO;AACL,YAAA,GAAG,OAAO;YACV,SAAS;SACV;IACH;AAAO,SAAA,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE;QACnC,OAAO;AACL,YAAA,GAAG,MAAM;YACT,SAAS;SACV;IACH;IAEA,OAAO;AACL,QAAA,GAAG,OAAO;AACV,QAAA,SAAS,EAAE;KACZ;AAEH,CAAC;;ACvDD,MAAM,UAAU,GAAG,CAAC,KAAoB,KAAI;AAC1C,IAAA,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,KAAK,EACL,QAAQ,EACR,eAAe,EACf,QAAQ,EACT,GAAG,KAAK;AAET,IAAA,MAAM,MAAM,GAAG,cAAc,EAAE;IAC/B,MAAM,EACJ,WAAW,EAAE,KAAK,EACnB,GAAG,cAAc,EAAE;IAEpB,MAAM,EAAE,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe;IACpD,MAAM,IAAI,GAAG,SAAS,GAAG,KAAK,GAAE,QAAQ;AAExC,IAAA,MAAM,aAAa,GAAG;AACpB,QAAA,eAAe,EAAE,EAAE;AACnB,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,KAAK,EAAE,MAAM;QACb,QAAQ;AACR,QAAA,GAAG;KACJ;AAGD,IAAA,QACEI,eAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAE,aAAa,aAGlB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAEvB,QAAQ,CAAA,EAAA,CACL;AAEV,CAAC;;ACzBD,MAAM,gBAAgB,GAAG,CAAC,KAAyB,KAAI;;AAErD,IAAA,MAAM,EACJ,QAAQ,EACR,mBAAmB,GAAG,EAAE,EACxB,YAAY,GAAG,EAAE,EACjB,gBAAgB,GAAG,QAAQ,EAC3B,SAAS,GAAG,IAAI,EAChB,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,QAAQ,EACnB,eAAe,GAAG,MAAM,EACxB,KAAK,GAAG,OAAO,EAChB,GAAG,KAAK;;;AAKT,IAAA,MAAM,MAAM,GAAG,cAAc,EAAE;;AAG/B,IAAA,MAAM,kBAAkB,GAAG,gBAAgB,KAAK,QAAQ,GAAG,MAAM,GAAG,gBAAgB;;IAIpF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGP,cAAQ,CAAmB,kBAAkB,CAAC;;IAGxE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAA8B,gBAAgB,CAAC;IAIzFC,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,gBAAgB,KAAK,QAAQ,EAAE;YACjC,QAAQ,CAAC,kBAAkB,CAAC;AAC5B,YAAA,OAAO,YAAY,CAAC,QAAQ,CAAC;QAC/B;IACF,CAAC,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAIlE,IAAA,MAAM,YAAY,GAAGO,iBAAW,CAAC,MAAK;QACpC,IAAI,KAAK,KAAK,MAAM;YAAE;QACtB,YAAY,CAAC,MAAM,CAAC;AACpB,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEnC,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAAC,MAAK;QACrC,IAAI,KAAK,KAAK,OAAO;YAAE;QACvB,YAAY,CAAC,OAAO,CAAC;AACrB,QAAA,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEnC,IAAA,MAAM,cAAc,GAAGA,iBAAW,CAAC,MAAK;QACtC,IAAI,SAAS,KAAK,QAAQ;YAAE;QAC5B,YAAY,CAAC,QAAQ,CAAC;AACtB,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;;AAK/C,IAAA,MAAM,YAAY,GAAGC,aAAO,CAC1B,OAAO;QACL,KAAK;QACL,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,cAAc;AACf,KAAA,CAAC,EACF,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,CAAC,CAC1E;;AAKD,IAAA,MAAM,QAAQ,GAAGA,aAAO,CAAC,OAAO;AAC9B,QAAA,GAAG,YAAY;AACf,QAAA,GAAG,mBAAmB;AACvB,KAAA,CAAC,EAAE,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAIxC,QACEC,eAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,QAAA,EAC3CA,eAAC,YAAY,CAAC,QAAQ,EAAA,EACpB,KAAK,EAAE,QAAQ,EAAA,QAAA,EAEfA,cAAA,CAAC,UAAU,EAAA,EACT,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,KAAK,EAAA,QAAA,EAGd,QAAQ,EAAA,CACE,EAAA,CACS,EAAA,CACC;AAE/B;;;;"}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, useState, useEffect, useCallback, useMemo } from 'react';
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { createContext, useState, useEffect, useContext, useCallback, useMemo } from 'react';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Copyright (c) [2026] [ankjs]
|
|
@@ -8,24 +8,106 @@ const AnkThemeContext = createContext(undefined);
|
|
|
8
8
|
const ColorContext = createContext(undefined);
|
|
9
9
|
|
|
10
10
|
const useSystemTheme = () => {
|
|
11
|
-
const
|
|
11
|
+
const theme = window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
12
12
|
? "dark"
|
|
13
|
-
: "light"
|
|
13
|
+
: "light";
|
|
14
|
+
const [sysTheme, setSysTheme] = useState(theme);
|
|
14
15
|
useEffect(() => {
|
|
15
16
|
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
|
16
17
|
const handleChange = () => {
|
|
17
18
|
setSysTheme(media.matches ? "dark" : "light");
|
|
18
19
|
};
|
|
20
|
+
handleChange();
|
|
19
21
|
media.addEventListener("change", handleChange);
|
|
20
22
|
return () => media.removeEventListener("change", handleChange);
|
|
21
|
-
}, []);
|
|
23
|
+
}, [theme, setSysTheme]);
|
|
22
24
|
return sysTheme;
|
|
23
25
|
};
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
const light = {
|
|
28
|
+
primary: 'red',
|
|
29
|
+
primaryColor: 'red',
|
|
30
|
+
pageBg: '#8d8d8d',
|
|
31
|
+
mainBgColor: '#fff',
|
|
32
|
+
backgroundColor: '#f0f0f0',
|
|
33
|
+
secondryBgColor: '#808080',
|
|
34
|
+
color: '#000',
|
|
35
|
+
};
|
|
36
|
+
const dark = {
|
|
37
|
+
primary: 'red',
|
|
38
|
+
primaryColor: 'red',
|
|
39
|
+
mainBgColor: '#000',
|
|
40
|
+
pageBg: '#333',
|
|
41
|
+
backgroundColor: '#444',
|
|
42
|
+
secondryBgColor: '808080',
|
|
43
|
+
color: '#eee',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const defaultColorsObject = {
|
|
47
|
+
light: light,
|
|
48
|
+
dark: dark,
|
|
49
|
+
};
|
|
50
|
+
const useThemeColors = () => {
|
|
51
|
+
const context = useContext(AnkThemeContext);
|
|
52
|
+
if (!context) {
|
|
53
|
+
throw new Error(` * useThemeColors must be used within a AnkThemeProvider * \n like this - \n import AnkThemeProvider from '@ankjs/react-ui;
|
|
54
|
+
|
|
55
|
+
<AnkThemeProvider>
|
|
56
|
+
<App />
|
|
57
|
+
</AnkThemeProvider>
|
|
58
|
+
`);
|
|
59
|
+
}
|
|
60
|
+
const { light: light$1, dark: dark$1 } = useContext(ColorContext) ?? defaultColorsObject;
|
|
61
|
+
const reLight = light$1 ?? light;
|
|
62
|
+
const reDark = dark$1 ?? dark;
|
|
63
|
+
const theme = context.theme || undefined;
|
|
64
|
+
const themeMode = context.themeType || undefined;
|
|
65
|
+
if (theme === undefined || themeMode === undefined) {
|
|
66
|
+
throw new Error(` * useThemeColors must be used within a AnkThemeProvider * \n like this - \n import AnkThemeProvider from '@ankjs/react-ui;
|
|
67
|
+
|
|
68
|
+
<AnkThemeProvider>
|
|
69
|
+
<App />
|
|
70
|
+
</AnkThemeProvider>
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
else if (context.theme === "light") {
|
|
74
|
+
return {
|
|
75
|
+
...reLight,
|
|
76
|
+
themeMode,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else if (context.theme === "dark") {
|
|
80
|
+
return {
|
|
81
|
+
...reDark,
|
|
82
|
+
themeMode,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
...reLight,
|
|
87
|
+
themeMode: "light"
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const MainUiView = (props) => {
|
|
92
|
+
const { children, autoApply, style, overflow, backgroundColor, fontolor } = props;
|
|
93
|
+
const colors = useThemeColors();
|
|
94
|
+
const { mainBgColor, color } = useThemeColors();
|
|
95
|
+
const bg = autoApply ? mainBgColor : backgroundColor;
|
|
96
|
+
const text = autoApply ? color : fontolor;
|
|
97
|
+
const styleContener = {
|
|
98
|
+
backgroundColor: bg,
|
|
99
|
+
color: text,
|
|
100
|
+
height: "100dvh",
|
|
101
|
+
width: "100%",
|
|
102
|
+
overflow,
|
|
103
|
+
...style
|
|
104
|
+
};
|
|
105
|
+
return (jsxs("div", { style: styleContener, children: [JSON.stringify(colors), children] }));
|
|
106
|
+
};
|
|
107
|
+
|
|
26
108
|
const AnkThemeProvider = (props) => {
|
|
27
109
|
//PROPERTY
|
|
28
|
-
const { children, colorsObjectProvide = "", colorsObject = "", defaultThemeMode = "system", style = {} } = props;
|
|
110
|
+
const { children, colorsObjectProvide = "", colorsObject = "", defaultThemeMode = "system", autoApply = true, style = {}, overflow = 'scroll', backgroundColor = "pink", color = "black" } = props;
|
|
29
111
|
// SYSTEM THEME MODE 🪝
|
|
30
112
|
// Assumed returns 'light' | 'dark'
|
|
31
113
|
const system = useSystemTheme();
|
|
@@ -35,24 +117,30 @@ const AnkThemeProvider = (props) => {
|
|
|
35
117
|
const [theme, setTheme] = useState(initialActiveTheme);
|
|
36
118
|
// State for the user's selected preference
|
|
37
119
|
const [themeType, setThemeType] = useState(defaultThemeMode);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (defaultThemeMode === 'system') {
|
|
122
|
+
setTheme(initialActiveTheme);
|
|
123
|
+
return setThemeType('system');
|
|
124
|
+
}
|
|
125
|
+
}, [defaultThemeMode, initialActiveTheme, setTheme, setThemeType]);
|
|
38
126
|
const setDarkTheme = useCallback(() => {
|
|
39
127
|
if (theme === 'dark')
|
|
40
128
|
return;
|
|
41
129
|
setThemeType('dark');
|
|
42
|
-
setTheme('dark');
|
|
130
|
+
return setTheme('dark');
|
|
43
131
|
}, [theme, setThemeType, setTheme]);
|
|
44
132
|
const setLightTheme = useCallback(() => {
|
|
45
133
|
if (theme === 'light')
|
|
46
134
|
return;
|
|
47
135
|
setThemeType('light');
|
|
48
|
-
setTheme('light');
|
|
136
|
+
return setTheme('light');
|
|
49
137
|
}, [theme, setThemeType, setTheme]);
|
|
50
138
|
const setSystemTheme = useCallback(() => {
|
|
51
139
|
if (themeType === 'system')
|
|
52
140
|
return;
|
|
53
141
|
setThemeType('system');
|
|
54
|
-
setTheme(system);
|
|
55
|
-
}, [
|
|
142
|
+
return setTheme(system);
|
|
143
|
+
}, [themeType, setTheme, system, setThemeType]);
|
|
56
144
|
// Memoize the context value to prevent unnecessary re-renders in consumers
|
|
57
145
|
const contextValue = useMemo(() => ({
|
|
58
146
|
theme,
|
|
@@ -61,13 +149,13 @@ const AnkThemeProvider = (props) => {
|
|
|
61
149
|
setDarkTheme,
|
|
62
150
|
setLightTheme,
|
|
63
151
|
setSystemTheme,
|
|
64
|
-
}), [theme, setTheme, setDarkTheme, setLightTheme, setSystemTheme]);
|
|
152
|
+
}), [theme, themeType, setTheme, setDarkTheme, setLightTheme, setSystemTheme]);
|
|
65
153
|
// WONER COLOUR OBJECT
|
|
66
154
|
const colorObj = useMemo(() => ({
|
|
67
155
|
...colorsObject,
|
|
68
156
|
...colorsObjectProvide,
|
|
69
157
|
}), [colorsObject, colorsObjectProvide]);
|
|
70
|
-
return (jsx(AnkThemeContext.Provider, { value: contextValue, children: jsx(ColorContext.Provider, { value: colorObj, children: children }) }));
|
|
158
|
+
return (jsx(AnkThemeContext.Provider, { value: contextValue, children: jsx(ColorContext.Provider, { value: colorObj, children: jsx(MainUiView, { autoApply: autoApply, style: style, overflow: overflow, backgroundColor: backgroundColor, fontolor: color, children: children }) }) }));
|
|
71
159
|
};
|
|
72
160
|
|
|
73
161
|
export { AnkThemeProvider as default };
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/contexts/AnkThemeContext.ts","../src/hook/useSystemTheme.ts","../src/providers/AnkThemeProvider.tsx"],"sourcesContent":[null,null,null],"names":["_jsx"],"mappings":";;;AAAA;;AAEG;AASI,MAAM,eAAe,GAAG,aAAa,CAA+B,SAAS,CAAC;AAG9E,MAAM,YAAY,GAAG,aAAa,CAA2B,SAAS,CAAC;;
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/contexts/AnkThemeContext.ts","../src/hook/useSystemTheme.ts","../src/constants/colors.ts","../src/hook/useThemeColors.ts","../src/providers/MainUiView.tsx","../src/providers/AnkThemeProvider.tsx"],"sourcesContent":[null,null,null,null,null,null],"names":["defaultLight","defaultDark","light","dark","_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -10,11 +10,14 @@ export interface ThemeHookReturn extends ColorPalette {
|
|
|
10
10
|
themeMode: ThemeModeType | undefined;
|
|
11
11
|
}
|
|
12
12
|
export type ThemeProviderProps = {
|
|
13
|
+
children: ReactNode;
|
|
13
14
|
colorsObjectProvide?: any;
|
|
14
15
|
colorsObject?: any;
|
|
16
|
+
autoApply?: boolean;
|
|
15
17
|
defaultThemeMode?: 'light' | 'dark' | 'system';
|
|
16
18
|
style?: CSSProperties;
|
|
17
|
-
|
|
19
|
+
overflow?: CSSProperties['overflow'];
|
|
20
|
+
color?: CSSProperties['color'];
|
|
18
21
|
};
|
|
19
22
|
export type ThemeContextType = {
|
|
20
23
|
theme?: 'light' | 'dark' | 'system';
|
package/package.json
CHANGED
package/src/constants/colors.ts
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
export const light = {
|
|
5
|
-
primary: '
|
|
5
|
+
primary: 'red',
|
|
6
6
|
primaryColor: 'red',
|
|
7
|
+
pageBg: '#8d8d8d',
|
|
7
8
|
mainBgColor: '#fff',
|
|
8
9
|
backgroundColor: '#f0f0f0',
|
|
9
10
|
secondryBgColor: '#808080',
|
|
10
|
-
pageBg: '#8d8d8d',
|
|
11
11
|
color: '#000',
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export const dark = {
|
|
15
|
-
primary: '
|
|
15
|
+
primary: 'red',
|
|
16
16
|
primaryColor: 'red',
|
|
17
|
-
mainBgColor: '#
|
|
18
|
-
secondryBgColor: '808080',
|
|
17
|
+
mainBgColor: '#000',
|
|
19
18
|
pageBg: '#333',
|
|
20
19
|
backgroundColor: '#444',
|
|
20
|
+
secondryBgColor: '808080',
|
|
21
21
|
color: '#eee',
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -2,25 +2,27 @@ import { useEffect, useState } from "react";
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
|
|
6
7
|
const useSystemTheme = () => {
|
|
7
8
|
|
|
9
|
+
const theme = window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
10
|
+
? "dark"
|
|
11
|
+
: "light"
|
|
8
12
|
|
|
9
13
|
const [sysTheme, setSysTheme] = useState<'light' | 'dark'>(
|
|
10
|
-
|
|
11
|
-
? "dark"
|
|
12
|
-
: "light"
|
|
14
|
+
theme
|
|
13
15
|
);
|
|
14
16
|
|
|
15
|
-
|
|
16
17
|
useEffect(() => {
|
|
17
18
|
const media = window.matchMedia('(prefers-color-scheme: dark)');
|
|
18
19
|
const handleChange = () => {
|
|
19
20
|
setSysTheme(media.matches ? "dark" : "light");
|
|
20
21
|
};
|
|
22
|
+
handleChange();
|
|
21
23
|
media.addEventListener("change", handleChange);
|
|
22
24
|
return () => media.removeEventListener("change", handleChange);
|
|
23
|
-
}, []);
|
|
25
|
+
}, [theme, setSysTheme]);
|
|
24
26
|
|
|
25
27
|
return sysTheme;
|
|
26
28
|
};
|
|
@@ -15,6 +15,7 @@ const defaultColorsObject = {
|
|
|
15
15
|
const useThemeColors = (): ThemeContextType | undefined => {
|
|
16
16
|
const context = useContext(AnkThemeContext);
|
|
17
17
|
|
|
18
|
+
|
|
18
19
|
if (!context) {
|
|
19
20
|
throw new Error(` * useThemeColors must be used within a AnkThemeProvider * \n like this - \n import AnkThemeProvider from '@ankjs/react-ui;
|
|
20
21
|
|
|
@@ -23,13 +24,18 @@ const useThemeColors = (): ThemeContextType | undefined => {
|
|
|
23
24
|
</AnkThemeProvider>
|
|
24
25
|
`)
|
|
25
26
|
};
|
|
27
|
+
|
|
28
|
+
|
|
26
29
|
const { light, dark } = useContext(ColorContext) ?? defaultColorsObject;
|
|
27
30
|
|
|
28
31
|
const reLight = light ?? defaultLight;
|
|
29
32
|
const reDark = dark ?? defaultDark;
|
|
30
33
|
|
|
31
34
|
const theme = context.theme || undefined;
|
|
32
|
-
const themeMode = context.
|
|
35
|
+
const themeMode = context.themeType || undefined;
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
33
39
|
|
|
34
40
|
if (theme === undefined || themeMode === undefined) {
|
|
35
41
|
throw new Error(` * useThemeColors must be used within a AnkThemeProvider * \n like this - \n import AnkThemeProvider from '@ankjs/react-ui;
|
|
@@ -5,14 +5,14 @@ Copyright (c) [2026] [ankjs]
|
|
|
5
5
|
Filename: AnkThemeProvider.tsx
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import React, { useState, useCallback, useMemo } from 'react';
|
|
8
|
+
import React, { useState, useCallback, useMemo, useEffect } from 'react';
|
|
9
9
|
import {
|
|
10
10
|
AnkThemeContext,
|
|
11
11
|
ColorContext
|
|
12
12
|
} from '../contexts/AnkThemeContext';
|
|
13
13
|
import type { ThemeProviderProps } from '../types/themeTypes';
|
|
14
14
|
import useSystemTheme from '../hook/useSystemTheme';
|
|
15
|
-
|
|
15
|
+
import MainUiView from './MainUiView';
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
@@ -26,7 +26,11 @@ const AnkThemeProvider = (props: ThemeProviderProps) => {
|
|
|
26
26
|
colorsObjectProvide = "",
|
|
27
27
|
colorsObject = "",
|
|
28
28
|
defaultThemeMode = "system",
|
|
29
|
-
|
|
29
|
+
autoApply = true,
|
|
30
|
+
style = {},
|
|
31
|
+
overflow = 'scroll',
|
|
32
|
+
backgroundColor = "pink",
|
|
33
|
+
color = "black"
|
|
30
34
|
} = props;
|
|
31
35
|
|
|
32
36
|
|
|
@@ -46,23 +50,32 @@ const AnkThemeProvider = (props: ThemeProviderProps) => {
|
|
|
46
50
|
|
|
47
51
|
|
|
48
52
|
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (defaultThemeMode === 'system') {
|
|
55
|
+
setTheme(initialActiveTheme);
|
|
56
|
+
return setThemeType('system');
|
|
57
|
+
};
|
|
58
|
+
}, [defaultThemeMode, initialActiveTheme, setTheme, setThemeType]);
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
49
62
|
const setDarkTheme = useCallback(() => {
|
|
50
63
|
if (theme === 'dark') return;
|
|
51
64
|
setThemeType('dark');
|
|
52
|
-
setTheme('dark');
|
|
65
|
+
return setTheme('dark');
|
|
53
66
|
}, [theme, setThemeType, setTheme]);
|
|
54
67
|
|
|
55
68
|
const setLightTheme = useCallback(() => {
|
|
56
69
|
if (theme === 'light') return;
|
|
57
70
|
setThemeType('light');
|
|
58
|
-
setTheme('light');
|
|
71
|
+
return setTheme('light');
|
|
59
72
|
}, [theme, setThemeType, setTheme]);
|
|
60
73
|
|
|
61
74
|
const setSystemTheme = useCallback(() => {
|
|
62
75
|
if (themeType === 'system') return
|
|
63
76
|
setThemeType('system');
|
|
64
|
-
setTheme(system);
|
|
65
|
-
}, [
|
|
77
|
+
return setTheme(system);
|
|
78
|
+
}, [themeType, setTheme, system, setThemeType]);
|
|
66
79
|
|
|
67
80
|
|
|
68
81
|
|
|
@@ -72,13 +85,11 @@ const AnkThemeProvider = (props: ThemeProviderProps) => {
|
|
|
72
85
|
theme,
|
|
73
86
|
themeType,
|
|
74
87
|
setTheme,
|
|
75
|
-
|
|
76
|
-
|
|
77
88
|
setDarkTheme,
|
|
78
89
|
setLightTheme,
|
|
79
90
|
setSystemTheme,
|
|
80
91
|
}),
|
|
81
|
-
[theme, setTheme, setDarkTheme, setLightTheme, setSystemTheme],
|
|
92
|
+
[theme, themeType, setTheme, setDarkTheme, setLightTheme, setSystemTheme],
|
|
82
93
|
);
|
|
83
94
|
|
|
84
95
|
|
|
@@ -96,7 +107,16 @@ const AnkThemeProvider = (props: ThemeProviderProps) => {
|
|
|
96
107
|
<ColorContext.Provider
|
|
97
108
|
value={colorObj}
|
|
98
109
|
>
|
|
99
|
-
|
|
110
|
+
<MainUiView
|
|
111
|
+
autoApply={autoApply}
|
|
112
|
+
style={style}
|
|
113
|
+
overflow={overflow}
|
|
114
|
+
backgroundColor={backgroundColor}
|
|
115
|
+
fontolor={color}
|
|
116
|
+
>
|
|
117
|
+
|
|
118
|
+
{children}
|
|
119
|
+
</MainUiView>
|
|
100
120
|
</ColorContext.Provider>
|
|
101
121
|
</AnkThemeContext.Provider>
|
|
102
122
|
)
|
|
@@ -104,76 +124,4 @@ const AnkThemeProvider = (props: ThemeProviderProps) => {
|
|
|
104
124
|
export default AnkThemeProvider;
|
|
105
125
|
|
|
106
126
|
/*
|
|
107
|
-
|
|
108
|
-
import React, { useState, useCallback, useMemo, ReactNode } from 'react';
|
|
109
|
-
|
|
110
|
-
interface ThemeProviderProps {
|
|
111
|
-
children: ReactNode; // Fixes the "Type {} is not assignable to ReactNode" error
|
|
112
|
-
colorsObjectProvide?: any;
|
|
113
|
-
colorsObject?: any;
|
|
114
|
-
defaultThemeMode?: 'light' | 'dark' | 'system';
|
|
115
|
-
style?: React.CSSProperties;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const AnkThemeProvider = (props: ThemeProviderProps) => {
|
|
119
|
-
const {
|
|
120
|
-
children,
|
|
121
|
-
colorsObjectProvide = {},
|
|
122
|
-
colorsObject = {},
|
|
123
|
-
defaultThemeMode = "system",
|
|
124
|
-
} = props;
|
|
125
|
-
|
|
126
|
-
const system = useSystemTheme(); // Assumed returns 'light' | 'dark'
|
|
127
|
-
|
|
128
|
-
// Determine initial active theme
|
|
129
|
-
const initialActiveTheme = defaultThemeMode === "system" ? system : defaultThemeMode;
|
|
130
|
-
|
|
131
|
-
// State for the active visual mode
|
|
132
|
-
const [theme, setTheme] = useState<'light' | 'dark'>(initialActiveTheme as 'light' | 'dark');
|
|
133
|
-
|
|
134
|
-
// State for the user's selected preference
|
|
135
|
-
const [themeType, setType] = useState<'light' | 'dark' | 'system'>(defaultThemeMode);
|
|
136
|
-
|
|
137
|
-
const setDarkTheme = useCallback(() => {
|
|
138
|
-
setTheme('dark');
|
|
139
|
-
setType('dark');
|
|
140
|
-
}, []);
|
|
141
|
-
|
|
142
|
-
const setLightTheme = useCallback(() => {
|
|
143
|
-
setTheme('light');
|
|
144
|
-
setType('light');
|
|
145
|
-
}, []);
|
|
146
|
-
|
|
147
|
-
const setSystemTheme = useCallback(() => {
|
|
148
|
-
setType('system');
|
|
149
|
-
setTheme(system);
|
|
150
|
-
}, [system]);
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const contextValue = useMemo(
|
|
155
|
-
() => ({
|
|
156
|
-
theme,
|
|
157
|
-
themeType,
|
|
158
|
-
setTheme,
|
|
159
|
-
setDarkTheme,
|
|
160
|
-
setLightTheme,
|
|
161
|
-
setSystemTheme,
|
|
162
|
-
}),
|
|
163
|
-
[theme, themeType, setTheme, setDarkTheme, setLightTheme, setSystemTheme],
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
const colorObj = useMemo(() => ({
|
|
167
|
-
...colorsObject,
|
|
168
|
-
...colorsObjectProvide,
|
|
169
|
-
}), [colorsObject, colorsObjectProvide]);
|
|
170
|
-
|
|
171
|
-
return (
|
|
172
|
-
<AnkThemeContext.Provider value={contextValue}>
|
|
173
|
-
<ColorContext.Provider value={colorObj}>
|
|
174
|
-
{children}
|
|
175
|
-
</ColorContext.Provider>
|
|
176
|
-
</AnkThemeContext.Provider>
|
|
177
|
-
);
|
|
178
|
-
};
|
|
179
|
-
*/
|
|
127
|
+
*/
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import useThemeColors from '../hook/useThemeColors';
|
|
2
|
+
import type { MainPropsType } from '../types/mainViewType';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const MainUiView = (props: MainPropsType) => {
|
|
10
|
+
const {
|
|
11
|
+
children,
|
|
12
|
+
autoApply,
|
|
13
|
+
style,
|
|
14
|
+
overflow,
|
|
15
|
+
backgroundColor,
|
|
16
|
+
fontolor
|
|
17
|
+
} = props;
|
|
18
|
+
|
|
19
|
+
const colors = useThemeColors();
|
|
20
|
+
const {
|
|
21
|
+
mainBgColor, color
|
|
22
|
+
} = useThemeColors();
|
|
23
|
+
|
|
24
|
+
const bg = autoApply ? mainBgColor : backgroundColor
|
|
25
|
+
const text = autoApply ? color: fontolor ;
|
|
26
|
+
|
|
27
|
+
const styleContener = {
|
|
28
|
+
backgroundColor: bg,
|
|
29
|
+
color: text,
|
|
30
|
+
height: "100dvh",
|
|
31
|
+
width: "100%",
|
|
32
|
+
overflow,
|
|
33
|
+
...style
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div
|
|
39
|
+
style={styleContener}
|
|
40
|
+
>
|
|
41
|
+
{
|
|
42
|
+
JSON.stringify(colors)
|
|
43
|
+
}
|
|
44
|
+
{children}
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
};
|
|
48
|
+
export default MainUiView;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
import React, { CSSProperties, ReactNode } from 'react'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export type MainPropsType = {
|
|
9
|
+
children: ReactNode,
|
|
10
|
+
autoApply: boolean,
|
|
11
|
+
style?: CSSProperties,
|
|
12
|
+
overflow?: CSSProperties['overflow'],
|
|
13
|
+
fontolor?: CSSProperties['color']
|
|
14
|
+
}
|
package/src/types/themeTypes.ts
CHANGED
|
@@ -13,11 +13,14 @@ export interface ThemeHookReturn extends ColorPalette {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export type ThemeProviderProps = {
|
|
16
|
+
children: ReactNode; // Fixes the "Type {} is not assignable to ReactNode" error
|
|
16
17
|
colorsObjectProvide?: any,
|
|
17
18
|
colorsObject?: any,
|
|
19
|
+
autoApply?: boolean,
|
|
18
20
|
defaultThemeMode?: 'light' | 'dark' | 'system',
|
|
19
21
|
style?: CSSProperties,
|
|
20
|
-
|
|
22
|
+
overflow?: CSSProperties['overflow']
|
|
23
|
+
color?: CSSProperties['color']
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
export type ThemeContextType = {
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import useThemeColors from '../hook/useThemeColors'
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export default function MainUiView(props) {
|
|
8
|
-
const {
|
|
9
|
-
children,
|
|
10
|
-
autoColorApply,
|
|
11
|
-
colorObject,
|
|
12
|
-
style,
|
|
13
|
-
others,
|
|
14
|
-
} = props;
|
|
15
|
-
|
|
16
|
-
const colors = useThemeColors();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const styleContener = {
|
|
20
|
-
...style
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<div
|
|
25
|
-
style={styleContener}
|
|
26
|
-
>
|
|
27
|
-
{
|
|
28
|
-
JSON.stringify(colors)
|
|
29
|
-
}
|
|
30
|
-
{children}
|
|
31
|
-
</div>
|
|
32
|
-
)
|
|
33
|
-
};
|