// ============ Pantalla: Inicio (dashboard con sesiones) ============ function SessionCard({ s, onOpen, big }) { const n = daysUntil(s.date); const when = n === 0 ? "Hoy" : n === 1 ? "Mañana" : fmtDate(s.date); const d = parseD(s.date); return (
{d.getDate()} {MES[d.getMonth()]}
{when} · {s.time} {s.course}

{s.title}

{s.host}
{s.joinable ? onOpen && onOpen(s)}>Unirme : Recordar}
); } function ContinueCard({ course, go }) { // find first active module / not-done lesson let target = null; for (const m of course.modules) { for (const l of m.lessons) { if (!l.done) { target = { m, l }; break; } } if (target) break; } return (
go("curso", { courseId: course.id })}>
Continuar donde quedaste

{course.title}

{target ? target.l.title : "Repasar contenido"}

{course.progress}% completado
); } function Dashboard({ go }) { const u = DATA.user; const inProgress = DATA.courses.filter((c) => c.progress > 0 && c.progress < 100); const upcoming = [...DATA.sessions].sort((a, b) => parseD(a.date) - parseD(b.date)); const next = upcoming[0]; const pending = DATA.assignments.filter((a) => a.status === "pending"); const totalProgress = DATA.courses.length ? Math.round(DATA.courses.reduce((s, c) => s + c.progress, 0) / DATA.courses.length) : 0; return (
{MES_L[TODAY.getMonth()].toUpperCase()} · {TODAY.getDate()}, {TODAY.getFullYear()}

Hola, {u.name.split(" ")[0]} 👋

{u.program ? <>Vas avanzando muy bien en el programa {u.program}. : "Tu campus esta listo para recibir cursos asignados."}

Avance global
{inProgress.length}cursos activos
{pending.length}tareas pendientes
Próxima sesión en vivo
{next ? go("sala", { sessionId: s.id })} /> :

Sin sesiones programadas

Cuando haya clases en vivo apareceran aca.

}

Continúa aprendiendo

{inProgress.map((c) => )} {inProgress.length === 0 &&
Todavía no hay cursos activos asignados.
}

Agenda

{upcoming.slice(0, 4).map((s) => { const d = parseD(s.date); return (
{d.getDate()}{MES[d.getMonth()]}
{s.title}{s.time}
); })}

Tareas por entregar

{pending.map((a) => { const dl = dueLabel(a.due); return (
go("tareas", { open: a.id })}>
{a.title}{a.course}
{dl.txt}
); })}
); } Object.assign(window, { Dashboard, SessionCard, ContinueCard });