@@ -11,8 +11,13 @@ const appThemes = new Map();
1111let themeApplied = false ;
1212let firstTime = true ;
1313
14+ const darkModeMediaQuery = window . matchMedia ( "(prefers-color-scheme: dark)" ) ;
15+ let systemThemeWatcherActive = false ;
16+
1417function init ( ) {
1518 themes . forEach ( ( theme ) => add ( theme ) ) ;
19+ updateSystemThemeWatcher ( settings . value . appTheme ) ;
20+ settings . on ( "update:appTheme" , updateSystemThemeWatcher ) ;
1621}
1722
1823/**
@@ -159,6 +164,45 @@ export function update(theme) {
159164 } ) ;
160165}
161166
167+ function syncSystemTheme ( event ) {
168+ if ( settings . value . appTheme . toLowerCase ( ) !== "system" ) return ;
169+ const isDark = event ? event . matches : darkModeMediaQuery . matches ;
170+ updateSystemTheme ( isDark ) ;
171+ }
172+
173+ function startSystemThemeWatcher ( ) {
174+ if ( systemThemeWatcherActive ) return ;
175+ systemThemeWatcherActive = true ;
176+ if ( typeof darkModeMediaQuery . addEventListener === "function" ) {
177+ darkModeMediaQuery . addEventListener ( "change" , syncSystemTheme ) ;
178+ } else {
179+ darkModeMediaQuery . addListener ( syncSystemTheme ) ;
180+ }
181+ }
182+
183+ function stopSystemThemeWatcher ( ) {
184+ if ( ! systemThemeWatcherActive ) return ;
185+ systemThemeWatcherActive = false ;
186+ if ( typeof darkModeMediaQuery . removeEventListener === "function" ) {
187+ darkModeMediaQuery . removeEventListener ( "change" , syncSystemTheme ) ;
188+ } else {
189+ darkModeMediaQuery . removeListener ( syncSystemTheme ) ;
190+ }
191+ }
192+
193+ /**
194+ * Start or stop syncing the app theme with the OS color scheme
195+ * @param {string } theme
196+ */
197+ export function updateSystemThemeWatcher ( theme ) {
198+ if ( String ( theme ) . toLowerCase ( ) === "system" ) {
199+ startSystemThemeWatcher ( ) ;
200+ syncSystemTheme ( ) ;
201+ return ;
202+ }
203+ stopSystemThemeWatcher ( ) ;
204+ }
205+
162206export default {
163207 get applied ( ) {
164208 return themeApplied ;
@@ -169,4 +213,5 @@ export default {
169213 add,
170214 apply,
171215 update,
216+ updateSystemThemeWatcher,
172217} ;
0 commit comments