11"use client"
22
3- import { useEffect , useRef } from "react"
4- import { Github , ExternalLink } from "lucide-react"
3+ import { useEffect , useRef , useState } from "react"
4+ import { Github , ExternalLink , Figma , Code } from "lucide-react"
55import Link from "next/link"
66
7- // Ejemplo de proyectos - puedes reemplazarlos con tus proyectos reales
7+ // Example projects - you can replace them with your real projects
88const projects = [
99 {
1010 id : 1 ,
@@ -18,7 +18,7 @@ const projects = [
1818 {
1919 id : 2 ,
2020 title : "Grunge Merch" ,
21- description : "Interfaz web de una tienda de merch oficial de bandas de grunge y rock, con sistema de páginas de producto detalladas y galería de imágenes HD ." ,
21+ description : "Official grunge and rock band merch store web interface, with detailed product pages and HD image gallery ." ,
2222 image : "./projects/grunge.png" ,
2323 technologies : [ "Next.js" , "React" , "Tailwind CSS" , "APIs" , "Web Scraping" ] ,
2424 github : "https://github.com/UltimateCosmic/grunge" ,
@@ -51,10 +51,51 @@ const projects = [
5151 github : "https://github.com/UltimateCosmic/UltimateCosmic.github.io" ,
5252 demo : "https://cosmodev.me/" ,
5353 } ,
54+ {
55+ id : 6 ,
56+ title : "DeliPUCP" ,
57+ description : "Mobile app to reserve menus across the university dining halls. Figma prototype demonstrating menu browsing, schedule selection, and reservation flow." ,
58+ image : "/projects/delipucp.png" ,
59+ technologies : [ "Figma Prototype" , "Mobile" , "UI/UX" ] ,
60+ github : "" , // Private repository
61+ demo : "https://www.figma.com/proto/F94vpya9dZRTw9RioBY2Ah/DELIPUCP?node-id=23-5611&p=f&t=00qIgBVLQ8tHGD28-1&scaling=scale-down&content-scaling=fixed&page-id=0%3A1&starting-point-node-id=23%3A5611&show-proto-sidebar=1" ,
62+ figma : "https://www.figma.com/design/F94vpya9dZRTw9RioBY2Ah/DeliPUCP?node-id=0-1&t=8eErBWAJa3yqx32j-1" ,
63+ } ,
64+ {
65+ id : 7 ,
66+ title : "OdiparTrack" ,
67+ description : "A planning system developed as part of 9th-semester coursework. Figma prototype showcases task scheduling, progress tracking, and resource allocation features." ,
68+ image : "/projects/odipartrack.png" ,
69+ technologies : [ "Figma Prototype" , "Planning System" , "UI/UX" ] ,
70+ github : "" , // Private repository
71+ demo : "https://www.figma.com/proto/zJ4QQT8oATe2hilIgBmOQ9/OdiparTrack-Software---Prototype?node-id=47-11512&p=f&t=8dFNxVa6FVvgEaoK-1&scaling=min-zoom&content-scaling=fixed&page-id=23%3A845&starting-point-node-id=47%3A11512&show-proto-sidebar=1" ,
72+ figma : "https://www.figma.com/design/zJ4QQT8oATe2hilIgBmOQ9/OdiparTrack-Software---Prototype?node-id=23-845&t=xUV13eCrmrIxBU9h-1" ,
73+ } ,
74+ {
75+ id : 8 ,
76+ title : "MiTutor" ,
77+ description : "Tutoring management system for coordinating sessions between professors and students, developed during 7th-semester coursework. Figma prototype includes session booking, tutor profiles, and messaging flows." ,
78+ image : "/projects/mitutor.png" ,
79+ technologies : [ "Figma Prototype" , "Education" , "Scheduling" ] ,
80+ github : "" , // Private repository
81+ demo : "https://www.figma.com/proto/PNjuf2y76dcM4Ip6WOjzNt/Prototipo?node-id=2266-20827&p=f&t=20oUQkWg9payQwdf-1&scaling=min-zoom&content-scaling=fixed&page-id=6%3A16&starting-point-node-id=2266%3A20827" ,
82+ designType : "figma" ,
83+ figma : "" , // Figma prototype exists but not publicly shared — mark as private
84+ } ,
5485]
5586
87+ // Filter state: default to show non-Figma projects (code/other)
88+ // 'projects' = non-Figma items, 'designs' = Figma prototypes
89+ type FilterType = "projects" | "designs"
90+
5691export function ProjectsSection ( ) {
5792 const sectionRef = useRef < HTMLElement > ( null )
93+ const [ filter , setFilter ] = useState < FilterType > ( "projects" )
94+
95+ const filteredProjects = projects . filter ( ( p ) => {
96+ const isFigma = Boolean ( p . figma ) || p . designType === "figma"
97+ return filter === "designs" ? isFigma : ! isFigma
98+ } )
5899
59100 useEffect ( ( ) => {
60101 const observer = new IntersectionObserver (
@@ -87,8 +128,37 @@ export function ProjectsSection() {
87128 < h2 className = "text-3xl font-bold leading-tight tracking-tighter md:text-4xl mb-8" >
88129 < span className = "text-dark-accent" > #</ span > Projects
89130 </ h2 >
131+
132+ { /* Filter tabs: Projects (default) / Designs - simple, full-width buttons, stack on mobile */ }
133+ < div className = "mb-6 flex w-full flex-col md:flex-row gap-3" >
134+ < button
135+ onClick = { ( ) => setFilter ( "projects" ) }
136+ className = { `flex-1 w-full flex items-center justify-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors ${
137+ filter === "projects"
138+ ? "bg-dark-accent/10 text-dark-accent border border-dark-accent"
139+ : "bg-dark-surface text-dark-secondary border border-dark-border"
140+ } `}
141+ aria-pressed = { filter === "projects" }
142+ >
143+ < Code className = "h-4 w-4" />
144+ < span > Projects</ span >
145+ </ button >
146+ < button
147+ onClick = { ( ) => setFilter ( "designs" ) }
148+ className = { `flex-1 w-full flex items-center justify-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors ${
149+ filter === "designs"
150+ ? "bg-dark-accent/10 text-dark-accent border border-dark-accent"
151+ : "bg-dark-surface text-dark-secondary border border-dark-border"
152+ } `}
153+ aria-pressed = { filter === "designs" }
154+ >
155+ < Figma className = "h-4 w-4" />
156+ < span > Designs</ span >
157+ </ button >
158+ </ div >
159+
90160 < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" >
91- { projects . map ( ( project ) => (
161+ { filteredProjects . map ( ( project ) => (
92162 < div
93163 key = { project . id }
94164 className = "bg-dark-background rounded-lg overflow-hidden border border-dark-border transition-all duration-300 hover:border-dark-accent hover:shadow-lg hover:shadow-dark-accent/10 flex flex-col h-full"
@@ -122,22 +192,49 @@ export function ProjectsSection() {
122192 </ div >
123193 </ div >
124194 < div className = "flex justify-between mt-auto" >
125- { project . github ? (
126- < Link
127- href = { project . github }
128- target = "_blank"
129- rel = "noopener noreferrer"
130- className = "flex items-center text-dark-secondary hover:text-dark-accent transition-colors"
131- >
132- < Github className = "h-4 w-4 mr-1" />
133- < span className = "text-sm" > Code</ span >
134- </ Link >
135- ) : (
136- < span className = "flex items-center text-dark-secondary/50" >
137- < Github className = "h-4 w-4 mr-1" />
138- < span className = "text-sm" > Private</ span >
139- </ span >
140- ) }
195+ < div className = "flex items-center space-x-4" >
196+ { /* Show Code if repository exists */ }
197+ { project . github && (
198+ < Link
199+ href = { project . github }
200+ target = "_blank"
201+ rel = "noopener noreferrer"
202+ className = "flex items-center text-dark-secondary hover:text-dark-accent transition-colors"
203+ >
204+ < Github className = "h-4 w-4 mr-1" />
205+ < span className = "text-sm" > Code</ span >
206+ </ Link >
207+ ) }
208+
209+ { /* If project has a Figma design URL, show Design with Figma icon.
210+ If project is a Figma prototype but has no public URL (designType === 'figma' && !project.figma),
211+ show "Private" with the Figma icon. Otherwise, if no github and no figma, show Private with GitHub icon. */ }
212+ { project . figma ? (
213+ < Link
214+ href = { project . figma }
215+ target = "_blank"
216+ rel = "noopener noreferrer"
217+ className = "flex items-center text-dark-secondary hover:text-dark-accent transition-colors"
218+ >
219+ < Figma className = "h-4 w-4 mr-1" />
220+ < span className = "text-sm" > Design</ span >
221+ </ Link >
222+ ) : project . designType === "figma" ? (
223+ // Figma prototype exists but not publicly shared — show Private with Figma icon
224+ < span className = "flex items-center text-dark-secondary/50" >
225+ < Figma className = "h-4 w-4 mr-1" />
226+ < span className = "text-sm" > Private</ span >
227+ </ span >
228+ ) : (
229+ ! project . github && (
230+ < span className = "flex items-center text-dark-secondary/50" >
231+ < Github className = "h-4 w-4 mr-1" />
232+ < span className = "text-sm" > Private</ span >
233+ </ span >
234+ )
235+ ) }
236+ </ div >
237+
141238 < Link
142239 href = { project . demo }
143240 target = "_blank"
0 commit comments