| | |
| | | const getStoredThemeStyle = () => localStorage.getItem('theme'); |
| | | |
| | | const setThemeClass = (style) => { |
| | | const setThemeStyle = (style) => { |
| | | localStorage.setItem('theme', style); |
| | | const html = document.documentElement; |
| | | const prevTheme = [...html.classList].find((c) => c.match(/theme--(light|dark)/)); |
| | | if (!prevTheme) return; |
| | | html.classList.remove(prevTheme); |
| | | if (prevTheme) { |
| | | html.classList.remove(prevTheme); |
| | | } |
| | | html.classList.add(`theme--${style}`); |
| | | }; |
| | | |
| | | const setThemeStyle = (style) => { |
| | | localStorage.setItem('theme', style); |
| | | setThemeClass(style); |
| | | const setDarkTheme = () => { |
| | | setThemeStyle('dark'); |
| | | }; |
| | | const setLightTheme = () => { |
| | | setThemeStyle('light'); |
| | | }; |
| | | |
| | | const switchTheme = () => { |
| | | const currThemeStyle = getStoredThemeStyle(); |
| | | switch (currThemeStyle) { |
| | | case 'light': |
| | | setThemeStyle('dark'); |
| | | setDarkTheme(); |
| | | break; |
| | | case 'dark': |
| | | setThemeStyle('light'); |
| | | setLightTheme(); |
| | | break; |
| | | default: |
| | | setThemeStyle('light'); |
| | | setLightTheme(); |
| | | break; |
| | | } |
| | | }; |
| | |
| | | false, |
| | | ); |
| | | |
| | | window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', switchTheme, false); |
| | | window |
| | | .matchMedia('(prefers-color-scheme: dark)') |
| | | .addEventListener('change', (e) => (e.matches ? setDarkTheme() : setLightTheme()), false); |
| | | |
| | | const currThemeStyle = getStoredThemeStyle(); |
| | | if (currThemeStyle) { |
| | | setThemeStyle(currThemeStyle); |
| | | } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { |
| | | setDarkTheme(); |
| | | } else { |
| | | const userPrefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; |
| | | if (userPrefersDark) { |
| | | setThemeStyle('dark'); |
| | | } |
| | | setLightTheme(); |
| | | } |