theme.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. 'use strict';
  2. {
  3. function setTheme(mode) {
  4. if (mode !== "light" && mode !== "dark" && mode !== "auto") {
  5. console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);
  6. mode = "auto";
  7. }
  8. document.documentElement.dataset.theme = mode;
  9. localStorage.setItem("theme", mode);
  10. }
  11. function cycleTheme() {
  12. const currentTheme = localStorage.getItem("theme") || "auto";
  13. const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
  14. if (prefersDark) {
  15. // Auto (dark) -> Light -> Dark
  16. if (currentTheme === "auto") {
  17. setTheme("light");
  18. } else if (currentTheme === "light") {
  19. setTheme("dark");
  20. } else {
  21. setTheme("auto");
  22. }
  23. } else {
  24. // Auto (light) -> Dark -> Light
  25. if (currentTheme === "auto") {
  26. setTheme("dark");
  27. } else if (currentTheme === "dark") {
  28. setTheme("light");
  29. } else {
  30. setTheme("auto");
  31. }
  32. }
  33. }
  34. function initTheme() {
  35. // set theme defined in localStorage if there is one, or fallback to auto mode
  36. const currentTheme = localStorage.getItem("theme");
  37. currentTheme ? setTheme(currentTheme) : setTheme("auto");
  38. }
  39. window.addEventListener('load', function(_) {
  40. const buttons = document.getElementsByClassName("theme-toggle");
  41. Array.from(buttons).forEach((btn) => {
  42. btn.addEventListener("click", cycleTheme);
  43. });
  44. });
  45. initTheme();
  46. }