1- var checkbox = document . querySelector ( 'input[name=mode]' )
2- checkbox . addEventListener ( 'change' , function ( ) {
3- if ( this . checked ) {
4- document . documentElement . setAttribute ( 'data-theme' , 'dark' )
5- var moon = document . getElementById ( 'moon' )
6- moon . innerHTML = feather . icons [ 'sun' ] . toSvg ( { 'fill' : 'var(--fg-color-dark)' } )
7- } else {
8- document . documentElement . setAttribute ( 'data-theme' , 'light' )
9- var moon = document . getElementById ( 'moon' )
10- moon . innerHTML = feather . icons [ 'moon' ] . toSvg ( { 'fill' : 'var(--fg-color-dark)' } )
11- }
12- } )
1+ var checkbox = document . querySelector ( 'input[name=mode]' ) ;
2+ var moon = document . getElementById ( 'moon' ) ;
3+ var storageKey = 'theme-preference' ;
4+ var mediaQuery = window . matchMedia ( '(prefers-color-scheme: dark)' ) ;
5+
6+ function setIcon ( theme ) {
7+ if ( ! moon || typeof feather === 'undefined' ) {
8+ return ;
9+ }
10+
11+ var iconName = theme === 'dark' ? 'sun' : 'moon' ;
12+ moon . innerHTML = feather . icons [ iconName ] . toSvg ( { fill : 'var(--fg-color-dark)' } ) ;
13+ }
14+
15+ function applyTheme ( theme ) {
16+ document . documentElement . setAttribute ( 'data-theme' , theme ) ;
17+ if ( checkbox ) {
18+ checkbox . checked = theme === 'dark' ;
19+ }
20+ setIcon ( theme ) ;
21+ }
22+
23+ function getPreferredTheme ( ) {
24+ var saved = localStorage . getItem ( storageKey ) ;
25+ if ( saved === 'light' || saved === 'dark' ) {
26+ return saved ;
27+ }
28+ return mediaQuery . matches ? 'dark' : 'light' ;
29+ }
30+
31+ if ( checkbox ) {
32+ applyTheme ( getPreferredTheme ( ) ) ;
33+
34+ checkbox . addEventListener ( 'change' , function ( ) {
35+ var theme = this . checked ? 'dark' : 'light' ;
36+ localStorage . setItem ( storageKey , theme ) ;
37+ applyTheme ( theme ) ;
38+ } ) ;
39+ }
40+
41+ function handleSystemThemeChange ( event ) {
42+ var saved = localStorage . getItem ( storageKey ) ;
43+ if ( saved === 'light' || saved === 'dark' ) {
44+ return ;
45+ }
46+ applyTheme ( event . matches ? 'dark' : 'light' ) ;
47+ }
48+
49+ if ( typeof mediaQuery . addEventListener === 'function' ) {
50+ mediaQuery . addEventListener ( 'change' , handleSystemThemeChange ) ;
51+ } else if ( typeof mediaQuery . addListener === 'function' ) {
52+ mediaQuery . addListener ( handleSystemThemeChange ) ;
53+ }
0 commit comments