Skip to content

Commit 3351395

Browse files
committed
support browserMode in theme script
1 parent f935680 commit 3351395

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

src/components/ThemeScript.astro

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
---
22
import * as themeConstants from '@/constants/theme';
3+
import { CONFIG } from '@/config';
34
import { getDefaultThemes } from '@/utils/theme';
45
56
const defaultThemes = getDefaultThemes();
67
---
78

89
{/* Inlined to avoid flash of white content. */}
9-
<script is:inline define:vars={{ themeConstants, defaultThemes }}>
10+
<script is:inline define:vars={{ themeConstants, defaultThemes, CONFIG }}>
1011
// this is JavaScript, not TypeScript
12+
const { DEFAULT_MODE } = CONFIG;
1113
const { MODES, THEMES, THEME_CONFIG } = themeConstants;
1214
const { DATA_ATTRIBUTE, CHANGE_EVENT, LOCAL_STORAGE_KEY } = THEME_CONFIG;
1315

16+
// used for event
1417
const darkModePreference = window.matchMedia('(prefers-color-scheme: dark)');
1518

16-
// 1. stored mode
17-
// 2. default app mode, config
18-
// 3. OS mode
19-
2019
// light is default
2120
const getMode = (themeMode) => (themeMode === MODES.dark ? MODES.dark : MODES.light);
2221

@@ -31,23 +30,46 @@ const defaultThemes = getDefaultThemes();
3130
return newTheme;
3231
};
3332

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;
4151
};
4252

53+
/**
54+
* 1. stored mode
55+
* 2. browser mode and theme
56+
* 3. default app mode, config
57+
*/
4358
const getTheme = () => {
4459
// either from storage
4560
const storedTheme = getStoredTheme();
4661
if (storedTheme) return storedTheme;
4762

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;
5173
};
5274

5375
const getStoredTheme = () => {
@@ -80,6 +102,7 @@ const defaultThemes = getDefaultThemes();
80102
);
81103

82104
if (!validatedTheme)
105+
// eslint-disable-next-line no-console
83106
return console.warn(
84107
`Invalid theme value '${JSON.stringify(newTheme)}' received. Expected ${JSON.stringify(THEMES)}.`
85108
);

0 commit comments

Comments
 (0)