From 91683d17674192514b72d02811d3fbde584cf29b Mon Sep 17 00:00:00 2001 From: Bayda77 Date: Mon, 12 Jan 2026 20:37:18 -0600 Subject: [PATCH] Added blog style pages for more descriptive sidequests and increased bottom padding to stop page from touching --- src/App.tsx | 2 + src/components/ProjectCard.tsx | 12 ++++ src/pages/Projects.tsx | 16 ++++- src/pages/SidequestDetail.tsx | 116 +++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 src/pages/SidequestDetail.tsx diff --git a/src/App.tsx b/src/App.tsx index 0cf7428..ebbba84 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,6 +8,7 @@ import About from './pages/About'; import WorkExperience from './pages/WorkExperience'; import Projects from './pages/Projects'; import Skills from './pages/Skills'; +import SidequestDetail from './pages/SidequestDetail'; function ScrollToTop() { @@ -41,6 +42,7 @@ function App() { } /> } /> } /> + } />
diff --git a/src/components/ProjectCard.tsx b/src/components/ProjectCard.tsx index 648647a..838a66e 100644 --- a/src/components/ProjectCard.tsx +++ b/src/components/ProjectCard.tsx @@ -1,5 +1,6 @@ import { motion, Variants } from "framer-motion"; import "../styles/components/cards.css"; +import { Link } from "react-router-dom"; export interface Project { id: number; @@ -11,6 +12,12 @@ export interface Project { demo?: string; repo?: string; }; + hasDetails?: boolean; + detailContent?: { + longDescription: string; + challenges: string; + learnings: string; + }; } interface ProjectCardProps { @@ -57,6 +64,11 @@ export default function ProjectCard({ project, variants }: ProjectCardProps) { GitHub )} + {project.hasDetails && ( + + Read More + + )}
); diff --git a/src/pages/Projects.tsx b/src/pages/Projects.tsx index c5f750b..f64142e 100644 --- a/src/pages/Projects.tsx +++ b/src/pages/Projects.tsx @@ -17,7 +17,7 @@ const FEATURED_PROJECTS: Project[] = [ }, ]; -const SIDEQUESTS: Project[] = [ +export const SIDEQUESTS: Project[] = [ { id: 101, // Different ID range for sidequests title: "Experimental Shader", @@ -26,6 +26,12 @@ const SIDEQUESTS: Project[] = [ image: "https://placehold.co/600x400/1a1a1a/cccccc?text=Shader+Experiment", // Placeholder image links: { repo: "https://github.com/Bayda77/sidequests", // Placeholder link + }, + hasDetails: true, + detailContent: { + longDescription: "This project started as a deep dive into the world of fragment shaders. I wanted to understand how to create organic-looking textures without relying on image assets. Using Perlin noise and fractional Brownian motion (fBm), I created a dynamic, shifting terrain that reacts to time and mouse input.", + challenges: "One of the biggest challenges was optimizing the GLSL code to run smoothly on lower-end devices. Mathematical operations in the fragment shader can get expensive quickly.", + learnings: "I gained a much deeper understanding of the graphics pipeline, vector math, and how to think about visuals in terms of mathematical functions rather than pixels." } }, { @@ -36,6 +42,12 @@ const SIDEQUESTS: Project[] = [ image: "https://placehold.co/600x400/2a2a2a/dddddd?text=CLI+Tool", // Placeholder links: { repo: "https://github.com/Bayda77/cli-tools" + }, + hasDetails: true, + detailContent: { + longDescription: "I built this CLI tool to automate repetitive tasks in my development workflow, such as scaffolding new project directories, managing git branches, and cleaning up temporary files. Written in Rust for blazingly fast execution.", + challenges: "Learning Rust's ownership model was a steep learning curve. Fighting the borrow checker was frustrating at first, but it eventually taught me to write much safer memory management code.", + learnings: "I learned how to build robust command-line interfaces with Clap, how to handle system I/O efficiently, and the benefits of compiled languages for system tools." } } ]; @@ -66,7 +78,7 @@ const cardVariants: Variants = { export default function Projects() { return (
-
+
{/* Featured Projects Section */} (); + const project = SIDEQUESTS.find(p => p.id === Number(id)); + + useEffect(() => { + window.scrollTo(0, 0); + }, []); + + if (!project) { + return ( +
+

Sidequest not found

+ Back to Projects +
+ ); + } + + return ( +
+ + + ← Back to Projects + + +
+

{project.title}

+
+ {project.techStack.map(tech => ( + + {tech} + + ))} +
+
+ +
+ {project.title} +
+ +
+
+

Overview

+

+ {project.detailContent?.longDescription || project.description} +

+
+ + {project.detailContent?.challenges && ( +
+

Challenges

+

+ {project.detailContent.challenges} +

+
+ )} + + {project.detailContent?.learnings && ( +
+

Learnings

+

+ {project.detailContent.learnings} +

+
+ )} + +
+ {project.links.demo && ( + + Live Demo ↗ + + )} + {project.links.repo && ( + + View Code ↗ + + )} +
+
+
+
+
+ ); +}