UNPKG

vuepress-theme-hope

Version:

A light vuepress theme with tons of features

80 lines 2.92 kB
import { computed, defineComponent, h, onMounted } from "vue"; import { useDarkMode } from "@theme-hope/composables/useDarkMode"; import "../../styles/appearance/theme-color-picker.scss"; const THEME_COLOR_KEY = "VUEPRESS_THEME_COLOR"; export default defineComponent({ name: "ThemeColorPicker", props: { /** * Theme color picker config * * 主题色选择器配置 */ themeColors: { type: Object, required: true, }, }, setup(props) { const { isDarkMode } = useDarkMode(); const activeThemeColors = computed(() => { const themeColors = { ...props.themeColors }; for (const [name, color] of Object.entries(themeColors)) { if (name.includes("light")) { if (isDarkMode.value) { delete themeColors[name]; } else { themeColors[name.replace("light-", "")] = color; delete themeColors[name]; } } if (name.includes("dark")) { if (isDarkMode.value) { themeColors[name.replace("dark-", "")] = color; delete themeColors[name]; } else { delete themeColors[name]; } } } return Object.entries(themeColors).map(([name, color]) => ({ name, color, })); }); const setThemeColor = (name = "") => { const classes = document.documentElement.classList; const colorNames = activeThemeColors.value.map(({ name }) => name); if (!name) { localStorage.removeItem(THEME_COLOR_KEY); classes.remove(...colorNames); return; } classes.remove(...colorNames.filter((themeColorClass) => themeColorClass !== name)); classes.add(name); localStorage.setItem(THEME_COLOR_KEY, name); }; onMounted(() => { const theme = localStorage.getItem(THEME_COLOR_KEY); if (theme) setThemeColor(theme); }); return () => h("ul", { class: "vp-theme-color-picker", id: "theme-color-picker" }, [ h("li", h("span", { class: "theme-color", onClick: () => { setThemeColor(); }, })), activeThemeColors.value.map(({ name, color }) => h("li", h("span", { style: { background: color }, onClick: () => { setThemeColor(name); }, }))), ]); }, }); //# sourceMappingURL=ThemeColorPicker.js.map