`; } /* Serialize FormData to object */ function formDataToObject(fd) { const obj = {}; for (const [k,v] of fd.entries()) obj[k] = v; return obj; } /* Submit handler: sends to Google Script, builds HTML and opens preview/download */ document.getElementById('animacodesForm').addEventListener('submit', async (e)=> { e.preventDefault(); const form = e.target; const btn = document.getElementById('submitBtn'); const status = document.getElementById('statusMessage'); btn.disabled = true; btn.innerText = 'PROCESANDO...'; status.style.display = 'block'; status.style.color = '#6ee7ff'; status.innerText = 'Guardando en Google Sheets y generando página...'; const fd = new FormData(form); const params = new URLSearchParams(); params.append('fecha', new Date().toLocaleString()); for (const [k,v] of fd.entries()) if (v) params.append(k,v); try { await fetch(WEB_APP_URL, { method:'POST', mode:'no-cors', body: params }); const dataObj = formDataToObject(fd); const html = buildProfileHTML(dataObj); // abrir preview en nueva pestaña const blob = new Blob([html], {type: 'text/html'}); const previewUrl = URL.createObjectURL(blob); window.open(previewUrl, '_blank', 'noopener'); // iniciar descarga (opcional) const a = document.createElement('a'); a.href = previewUrl; a.download = (dataObj.usuarioLinktree ? dataObj.usuarioLinktree.replace(/[^a-z0-9_\\-]/gi,'') : 'perfil') + '.html'; a.click(); status.style.color = '#34d399'; status.innerText = 'Página generada y abierta en nueva pestaña. Descarga iniciada.'; form.reset(); btn.style.display = 'none'; } catch (err) { console.error(err); status.style.color = '#ff4d4d'; status.innerText = 'Error al generar la página. Intenta nuevamente.'; btn.disabled = false; btn.innerText = 'GENERAR Y GUARDAR ACCESO'; } });