From 4a1e8717e90d1b0b516da2cbc1d16ff906d7fbdf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ga=C3=ABtan=20Caillaut?= Date: Sat, 6 Mar 2021 15:12:22 +0100 Subject: [PATCH] cycle between automatic-light-dark themes --- src/components/DarkMode.vue | 42 ++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/src/components/DarkMode.vue b/src/components/DarkMode.vue index a5aae41..02450d9 100644 --- a/src/components/DarkMode.vue +++ b/src/components/DarkMode.vue @@ -4,7 +4,7 @@ aria-label="Toggle dark mode" class="navbar-item is-inline-block-mobile" > - + @@ -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]; + } }, }; -- 2.41.0