// 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 &&
/ }
캠퍼스 분실물 찾아주는 앱
{/* Project header */}
{['김민준','이수민','박서연','정현우','한지우'].map((n, i) => (
))}
전체 진행률
47%
{/* Completion Index — only when project status is complete (demo project is in-progress, so hidden) */}
{projectComplete && (
)}
{/* Tabs */}
{[['칸반', true], ['멤버'], ['자료'], ['일정']].map(([l, on]) => (
{l}
))}
setEvalOpen(o => !o)} className="rounded-xl text-[12px] font-bold px-3 py-2 flex items-center gap-1.5" style={{ background: evalOpen ? '#4F46E5' : '#EEF2FF', color: evalOpen ? 'white' : '#4F46E5' }}>
팀원 평가하기
{evalOpen && (
<>
setEvalOpen(false)} />
평가할 팀원 선택
{TEAM.map(m => (
{ setEvalOpen(false); window.__openPeerEval && window.__openPeerEval(m); }}
className="w-full flex items-center gap-2.5 px-2 py-2 rounded-xl hover:bg-zinc-50 text-left">
{m.name}
{m.dept} {m.year}
))}
프로젝트 종료 시점 동료평가 · 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 => (
))}
{[
{ 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) => (
))}
)}
);
}
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 (
{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.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 (
);
})}
)}
PROJECT COMPLETE
프로젝트 완료를 축하해요!
10주의 협업이 한 장의 포트폴리오로 자동 정리됐어요
{/* PDF-like card */}
PORTFOLIO
2026.07.14 생성
#ML-2026-0714-892
} />
} />
} />
사용 기술
{['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 => (
))}
전공 다양성 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 => (
))}
동료 평가 — 4.7 / 5.0
{[
{ who: '박서연', dept: '경영학', text: '커뮤니케이션이 정말 좋았어요. 막혔을 때 항상 빠르게 해결책을 가져오는 분.' },
{ who: '이수민', dept: '시각디자인', text: '디자인 의도를 정확히 구현해줘서 작업이 정말 편했어요.' },
].map((c, i) => (
))}
PDF로 내보내기
공유 링크 복사
다음 프로젝트
);
}
function SectionLabel({ children }) {
return