1+
2+ const navToggle = document . querySelector ( '.nav-toggle' ) ;
3+ const navLinks = document . querySelector ( '.nav-links' ) ;
4+
5+ navToggle . addEventListener ( 'click' , ( ) => {
6+ navLinks . classList . toggle ( 'active' ) ;
7+ } ) ;
8+
9+
10+ document . querySelectorAll ( 'a[href^="#"]' ) . forEach ( anchor => {
11+ anchor . addEventListener ( 'click' , function ( e ) {
12+ e . preventDefault ( ) ;
13+ const target = document . querySelector ( this . getAttribute ( 'href' ) ) ;
14+ if ( target ) {
15+ target . scrollIntoView ( {
16+ behavior : 'smooth' ,
17+ block : 'start'
18+ } ) ;
19+ }
20+ navLinks . classList . remove ( 'active' ) ;
21+ } ) ;
22+ } ) ;
23+
24+
25+ window . addEventListener ( 'scroll' , ( ) => {
26+ const scrollIndicator = document . querySelector ( '.scroll-indicator' ) ;
27+ const scrollTop = window . pageYOffset ;
28+ const docHeight = document . documentElement . scrollHeight - window . innerHeight ;
29+ const scrollPercent = ( scrollTop / docHeight ) * 100 ;
30+ scrollIndicator . style . transform = `scaleX(${ scrollPercent / 100 } )` ;
31+ } ) ;
32+
33+ const observerOptions = {
34+ threshold : 0.1 ,
35+ rootMargin : '0px 0px -50px 0px'
36+ } ;
37+
38+ const observer = new IntersectionObserver ( ( entries ) => {
39+ entries . forEach ( entry => {
40+ if ( entry . isIntersecting ) {
41+ entry . target . classList . add ( 'visible' ) ;
42+ }
43+ } ) ;
44+ } , observerOptions ) ;
45+
46+ document . querySelectorAll ( '.fade-in' ) . forEach ( el => {
47+ observer . observe ( el ) ;
48+ } ) ;
49+
50+
51+ window . addEventListener ( 'scroll' , ( ) => {
52+ const nav = document . querySelector ( '.nav' ) ;
53+ if ( window . scrollY > 100 ) {
54+ nav . style . background = 'rgba(15, 23, 42, 0.98)' ;
55+ } else {
56+ nav . style . background = 'rgba(15, 23, 42, 0.95)' ;
57+ }
58+ } ) ;
59+
60+
61+
62+
0 commit comments