44 const cursor = document . querySelector ( ".cursor" ) ;
55 if ( ! cursor ) return ;
66
7+ const cursorRing = document . querySelector ( ".cursor-ring" ) ;
8+
79 // Select all interactive elements: a, button, year-btn, and the specific social links
810 const hoverables = document . querySelectorAll ( "a, button, .year-btn, .socials a" ) ;
911
10- document . addEventListener ( "mouseenter" , ( ) => cursor . classList . add ( "visible" ) ) ;
11- document . addEventListener ( "mouseleave" , ( ) => cursor . classList . remove ( "visible" ) ) ;
12+ let mouseX = 0 ;
13+ let mouseY = 0 ;
14+ let ringX = 0 ;
15+ let ringY = 0 ;
16+ const inertia = 0.3 ;
17+
18+ document . addEventListener ( "mouseenter" , ( ) => {
19+ cursor . classList . add ( "visible" ) ;
20+ if ( cursorRing ) cursorRing . classList . add ( "visible" ) ;
21+ } ) ;
22+
23+ document . addEventListener ( "mouseleave" , ( ) => {
24+ cursor . classList . remove ( "visible" ) ;
25+ if ( cursorRing ) cursorRing . classList . remove ( "visible" ) ;
26+ } ) ;
1227
13- // Hover effect (scaling)
1428 hoverables . forEach ( el => {
15- el . addEventListener ( "mouseenter" , ( ) => cursor . classList . add ( "hovered" ) ) ;
16- el . addEventListener ( "mouseleave" , ( ) => cursor . classList . remove ( "hovered" ) ) ;
29+ el . addEventListener ( "mouseenter" , ( ) => {
30+ cursor . classList . add ( "hovered" ) ;
31+ if ( cursorRing ) cursorRing . classList . add ( "hovered" ) ;
32+ } ) ;
33+
34+ el . addEventListener ( "mouseleave" , ( ) => {
35+ cursor . classList . remove ( "hovered" ) ;
36+ if ( cursorRing ) cursorRing . classList . remove ( "hovered" ) ;
37+ } ) ;
1738 } ) ;
1839
19- // Position tracking
2040 document . addEventListener ( "mousemove" , e => {
21- cursor . style . top = e . clientY + "px" ;
22- cursor . style . left = e . clientX + "px" ;
41+ mouseX = e . clientX ;
42+ mouseY = e . clientY ;
43+ cursor . style . top = mouseY + "px" ;
44+ cursor . style . left = mouseX + "px" ;
2345 } ) ;
46+
47+ function animateRing ( ) {
48+ if ( cursorRing ) {
49+ const dx = mouseX - ringX ;
50+ const dy = mouseY - ringY ;
51+
52+ ringX += dx * inertia ;
53+ ringY += dy * inertia ;
54+
55+ cursorRing . style . top = ringY + "px" ;
56+ cursorRing . style . left = ringX + "px" ;
57+ }
58+
59+ requestAnimationFrame ( animateRing ) ;
60+ }
61+
62+ if ( cursorRing ) {
63+ animateRing ( ) ;
64+ }
2465} ) ( ) ;
0 commit comments