1
1
---
2
2
import * as themeConstants from ' @/constants/theme' ;
3
+ import { CONFIG } from ' @/config' ;
3
4
import { getDefaultThemes } from ' @/utils/theme' ;
4
5
5
6
const defaultThemes = getDefaultThemes ();
6
7
---
7
8
8
9
{ /* Inlined to avoid flash of white content. */ }
9
- <script is:inline define:vars ={ { themeConstants , defaultThemes }} >
10
+ <script is:inline define:vars ={ { themeConstants , defaultThemes , CONFIG }} >
10
11
// this is JavaScript, not TypeScript
12
+ const { DEFAULT_MODE } = CONFIG;
11
13
const { MODES, THEMES, THEME_CONFIG } = themeConstants;
12
14
const { DATA_ATTRIBUTE, CHANGE_EVENT, LOCAL_STORAGE_KEY } = THEME_CONFIG;
13
15
16
+ // used for event
14
17
const darkModePreference = window.matchMedia('(prefers-color-scheme: dark)');
15
18
16
- // 1. stored mode
17
- // 2. default app mode, config
18
- // 3. OS mode
19
-
20
19
// light is default
21
20
const getMode = (themeMode) => (themeMode === MODES.dark ? MODES.dark : MODES.light);
22
21
@@ -31,23 +30,46 @@ const defaultThemes = getDefaultThemes();
31
30
return newTheme;
32
31
};
33
32
34
- const getOSMode = () => (darkModePreference.matches ? MODES.dark : MODES.light);
35
-
36
- const getOSTheme = () => {
37
- const themeMode = getOSMode();
38
- const defaultOSTheme = getDefaultTheme(themeMode);
39
-
40
- return defaultOSTheme;
33
+ /** 'dark' | 'light' | null */
34
+ const getBrowserMode = () => {
35
+ const lightModePreference = window.matchMedia('(prefers-color-scheme: light)');
36
+
37
+ let browserMode;
38
+
39
+ switch (true) {
40
+ case darkModePreference.matches:
41
+ browserMode = MODES.dark;
42
+ break;
43
+ case lightModePreference.matches:
44
+ browserMode = MODES.light;
45
+ break;
46
+ default:
47
+ browserMode = null;
48
+ break;
49
+ }
50
+ return browserMode;
41
51
};
42
52
53
+ /**
54
+ * 1. stored mode
55
+ * 2. browser mode and theme
56
+ * 3. default app mode, config
57
+ */
43
58
const getTheme = () => {
44
59
// either from storage
45
60
const storedTheme = getStoredTheme();
46
61
if (storedTheme) return storedTheme;
47
62
48
- // or fallback to default theme for OS mode
49
- const defaultOSTheme = getOSTheme();
50
- return defaultOSTheme;
63
+ // or fallback to default theme for browser mode
64
+ const browserMode = getBrowserMode();
65
+ if (browserMode) {
66
+ const defaultBrowserTheme = getDefaultTheme(browserMode);
67
+ return defaultBrowserTheme;
68
+ }
69
+
70
+ // fallback to app default
71
+ const defaultAppTheme = getDefaultTheme(DEFAULT_MODE);
72
+ return defaultAppTheme;
51
73
};
52
74
53
75
const getStoredTheme = () => {
@@ -80,6 +102,7 @@ const defaultThemes = getDefaultThemes();
80
102
);
81
103
82
104
if (!validatedTheme)
105
+ // eslint-disable-next-line no-console
83
106
return console.warn(
84
107
`Invalid theme value '${JSON.stringify(newTheme)}' received. Expected ${JSON.stringify(THEMES)}.`
85
108
);
0 commit comments