index.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import * as params from '@params';
  2. const PERSISTENCE_KEY = 'theme-scheme'
  3. const themeOptions = params.theme || {}
  4. const THEME_DARK = typeof themeOptions.dark === 'undefined' ? true : themeOptions.dark;
  5. const THEME_LIGHT = typeof themeOptions.light === 'undefined' ? true : themeOptions.light;
  6. const THEME_DEFAULT = typeof themeOptions.default === 'undefined' ? "system" : themeOptions.default;
  7. window.addEventListener('load', async () => {
  8. const menu = document.getElementById('themeMenu')
  9. const $icon = document.getElementById('navbar-theme-icon-svg')
  10. if (menu == null || $icon == null) return
  11. const btns = menu.getElementsByTagName('a')
  12. const iconMap = Array.from(btns).reduce((map, btn) => {
  13. const $img = btn.getElementsByTagName('img')[0]
  14. map[btn.dataset.scheme] = $img.src
  15. return map
  16. }, {})
  17. function checkScheme(scheme) {
  18. if (THEME_LIGHT === false) return "dark"
  19. if (THEME_DARK === false) return "light"
  20. return scheme
  21. }
  22. function loadScheme() {
  23. return localStorage.getItem(PERSISTENCE_KEY) || loadDefaultScheme()
  24. }
  25. function loadDefaultScheme() {
  26. return THEME_DEFAULT || "system"
  27. }
  28. function saveScheme(scheme) {
  29. localStorage.setItem(PERSISTENCE_KEY, scheme)
  30. }
  31. function getPreferredColorScheme() {
  32. const isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches;
  33. return isDarkMode ? "dark" : "light";
  34. }
  35. function setScheme(newScheme) {
  36. let theme = newScheme
  37. if (newScheme === 'system') {
  38. theme = getPreferredColorScheme()
  39. }
  40. // set data-theme attribute on html tag
  41. document.querySelector("html").dataset.theme = theme;
  42. // update icon
  43. $icon.src = iconMap[newScheme]
  44. // save preference to local storage
  45. saveScheme(newScheme)
  46. setImages(theme)
  47. }
  48. const checkedScheme = checkScheme(loadScheme())
  49. setScheme(checkedScheme)
  50. Array.from(menu.getElementsByTagName('a')).forEach((btn) => {
  51. btn.addEventListener('click', () => {
  52. const { scheme } = btn.dataset
  53. setScheme(scheme)
  54. })
  55. })
  56. })
  57. function setImages(newScheme) {
  58. const els = Array.from(document.getElementsByClassName('logo-holder'));
  59. for (const el of els) {
  60. const light = el.querySelector('.light-logo');
  61. const dark = el.querySelector('.dark-logo');
  62. if (newScheme === "dark" && dark !== null) {
  63. if (light !== null) light.style.display = 'none'
  64. dark.style.display = 'inline'
  65. }
  66. else {
  67. if (light !== null) light.style.display = 'inline'
  68. if (dark !== null) dark.style.display = 'none'
  69. }
  70. }
  71. }