1
1
///<reference lib="dom" />
2
2
3
+ // Regex to match the content of the main tag
3
4
const regex =
4
5
/ \< h e a d \> [ \s \S ] * \< \/ h e a d \> [ \s \S ] * ?\< m a i n [ \s \S ] * ?\> ( [ \s \S ] * ) \< \/ m a i n \> /
5
6
6
7
let isDark = globalThis . matchMedia ( '(prefers-color-scheme: dark)' ) . matches
7
8
8
- /**
9
- * @type {HTMLMetaElement }
10
- */
9
+ // check if the browser supports view transition
10
+ const isViewTransition = document . startViewTransition &&
11
+ ! globalThis . matchMedia ( '(prefers-reduced-motion: reduce)' ) . matches
12
+
13
+ /** @type {HTMLMetaElement }*/
11
14
const metaTheme = document . head . querySelector ( "meta[name='theme-color']" )
12
15
13
16
/**
14
17
* @param {boolean } isDarkTheme
15
18
* @param {Element } e
19
+ * @param {Array<[string, string]> } colors
16
20
*/
17
21
function toggleColor ( isDarkTheme , e ) {
18
22
e . classList . toggle ( 'fa-sun' )
19
23
e . classList . toggle ( 'fa-moon' )
20
- window . localStorage . setItem ( 'darkMode' , isDarkTheme ? 'dark' : 'light' )
24
+ globalThis . localStorage . setItem ( 'darkMode' , isDarkTheme ? 'dark' : 'light' )
25
+
21
26
const colors = [
22
27
[ '--theme-color' , isDarkTheme ? '#ffffff' : 'rgb(0, 0, 0)' ] ,
23
28
[
@@ -46,7 +51,7 @@ document.addEventListener('DOMContentLoaded', () => {
46
51
toyNavHeight + 'px' ,
47
52
)
48
53
49
- const localDarkMode = window . localStorage . getItem ( 'darkMode' )
54
+ const localDarkMode = globalThis . localStorage . getItem ( 'darkMode' )
50
55
isDark = localDarkMode === 'undefined' ? isDark : localDarkMode === 'dark'
51
56
52
57
const model = document . querySelector ( 'a.model' )
@@ -56,10 +61,30 @@ document.addEventListener('DOMContentLoaded', () => {
56
61
57
62
model . addEventListener ( 'click' , ( e ) => {
58
63
e . preventDefault ( )
59
- const darkMode = window . localStorage . getItem ( 'darkMode' ) === 'dark'
64
+ const darkMode = globalThis . localStorage . getItem ( 'darkMode' ) === 'dark'
60
65
? 'light'
61
66
: 'dark'
62
- toggleColor ( darkMode === 'dark' , darkIcon )
67
+
68
+ if ( ! isViewTransition ) {
69
+ return toggleColor ( darkMode === 'dark' , darkIcon )
70
+ }
71
+
72
+ // 存储点击坐标
73
+ const x = e . clientX
74
+ const y = e . clientY
75
+ const endRadius = Math . hypot (
76
+ Math . max ( x , innerWidth - x ) ,
77
+ Math . max ( y , innerHeight - y ) ,
78
+ )
79
+
80
+ document . startViewTransition (
81
+ ( ) => toggleColor ( darkMode === 'dark' , darkIcon ) ,
82
+ )
83
+ ; [
84
+ [ '--click-x' , `${ x } px` ] ,
85
+ [ '--click-y' , `${ y } px` ] ,
86
+ [ '--end-radius' , `${ endRadius } px` ]
87
+ ] . forEach ( ( [ v , c ] ) => document . documentElement . style . setProperty ( v , c ) )
63
88
} )
64
89
65
90
const header = document . querySelector ( 'header' )
@@ -133,7 +158,7 @@ const renderPage = async (e) => {
133
158
reactionsEnabled : '1' ,
134
159
emitMetadata : '1' ,
135
160
inputPosition : 'bottom' ,
136
- theme : window . localStorage . getItem ( 'darkMode' ) ??
161
+ theme : globalThis . localStorage . getItem ( 'darkMode' ) ??
137
162
'preferred_color_scheme' ,
138
163
lang : 'zh-CN' ,
139
164
} ,
0 commit comments