import Link from 'next/link'; import { ArrowRight, Award, Calendar, Code, FileText, PenTool, Sparkles, Bot, } from 'lucide-react'; import { Card, CardBody, CardHeader, Badge, Avatar, Button } from '@nextcraft/ui'; import { primaryLearner, competencyStacks, allCompetencies, learnerArtifacts, upcomingDefenses, learnerMicrocredentials, } from '@nextcraft/mock-data'; import { AiTutorChat } from '../../../components/learner/ai-tutor-chat'; import { ProgressGraph } from '../../../components/learner/progress-graph'; const ACTIVE_COMPETENCY_IDS = [ 'stack-orchestration-c003', 'stack-orchestration-c008', 'stack-safety-c019', 'stack-safety-c023', ]; const ACTIVE_PROGRESS: Record = { 'stack-orchestration-c003': 45, 'stack-orchestration-c008': 38, 'stack-safety-c019': 52, 'stack-safety-c023': 30, }; const ARTIFACT_ICON = { code: Code, design: PenTool, simulation: Sparkles, document: FileText, } as const; function formatDate(iso: string): string { const d = new Date(iso); return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); } export default function DashboardPage() { const learner = primaryLearner; const activeStack = competencyStacks.find((s) => s.id === 'stack-orchestration')!; const activeCompetencies = ACTIVE_COMPETENCY_IDS .map((id) => allCompetencies.find((c) => c.id === id)) .filter((c): c is NonNullable => Boolean(c)); const stackProgress = learner.progress[activeStack.id] ?? 0; const masteredInStack = activeStack.competencies.filter((c) => c.status === 'mastered').length; const totalInStack = activeStack.competencies.length; const milestones = Array.from({ length: totalInStack }, (_, i) => i < masteredInStack); return (
{/* Header */}

Welcome back, {learner.name.split(' ')[0]}

You're {stackProgress}% through the {activeStack.name} stack.

{/* Top row: active competencies + milestone tracker */}
{/* Active competencies (spans 2) */}

Active competencies

{activeStack.name}

{activeCompetencies.map((c) => { const pct = ACTIVE_PROGRESS[c.id] ?? 0; return (
{c.name} {pct}%
); })} {/* Milestone tracker */}

Milestone tracker

{masteredInStack}/{totalInStack} competencies mastered

    {milestones.map((done, i) => (
  1. {done ? : i + 1}
  2. ))}

{stackProgress}% overall stack progress

{/* Progress graph (full width) */}

Mastery progress

Last 8 weeks · AI Orchestration stack

{/* Bottom row: recent artifacts + upcoming defenses */}
{/* Recent artifacts */}

Recent artifacts

{learnerArtifacts.length} submitted

{learnerArtifacts.slice(0, 4).map((a) => { const Icon = ARTIFACT_ICON[a.type] ?? FileText; return (

{a.name}

{formatDate(a.createdAt)}

{a.type}

); })}
{/* Upcoming defenses */}

Upcoming defenses

Oral exams on the calendar

{upcomingDefenses.map((d) => { const comp = allCompetencies.find((c) => c.id === d.competencyId); if (!comp) return null; return (

{comp.name}

{d.status === 'scheduled' ? 'Scheduled' : 'Pending scheduling'}

); })}
{/* AI Tutor chat */}

AI Tutor

Coach and Socratic tutor · mock responses

); }