diff options
author | Anna Tsyganova <ATSyganova@IBS.RU> | 2022-08-19 21:50:38 +0300 |
---|---|---|
committer | Anna Tsyganova <ATSyganova@IBS.RU> | 2022-08-19 21:50:38 +0300 |
commit | a03d227f9279da858d0828367cbc7230122db87f (patch) | |
tree | 39de0ead95932f7f5e130a370a040fc663d88c50 /src/components/_sila/Global/ThemeButton.vue | |
parent | 6e09dd79705f941a91a4ff094fbddda831492216 (diff) | |
download | webui-vue-a03d227f9279da858d0828367cbc7230122db87f.tar.xz |
SILABMC-263: Create theme buttonsila-dark-mode
Diffstat (limited to 'src/components/_sila/Global/ThemeButton.vue')
-rw-r--r-- | src/components/_sila/Global/ThemeButton.vue | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/components/_sila/Global/ThemeButton.vue b/src/components/_sila/Global/ThemeButton.vue new file mode 100644 index 00000000..9a0de644 --- /dev/null +++ b/src/components/_sila/Global/ThemeButton.vue @@ -0,0 +1,77 @@ +<template> + <b-nav-item @click="toggleTheme"> + <icon-sun v-if="userTheme !== 'dark-theme'" /> + <icon-moon v-if="userTheme === 'dark-theme'" /> + </b-nav-item> +</template> + +<script> +import IconSun from '@carbon/icons-vue/es/sun/20'; +import IconMoon from '@carbon/icons-vue/es/moon/20'; + +export default { + name: 'ThemeButton', + components: { + IconSun, + IconMoon, + }, + + data() { + return { + userTheme: 'light-theme', + }; + }, + mounted() { + const initUserTheme = this.getTheme() || this.getMediaPreference(); + this.setTheme(initUserTheme); + }, + + methods: { + toggleTheme() { + const activeTheme = localStorage.getItem('user-theme'); + if (activeTheme === 'light-theme') { + this.setTheme('dark-theme'); + } else { + this.setTheme('light-theme'); + } + }, + + getTheme() { + return localStorage.getItem('user-theme'); + }, + + setTheme(theme) { + localStorage.setItem('user-theme', theme); + this.userTheme = theme; + document.documentElement.className = theme; + }, + + getMediaPreference() { + const hasDarkPreference = window.matchMedia( + '(prefers-color-scheme: dark)' + ).matches; + if (hasDarkPreference) { + return 'dark-theme'; + } else { + return 'light-theme'; + } + }, + }, + // props: {}, + // data() {}, + // computed: {}, + // watch: {}, + // created() {}, + // mounted() {}, + // methods: {}, +}; +</script> + +<style lang="scss"> +:root.dark-theme { + --background-color-primary: #1e1e1e; + --background-color-secondary: #2d2d30; + --accent-color: #3f3f3f; + --text-primary-color: #ddd; +} +</style> |