'); doc.close();const root = doc.getElementById('pdfRoot'); if(!root){ if(frame && frame.parentNode) frame.parentNode.removeChild(frame); flash('No se pudo preparar el PDF.', 'err'); return; }const waitRender = new Promise(function(resolve){ requestAnimationFrame(function(){ requestAnimationFrame(function(){ setTimeout(resolve, 240); }); }); });const waitImages = new Promise(function(resolve){ const imgs = Array.from(root.querySelectorAll('img')); if(!imgs.length) return resolve(); let pending = imgs.length; const done = function(){ pending--; if(pending<=0) resolve(); }; imgs.forEach(function(img){ if(img.complete) return done(); img.addEventListener('load', done, {once:true}); img.addEventListener('error', done, {once:true}); }); });loadPdfLib().then(function(){ return Promise.all([waitRender, waitImages]); }).then(function(){ return window.html2pdf().set({ margin:[0,0,0,0], filename:'Examen_BAUER_'+(state.student.name||'Alumno').replace(/\s+/g,'_')+'.pdf', image:{type:'jpeg',quality:0.98}, html2canvas:{scale:2,useCORS:true,scrollX:0,scrollY:0,x:0,y:0,backgroundColor:'#0f1210',windowWidth:794,windowHeight:1123}, jsPDF:{unit:'mm',format:'a4',orientation:'portrait'}, pagebreak:{mode:['css']} }).from(root).save(); }).then(function(){ state.pdfExported=true; state.dirty=false; flash('PDF generado.', 'ok'); }).catch(function(){ flash('No se pudo generar PDF.', 'err'); }).finally(function(){ if(frame && frame.parentNode) frame.parentNode.removeChild(frame); }); }function exportJson(){ try{ const blob=new Blob([JSON.stringify(state,null,2)],{type:'application/json'}); const a=document.createElement('a'); a.href=URL.createObjectURL(blob); a.download='backup_examen_'+Date.now()+'.json'; document.body.appendChild(a); a.click(); a.remove(); flash('JSON exportado.', 'ok'); }catch(e){ flash('No se pudo exportar JSON.', 'err'); } }function resetAll(){ if(!confirm('¿Reiniciar todo el examen?')) return; localStorage.removeItem(CONFIG.storageKey); clearInterval(timer); clearInterval(autosave); Object.assign(state,{view:'start',block:0,remaining:CONFIG.duration,started:false,student:{name:'',group:'',date:new Date().toISOString().slice(0,10)},answers:{},lastSaved:null,saveState:'idle',pdfExported:false,dirty:false,teacherMode:false}); render(); }function renderSummary(){ viewport.innerHTML='

Resumen final

Auto:
'+autoScore()+'/'+CONFIG.autoPoints+'
Manual pendiente:
/'+(CONFIG.totalPoints-CONFIG.autoPoints)+'
Final profesor:
/'+CONFIG.totalPoints+'
'+BLOCKS.map((b,i)=>'

'+esc(b.title)+'

'+b.q.map((q,ix)=>'
'+(ix+1)+'. '+esc(q.p+correctAnswerText(q))+'
'+esc(state.answers[q.id]||'—')+'
').join('')+'
').join('')+'
';document.getElementById('downloadPdf').onclick=generatePdf; document.getElementById('backBtn').onclick=()=>{ state.view='exam'; render(); }; document.getElementById('resetBtn').onclick=resetAll; }function render(){ try{ openModal(); if(state.view==='start') return renderStart(); if(state.view==='exam') return renderExam(); if(state.view==='summary') return renderSummary(); renderStart(); }catch(e){ console.error(e); if(viewport) viewport.innerHTML='

Error

Hubo un problema. Recarga o usa borrador.

'; } }window.addEventListener('beforeunload', function(e){ const incomplete=ansCount()