]> git.immae.eu Git - github/bastienwirtz/homer.git/commitdiff
Merge pull request #197 from GaaH/add-auto-theme-mode v21.03.2
authorBastien Wirtz <bastien.wirtz@gmail.com>
Wed, 10 Mar 2021 05:33:15 +0000 (21:33 -0800)
committerGitHub <noreply@github.com>
Wed, 10 Mar 2021 05:33:15 +0000 (21:33 -0800)
cycle between automatic-light-dark themes

src/components/DarkMode.vue

index a5aae41cfa15911334d5ce94d0272babc25bf90a..80491fafae8d2dc9fb6f467146cac0e7db8495a8 100644 (file)
@@ -4,7 +4,11 @@
     aria-label="Toggle dark mode"
     class="navbar-item is-inline-block-mobile"
   >
-    <i class="fas fa-fw fa-adjust"></i>
+    <i
+      :class="`${faClasses[mode]}`"
+      class="fa-fw"
+      :title="`${titles[mode]}`"
+    ></i>
   </a>
 </template>
 
@@ -14,21 +18,55 @@ export default {
   data: function () {
     return {
       isDark: null,
+      faClasses: null,
+      titles: null,
+      mode: null,
     };
   },
   created: function () {
-    this.isDark =
-      "overrideDark" in localStorage
-        ? JSON.parse(localStorage.overrideDark)
-        : matchMedia("(prefers-color-scheme: dark)").matches;
+    this.faClasses = ["fas fa-adjust", "fas fa-circle", "far fa-circle"];
+    this.titles = ["Auto-switch", "Light theme", "Dark theme"];
+    this.mode = 0;
+    if ("overrideDark" in localStorage) {
+      // Light theme is 1 and Dark theme is 2
+      this.mode = JSON.parse(localStorage.overrideDark) ? 2 : 1;
+    }
+    this.isDark = this.getIsDark();
     this.$emit("updated", this.isDark);
   },
   methods: {
     toggleTheme: function () {
-      this.isDark = !this.isDark;
-      localStorage.overrideDark = this.isDark;
+      this.mode = (this.mode + 1) % 3;
+      switch (this.mode) {
+        // Default behavior
+        case 0:
+          localStorage.removeItem("overrideDark");
+          break;
+        // Force light theme
+        case 1:
+          localStorage.overrideDark = false;
+          break;
+        // Force dark theme
+        case 2:
+          localStorage.overrideDark = true;
+          break;
+        default:
+          // Should be unreachable
+          break;
+      }
+
+      this.isDark = this.getIsDark();
       this.$emit("updated", this.isDark);
     },
+
+    getIsDark: function () {
+      const values = [
+        matchMedia("(prefers-color-scheme: dark)").matches,
+        false,
+        true,
+      ];
+      return values[this.mode];
+    },
   },
 };
 </script>