// ============ Pantallas: Mis Cursos + Detalle de curso ============ function CourseCard({ c, go }) { const done = c.progress === 100; const started = c.progress > 0; const totalLessons = c.modules.reduce((s, m) => s + m.lessons.length, 0); const doneLessons = c.modules.reduce((s, m) => s + m.lessons.filter((l) => l.done).length, 0); return (
go("curso", { courseId: c.id })}>
{c.level} {done && Completado}

{c.title}

{c.subtitle}

{c.instructor} {c.hours}
{doneLessons}/{totalLessons} lecciones {done ? "Repasar" : started ? "Continuar" : "Empezar"}
); } function CourseList({ go, query = "" }) { const [tab, setTab] = useState("todos"); const q = query.toLowerCase().trim(); const filtered = DATA.courses.filter((c) => { if (q && !c.title.toLowerCase().includes(q) && !(c.subtitle || "").toLowerCase().includes(q)) return false; if (tab === "curso") return c.progress > 0 && c.progress < 100; if (tab === "completados") return c.progress === 100; if (tab === "nuevos") return c.progress === 0; return true; }); const tabs = [["todos", "Todos"], ["curso", "En curso"], ["completados", "Completados"], ["nuevos", "Por empezar"]]; return (
{tabs.map(([id, l]) => ( ))}
{filtered.map((c) => )}
); } function ModuleRow({ m, courseId, openDefault, go }) { const [open, setOpen] = useState(openDefault); const locked = m.state === "locked"; const doneCount = m.lessons.filter((l) => l.done).length; const allDone = doneCount === m.lessons.length; return (
{open && !locked && (
{m.lessons.map((l) => { const meta = TYPE_META[l.type]; return ( ); })}
)}
); } function CourseDetail({ courseId, go }) { const c = DATA.courses.find((x) => x.id === courseId); const totalLessons = c.modules.reduce((s, m) => s + m.lessons.length, 0); const doneLessons = c.modules.reduce((s, m) => s + m.lessons.filter((l) => l.done).length, 0); const activeIdx = c.modules.findIndex((m) => m.state === "active"); return (
{c.level}

{c.title}

{c.subtitle}

{c.instructor} {c.hours} de contenido {c.modules.length} módulos
{doneLessons} de {totalLessons} lecciones { for (const m of c.modules) for (const l of m.lessons) if (!l.done) return go("leccion", { courseId: c.id, moduleId: m.id, lessonId: l.id }); go("leccion", { courseId: c.id, moduleId: c.modules[0].id, lessonId: c.modules[0].lessons[0].id }); }}> {c.progress === 0 ? "Empezar curso" : c.progress === 100 ? "Repasar" : "Continuar"}

Contenido del curso

{c.modules.map((m, i) => ( ))}
); } Object.assign(window, { CourseCard, CourseList, ModuleRow, CourseDetail });