2 * https://getbootstrap.com/docs/5.3/customize/color-modes/#javascript
4 * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
5 * Copyright 2011-2025 The Bootstrap Authors
6 * Licensed under the Creative Commons Attribution 3.0 Unported License.
9 export function initColorToggler() {
11 const getStoredTheme = () => localStorage.getItem('theme')
12 const setStoredTheme = theme => localStorage.setItem('theme', theme)
14 const getPreferredTheme = () => {
15 const storedTheme = getStoredTheme()
20 return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
23 const setTheme = theme => {
24 if (theme === 'auto') {
25 document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'))
27 document.documentElement.setAttribute('data-bs-theme', theme)
31 setTheme(getPreferredTheme())
33 const showActiveTheme = (theme, focus = false) => {
34 const themeSwitcher = document.querySelector('#bd-theme')
40 const themeSwitcherText = document.querySelector('#bd-theme-text')
41 // const activeThemeIcon = document.querySelector('.theme-icon-active use')
42 const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
43 // const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
45 document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
46 element.classList.remove('active')
47 element.setAttribute('aria-pressed', 'false')
50 btnToActive.classList.add('active')
51 btnToActive.setAttribute('aria-pressed', 'true')
52 // activeThemeIcon.setAttribute('href', svgOfActiveBtn)
53 const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
54 themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
61 window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
62 const storedTheme = getStoredTheme()
63 if (storedTheme !== 'light' && storedTheme !== 'dark') {
64 setTheme(getPreferredTheme())
68 showActiveTheme(getPreferredTheme())
70 document.querySelectorAll('[data-bs-theme-value]')
72 toggle.addEventListener('click', () => {
73 const theme = toggle.getAttribute('data-bs-theme-value')
76 showActiveTheme(theme, true)