<script lang="ts" setup> import type { ThemeName } from "@@/composables/useTheme" import { useTheme } from "@@/composables/useTheme" import { MagicStick } from "@element-plus/icons-vue" const { themeList, activeThemeName, setTheme } = useTheme() function handleChangeTheme({ clientX, clientY }: MouseEvent, themeName: ThemeName) { const maxRadius = Math.hypot( Math.max(clientX, window.innerWidth - clientX), Math.max(clientY, window.innerHeight - clientY) ) const style = document.documentElement.style style.setProperty("--v3-theme-x", `${clientX}px`) style.setProperty("--v3-theme-y", `${clientY}px`) style.setProperty("--v3-theme-r", `${maxRadius}px`) const handler = () => { setTheme(themeName) } document.startViewTransition ? document.startViewTransition(handler) : handler() } </script> <template> <el-dropdown trigger="click"> <div> <el-tooltip effect="dark" content="主题模式" placement="bottom"> <el-icon :size="20"> <MagicStick /> </el-icon> </el-tooltip> </div> <template #dropdown> <el-dropdown-menu> <el-dropdown-item v-for="(theme, index) in themeList" :key="index" :disabled="activeThemeName === theme.name" @click="(e: MouseEvent) => handleChangeTheme(e, theme.name)" > <span>{{ theme.title }}</span> </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </template>