// Screens 5-7: Dashboard, Portfolio, Notifications const A2 = window.MajorAtoms; const D2 = window.MajorLinkData; const Lc2 = window.lucideReact || {}; const { useState: useS2 } = React; // ============ SCREEN 5: DASHBOARD ============ function ScreenDashboard({ device, animKey }) { const isM = device === 'mobile'; const [evalOpen, setEvalOpen] = useS2(false); const projectComplete = false; // demo project is in-progress; flip to true to surface the completion index const TEAM = [ { name: '김민준', dept: '컴퓨터공학', year: 3 }, { name: '이수민', dept: '시각디자인', year: 2 }, { name: '박서연', dept: '경영학', year: 3 }, { name: '정현우', dept: '통계학', year: 4 }, { name: '한지우', dept: '미디어커뮤니케이션', year: 2 }, ]; return (
{!isM && } {!isM && /} 캠퍼스 분실물 찾아주는 앱
{!isM && }
{/* Project header */}
교내 서비스 진행 중

캠퍼스 분실물 찾아주는 앱

{['김민준','이수민','박서연','정현우','한지우'].map((n, i) => ( ))}
마감까지
D-23
전체 진행률 47%
{/* Completion Index — only when project status is complete (demo project is in-progress, so hidden) */} {projectComplete && (
)}
{/* Tabs */}
{[['칸반', true], ['멤버'], ['자료'], ['일정']].map(([l, on]) => (
{l}
))}
{evalOpen && ( <>
setEvalOpen(false)} />
평가할 팀원 선택
{TEAM.map(m => ( ))}
프로젝트 종료 시점 동료평가 · CATME 6개 항목
)}
{/* Body */}
{isM ? (
{[['To Do', 5, true], ['In Progress', 3], ['Done', 8]].map(([l, n, on]) => (
{l} {n}
))}
← 가로로 스와이프해서 다른 열 보기
{D2.TASKS.todo.map(t => )}
) : (
)}
{!isM && (
{[ { l: '로그인 API 구현', d: 'D-2', urgent: true, owner: '정현우', dept: '통계학' }, { l: '로고 시안 v2', d: '내일', urgent: true, owner: '이수민', dept: '시각디자인' }, { l: '발표 영상 편집', d: 'D-4', owner: '한지우', dept: '미디어커뮤니케이션' }, { l: '인터뷰 스크립트', d: 'D-7', owner: '박서연', dept: '경영학' }, ].map(t => (
{t.l}
{t.owner}
{t.d}
))}
{[ { who: '박서연', dept: '경영학', what: '[로고 시안] Task를 완료했어요', t: '5분 전' }, { who: '정현우', dept: '통계학', what: '[로그인 API] 댓글을 남겼어요', t: '23분 전' }, { who: '한지우', dept: '미디어커뮤니케이션', what: '[발표 영상] 자료를 업로드했어요', t: '1시간 전' }, { who: '이수민', dept: '시각디자인', what: '브랜드 컬러를 확정했어요', t: '3시간 전' }, ].map((a, i) => (
{a.who}님이 {a.what}
{a.t}
))}
디스코드 알림
#majorlink-team
)}
); } function KanbanColumn({ title, count, tone, tasks, done }) { const tones = { gray: { dot: '#94A3B8', bg: '#F4F4F5', text: '#475569' }, indigo: { dot: '#4F46E5', bg: '#EEF2FF', text: '#4F46E5' }, lime: { dot: '#84CC16', bg: '#ECFCCB', text: '#3F6212' }, }; const t = tones[tone]; return (
{title} {count}
{tasks.map(task => )}
+ Task 추가
); } function TaskCard({ t, done }) { const m = D2.MAJOR[t.major]; const dept = { '컴공/SW': '컴퓨터공학', '디자인': '시각디자인', '경영/기획': '경영학', '미디어/홍보': '미디어커뮤니케이션', '통계/데이터': '통계학' }[t.major]; return (
window.__openTask && window.__openTask(t)} className="rounded-xl bg-white p-3 border shadow-card hover:shadow-cardHov transition cursor-pointer" style={{ borderColor: '#E4E4E7', opacity: done ? 0.7 : 1 }}>
{t.title}
{t.tag && {t.tag}}
{t.desc}
{t.owner}
{t.files > 0 && {t.files}} {t.comments > 0 && {t.comments}} {t.due}
); } // ============ SCREEN 6: PORTFOLIO ============ function ScreenPortfolio({ device, animKey }) { const isM = device === 'mobile'; return (
{/* Confetti */} {window.__ML_SHOW_CONFETTI !== false && (
{Array.from({ length: 24 }).map((_, i) => { const colors = ['#4F46E5','#84CC16','#EC4899','#F97316','#14B8A6','#F59E0B']; const shape = i % 3; return ( ); })}
)}
{!isM && }
PROJECT COMPLETE

