{"id":645,"date":"2026-04-06T11:35:41","date_gmt":"2026-04-06T15:35:41","guid":{"rendered":"https:\/\/eduverso.club\/?page_id=645"},"modified":"2026-04-13T14:21:04","modified_gmt":"2026-04-13T18:21:04","slug":"dashboard-login","status":"publish","type":"page","link":"https:\/\/eduverso.club\/?page_id=645","title":{"rendered":"LOGIN\/DASHBOARD"},"content":{"rendered":"\n<div class=\"wp-block-columns alignfull is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Eduverso &#8211; Mi Laboratorio<\/title>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600;700;800;900&#038;display=swap\" rel=\"stylesheet\">\n    <style>\n        :root {\n            --edv-brand-purple: #6016FC; \n            --edv-bg: #F8FAFC;\n            --edv-text-dark: #1E293B;\n            --edv-text-muted: #64748B;\n            --phase-empatia: #3498DB;\n            --phase-definicion: #27AE60;\n            --phase-ideacion: #F1C40F;\n            --phase-prototipado: #E67E22;\n            --phase-testeo: #E74C3C;\n        }\n\n        body { background-color: var(--edv-bg); font-family: 'Inter', sans-serif; margin: 0; color: var(--edv-text-dark); }\n        #eduverso-app { padding: 2rem; max-width: 1100px; margin: 0 auto; min-height: 100vh; }\n\n        \/* HEADER *\/\n        .app-header { \n            background: white; border-radius: 24px; padding: 1.2rem 2rem; display: flex; align-items: center; gap: 1.5rem; \n            box-shadow: 0 10px 25px rgba(96, 22, 252, 0.05); margin-bottom: 2rem; border: 1px solid rgba(96, 22, 252, 0.1);\n        }\n        .avatar-leti { width: 55px; height: 55px; border-radius: 15px; border: 2px solid var(--edv-brand-purple); padding: 5px; background: white; }\n        .avatar-leti img { width: 100%; }\n\n        \/* VISTA DASHBOARD *\/\n        #view-dashboard { display: none; animation: fadeIn 0.5s ease; }\n        .active-game-container { display: grid; grid-template-columns: 1fr 1fr; gap: 2.5rem; background: white; border-radius: 32px; padding: 3rem; box-shadow: 0 20px 50px rgba(0,0,0,0.04); }\n        .game-visual img { width: 100%; border-radius: 24px; box-shadow: 0 15px 35px rgba(0,0,0,0.08); }\n        \n        \/* STEPPER *\/\n        .edv-game-map { display: flex; justify-content: space-between; margin-bottom: 3rem; position: relative; padding: 0 20px; }\n        .edv-game-map::before { content: ''; position: absolute; top: 22px; left: 50px; right: 50px; height: 3px; background: #E2E8F0; z-index: 1; }\n        .phase-step { position: relative; z-index: 2; display: flex; flex-direction: column; align-items: center; width: 18%; }\n        .phase-dot { width: 44px; height: 44px; border-radius: 12px; background: white; border: 3px solid #E2E8F0; display: flex; align-items: center; justify-content: center; font-weight: 800; color: #CBD5E1; transition: 0.3s; }\n        .phase-step.active .phase-dot { background: var(--phase-color); border-color: var(--phase-color); color: white; transform: scale(1.15); box-shadow: 0 5px 15px rgba(0,0,0,0.1); }\n        .phase-label { margin-top: 12px; font-size: 0.7rem; font-weight: 800; text-transform: uppercase; color: #94A3B8; }\n\n        \/* BOTONES *\/\n        .btn-primary { background: var(--edv-brand-purple); color: white; border: none; padding: 1.1rem; border-radius: 18px; font-weight: 800; cursor: pointer; width: 100%; margin-top: 10px; transition: 0.3s; display: none; }\n        .btn-primary:hover { transform: translateY(-2px); filter: brightness(1.1); }\n        \n        \/* BOT\u00d3N CAMBIAR PROYECTO *\/\n        .btn-reset { \n            background: transparent; color: var(--edv-text-muted); border: 1px dashed #CBD5E1; \n            padding: 8px 15px; border-radius: 10px; font-size: 0.75rem; font-weight: 700; \n            cursor: pointer; margin-top: 15px; transition: 0.2s; display: inline-flex; align-items: center; gap: 5px;\n        }\n        .btn-reset:hover { background: #FFF1F2; color: #E11D48; border-color: #FDA4AF; }\n\n        #btn-logout { background: #FEE2E2; color: #DC2626; border: none; padding: 8px 15px; border-radius: 10px; font-weight: 800; cursor: pointer; display: none; }\n\n        \/* CHAT WINDOW *\/\n        #leti-chat-window { position: fixed; bottom: 100px; right: 30px; width: 350px; height: 480px; background: white; border-radius: 24px; box-shadow: 0 15px 50px rgba(0,0,0,0.15); display: none; flex-direction: column; z-index: 1000; border: 1px solid #F1F5F9; overflow: hidden; }\n        .chat-header { background: var(--edv-brand-purple); color: white; padding: 15px 20px; font-weight: 800; display: flex; justify-content: space-between; }\n        #chat-messages { flex: 1; padding: 15px; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; background: #F8FAFC; }\n        .msg { padding: 10px 14px; border-radius: 15px; font-size: 0.85rem; line-height: 1.4; max-width: 85%; }\n        .msg.leti { background: white; border: 1px solid #E2E8F0; align-self: flex-start; }\n        .msg.user { background: var(--edv-brand-purple); color: white; align-self: flex-end; }\n        .chat-input-area { padding: 15px; display: flex; gap: 8px; border-top: 1px solid #F1F5F9; }\n        .chat-input-area input { flex: 1; border: 1px solid #E2E8F0; padding: 8px 12px; border-radius: 10px; outline: none; }\n\n        @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n    <\/style>\n<\/head>\n<body>\n\n<div id=\"eduverso-app\">\n    <header class=\"app-header\">\n        <div class=\"avatar-leti\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/YT1327KF\/ROBOT.png\" alt=\"Leti\"><\/div>\n        <div style=\"flex:1\">\n            <h2 id=\"header-title\" style=\"margin:0; font-size: 1.2rem; color: var(--edv-brand-purple);\">Iniciando&#8230;<\/h2>\n            <p id=\"header-subtitle\" style=\"margin:0; font-size:0.85rem; color: var(--edv-text-muted);\">Laboratorio Eduverso.<\/p>\n        <\/div>\n        <button id=\"btn-logout\" onclick=\"logout()\">Cerrar Sesi\u00f3n<\/button>\n    <\/header>\n\n    <div id=\"view-dashboard\">\n        <nav class=\"edv-game-map\">\n            <div id=\"p1\" class=\"phase-step\" style=\"--phase-color:var(--phase-empatia)\"><div class=\"phase-dot\">1<\/div><span class=\"phase-label\">Empat\u00eda<\/span><\/div>\n            <div id=\"p2\" class=\"phase-step\" style=\"--phase-color:var(--phase-definicion)\"><div class=\"phase-dot\">2<\/div><span class=\"phase-label\">Definir<\/span><\/div>\n            <div id=\"p3\" class=\"phase-step\" style=\"--phase-color:var(--phase-ideacion)\"><div class=\"phase-dot\">3<\/div><span class=\"phase-label\">Idear<\/span><\/div>\n            <div id=\"p4\" class=\"phase-step\" style=\"--phase-color:var(--phase-prototipado)\"><div class=\"phase-dot\">4<\/div><span class=\"phase-label\">Prototipar<\/span><\/div>\n            <div id=\"p5\" class=\"phase-step\" style=\"--phase-color:var(--phase-testeo)\"><div class=\"phase-dot\">5<\/div><span class=\"phase-label\">Testear<\/span><\/div>\n        <\/nav>\n\n        <main class=\"active-game-container\">\n            <div class=\"game-visual\">\n                <img decoding=\"async\" src=\"https:\/\/i.ibb.co\/rRXwSqHy\/tablero-kit.jpg\" alt=\"Tablero Eduverso\">\n            <\/div>\n            <div class=\"game-info\">\n                <span id=\"badge-kit\" style=\"background:rgba(96,22,252,0.1); color:var(--edv-brand-purple); padding:5px 12px; border-radius:20px; font-weight:800; font-size:0.75rem;\">MODO: DESIGN KIT<\/span>\n                <h1 id=\"user-project-name\" style=\"font-size: 2.2rem; margin: 15px 0;\">Cargando&#8230;<\/h1>\n                \n                <div id=\"context-box\">\n                    <p id=\"context-display\" style=\"color:var(--edv-text-muted); line-height:1.6; font-style: italic; margin-bottom: 5px;\">\u00abEsperando contexto&#8230;\u00bb<\/p>\n                    <button id=\"btn-reset-project\" class=\"btn-reset\">\ud83d\udd04 Cambiar Proyecto \/ Reiniciar<\/button>\n                <\/div>\n                \n                <div style=\"background:#F8FAFC; padding:20px; border-radius:20px; margin: 20px 0;\">\n                    <span class=\"edv-label\">Puntos de Innovaci\u00f3n<\/span>\n                    <strong id=\"user-points\" style=\"font-size: 1.8rem; color: var(--edv-brand-purple);\">0 pts<\/strong>\n                <\/div>\n                \n                <button id=\"btn-continue-game\" class=\"btn-primary\" style=\"background:var(--edv-text-dark)\">COMENZAR PARTIDA<\/button>\n            <\/div>\n        <\/main>\n    <\/div>\n\n    <div id=\"leti-chat-window\">\n        <div class=\"chat-header\"><span>LETI AI<\/span><span style=\"cursor:pointer\" onclick=\"toggleChat()\">\u2715<\/span><\/div>\n        <div id=\"chat-messages\"><\/div>\n        <div class=\"chat-input-area\">\n            <input type=\"text\" id=\"chat-input\" placeholder=\"Escribe aqu\u00ed...\">\n            <button onclick=\"sendChatMessage()\" style=\"background:var(--edv-brand-purple); color:white; border:none; border-radius:8px; padding:0 10px; cursor:pointer;\">\u2794<\/button>\n        <\/div>\n    <\/div>\n    \n    <div id=\"btn-chat-trigger\" onclick=\"toggleChat()\" style=\"position:fixed; bottom:30px; right:30px; width:65px; height:65px; background:white; border:2px solid var(--edv-brand-purple); border-radius:50%; display:none; align-items:center; justify-content:center; cursor:pointer; box-shadow:0 10px 20px rgba(0,0,0,0.1); z-index:999;\">\n        <img decoding=\"async\" src=\"https:\/\/i.ibb.co\/YT1327KF\/ROBOT.png\" style=\"width:70%;\">\n    <\/div>\n<\/div>\n\n<script type=\"module\">\n    import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/11.0.1\/firebase-app.js\";\n    import { getAuth, onAuthStateChanged, signOut } from \"https:\/\/www.gstatic.com\/firebasejs\/11.0.1\/firebase-auth.js\";\n    import { getFirestore, doc, getDoc, updateDoc, deleteField } from \"https:\/\/www.gstatic.com\/firebasejs\/11.0.1\/firebase-firestore.js\";\n\n    const firebaseConfig = {\n        apiKey: \"AIzaSyAx9tzEWcCkjncZCPKLE75nVEhs1WnERRM\",\n        authDomain: \"eduverso-lab-app.firebaseapp.com\",\n        projectId: \"eduverso-lab-app\",\n        storageBucket: \"eduverso-lab-app.firebasestorage.app\",\n        messagingSenderId: \"436116444684\",\n        appId: \"1:436116444684:web:35c20208dd71f7145bc029\"\n    };\n\n    const app = initializeApp(firebaseConfig);\n    const auth = getAuth(app);\n    const db = getFirestore(app);\n\n    onAuthStateChanged(auth, async (user) => {\n        const vDash = document.getElementById('view-dashboard');\n        const btnContinue = document.getElementById('btn-continue-game');\n        const btnL = document.getElementById('btn-logout');\n        const btnChat = document.getElementById('btn-chat-trigger');\n\n        if (user) {\n            const userRef = doc(db, 'sesiones_juego', user.uid);\n            const snap = await getDoc(userRef);\n\n            if (snap.exists()) {\n                const data = snap.data();\n                const paso = data.paso_actual || 1;\n                const tieneContexto = !!data.contexto_idea;\n                \n                \/\/ Determinar si hay progreso en el mapa de empat\u00eda\n                const tieneProgreso = data.mapa_empatia && Object.keys(data.mapa_empatia).length > 0;\n\n                document.getElementById('header-title').innerText = `\u00a1Hola, ${data.usuario_nombre}!`;\n                document.getElementById('user-project-name').innerText = data.usuario_nombre;\n                document.getElementById('user-points').innerText = `${data.puntos_innovacion || 0} pts`;\n                document.getElementById('context-display').innerText = tieneContexto ? `\"${data.contexto_idea}\"` : \"Leti est\u00e1 esperando tu idea en el chat...\";\n\n                \/\/ --- L\u00d3GICA DE TEXTO DE BOT\u00d3N ---\n                if (tieneContexto) {\n                    btnContinue.style.display = 'block';\n                    \/\/ Si ya pas\u00f3 de la fase 1 o ya empez\u00f3 a llenar el mapa\n                    if (paso > 1 || tieneProgreso) {\n                        btnContinue.innerText = \"RETOMAR PARTIDA\";\n                    } else {\n                        btnContinue.innerText = \"COMENZAR PARTIDA\";\n                    }\n                } else {\n                    btnContinue.style.display = 'none';\n                }\n\n                btnContinue.onclick = () => {\n                    const rutas = {\n                        1: \"https:\/\/eduverso.club\/?page_id=658\",\n                        2: \"https:\/\/eduverso.club\/definir\/\",\n                        3: \"https:\/\/eduverso.club\/idear\/\",\n                        4: \"https:\/\/eduverso.club\/prototipar\/\",\n                        5: \"https:\/\/eduverso.club\/testear\/\"\n                    };\n                    window.location.href = rutas[paso];\n                };\n\n                \/\/ REINICIAR PROYECTO\n                document.getElementById('btn-reset-project').onclick = async () => {\n                    if(confirm(\"\u00bfEst\u00e1s seguro? Se borrar\u00e1 el contexto actual, el mapa de empat\u00eda y volver\u00e1s a la Fase 1.\")){\n                        await updateDoc(userRef, {\n                            contexto_idea: deleteField(),\n                            mapa_empatia: {},\n                            paso_actual: 1,\n                            puntos_innovacion: 0\n                        });\n                        location.reload();\n                    }\n                };\n\n                \/\/ Actualizar Stepper\n                document.querySelectorAll('.phase-step').forEach(s => s.classList.remove('active'));\n                document.getElementById(`p${paso}`).classList.add('active');\n\n                vDash.style.display = 'block';\n                btnL.style.display = 'block';\n                btnChat.style.display = 'flex';\n\n                if(!tieneContexto) {\n                    toggleChat(true);\n                    addMessage(\"leti\", `\u00a1Hola <strong>${data.usuario_nombre}<\/strong>! Soy Leti. Para empezar un nuevo proyecto, cu\u00e9ntame: \u00bfQu\u00e9 quieres resolver hoy?`);\n                }\n            }\n        } else {\n            window.location.href = \"\/login\/\";\n        }\n    });\n\n    window.logout = async () => { await signOut(auth); location.reload(); };\n\n    window.toggleChat = (force = false) => {\n        const win = document.getElementById('leti-chat-window');\n        win.style.display = (win.style.display === 'flex' && !force) ? 'none' : 'flex';\n    };\n\n    window.addMessage = (type, text) => {\n        const box = document.getElementById('chat-messages');\n        box.innerHTML += `<div class=\"msg ${type}\">${text}<\/div>`;\n        box.scrollTop = box.scrollHeight;\n    };\n\n    window.sendChatMessage = async () => {\n        const input = document.getElementById('chat-input');\n        const text = input.value.trim();\n        if(!text) return;\n\n        addMessage(\"user\", text);\n        input.value = \"\";\n\n        const user = auth.currentUser;\n        if(user) {\n            const userRef = doc(db, 'sesiones_juego', user.uid);\n            const snap = await getDoc(userRef);\n            \n            if(!snap.data().contexto_idea) {\n                await updateDoc(userRef, { contexto_idea: text });\n                document.getElementById('context-display').innerText = `\"${text}\"`;\n                addMessage(\"leti\", \"\u00a1Proyecto configurado! Haz clic en <strong>COMENZAR PARTIDA<\/strong>.\");\n                \n                const btnContinue = document.getElementById('btn-continue-game');\n                btnContinue.style.display = 'block';\n                btnContinue.innerText = \"COMENZAR PARTIDA\";\n            } else {\n                addMessage(\"leti\", \"\u00a1Entendido! Si quieres cambiar de proyecto, usa el bot\u00f3n de reiniciar arriba.\");\n            }\n        }\n    };\n<\/script>\n<\/body>\n<\/html>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eduverso &#8211; Mi Laboratorio Iniciando&#8230; Laboratorio Eduverso. Cerrar Sesi\u00f3n 1 Empat\u00eda 2 Definir 3 Idear 4 Prototipar 5 Testear MODO: DESIGN KIT Cargando&#8230; \u00abEsperando contexto&#8230;\u00bb \ud83d\udd04 Cambiar Proyecto \/ Reiniciar Puntos de Innovaci\u00f3n 0 pts COMENZAR PARTIDA LETI AI\u2715 \u2794<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-645","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/eduverso.club\/index.php?rest_route=\/wp\/v2\/pages\/645","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eduverso.club\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/eduverso.club\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/eduverso.club\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/eduverso.club\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=645"}],"version-history":[{"count":30,"href":"https:\/\/eduverso.club\/index.php?rest_route=\/wp\/v2\/pages\/645\/revisions"}],"predecessor-version":[{"id":790,"href":"https:\/\/eduverso.club\/index.php?rest_route=\/wp\/v2\/pages\/645\/revisions\/790"}],"wp:attachment":[{"href":"https:\/\/eduverso.club\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}