aboutsummaryrefslogtreecommitdiff
path: root/src/App.jsx
diff options
context:
space:
mode:
authorPedro Machado <machadop1407@gmail.com>2025-06-23 16:50:43 -0700
committerPedro Machado <machadop1407@gmail.com>2025-06-23 16:50:43 -0700
commiteb0eed40d780ccd81d8e0fe956e288c1724f1883 (patch)
tree8df03b483e3701e99f9df527723c977766b8315a /src/App.jsx
first commit
Diffstat (limited to 'src/App.jsx')
-rw-r--r--src/App.jsx39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/App.jsx b/src/App.jsx
new file mode 100644
index 0000000..44f7866
--- /dev/null
+++ b/src/App.jsx
@@ -0,0 +1,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> &copy; 2025 PedroTech. All rights reserved.</p>
+ </motion.footer>
+ </div>
+ );
+}
+
+export default App;