@@ -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