dark-mode-switch.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 & support prettify CSS themes
  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 delStoredPrettifyTheme = () => localStorage.removeItem('themePrettify')
  20. const getStoredPrettifyTheme = () => localStorage.getItem('themePrettify')
  21. const setStoredPrettifyTheme = theme => localStorage.setItem('themePrettify', theme)
  22. const getPrettifyThemeLink = () => {
  23. for (const sheet of document.getElementsByTagName('link')) {
  24. if (sheet.rel === 'stylesheet' && sheet.href.includes('css/prettify/') && !sheet.href.includes('css/prettify/prettify.css')) {
  25. return sheet
  26. }
  27. }
  28. return null
  29. }
  30. const setTheme = theme => {
  31. const preferredTheme = theme === 'auto' ? getPreferredTheme() : theme
  32. document.documentElement.setAttribute('data-bs-theme', preferredTheme)
  33. const sheetPrettify = getPrettifyThemeLink()
  34. if (sheetPrettify) {
  35. sheetPrettify.remove()
  36. }
  37. const link = document.createElement('link')
  38. link.rel = 'stylesheet'
  39. if (preferredTheme === 'dark') {
  40. link.href = 'css/prettify/sons-of-obsidian.css'
  41. document.head.appendChild(link)
  42. } else {
  43. const themePrettify = getStoredPrettifyTheme()
  44. if (themePrettify) {
  45. link.href = themePrettify
  46. document.head.appendChild(link)
  47. }
  48. }
  49. }
  50. window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
  51. const storedTheme = getStoredTheme()
  52. if (storedTheme !== 'light' && storedTheme !== 'dark') {
  53. setTheme(getStoredPreferredTheme())
  54. }
  55. })
  56. window.addEventListener('DOMContentLoaded', () => {
  57. const sheetPrettify = getPrettifyThemeLink()
  58. if (sheetPrettify) {
  59. setStoredPrettifyTheme(sheetPrettify.href)
  60. } else {
  61. delStoredPrettifyTheme()
  62. }
  63. setTheme(getStoredPreferredTheme())
  64. const toggle = document.querySelector('#bd-theme')
  65. toggle.checked = getStoredTheme() === 'dark'
  66. toggle.addEventListener('change', (event) => {
  67. const theme = event.currentTarget.checked ? 'dark' : 'light'
  68. setStoredTheme(theme)
  69. setTheme(theme)
  70. event.currentTarget.focus()
  71. })
  72. })
  73. })()