diff --git a/src/components/Projects.tsx b/src/components/Projects.tsx new file mode 100644 index 0000000..1cda177 --- /dev/null +++ b/src/components/Projects.tsx @@ -0,0 +1,222 @@ +'use client'; + +import { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useTranslations } from 'next-intl'; +import { ExternalLink } from 'lucide-react'; + +type Project = { + id: string; + category: 'ai' | 'web'; + titleKey: string; + descKey: string; + tags: string[]; + link: string; +}; + +export default function Projects() { + const t = useTranslations('Projects'); + const [filter, setFilter] = useState<'all' | 'ai' | 'web'>('all'); + + const projectsList: Project[] = [ + { + id: 'ai1', + category: 'ai', + titleKey: 'list.ai1.title', + descKey: 'list.ai1.description', + tags: ['LLM Ops', 'Evaluation', 'Python', 'HuggingFace'], + link: 'https://github.com/Coaxys', + }, + { + id: 'ai2', + category: 'ai', + titleKey: 'list.ai2.title', + descKey: 'list.ai2.description', + tags: ['Inference', 'vLLM', 'Quantization', 'Docker'], + link: 'https://github.com/Coaxys', + }, + { + id: 'ai3', + category: 'ai', + titleKey: 'list.ai3.title', + descKey: 'list.ai3.description', + tags: ['RAG', 'Agents', 'LangChain', 'VectorDB'], + link: 'https://github.com/Coaxys', + }, + { + id: 'ai4', + category: 'ai', + titleKey: 'list.ai4.title', + descKey: 'list.ai4.description', + tags: ['Data Engineering', 'Ray', 'NLP', 'FastAPI'], + link: 'https://github.com/Coaxys', + }, + { + id: 'ai5', + category: 'ai', + titleKey: 'list.ai5.title', + descKey: 'list.ai5.description', + tags: ['Speech', 'Whisper', 'PyTorch', 'Gradio'], + link: 'https://github.com/Coaxys', + }, + { + id: 'web1', + category: 'web', + titleKey: 'list.web1.title', + descKey: 'list.web1.description', + tags: ['UI/UX', 'Next.js', 'Tailwind CSS', 'Framer Motion'], + link: 'https://teknav.ir', + }, + { + id: 'web2', + category: 'web', + titleKey: 'list.web2.title', + descKey: 'list.web2.description', + tags: ['Branding', 'React', 'Chart.js', 'Figma'], + link: 'https://github.com/Coaxys', + }, + { + id: 'web3', + category: 'web', + titleKey: 'list.web3.title', + descKey: 'list.web3.description', + tags: ['Open Source', 'MDX', 'Tailwind CSS', 'SEO'], + link: 'https://github.com/Coaxys', + }, + { + id: 'web4', + category: 'web', + titleKey: 'list.web4.title', + descKey: 'list.web4.description', + tags: ['Frontend', 'Next.js', 'WebGL', 'Framer Motion'], + link: 'https://github.com/Coaxys', + }, + { + id: 'web5', + category: 'web', + titleKey: 'list.web5.title', + descKey: 'list.web5.description', + tags: ['Branding', 'CSS Grid', 'Interactivity', 'Vite'], + link: 'https://github.com/Coaxys', + }, + ]; + + const filteredProjects = projectsList.filter( + (p) => filter === 'all' || p.category === filter + ); + + return ( +
+
+ + {/* Header */} +
+

+ {t('title')} +

+

+ {t('subtitle')} +

+
+ + {/* Tab Filters */} +
+
+ {(['all', 'ai', 'web'] as const).map((tab) => ( + + ))} +
+
+ + {/* Projects Grid */} + + + {filteredProjects.map((p) => ( + +
+ {/* Category Pill */} + + {p.category === 'ai' ? t('aiLabel') : t('webLabel')} + + + {/* Title */} +

+ {t(p.titleKey)} +

+ + {/* Description */} +

+ {t(p.descKey)} +

+
+ +
+ {/* Tech Tags */} +
+ {p.tags.map((tag) => ( + + {tag} + + ))} +
+ + {/* Card Actions / Hover overlay equivalent */} + +
+ + {/* Subtle Hover Action Overlay (as per spec: "Hover reveals a subtle overlay with a 'View' button") */} +
+ + ))} + + + +
+
+ ); +}