dark-mode-switch.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*!
  2. * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
  3. * Copyright 2011-2024 The Bootstrap Authors
  4. * Licensed under the Creative Commons Attribution 3.0 Unported License.
  5. * Modified to work with a simpler checkbox toggle
  6. */
  7. (() => {
  8. 'use strict'
  9. const getStoredTheme = () => localStorage.getItem('theme')
  10. const setStoredTheme = theme => localStorage.setItem('theme', theme)
  11. const getPreferredTheme = () => window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
  12. const getStoredPreferredTheme = () => {
  13. const storedTheme = getStoredTheme()
  14. if (storedTheme) {
  15. return storedTheme
  16. }
  17. return getPreferredTheme()
  18. }
  19. const setTheme = theme => {
  20. if (theme === 'auto') {
  21. document.documentElement.setAttribute('data-bs-theme', getPreferredTheme())
  22. } else {
  23. document.documentElement.setAttribute('data-bs-theme', theme)
  24. }
  25. }
  26. setTheme(getStoredPreferredTheme())
  27. window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
  28. const storedTheme = getStoredTheme()
  29. if (storedTheme !== 'light' && storedTheme !== 'dark') {
  30. setTheme(getStoredPreferredTheme())
  31. }
  32. })
  33. window.addEventListener('DOMContentLoaded', () => {
  34. const toggle = document.querySelector('#bd-theme')
  35. toggle.checked = getStoredTheme() === 'dark'
  36. toggle.addEventListener('change', (event) => {
  37. const theme = event.currentTarget.checked ? 'dark' : 'light'
  38. setStoredTheme(theme)
  39. setTheme(theme)
  40. event.currentTarget.focus()
  41. })
  42. })
  43. })()