Carrito de cursos

Gestiona tu selección y calcula tu plan de aprendizaje

Ajusta cantidades, revisa el total en euros y usa el estimador para ver las horas totales del curso según tu ritmo semanal.

Tus cursos

Modifica cantidades o elimina elementos. Se recalcula al instante.

    Σ

    Resumen

    Total en euros y tiempo total.

    Cursos
    0
    Total
    0,00 €
    Tiempo total
    0.0 h
    Checkout seguro
    Simulación de compra con validación. Puedes revisar antes de confirmar.
    ¿Dudas? Llámanos: +34 911 234 567
    Promesa de calidad
    Todos los cursos incluyen recursos descargables y acceso sin caducidad.
    %

    Recordatorio

    Tu carrito se guarda automáticamente en tu navegador.

    Si cambias de dispositivo, tu selección no se sincroniza. Finaliza la compra para asegurar tu acceso.
    Ayuda
    Cómo funciona el carrito
    Carga de datos
    El carrito lee tu selección desde localStorage y cruza los IDs con catalog.json para mostrar precio y duración.
    Estimador de horas
    Introduce horas/semana para calcular semanas necesarias. La fecha estimada se calcula desde hoy.
    Privacidad
    El sitio usa cookies locales para recordar preferencias de tema y el consentimiento.
    Atajo: pulsa Esc para cerrar.
    Checkout
    Confirmar pedido
    Resumen de pago
    Total
    0,00 €
    Horas
    0.0 h
    Cursos
    0
    Tu tiempo estimado
    Ajusta horas/semana en el estimador para ver la duración en semanas.
    Ritmo guardado
    Puedes cambiarlo cuando quieras.
    Acceso inmediato
    Recibirás el acceso por email tras confirmar. Este flujo es demostrativo.
    Al confirmar, aceptas nuestras condiciones y el tratamiento de datos para gestionar el pedido.
    Listo
    Pedido confirmado
    Gracias por tu compra
    Hemos enviado un email con el resumen.
    Referencia
    Si necesitas ayuda, contáctanos en [email protected] o +34 911 234 567.
    `; const yearEl=document.getElementById('m2b9x'); if(yearEl) yearEl.textContent=String(new Date().getFullYear()); } } } function u9toggleTheme(){ const root=document.documentElement; const isDark=root.classList.contains('dark'); if(isDark){ root.classList.remove('dark'); try{localStorage.setItem(f1.kThemeKey,'light')}catch(e){} }else{ root.classList.add('dark'); try{localStorage.setItem(f1.kThemeKey,'dark')}catch(e){} } } function o6cookieInit(){ const banner=$('c0o8k'); const v=localStorage.getItem(f1.kConsentKey); if(v==='accepted' || v==='rejected'){ banner.classList.add('hidden'); return; } banner.classList.remove('hidden'); const accept=$('h6s2p'); const reject=$('g1k7v'); const close=$('q9e1c'); const set=(val)=>{ try{localStorage.setItem(f1.kConsentKey,val)}catch(e){} banner.classList.add('hidden'); }; accept.addEventListener('click', ()=>set('accepted')); reject.addEventListener('click', ()=>set('rejected')); close.addEventListener('click', ()=>set('rejected')); } function k6openDialog(dlg){ if(!dlg) return; try{ dlg.showModal(); }catch(e){} } function z6closeDialog(dlg){ if(!dlg) return; try{ dlg.close(); }catch(e){} } function r9wireDialogs(){ const helpDlg=$('k1q8a'); const chkDlg=$('h4v0d'); const okDlg=$('e9a1t'); $('a6n0c').addEventListener('click', ()=>k6openDialog(helpDlg)); $('u7x1v').addEventListener('click', ()=>z6closeDialog(helpDlg)); $('m6c3s').addEventListener('click', ()=>z6closeDialog(helpDlg)); helpDlg.addEventListener('cancel', (ev)=>{ev.preventDefault(); z6closeDialog(helpDlg);}); $('t5y8e').addEventListener('click', ()=>{ const cart=y1getCart(); if(cart.length===0){ $('k7w3x').classList.remove('hidden'); return; } x7render().then(()=>k6openDialog(chkDlg)); }); $('p8n1h').addEventListener('click', ()=>z6closeDialog(chkDlg)); $('g8u3l').addEventListener('click', ()=>z6closeDialog(chkDlg)); chkDlg.addEventListener('cancel', (ev)=>{ev.preventDefault(); z6closeDialog(chkDlg);}); $('y1c8b').addEventListener('click', ()=>z6closeDialog(okDlg)); $('t0b3n').addEventListener('click', ()=>z6closeDialog(okDlg)); okDlg.addEventListener('cancel', (ev)=>{ev.preventDefault(); z6closeDialog(okDlg);}); $('i3m7q').addEventListener('click', ()=>{ o2clearCart(); z6closeDialog(okDlg); }); } function f3validateForm(){ const name=$('k2n8q'); const last=$('s1b6c'); const email=$('f3u9e'); const phone=$('n8e2p'); const eName=$('a9v6z'); const eLast=$('x0m5d'); const eEmail=$('c1k8y'); const ePhone=$('p5q7t'); const show=(el,msg)=>{ el.textContent=msg; el.classList.remove('hidden'); }; const hide=(el)=>{ el.textContent=''; el.classList.add('hidden'); }; let ok=true; const n=name.value.trim(); const l=last.value.trim(); const em=email.value.trim(); const ph=phone.value.trim(); if(n.length<2){ ok=false; show(eName,'Introduce tu nombre (mín. 2 caracteres).'); } else hide(eName); if(l.length<2){ ok=false; show(eLast,'Introduce tus apellidos (mín. 2 caracteres).'); } else hide(eLast); const reEmail=/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i; if(!reEmail.test(em)){ ok=false; show(eEmail,'Email no válido.'); } else hide(eEmail); const normPh=ph.replace(/[^\d+]/g,''); const rePhone=/^\+34\s?\d{9}$|^\+34\d{9}$/; if(!rePhone.test(ph.replace(/\s+/g,' ')) && !rePhone.test(normPh)){ ok=false; show(ePhone, eEmail.textContent); show(ePhone,''); show(ePhone,''); } if(!(/^\+34\s?\d{9}$/.test(ph.trim()) || /^\+34\d{9}$/.test(normPh))){ ok=false; show(ePhone, eEmail.textContent); } hide(eEmail); if(!(/^\+34\s?\d{9}$/.test(ph.trim()) || /^\+34\d{9}$/.test(normPh))){ ok=false; show(ePhone, ''); } if(!(/^\+34\s?\d{9}$/.test(ph.trim()) || /^\+34\d{9}$/.test(normPh))){ ok=false; show(ePhone, ''); } if(!(/^\+34\s?\d{9}$/.test(ph.trim()) || /^\+34\d{9}$/.test(normPh))){ ok=false; show(ePhone,''); } hide(ePhone); if(!(/^\+34\s?\d{9}$/.test(ph.trim()) || /^\+34\d{9}$/.test(normPh))){ ok=false; show(ePhone,''); } hide(ePhone); if(!(/^\+34\s?\d{9}$/.test(ph.trim()) || /^\+34\d{9}$/.test(normPh))){ ok=false; show(ePhone,'Teléfono no válido. Formato: +34 621 483 902'); } return ok; } function t7randomRef(){ const a='ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; let s='CS-'; for(let i=0;i<4;i++){ s+=a[Math.floor(Math.random()*a.length)]; } s+='-'; for(let i=0;i<6;i++){ s+=a[Math.floor(Math.random()*a.length)]; } s+='-'; for(let i=0;i<4;i++){ s+=a[Math.floor(Math.random()*a.length)]; } return s; } function g7wireCheckout(){ const form=$('y7r2k'); const chkDlg=$('h4v0d'); const okDlg=$('e9a1t'); form.addEventListener('submit', (ev)=>{ ev.preventDefault(); const cart=y1getCart(); if(cart.length===0){ z6closeDialog(chkDlg); return; } if(!f3validateForm()) return; const ref=t7randomRef(); $('s9e2m').textContent=ref; const totalsNow={total:0,hours:0,count:0}; $('u5z1l').textContent='Hemos enviado un email con el resumen (demo). Guarda tu referencia por si necesitas soporte.'; z6closeDialog(chkDlg); k6openDialog(okDlg); }); } function w2wireControls(){ $('p1d7u').addEventListener('click', u9toggleTheme); $('z9h2s').addEventListener('click', ()=>{ const cart=y1getCart(); if(cart.length===0){ x7render(); return; } const dlg=document.createElement('dialog'); dlg.className='rounded-2xl w-[min(520px,calc(100vw-2rem))] p-0 t8s0y bg-white text-slate-900 dark:bg-slate-950 dark:text-slate-100 m5x1r'; dlg.innerHTML=`
    Confirmación
    Vaciar carrito
    ¿Seguro que quieres eliminar todos los cursos del carrito?
    `; document.body.appendChild(dlg); const close=()=>{try{dlg.close()}catch(e){}; dlg.remove();}; dlg.querySelectorAll('[data-x="close"],[data-x="cancel"]').forEach(b=>b.addEventListener('click', close)); dlg.querySelector('[data-x="ok"]').addEventListener('click', ()=>{ o2clearCart(); close(); }); dlg.addEventListener('cancel', (ev)=>{ev.preventDefault(); close();}); dlg.showModal(); }); $('c4t1b').addEventListener('click', ()=>x7render()); $('e1b0m').addEventListener('click', g2ensureEstimatorVisible); const apply=()=>{ const inp=$('h8e4t'); let v=(inp.value||'').replace(',','.'); v=v.replace(/[^\d.]/g,''); let num=Number(v); if(!Number.isFinite(num)) num=0; if(num>0) num=n1(num,0.5,60); if(num>0){ localStorage.setItem(f1.kPaceKey, String(r1(num))); inp.value=String(r1(num)).replace('.',','); }else{ inp.value=''; localStorage.removeItem(f1.kPaceKey); } x7render(); }; $('n7k0w').addEventListener('click', apply); $('h8e4t').addEventListener('keydown', (ev)=>{ if(ev.key==='Enter'){ ev.preventDefault(); apply(); } }); $('s0u2d').addEventListener('click', ()=>{ localStorage.removeItem(f1.kPaceKey); $('h8e4t').value=''; x7render(); }); $('r6c1a').addEventListener('click', ()=>{ const inp=$('h8e4t'); if(!inp.value.trim()){ localStorage.removeItem(f1.kPaceKey); x7render(); return; } apply(); }); } function n0initPaceInput(){ const paceRaw=localStorage.getItem(f1.kPaceKey); const inp=$('h8e4t'); if(paceRaw && inp){ const num=Number(paceRaw); if(Number.isFinite(num) && num>0){ inp.value=String(r1(num)).replace('.',','); } } } async function init(){ await Promise.all([j8loadComponent('v8m2q','./header.html'), j8loadComponent('n2z6p','./footer.html')]); o6cookieInit(); r9wireDialogs(); g7wireCheckout(); w2wireControls(); n0initPaceInput(); await x7render(); } init(); })();