@@ -103,36 +103,43 @@ const App = () => {
103
103
export default App;
104
104
105
105
*/
106
-
107
106
import React , { useEffect , useState } from 'react' ;
108
107
import { BrowserRouter } from 'react-router-dom' ;
109
108
import Routing from './Routing' ;
110
109
import LocomotiveScroll from 'locomotive-scroll' ;
111
110
import 'locomotive-scroll/dist/locomotive-scroll.css' ;
112
- import './styles/Aos.css ';
113
- import './styles/Header .css' ;
111
+ import AOS from 'aos ';
112
+ import 'aos/dist/aos .css' ;
114
113
115
114
import Header from './components/Header' ;
115
+ import Footer from './components/Footer' ;
116
116
import getMode from './utils/getMode' ;
117
+ import './styles/Header.css' ;
117
118
118
119
const App = ( ) => {
119
120
const [ showProgressBar , setShowProgressBar ] = useState ( false ) ;
120
121
121
122
useEffect ( ( ) => {
122
123
const scrollEl = document . querySelector ( '#main-container' ) ;
123
124
const headerEl = document . querySelector ( 'header' ) ;
125
+ const footerEl = document . querySelector ( 'footer' ) ;
124
126
125
127
const scroll = new LocomotiveScroll ( {
126
128
el : scrollEl ,
127
129
smooth : true ,
128
130
} ) ;
129
131
132
+ AOS . init ( {
133
+ duration : 1000 ,
134
+ once : true ,
135
+ easing : 'ease-in-out' ,
136
+ } ) ;
137
+
130
138
const observer = new IntersectionObserver ( ( entries ) => {
131
139
entries . forEach ( ( entry ) => {
132
140
if ( entry . isIntersecting ) {
133
141
entry . target . classList . add ( 'aos-animate' ) ;
134
- } else {
135
- entry . target . classList . remove ( 'aos-animate' ) ;
142
+ observer . unobserve ( entry . target ) ;
136
143
}
137
144
} ) ;
138
145
} ) ;
@@ -163,10 +170,30 @@ const App = () => {
163
170
if ( headerEl ) {
164
171
if ( scrollPosition > windowHeight / 2.5 ) {
165
172
headerEl . style . opacity = '1' ;
173
+ headerEl . classList . add ( 'visible' ) ;
166
174
} else {
167
175
headerEl . style . opacity = '0' ;
176
+ headerEl . classList . remove ( 'visible' ) ;
177
+ }
178
+ }
179
+
180
+ if ( footerEl ) {
181
+ if ( scrollPosition + windowHeight >= totalHeight ) {
182
+ footerEl . style . opacity = '1' ;
183
+ footerEl . classList . add ( 'visible' ) ;
184
+ } else {
185
+ footerEl . style . opacity = '0' ;
186
+ footerEl . classList . remove ( 'visible' ) ;
168
187
}
169
188
}
189
+
190
+ // Reset animations when reaching the top
191
+ if ( scrollPosition === 0 ) {
192
+ document . querySelectorAll ( '[data-aos]' ) . forEach ( ( aosElem ) => {
193
+ aosElem . classList . remove ( 'aos-animate' ) ;
194
+ observer . observe ( aosElem ) ;
195
+ } ) ;
196
+ }
170
197
} ;
171
198
172
199
scroll . on ( 'scroll' , handleScroll ) ;
@@ -182,8 +209,7 @@ const App = () => {
182
209
< BrowserRouter basename = { process . env . PUBLIC_URL } >
183
210
< >
184
211
{ showProgressBar && (
185
- < div
186
- id = "progress-bar"
212
+ < div id = "progress-bar"
187
213
className = { ( getMode ( ) === "dark" ) ? "scroll-watcher-dark" : "scroll-watcher-light" }
188
214
style = { { width : '0%' } }
189
215
> </ div >
@@ -193,11 +219,11 @@ const App = () => {
193
219
< main id = "main-container" data-scroll-container >
194
220
< Routing />
195
221
</ main >
222
+ < Footer />
196
223
</ div >
197
224
</ >
198
225
</ BrowserRouter >
199
226
) ;
200
227
} ;
201
228
202
229
export default App ;
203
-
0 commit comments