@@ -15,6 +15,28 @@ export default function App() {
1515
1616 useEffect ( ( ) => setStreak ( computeStreak ( ) ) , [ ] )
1717
18+ useEffect ( ( ) => {
19+ const glow = document . getElementById ( 'mouse-glow' )
20+ if ( ! glow ) return
21+
22+ const handleMouseMove = ( e : MouseEvent ) => {
23+ glow . style . transform = `translate3d(${ e . clientX } px, ${ e . clientY } px, 0)`
24+ glow . style . opacity = '1'
25+ }
26+
27+ const handleMouseLeave = ( ) => {
28+ glow . style . opacity = '0'
29+ }
30+
31+ window . addEventListener ( 'mousemove' , handleMouseMove )
32+ document . addEventListener ( 'mouseleave' , handleMouseLeave )
33+
34+ return ( ) => {
35+ window . removeEventListener ( 'mousemove' , handleMouseMove )
36+ document . removeEventListener ( 'mouseleave' , handleMouseLeave )
37+ }
38+ } , [ ] )
39+
1840 useEffect ( ( ) => {
1941 let active = true
2042 const feedSources = SOURCES . filter ( ( s ) => s . feed )
@@ -54,6 +76,13 @@ export default function App() {
5476
5577 return (
5678 < div className = "relative min-h-screen bg-zinc-950 text-zinc-100 selection:bg-violet-500/30 overflow-x-hidden" >
79+ { /* 鼠标跟随动态微光 */ }
80+ < div
81+ id = "mouse-glow"
82+ className = "pointer-events-none fixed -left-[150px] -top-[150px] h-[300px] w-[300px] rounded-full bg-violet-500/12 blur-[100px] transition-opacity duration-700 opacity-0 will-change-transform"
83+ style = { { transform : 'translate3d(0px, 0px, 0)' } }
84+ />
85+
5786 { /* 氛围渐变光晕 */ }
5887 < div className = "pointer-events-none absolute -top-40 -left-40 h-[600px] w-[600px] rounded-full bg-violet-600/12 blur-[130px] animate-float-1" />
5988 < div className = "pointer-events-none absolute top-1/4 -right-40 h-[700px] w-[700px] rounded-full bg-fuchsia-600/8 blur-[145px] animate-float-2" />
0 commit comments