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.
- {/* */}
-
+
-
+
-
+
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==