]> git.immae.eu Git - github/bastienwirtz/homer.git/commitdiff
cycle between automatic-light-dark themes
authorGaëtan Caillaut <gcaillaut@protonmail.com>
Sat, 6 Mar 2021 14:12:22 +0000 (15:12 +0100)
committerGaëtan Caillaut <gcaillaut@protonmail.com>
Tue, 9 Mar 2021 17:32:38 +0000 (18:32 +0100)
src/components/DarkMode.vue

index a5aae41cfa15911334d5ce94d0272babc25bf90a..02450d9f900552eff6550a16d0ebcf5b5694190b 100644 (file)
@@ -4,7 +4,7 @@
     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"></i>
   </a>
 </template>
 
@@ -14,21 +14,49 @@ export default {
   data: function () {
     return {
       isDark: null,
+      faClasses: 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.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>