"use client"; import { SquareArrowOutUpRight } from 'lucide-react'; import React from 'react'; import { Button } from './ui/button'; const projects = [ { name: 'EPC 2025 Broadcast Manager', url: 'https://www.youtube.com/playlist?list=PLZeYZotn5_IOJDek6e35NKzUtJm09yxZD', desc: 'ADOFAI is web-scale', detail: '달성이 주관하고 ADOFAI.gg가 공동 주최하는 Effect Playing Contest 2025 방송 화면의 대부분의 기능을 개발하였습니다.', tags: ['React', 'ElysiaJS'], }, { name: 'newsletter', url: 'https://github.com/imnyang/newsletter', desc: 'For Memos', detail: '그저 이메일이 오면 Discord 웹훅으로 포워딩합니다.', tags: ['Rust', 'IMAP'] }, { name: 'memos-rss', url: 'https://github.com/imnyang/memos-rss', desc: 'For Memos', detail: 'Discord 포럼 채널에 RSS 피드에 올라온 내용을 포워딩합니다.', tags: ['Rust', 'Discord Bot', 'RSS'] }, { name: 'today.isangjeong', url: 'https://instagram.com/today.isangjeong', desc: 'Instagram Bot', detail: '매일 학교의 급식 메뉴를 자동으로 업로드하는 인스타그램 봇입니다.', tags: ['TypeScript', 'Instagram', '@napi-rs/canvas'] } ]; export default function Projects() { const [visibleCount, setVisibleCount] = React.useState(3); return (
{projects.slice(0, visibleCount).map((project, idx) => (
{project.url ? ( {project.name} ) : ( {project.name} )} {project.desc}

{project.detail}

{project.tags.map((tag, i) => ( {tag} ))}
))}
{visibleCount < projects.length && ( )}
); }