Skip to content

Commit feb35ff

Browse files
authored
improve theme switch animation (#240)
1 parent 3e6e9f7 commit feb35ff

File tree

3 files changed

+8008
-16
lines changed

3 files changed

+8008
-16
lines changed

.npmrc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
package-lock=false
2-
force=true
1+
force=true

.vitepress/theme/components/CustomLayout.vue

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,40 @@ provide("toggle-appearance", async () => {
2121
const vw = innerWidth / 100;
2222
const vh = innerHeight / 100;
2323
24-
const clipPath = [
25-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, ${100 * vw}px ${100 * vh}px, ${100 * vw}px ${66 * vh}px, ${100 * vw}px ${66 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px 0)`,
26-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, ${80 * vw}px ${100 * vh}px, ${80 * vw}px ${66 * vh}px, ${100 * vw}px ${66 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px 0)`,
27-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, ${60 * vw}px ${100 * vh}px, ${60 * vw}px ${66 * vh}px, ${100 * vw}px ${66 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px 0)`,
28-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, ${40 * vw}px ${100 * vh}px, ${40 * vw}px ${66 * vh}px, ${80 * vw}px ${66 * vh}px, ${80 * vw}px ${33 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px 0)`,
29-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, ${20 * vw}px ${100 * vh}px, ${20 * vw}px ${66 * vh}px, ${60 * vw}px ${66 * vh}px, ${60 * vw}px ${33 * vh}px, ${100 * vw}px ${33 * vh}px, ${100 * vw}px 0)`,
30-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, 0 ${100 * vh}px, 0 ${66 * vh}px, ${40 * vw}px ${66 * vh}px, ${40 * vw}px ${33 * vh}px, ${80 * vw}px ${33 * vh}px, ${80 * vw}px 0)`,
31-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, 0 ${100 * vh}px, 0 ${66 * vh}px, ${20 * vw}px ${66 * vh}px, ${20 * vw}px ${33 * vh}px, ${60 * vw}px ${33 * vh}px, ${60 * vw}px 0)`,
32-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, 0 ${100 * vh}px, 0 ${66 * vh}px, 0 ${66 * vh}px, 0 ${33 * vh}px, ${40 * vw}px ${33 * vh}px, ${40 * vw}px 0)`,
33-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, 0 ${100 * vh}px, 0 ${66 * vh}px, 0 ${66 * vh}px, 0 ${33 * vh}px, ${20 * vw}px ${33 * vh}px, ${20 * vw}px 0)`,
34-
`polygon(0 0, ${100 * vw}px 0, ${100 * vw}px ${100 * vh}px, 0 ${100 * vh}px, 0 ${66 * vh}px, 0 ${66 * vh}px, 0 ${33 * vh}px, 0 ${33 * vh}px, 0 0)`,
35-
];
24+
const maskImage =
25+
`url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${200 * vw} ${100 * vh}">
26+
<defs>
27+
<filter id="blur">
28+
<feGaussianBlur stdDeviation="30"/>
29+
</filter>
30+
</defs>
31+
<polygon points="
32+
${90 * vw} 0 ${200 * vw},0 ${200 * vw},${100 * vh}
33+
${30 * vw},${100 * vh} ${30 * vw},${66 * vh}
34+
${60 * vw},${66 * vh} ${60 * vw},${33 * vh}
35+
${90 * vw},${33 * vh}
36+
" fill="white" filter="url(%23blur)" />
37+
</svg>')`.replace(/\s+/gu, " ");
3638
3739
await document.startViewTransition(async () => {
3840
isDark.value = !isDark.value;
3941
await nextTick();
4042
}).ready;
4143
44+
const maskPosition = [
45+
`${100 * vw}px -${5 * vh}px`,
46+
`-${100 * vw}px -${5 * vh}px`,
47+
];
48+
const maskSize = `${220 * vw}px ${110 * vh}px`;
49+
4250
document.documentElement.animate(
43-
{ clipPath: isDark.value ? clipPath.reverse() : clipPath },
4451
{
45-
duration: 500,
52+
maskImage: [maskImage, maskImage],
53+
maskPosition: isDark.value ? maskPosition.reverse() : maskPosition,
54+
maskSize: [maskSize, maskSize],
55+
},
56+
{
57+
duration: 300,
4658
easing: "ease-in",
4759
pseudoElement: `::view-transition-${isDark.value ? "old" : "new"}(root)`,
4860
},
@@ -59,6 +71,7 @@ provide("toggle-appearance", async () => {
5971
::view-transition-new(root) {
6072
animation: none;
6173
mix-blend-mode: normal;
74+
mask-repeat: no-repeat;
6275
}
6376
6477
::view-transition-old(root),

0 commit comments

Comments
 (0)