| |
| /*! |
| * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) |
| * Copyright 2011-2023 The Bootstrap Authors |
| * Licensed under the Creative Commons Attribution 3.0 Unported License. |
| * Updates for {pkgdown} by the {bslib} authors, also licensed under CC-BY-3.0. |
| */ |
| |
| const getStoredTheme = () => localStorage.getItem('theme') |
| const setStoredTheme = theme => localStorage.setItem('theme', theme) |
| |
| const getPreferredTheme = () => { |
| const storedTheme = getStoredTheme() |
| if (storedTheme) { |
| return storedTheme |
| } |
| |
| return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' |
| } |
| |
| const setTheme = theme => { |
| if (theme === 'auto') { |
| document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')) |
| } else { |
| document.documentElement.setAttribute('data-bs-theme', theme) |
| } |
| } |
| |
| function bsSetupThemeToggle () { |
| 'use strict' |
| |
| const showActiveTheme = (theme, focus = false) => { |
| var activeLabel, activeIcon; |
| |
| document.querySelectorAll('[data-bs-theme-value]').forEach(element => { |
| const buttonTheme = element.getAttribute('data-bs-theme-value') |
| const isActive = buttonTheme == theme |
| |
| element.classList.toggle('active', isActive) |
| element.setAttribute('aria-pressed', isActive) |
| |
| if (isActive) { |
| activeLabel = element.textContent; |
| activeIcon = element.querySelector('span').classList.value; |
| } |
| }) |
| |
| const themeSwitcher = document.querySelector('#dropdown-lightswitch') |
| if (!themeSwitcher) { |
| return |
| } |
| |
| themeSwitcher.setAttribute('aria-label', activeLabel) |
| themeSwitcher.querySelector('span').classList.value = activeIcon; |
| |
| if (focus) { |
| themeSwitcher.focus() |
| } |
| } |
| |
| window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { |
| const storedTheme = getStoredTheme() |
| if (storedTheme !== 'light' && storedTheme !== 'dark') { |
| setTheme(getPreferredTheme()) |
| } |
| }) |
| |
| window.addEventListener('DOMContentLoaded', () => { |
| showActiveTheme(getPreferredTheme()) |
| |
| document |
| .querySelectorAll('[data-bs-theme-value]') |
| .forEach(toggle => { |
| toggle.addEventListener('click', () => { |
| const theme = toggle.getAttribute('data-bs-theme-value') |
| setTheme(theme) |
| setStoredTheme(theme) |
| showActiveTheme(theme, true) |
| }) |
| }) |
| }) |
| } |
| |
| setTheme(getPreferredTheme()); |
| bsSetupThemeToggle(); |