11import { browser } from '$app/environment' ;
22import { type Updater , writable } from 'svelte/store' ;
33
4- function getLocalStoreState ( ) {
4+ export enum LightMode {
5+ Dark = 'dark' ,
6+ Light = 'light' ,
7+ System = 'system' ,
8+ }
9+
10+ function getLocalStoreState ( ) : LightMode {
511 const scheme = localStorage . getItem ( 'theme' ) ;
6- if ( scheme === 'dark' || scheme === 'light' || scheme === 'system' ) {
7- return scheme ;
12+ if ( scheme !== null && Object . values ( LightMode ) . includes ( scheme as LightMode ) ) {
13+ return scheme as LightMode ;
814 }
915
10- localStorage . setItem ( 'theme' , 'system' ) ;
16+ localStorage . setItem ( 'theme' , LightMode . System ) ;
1117
12- return 'system' ;
18+ return LightMode . System ;
1319}
1420
1521export function getDarkReaderState ( ) {
1622 const rootHtml = document . documentElement ;
1723
1824 const proxyInjected = rootHtml . getAttribute ( 'data-darkreader-proxy-injected' ) ;
1925 const metaElement = rootHtml . querySelector ( 'head meta[name="darkreader"]' ) ;
20-
21- let scheme = rootHtml . getAttribute ( 'data-darkreader-scheme' ) ;
22- if ( scheme === 'auto' ) {
23- scheme = 'system' ;
24- }
26+ const scheme = rootHtml . getAttribute ( 'data-darkreader-scheme' ) ;
2527
2628 return {
2729 isInjected : proxyInjected === 'true' ,
@@ -30,58 +32,56 @@ export function getDarkReaderState() {
3032 } ;
3133}
3234
33- function getColorSchemePreference ( ) {
35+ function getColorSchemePreference ( ) : LightMode {
3436 // If we are not in a browser environment, return default
3537 if ( ! browser ) {
36- return 'system' ;
38+ return LightMode . System ;
3739 }
3840
3941 // Check if local storage has a theme stored
4042 const localStoreState = getLocalStoreState ( ) ;
41- if ( localStoreState !== 'system' ) {
43+ if ( localStoreState !== LightMode . System ) {
4244 return localStoreState ;
4345 }
4446
4547 // If a user has Dark Reader extension installed, assume they prefer dark mode
4648 const darkReaderState = getDarkReaderState ( ) ;
4749 if ( darkReaderState . isInjected ) {
48- return 'dark' ;
50+ return LightMode . Dark ;
4951 }
5052
5153 // Check if the user has a system theme preference for light mode
5254 if ( window . matchMedia ( '(prefers-color-scheme: light)' ) . matches ) {
53- return 'light' ;
55+ return LightMode . Light ;
5456 }
5557
5658 // Default to dark mode
57- return 'dark' ;
59+ return LightMode . Dark ;
5860}
5961
60- const { set, update, subscribe } = writable < 'dark' | 'light' | 'system' > (
61- getColorSchemePreference ( )
62- ) ;
62+ const { set, update, subscribe } = writable < LightMode > ( getColorSchemePreference ( ) ) ;
6363
6464function setHtmlDarkModeSelector ( value : boolean ) {
6565 document . documentElement . classList . toggle ( 'dark' , value ) ;
6666}
6767
6868function handleSchemePreferenceChange ( ) {
6969 const scheme = getColorSchemePreference ( ) ;
70- setHtmlDarkModeSelector ( scheme === 'dark' ) ;
70+ setHtmlDarkModeSelector ( scheme === LightMode . Dark ) ;
7171}
7272
7373export const ColorSchemeStore = {
74- set : ( value : 'dark' | 'light' | 'system' ) => {
74+ set : ( value : LightMode ) => {
7575 localStorage . setItem ( 'theme' , value ) ;
7676 set ( value ) ;
7777 handleSchemePreferenceChange ( ) ;
7878 } ,
79- update : ( updater : Updater < 'dark' | 'light' | 'system' > ) => {
79+ update : ( updater : Updater < LightMode > ) => {
8080 update ( ( value ) => {
8181 const oldValue = value ;
8282 const newValue = updater ( value ) ;
8383 if ( oldValue !== newValue ) {
84- setHtmlDarkModeSelector ( newValue === 'dark' ) ;
84+ setHtmlDarkModeSelector ( newValue === LightMode . Dark ) ;
8585 localStorage . setItem ( 'theme' , newValue ) ;
8686 }
8787 return newValue ;
@@ -90,16 +90,9 @@ export const ColorSchemeStore = {
9090 subscribe,
9191} ;
9292
93- export function willActivateLightMode ( value : 'dark' | 'light' | 'system' ) {
94- return (
95- value === 'light' ||
96- ( value === 'system' && window . matchMedia ( '(prefers-color-scheme: light)' ) . matches )
97- ) ;
98- }
99-
10093export function initializeDarkModeStore ( ) {
10194 const schemePreference = getColorSchemePreference ( ) ;
102- setHtmlDarkModeSelector ( schemePreference === 'dark' ) ;
95+ setHtmlDarkModeSelector ( schemePreference === LightMode . Dark ) ;
10396
10497 window
10598 . matchMedia ( '(prefers-color-scheme: light)' )
@@ -111,6 +104,6 @@ export function initializeDarkModeStore() {
111104 window . addEventListener ( 'storage' , ( event ) => {
112105 if ( event . key !== 'theme' ) return ;
113106
114- setHtmlDarkModeSelector ( event . newValue === 'dark' ) ;
107+ setHtmlDarkModeSelector ( event . newValue === LightMode . Dark ) ;
115108 } ) ;
116109}
0 commit comments