@@ -35,6 +35,14 @@ import njtJamesGroupInternNjtOfficialPicture from "../../../public/image-assets/
3535import njtJamesGroupInternPicture1 from "../../../public/image-assets/New_Jersey_Transit/NJT_James_Group_Intern_Picture_1.jpg" ;
3636import 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+
3846interface 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
5565const 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+
332438export 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
361467468+ 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