diff --git a/package.json b/package.json index a4ce51a..504b0a4 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "next": "15.0.2", "react": "19.0.0-rc-02c0e824-20241028", "react-dom": "19.0.0-rc-02c0e824-20241028", + "react-icons": "^5.5.0", "styled-components": "^6.1.13" }, "devDependencies": { diff --git a/src/app/page.tsx b/src/app/page.tsx index 2684e09..af7c21d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -18,42 +18,30 @@ const Home: NextPage = () => { - + {screen === "landing" && } {screen === "projects" && } @@ -62,56 +50,6 @@ const Home: NextPage = () => { ); - // return ( - // - // - // ); }; export default Home; diff --git a/src/lib/components/Landing.tsx b/src/lib/components/Landing.tsx index 4ddcd5f..200dc8b 100644 --- a/src/lib/components/Landing.tsx +++ b/src/lib/components/Landing.tsx @@ -7,12 +7,12 @@ export const Landing: React.FC<{ setScreen: (screen: "landing" | "projects") => void; }> = ({ setScreen }) => { return ( - - - + + + Hi, I{"'"}m Dylan - + I’m a software engineer with hands-on experience building digital products since I was a teenager. My early work led me to tech roles at an e-commerce company that later sold and then into a YC-backed @@ -27,27 +27,28 @@ export const Landing: React.FC<{ allowing teams to focus on delivering real value efficiently and adapt to evolving challenges. - {/* me-irl */} - + - + - + diff --git a/src/lib/components/Projects.tsx b/src/lib/components/Projects.tsx index f3b0f8e..89cf59d 100644 --- a/src/lib/components/Projects.tsx +++ b/src/lib/components/Projects.tsx @@ -1,5 +1,5 @@ import { motion } from "framer-motion"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { ATVsNetWeb, DigiBuild, @@ -7,6 +7,7 @@ import { SouffleClub, TrustedFor, } from "./ProjectDescriptions"; +import { AiOutlineClose, AiOutlineMenu } from "react-icons/ai"; // import Image from "next/image"; const projects: Record = { @@ -17,14 +18,52 @@ const projects: Record = { "Politech.ai": PolitechAI, }; +const menuVariants = { + open: { + opacity: 1, + height: "auto", + transition: { duration: 0.3, ease: "easeInOut" }, + }, + closed: { + opacity: 0, + height: 0, + transition: { duration: 0.3, ease: "easeInOut" }, + }, +}; + export const Projects: React.FC<{ setScreen: (screen: "landing" | "projects") => void; }> = ({ setScreen }) => { const [selectedProject, setSelectedProject] = useState("Politech.ai"); + const [menuOpen, setMenuOpen] = useState(false); + const [isDesktop, setIsDesktop] = useState(false); const ProjectDescription = projects[selectedProject]; + + useEffect(() => { + const handleResize = () => { + setIsDesktop(window.innerWidth >= 640); + }; + + handleResize(); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, []); + return ( <> - + +
+ +
+ - + {Object.keys(projects) .reverse() .map((project, idx) => ( ))} + -

{selectedProject}

+

+ {selectedProject} +

{/* @ts-expect-error ProjectDescription is a React.FC or React.ReactElement but TS doesn't care and doesn't want to render it */}
diff --git a/yarn.lock b/yarn.lock index 4fb446f..ab7b8af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2939,6 +2939,11 @@ react-dom@19.0.0-rc-02c0e824-20241028: dependencies: scheduler "0.25.0-rc-02c0e824-20241028" +react-icons@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.5.0.tgz#8aa25d3543ff84231685d3331164c00299cdfaf2" + integrity sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw== + react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -3194,8 +3199,16 @@ string-convert@^0.2.0: resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3276,7 +3289,14 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==