// Academia Pilar Garijo — Área privada (prototipo) // Login simulado → curso contratado con lecciones, visor, notas y exportación. const CURSO = { titulo: "Curso de Masaje Método Garijo", modulos: [ { nombre: "Módulo 1 · Introducción", lecciones: [ { id: "l01", nombre: "Bienvenida al curso", dur: "04:32" }, { id: "l02", nombre: "Cómo aprovechar la formación", dur: "06:15" }, ], }, { nombre: "Módulo 2 · Fundamentos del método", lecciones: [ { id: "l03", nombre: "Principios del Método Garijo", dur: "18:40" }, { id: "l04", nombre: "Preparación, camilla y entorno", dur: "12:05" }, { id: "l05", nombre: "Las manos: presión y ritmo", dur: "21:18" }, ], }, { nombre: "Módulo 3 · El masaje completo", lecciones: [ { id: "l06", nombre: "Espalda I", dur: "24:50" }, { id: "l07", nombre: "Espalda II", dur: "19:32" }, { id: "l08", nombre: "Zona cervical", dur: "16:44" }, { id: "l09", nombre: "Extremidades inferiores", dur: "22:10" }, { id: "l10", nombre: "La secuencia completa", dur: "32:00" }, ], }, { nombre: "Módulo 4 · Aplicación en consulta", lecciones: [ { id: "l11", nombre: "Protocolos con tus clientes", dur: "14:25" }, { id: "l12", nombre: "Cierre y siguientes pasos", dur: "08:12" }, ], }, ], }; const LECCIONES = CURSO.modulos.flatMap((m) => m.lecciones); // Texto de cada lección (contenido provisional hasta tener el real) function textoLeccion(leccion) { return [ `En esta lección, Pilar desarrolla «${leccion.nombre}» dentro del ${CURSO.titulo}. Mira el vídeo completo antes de pasar a la siguiente lección: cada gesto del método se apoya en el anterior.`, "Debajo tienes el espacio de notas. Apunta lo que quieras recordar al aplicar la técnica en tu consulta: presiones, ritmos, errores a evitar. Al terminar el curso podrás exportar todas tus notas en un solo documento.", ]; } // --- persistencia --- const LS_NOTAS = "pg-academia-notas"; const LS_HECHAS = "pg-academia-completadas"; const LS_LECCION = "pg-academia-leccion"; const LS_SESION = "pg-academia-sesion"; function leerLS(clave, porDefecto) { try { const v = localStorage.getItem(clave); return v ? JSON.parse(v) : porDefecto; } catch (e) { return porDefecto; } } // ============================================================ // Login // ============================================================ function LoginScreen({ onLogin }) { const enviar = (e) => { e.preventDefault(); onLogin(); }; return (
Pilar Garijo Academia

Área privada de alumnos

Accede con los datos que recibiste al inscribirte.

e.preventDefault()}>¿Has olvidado la contraseña?

← Volver a la academia

); } // ============================================================ // Área privada // ============================================================ function AreaPrivada({ onLogout }) { const [leccionId, setLeccionId] = React.useState(() => leerLS(LS_LECCION, "l01")); const [notas, setNotas] = React.useState(() => leerLS(LS_NOTAS, {})); const [hechas, setHechas] = React.useState(() => leerLS(LS_HECHAS, [])); const leccion = LECCIONES.find((l) => l.id === leccionId) || LECCIONES[0]; const idx = LECCIONES.indexOf(leccion); const numero = (i) => String(i + 1).padStart(2, "0"); React.useEffect(() => { localStorage.setItem(LS_LECCION, JSON.stringify(leccionId)); }, [leccionId]); const cambiarNota = (texto) => { const siguientes = { ...notas, [leccion.id]: texto }; setNotas(siguientes); localStorage.setItem(LS_NOTAS, JSON.stringify(siguientes)); }; const alternarHecha = (id) => { const siguientes = hechas.includes(id) ? hechas.filter((h) => h !== id) : [...hechas, id]; setHechas(siguientes); localStorage.setItem(LS_HECHAS, JSON.stringify(siguientes)); }; const exportarNotas = () => { const fecha = new Date().toLocaleDateString("es-ES", { day: "numeric", month: "long", year: "numeric" }); let texto = `MIS NOTAS — ${CURSO.titulo.toUpperCase()}\n`; texto += `Academia Pilar Garijo · Exportado el ${fecha}\n`; texto += "=".repeat(56) + "\n\n"; let conNotas = 0; LECCIONES.forEach((l, i) => { const nota = (notas[l.id] || "").trim(); if (!nota) return; conNotas++; texto += `Lección ${numero(i)} — ${l.nombre}\n`; texto += "-".repeat(40) + "\n"; texto += nota + "\n\n"; }); if (conNotas === 0) { texto += "(Todavía no has escrito ninguna nota.)\n"; } const blob = new Blob([texto], { type: "text/plain;charset=utf-8" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "Mis notas - Curso de Masaje Metodo Garijo.txt"; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url); }; const completadas = hechas.filter((id) => LECCIONES.some((l) => l.id === id)).length; const pct = Math.round((completadas / LECCIONES.length) * 100); return (
Pilar Garijo Área privada
Hola, alumna/o
A
{/* ---------- menú de lecciones ---------- */} {/* ---------- visor ---------- */}
Lección {numero(idx)} · Vídeo {leccion.dur}
Lección {numero(idx)} de {numero(LECCIONES.length - 1)}

{leccion.nombre}

Sobre esta lección

{textoLeccion(leccion).map((parrafo, i) => (

{parrafo}

))}

Mis notas

Se guardan automáticamente
); } // ============================================================ // Raíz // ============================================================ function AcademiaApp() { // Siempre se entra por el login: no recordamos la sesión al cargar la página. const [dentro, setDentro] = React.useState(false); const entrar = () => { setDentro(true); }; const salir = () => { setDentro(false); }; return dentro ? : ; } ReactDOM.createRoot(document.getElementById("root")).render();