@@ -32,27 +32,68 @@ document.addEventListener('DOMContentLoaded', (event) => {
3232 const switchEl = document . getElementById ( 'darkModeSwitch' ) ;
3333 const darkEl = document . getElementById ( 'dark-mode-bi' ) ;
3434 const lightEl = document . getElementById ( 'light-mode-bi' ) ;
35+
36+ function setIcon ( mode ) {
37+ if ( mode == 'dark' && darkEl . classList . contains ( 'd-none' ) ) {
38+ lightEl . classList . add ( 'd-none' ) ;
39+ darkEl . classList . remove ( 'd-none' ) ;
40+ } else if ( mode == 'light' && lightEl . classList . contains ( 'd-none' ) ) {
41+ darkEl . classList . add ( 'd-none' ) ;
42+ lightEl . classList . remove ( 'd-none' ) ;
43+ }
44+ }
45+
46+ function toggleIcon ( mode ) {
47+ if ( mode == 'dark' ) {
48+ setIcon ( 'light' ) ;
49+ } else if ( mode == 'light' ) {
50+ setIcon ( 'dark' ) ;
51+ }
52+ }
3553
54+ function switchMode ( mode , bsTheme ) {
55+ if ( mode == true ) {
56+ htmlEl . setAttribute ( 'data-bs-theme' , 'dark' ) ;
57+ if ( bsTheme == true ) {
58+ localStorage . setItem ( 'bsTheme' , 'dark' ) ;
59+ }
60+ toggleIcon ( 'dark' ) ;
61+ } else {
62+ htmlEl . setAttribute ( 'data-bs-theme' , 'light' ) ;
63+ if ( bsTheme == true ) {
64+ localStorage . setItem ( 'bsTheme' , 'light' ) ;
65+ }
66+ toggleIcon ( 'light' ) ;
67+ }
68+ }
69+ const currentTheme = localStorage . getItem ( 'bsTheme' ) || null ;
70+
71+ // Set the theme by OS preferences
72+ if ( window . matchMedia ) {
73+ var osMode = window . matchMedia ( '(prefers-color-scheme: dark)' )
74+ if ( currentTheme == null ) {
75+ switchEl . setAttribute ( 'checked' , osMode . matches ) ;
76+ switchMode ( osMode . matches , false ) ;
77+ }
78+ osMode . addEventListener ( 'change' , e => {
79+ if ( currentTheme == null ) {
80+ switchEl . setAttribute ( 'checked' , osMode . matches ) ;
81+ switchMode ( osMode . matches , false ) ;
82+ }
83+ } )
84+
85+ }
3686 // Set the default theme to light if no setting is found in local storage
37- const currentTheme = localStorage . getItem ( 'bsTheme' ) || 'light' ;
38- htmlEl . setAttribute ( 'data-bs-theme' , currentTheme ) ;
39- switchEl . checked = currentTheme === 'light' ;
87+
88+ toggleIcon ( currentTheme ) ;
4089
4190 switchEl . addEventListener ( 'change' , function ( ) {
4291 if ( this . checked ) {
43- htmlEl . setAttribute ( 'data-bs-theme' , 'light' ) ;
44- localStorage . setItem ( 'bsTheme' , 'light' ) ;
45- if ( darkEl . classList . contains ( 'd-none' ) ) {
46- lightEl . classList . add ( 'd-none' ) ;
47- darkEl . classList . remove ( 'd-none' ) ;
48- }
92+ switchMode ( false , true ) ;
93+ setIcon ( 'dark' ) ;
4994 } else {
50- htmlEl . setAttribute ( 'data-bs-theme' , 'dark' ) ;
51- localStorage . setItem ( 'bsTheme' , 'dark' ) ;
52- if ( lightEl . classList . contains ( 'd-none' ) ) {
53- darkEl . classList . add ( 'd-none' ) ;
54- lightEl . classList . remove ( 'd-none' ) ;
55- }
95+ switchMode ( true , true ) ;
96+ setIcon ( 'light' ) ;
5697 }
5798 } ) ;
5899} ) ;
0 commit comments