mirror of
https://github.com/WuKongIM/WuKongIMDocs
synced 2025-05-31 05:24:10 +00:00
73 lines
1.6 KiB
Vue
73 lines
1.6 KiB
Vue
<script setup lang="ts">
|
|
import { useData } from "vitepress";
|
|
import DefaultTheme from "vitepress/theme";
|
|
import { nextTick, provide } from "vue";
|
|
import HomePreview from "./components/HomePreview.vue";
|
|
|
|
const { isDark } = useData();
|
|
|
|
const enableTransitions = () =>
|
|
"startViewTransition" in document && window.matchMedia("(prefers-reduced-motion: no-preference)").matches;
|
|
|
|
provide("toggle-appearance", async ({ clientX: x, clientY: y }: MouseEvent) => {
|
|
if (!enableTransitions()) {
|
|
isDark.value = !isDark.value;
|
|
return;
|
|
}
|
|
|
|
const clipPath = [
|
|
`circle(0px at ${x}px ${y}px)`,
|
|
`circle(${Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y))}px at ${x}px ${y}px)`,
|
|
];
|
|
|
|
// @ts-expect-error
|
|
await document.startViewTransition(async () => {
|
|
isDark.value = !isDark.value;
|
|
await nextTick();
|
|
}).ready;
|
|
|
|
document.documentElement.animate(
|
|
{ clipPath: isDark.value ? clipPath.reverse() : clipPath },
|
|
{
|
|
duration: 300,
|
|
easing: "ease-in",
|
|
pseudoElement: `::view-transition-${isDark.value ? "old" : "new"}(root)`,
|
|
}
|
|
);
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<DefaultTheme.Layout>
|
|
<template #home-features-after>
|
|
<HomePreview />
|
|
</template>
|
|
</DefaultTheme.Layout>
|
|
</template>
|
|
|
|
<style>
|
|
::view-transition-old(root),
|
|
::view-transition-new(root) {
|
|
animation: none;
|
|
mix-blend-mode: normal;
|
|
}
|
|
|
|
::view-transition-old(root),
|
|
.dark::view-transition-new(root) {
|
|
z-index: 1;
|
|
}
|
|
|
|
::view-transition-new(root),
|
|
.dark::view-transition-old(root) {
|
|
z-index: 9999;
|
|
}
|
|
|
|
.VPSwitchAppearance {
|
|
width: 22px !important;
|
|
}
|
|
|
|
.VPSwitchAppearance .check {
|
|
transform: none !important;
|
|
}
|
|
</style>
|