Skip to content

Commit 12be7c1

Browse files
committed
Updated the projects page
1 parent 5c08f8e commit 12be7c1

File tree

5 files changed

+136
-11
lines changed

5 files changed

+136
-11
lines changed
2.4 MB
Loading
578 Bytes
Loading
743 KB
Loading

next-js-app/src/app/globals.css

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,29 @@ body {
4040
.animate-gradient {
4141
background-size: 200% 200%;
4242
animation: gradient-animation 3s ease infinite;
43+
}
44+
45+
/* Custom scrollbar for horizontal project display */
46+
.flex::-webkit-scrollbar {
47+
height: 8px; /* height of horizontal scrollbar */
48+
}
49+
50+
.flex::-webkit-scrollbar-track {
51+
background: #2d2d2d; /* Dark background for the track */
52+
border-radius: 10px;
53+
}
54+
55+
.flex::-webkit-scrollbar-thumb {
56+
background: #888; /* Gray thumb */
57+
border-radius: 10px;
58+
}
59+
60+
.flex::-webkit-scrollbar-thumb:hover {
61+
background: #555; /* Darker gray on hover */
62+
}
63+
64+
/* For Firefox */
65+
.flex {
66+
scrollbar-width: thin; /* "auto" or "thin" */
67+
scrollbar-color: #888 #2d2d2d; /* thumb color track color */
4368
}

next-js-app/src/app/home/page.tsx

Lines changed: 111 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ import njtJamesGroupInternNjtOfficialPicture from "../../../public/image-assets/
3535
import njtJamesGroupInternPicture1 from "../../../public/image-assets/New_Jersey_Transit/NJT_James_Group_Intern_Picture_1.jpg";
3636
import njtJamesWearingHardhatConsoleRoom from "../../../public/image-assets/New_Jersey_Transit/NJT_James_Wearing_Hardhat_Console_Room.jpg";
3737

38+
import envolvlyProjectThumbnail from "../../../public/image-assets/projects/Envolvly/thumbnail.png";
39+
import MITJOSProjectThumbnail from "../../../public/image-assets/projects/MIT-JOS/thumbnail.png";
40+
import WormholeProjectThumbnail from "../../../public/image-assets/projects/Wormhole/thumbnail.png";
41+
42+
import fileIcon from "../../../public/file.svg";
43+
import globeIcon from "../../../public/globe.svg";
44+
import windowIcon from "../../../public/window.svg";
45+
3846
interface Experience {
3947
company: string;
4048
role: string;
@@ -50,6 +58,8 @@ interface Project {
5058
technologies: string;
5159
period: string;
5260
description: string;
61+
longDescription: string;
62+
image?: StaticImageData;
5363
}
5464

5565
const education: Education = {
@@ -145,21 +155,48 @@ const projects: Project[] = [
145155
technologies: "GitHub, Docker, AWS, React, Typescript, MongoDB",
146156
period: "September 2023 - Current",
147157
description:
158+
"Laid groundwork for tech infrastructure, resulting in a robust, scalable application reaching 1,000+ unique users.",
159+
longDescription:
148160
"Laid groundwork for tech infrastructure, resulting in a robust, scalable application reaching 1,000+ unique users. Directly implemented cloud technologies such as AWS Lambda, Elastic Beanstalk, EC2, Git, and Firebase, creating a full stack web application with full mobile & desktop support.",
161+
image: envolvlyProjectThumbnail,
149162
},
150163
{
151164
name: "MIT JOS",
152165
technologies: "C, C++, Assembly, OS concepts, Computer Architecture",
153166
period: "March 2024 - June 2024",
154167
description:
168+
"Completed labs, assignments, & built an Operating system based off of MIT’s JOS curriculum.",
169+
longDescription:
155170
"Completed labs, assignments, & built an Operating system based off of MIT’s JOS curriculum. Worked directly on memory management, process management, file systems, concurrency, & kernel operations.",
171+
image: MITJOSProjectThumbnail,
156172
},
157173
{
158174
name: "StuntCV",
159175
technologies: "Python, OpenCV, MediaPipe, Tkinter, NumPy",
160176
period: "July 2025 - Present",
161177
description:
178+
"A desktop application designed for detailed analysis of acrobatic performances.",
179+
longDescription:
162180
"A desktop application designed for detailed analysis of acrobatic performances, such as cheer stunts and partner acrobatics, using advanced computer vision.",
181+
image: windowIcon,
182+
},
183+
{
184+
name: "Wormhole",
185+
technologies: "Next.js, TypeScript, Tailwind CSS, Vercel",
186+
period: "August 2025",
187+
description: "A secure file transfer application.",
188+
longDescription:
189+
"A secure file transfer application that allows users to send files of any size with end-to-end encryption.",
190+
image: WormholeProjectThumbnail,
191+
},
192+
{
193+
name: "ResumAI",
194+
technologies: "Python, OpenAI API, Streamlit",
195+
period: "August 2025",
196+
description: "An AI-powered resume builder and analyzer.",
197+
longDescription:
198+
"An AI-powered resume builder and analyzer that helps users create and optimize their resumes for job applications.",
199+
image: globeIcon,
163200
},
164201
];
165202

@@ -285,7 +322,7 @@ function ExperienceCard({ experience }: { experience: Experience }) {
285322
</p>
286323
<p className="text-sm text-gray-500">{experience.period}</p>
287324
</div>
288-
<div className="w-16 h-16 bg-.white rounded-lg flex items-center justify-center">
325+
<div className="w-16 h-16 bg-white rounded-lg flex items-center justify-center">
289326
{experience.logo ? (
290327
<Image
291328
src={experience.logo}
@@ -329,6 +366,75 @@ function ExperienceCard({ experience }: { experience: Experience }) {
329366
);
330367
}
331368

369+
function ProjectCard({ project }: { project: Project }) {
370+
const [isModalOpen, setIsModalOpen] = useState(false);
371+
372+
return (
373+
<>
374+
<div
375+
className="bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-800 rounded-lg p-6 hover:border-gray-300 dark:hover:border-gray-700 transition-all duration-300 cursor-pointer"
376+
onClick={() => setIsModalOpen(true)}
377+
>
378+
{project.image && (
379+
<div className="w-full h-40 relative mb-4 rounded-lg overflow-hidden">
380+
<Image
381+
src={project.image}
382+
alt={`${project.name} image`}
383+
fill
384+
style={{ objectFit: "cover" }}
385+
/>
386+
</div>
387+
)}
388+
<h3 className="text-xl font-bold">{project.name}</h3>
389+
<p className="text-sm text-gray-500 mb-2">{project.period}</p>
390+
<p className="text-gray-600 dark:text-gray-400 mb-4">
391+
{project.description}
392+
</p>
393+
<p className="text-sm text-gray-500 font-mono">
394+
{project.technologies}
395+
</p>
396+
</div>
397+
398+
{isModalOpen && (
399+
<div
400+
className="fixed inset-0 bg-black bg-opacity-50 backdrop-blur-sm flex items-center justify-center z-50"
401+
onClick={() => setIsModalOpen(false)}
402+
>
403+
<div
404+
className="bg-white dark:bg-gray-800 p-8 rounded-lg shadow-lg w-full max-w-2xl"
405+
onClick={(e) => e.stopPropagation()}
406+
>
407+
{project.image && (
408+
<div className="w-full h-64 relative mb-4 rounded-lg overflow-hidden">
409+
<Image
410+
src={project.image}
411+
alt={`${project.name} image`}
412+
fill
413+
style={{ objectFit: "cover" }}
414+
/>
415+
</div>
416+
)}
417+
<h2 className="text-3xl font-bold mb-2">{project.name}</h2>
418+
<p className="text-sm text-gray-500 mb-4">{project.period}</p>
419+
<p className="text-lg text-gray-700 dark:text-gray-300 mb-4">
420+
{project.longDescription}
421+
</p>
422+
<p className="text-md text-gray-500 font-mono">
423+
{project.technologies}
424+
</p>
425+
<button
426+
onClick={() => setIsModalOpen(false)}
427+
className="mt-6 bg-gray-200 dark:bg-gray-600 text-gray-800 dark:text-gray-200 font-bold py-2 px-4 rounded"
428+
>
429+
Close
430+
</button>
431+
</div>
432+
</div>
433+
)}
434+
</>
435+
);
436+
}
437+
332438
export default function HomePage() {
333439
return (
334440
<div className="min-h-screen font-sans">
@@ -359,6 +465,7 @@ export default function HomePage() {
359465
</a>
360466
<a
361467
href="mailto:[email protected]"
468+
target="_blank"
362469
rel="noopener noreferrer"
363470
className="text-gray-600 dark:text-gray-400 hover:text-black dark:hover:text-white transition-colors"
364471
>
@@ -414,20 +521,13 @@ export default function HomePage() {
414521

415522
<section id="projects">
416523
<h2 className="text-4xl font-bold mb-8 text-center">Projects</h2>
417-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
524+
<div className="flex overflow-x-auto gap-8 pb-8">
418525
{projects.map((proj, index) => (
419526
<div
420527
key={index}
421-
className="bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-800 rounded-lg p-6 hover:border-gray-300 dark:hover:border-gray-700 transition-all duration-300"
528+
className="flex-shrink-0 w-full md:w-1/2 lg:w-1/3"
422529
>
423-
<h3 className="text-xl font-bold">{proj.name}</h3>
424-
<p className="text-sm text-gray-500 mb-2">{proj.period}</p>
425-
<p className="text-gray-600 dark:text-gray-400 mb-4">
426-
{proj.description}
427-
</p>
428-
<p className="text-sm text-gray-500 font-mono">
429-
{proj.technologies}
430-
</p>
530+
<ProjectCard project={proj} />
431531
</div>
432532
))}
433533
</div>

0 commit comments

Comments
 (0)