프로젝트 완료를 축하해요!

10주의 협업이 한 장의 포트폴리오로 자동 정리됐어요

{/* PDF-like card */}
최도윤
한양대 · 컴퓨터공학 3학년
PORTFOLIO
2026.07.14 생성
#ML-2026-0714-892
} />
매칭
알고리즘 UI
} /> } /> } />
사용 기술
{['React','TypeScript','Tailwind','Figma','Git','Vercel'].map(t => {t})}
팀 구성 — 5명
{[ { n: '최도윤', d: '컴퓨터공학', r: 'FE 개발' }, { n: '정현우', d: '통계학', r: 'BE 개발' }, { n: '이수민', d: '시각디자인', r: '디자인' }, { n: '박서연', d: '경영학', r: 'PM' }, { n: '한지우', d: '미디어커뮤니케이션', r: '콘텐츠' }, ].map(p => (
{p.n}
{p.r}
))}
전공 다양성 5/5 — 5개 계열 모두 참여
링크
{[ { ico: , l: 'GitHub', v: 'github.com/lostfound-app' }, { ico: , l: '배포 URL', v: 'lostfound.hanyang.kr' }, { ico: , l: 'Figma', v: 'figma.com/file/Tn29x' }, ].map(L => (
{L.ico}
{L.l}
{L.v}
))}
동료 평가 — 4.7 / 5.0
{[ { who: '박서연', dept: '경영학', text: '커뮤니케이션이 정말 좋았어요. 막혔을 때 항상 빠르게 해결책을 가져오는 분.' }, { who: '이수민', dept: '시각디자인', text: '디자인 의도를 정확히 구현해줘서 작업이 정말 편했어요.' }, ].map((c, i) => (
{c.who}
"{c.text}"
{[1,2,3,4,5].map(s => )}
))}
); } function SectionLabel({ children }) { return
{children}
; } function InfoTile({ label, big, small, icon, custom }) { return (
{icon}{label.toUpperCase()}
{custom ?
{custom}
: (
{big}
{small}
)}
); } // ============ SCREEN 7: NOTIFICATIONS (mobile-only feature) ============ function ScreenNotifWeb() { return (
📱

모바일 전용 화면입니다

알림은 푸시 중심이라 모바일 앱에서 가장 빛나요. 오른쪽 iPhone 프레임에서 풀스크린으로 미리보기 하세요.

iOS · Android · 카카오톡 알림 연동
); } function ScreenNotifMobile({ animKey }) { return (

알림

3 NEW
오늘
{D2.NOTIFS_TODAY.map((n, i) => )}
이번 주
{D2.NOTIFS_WEEK.map((n, i) => )}
); } function NotifCard({ n, idx, animKey, dim }) { return (
{n.icon} {n.title} {n.time}
{n.body}
); } window.MajorScreens2 = { ScreenDashboard, ScreenPortfolio, ScreenNotifWeb, ScreenNotifMobile, };