|
134 | 134 |
|
135 | 135 | // Toggle color modes
|
136 | 136 |
|
137 |
| - var currentTheme = localStorage.getItem('theme') |
138 |
| - var currentThemeIcon = document.querySelector('#bd-theme > .bi use') |
| 137 | + var root = document.documentElement |
| 138 | + var activeTheme = localStorage.getItem('theme') |
| 139 | + var activeThemeIcon = document.querySelector('.theme-icon-active use') |
139 | 140 |
|
140 |
| - function checkMatchMedia() { |
141 |
| - if (window.matchMedia('(prefers-color-scheme: dark)').matches && !currentTheme) { |
| 141 | + var checkSystemTheme = function () { |
| 142 | + // if OS dark mode is set, and there's no stored theme, set the theme to dark (but don't store it) |
| 143 | + if (window.matchMedia('(prefers-color-scheme: dark)').matches && !activeTheme) { |
142 | 144 | document.documentElement.setAttribute('data-theme', 'dark')
|
143 | 145 | } else {
|
| 146 | + // otherwise, set the theme to the default (light) |
144 | 147 | document.documentElement.removeAttribute('data-theme')
|
145 | 148 | }
|
146 | 149 | }
|
147 | 150 |
|
148 |
| - document.querySelectorAll('.bd-theme-toggles .dropdown-item') |
149 |
| - .forEach(function (toggle) { |
150 |
| - toggle.addEventListener('click', function () { |
151 |
| - var theme = this.getAttribute('data-theme-value') |
| 151 | + var setTheme = function (theme) { |
| 152 | + document.querySelectorAll('[data-theme-value]').forEach(function (el) { |
| 153 | + el.classList.remove('active') |
| 154 | + }) |
152 | 155 |
|
153 |
| - document.querySelector('.bd-theme-toggles .current').removeAttribute('class') |
154 |
| - toggle.parentElement.setAttribute('class', 'current') |
| 156 | + var btnToActive = document.querySelector('[data-theme-value="' + theme + '"]') |
| 157 | + var svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href') |
155 | 158 |
|
156 |
| - var svg = toggle.querySelector('.theme-icon use').getAttribute('href') |
157 |
| - currentThemeIcon.setAttribute('href', svg) |
| 159 | + btnToActive.classList.add('active') |
| 160 | + activeThemeIcon.setAttribute('href', svgOfActiveBtn) |
| 161 | + } |
158 | 162 |
|
159 |
| - console.log(theme) |
| 163 | + document.querySelectorAll('[data-theme-value]') |
| 164 | + .forEach(function (toggle) { |
| 165 | + toggle.addEventListener('click', function () { |
| 166 | + var theme = this.getAttribute('data-theme-value') |
160 | 167 |
|
161 |
| - // in OS darkmode, going from light to auto doesn't make it dark |
| 168 | + setTheme(theme) |
162 | 169 |
|
163 | 170 | if (theme === 'auto') {
|
164 |
| - document.documentElement.removeAttribute('data-theme') |
| 171 | + root.removeAttribute('data-theme') |
165 | 172 | localStorage.removeItem('theme')
|
166 |
| - checkMatchMedia() |
| 173 | + checkSystemTheme() |
167 | 174 | } else {
|
168 |
| - document.documentElement.setAttribute('data-theme', theme) |
| 175 | + root.setAttribute('data-theme', theme) |
169 | 176 | localStorage.setItem('theme', theme)
|
170 | 177 | }
|
171 | 178 | })
|
172 | 179 | })
|
173 | 180 |
|
174 |
| - if (currentTheme) { |
175 |
| - var currentThemeButton = document.querySelector('.dropdown-item[data-theme-value="' + currentTheme + '"]') |
176 |
| - document.documentElement.setAttribute('data-theme', currentTheme) |
177 |
| - document.querySelector('.bd-theme-toggles .current').removeAttribute('class') |
178 |
| - currentThemeButton.parentElement.setAttribute('class', 'current') |
179 |
| - var svg = currentThemeButton.querySelector('.theme-icon use').getAttribute('href') |
180 |
| - currentThemeIcon.setAttribute('href', svg) |
| 181 | + if (activeTheme) { |
| 182 | + root.setAttribute('data-theme', activeTheme) |
| 183 | + setTheme(activeTheme) |
181 | 184 | } else {
|
182 | 185 | window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function () {
|
183 |
| - checkMatchMedia() |
| 186 | + checkSystemTheme() |
184 | 187 | })
|
185 |
| - checkMatchMedia() |
| 188 | + checkSystemTheme() |
186 | 189 | }
|
187 | 190 |
|
188 | 191 | // Insert copy to clipboard button before .highlight
|
|
0 commit comments