blob: c3e9f01de111a098e18196143437ea65d680d993 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
import "./App.css";
import { Navbar } from "./components/Navbar";
import { Hero } from "./components/Hero";
import { Projects } from "./components/Projects";
import { Contact } from "./components/Contact";
import { useEffect, useState } from "react";
import emailjs from "@emailjs/browser";
import { motion } from "framer-motion";
function App() {
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
setIsLoaded(true);
emailjs.init(import.meta.env.VITE_EMAILJS_PUBLIC_KEY);
}, []);
return (
<div className={`app ${isLoaded ? "loaded" : ""}`}>
<Navbar />
<Hero />
<Projects />
<Contact />
<motion.footer
className="footer"
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
<p> © 2025 Meiling Zhao</p>
</motion.footer>
</div>
);
}
export default App;
|