feat(lite/dark mode): persistence + icon (#6383)
This commit is contained in:
parent
8d64a0a232
commit
72090ea8ff
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="!xenApiStore.isConnected" style="display: flex">
|
<div v-if="!xenApiStore.isConnected">
|
||||||
<AppLogin />
|
<AppLogin />
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { watchEffect } from "vue";
|
import { watchEffect } from "vue";
|
||||||
|
import favicon from "@/assets/favicon.svg";
|
||||||
import AppHeader from "@/components/AppHeader.vue";
|
import AppHeader from "@/components/AppHeader.vue";
|
||||||
import AppLogin from "@/components/AppLogin.vue";
|
import AppLogin from "@/components/AppLogin.vue";
|
||||||
import favicon from "@/assets/favicon.svg";
|
|
||||||
import InfraPoolList from "@/components/infra/InfraPoolList.vue";
|
import InfraPoolList from "@/components/infra/InfraPoolList.vue";
|
||||||
import { useXenApiStore } from "@/stores/xen-api.store";
|
import { useXenApiStore } from "@/stores/xen-api.store";
|
||||||
|
|
||||||
@ -31,6 +31,12 @@ if (link == null) {
|
|||||||
}
|
}
|
||||||
link.href = favicon;
|
link.href = favicon;
|
||||||
|
|
||||||
|
document.title = "XO Lite";
|
||||||
|
|
||||||
|
if (window.localStorage?.getItem("colorMode") !== "light") {
|
||||||
|
document.documentElement.classList.add("dark");
|
||||||
|
}
|
||||||
|
|
||||||
const xenApiStore = useXenApiStore();
|
const xenApiStore = useXenApiStore();
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
|
@ -1,26 +1,36 @@
|
|||||||
<template>
|
<template>
|
||||||
<header class="app-header">
|
<header class="app-header">
|
||||||
<RouterLink :to="{ name: 'home' }">
|
<RouterLink :to="{ name: 'home' }">
|
||||||
<img alt="XO Lite" src="../assets/logo.svg" style="width: 6rem" />
|
<img alt="XO Lite" src="../assets/logo.svg" />
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
<slot />
|
<slot />
|
||||||
<span style="cursor: pointer" @click="toggleTheme">Switch theme</span>
|
<div>
|
||||||
<span style="cursor: pointer; margin-left: 1rem" @click="logout">
|
<span @click="toggleTheme"
|
||||||
Logout
|
><FontAwesomeIcon style="font-size: 1.5em" :icon="colorModeIcon"
|
||||||
</span>
|
/></span>
|
||||||
|
<span style="margin-left: 1rem" @click="logout">Logout</span>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { nextTick } from "vue";
|
import { computed, nextTick, ref } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
|
import { faMoon, faSun } from "@fortawesome/pro-solid-svg-icons";
|
||||||
|
import { useLocalStorage } from "@vueuse/core";
|
||||||
import { useXenApiStore } from "@/stores/xen-api.store";
|
import { useXenApiStore } from "@/stores/xen-api.store";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
|
const colorMode = useLocalStorage<string>("colorMode", "dark");
|
||||||
const toggleTheme = () => {
|
const toggleTheme = () => {
|
||||||
document.documentElement.classList.toggle("dark");
|
colorMode.value = document.documentElement.classList.toggle("dark")
|
||||||
|
? "dark"
|
||||||
|
: "light";
|
||||||
};
|
};
|
||||||
|
const colorModeIcon = computed(() =>
|
||||||
|
colorMode.value === "light" ? faMoon : faSun
|
||||||
|
);
|
||||||
|
|
||||||
const logout = () => {
|
const logout = () => {
|
||||||
const xenApiStore = useXenApiStore();
|
const xenApiStore = useXenApiStore();
|
||||||
@ -33,9 +43,16 @@ const logout = () => {
|
|||||||
.app-header {
|
.app-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
min-height: 8rem;
|
min-height: 8rem;
|
||||||
padding: 0 0.8rem;
|
padding: 1rem;
|
||||||
border-bottom: 0.1rem solid var(--color-blue-scale-400);
|
border-bottom: 0.1rem solid var(--color-blue-scale-400);
|
||||||
background-color: var(--background-color-secondary);
|
background-color: var(--background-color-secondary);
|
||||||
|
img {
|
||||||
|
width: 4rem;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
Loading…
Reference in New Issue
Block a user