You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.7 KiB
59 lines
1.7 KiB
import { defineStore } from "pinia" |
|
import { ref } from "vue"; |
|
|
|
// @ts-ignore |
|
import bootstrap from "bootstrap/dist/js/bootstrap.bundle.min"; |
|
|
|
export const useStateStore = defineStore("state", () => { |
|
|
|
const colorMode = ref<string>("auto"); |
|
const setColorMode = (newMode: string): void => { |
|
colorMode.value = newMode; |
|
applyColorMode(); |
|
}; |
|
const applyColorMode = (): void => { |
|
let css = "light"; |
|
if (colorMode.value === "auto") { |
|
const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches; |
|
if (preferDark) { |
|
css = "dark"; |
|
} |
|
} |
|
else if (colorMode.value == "dark") { |
|
css = "dark"; |
|
} |
|
|
|
const html = document.documentElement as HTMLElement; |
|
|
|
// Theme used by Bootstrap |
|
html.setAttribute('data-bs-theme', css); |
|
|
|
// Theme class used by shiki syntax highlighting |
|
html.classList.remove("dark"); |
|
if (css === "dark") { |
|
html.classList.add("dark"); |
|
} |
|
} |
|
|
|
const popoverList = ref<any[]>([]); |
|
const tooltipList = ref<any[]>([]); |
|
|
|
const initBootstrap = (): void => { |
|
// Initialize popovers |
|
popoverList.value.forEach(popover => popover.dispose()); |
|
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]'); |
|
popoverList.value = [...popoverTriggerList].map(popover => new bootstrap.Popover(popover)); |
|
|
|
// Initialize tooltips |
|
tooltipList.value.forEach(tooltip => tooltip.dispose()); |
|
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]:not([data-bs-show])'); |
|
tooltipList.value = [...tooltipTriggerList].map(tooltip => new bootstrap.Tooltip(tooltip)); |
|
}; |
|
|
|
return { colorMode, setColorMode, applyColorMode, initBootstrap } |
|
}, { |
|
persist: { |
|
pick: ["colorMode"], |
|
storage: localStorage |
|
} |
|
})
|
|
|