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.
10 const getStoredTheme = () => localStorage.getItem('theme')
11 const setStoredTheme = theme => localStorage.setItem('theme', theme)
13 const getPreferredTheme = () => {
14 const storedTheme = getStoredTheme()
19 return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
22 const setTheme = theme => {
23 if (theme === 'auto') {
24 document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'))
26 document.documentElement.setAttribute('data-bs-theme', theme)
30 setTheme(getPreferredTheme())
32 const showActiveTheme = (theme, focus = false) => {
33 const themeSwitcher = document.querySelector('#bd-theme')
39 const themeSwitcherText = document.querySelector('#bd-theme-text')
40 // const activeThemeIcon = document.querySelector('.theme-icon-active use')
41 const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
42 // const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
44 document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
45 element.classList.remove('active')
46 element.setAttribute('aria-pressed', 'false')
49 btnToActive.classList.add('active')
50 btnToActive.setAttribute('aria-pressed', 'true')
51 // activeThemeIcon.setAttribute('href', svgOfActiveBtn)
52 const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
53 themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
60 window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
61 const storedTheme = getStoredTheme()
62 if (storedTheme !== 'light' && storedTheme !== 'dark') {
63 setTheme(getPreferredTheme())
67 window.addEventListener('DOMContentLoaded', () => {
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)