diff --git a/src/components/DarkMode.vue b/src/components/DarkMode.vue
index a5aae41cf..80491fafa 100644
--- a/src/components/DarkMode.vue
+++ b/src/components/DarkMode.vue
@@ -4,7 +4,11 @@
aria-label="Toggle dark mode"
class="navbar-item is-inline-block-mobile"
>
-
+
@@ -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];
+ },
},
};