/** ============================ * Anti-blocage (front) * - queue d'actions * - status heartbeat * - fallback quand backend absent * ============================ */ const chat = document.getElementById('chat'); const promptEl = document.getElementById('prompt'); const sendBtn = document.getElementById('btnSend'); const statusPill = document.getElementById('statusPill'); const codeEl = document.getElementById('code'); const previewFrame = document.getElementById('previewFrame'); const netStatus = document.getElementById('netStatus'); const mediaOut = document.getElementById('mediaOut'); let onlineBackend = false; function addMsg(role, title, html) { const wrap = document.createElement('div'); wrap.className = "rounded-2xl border border-white/10 bg-white/5 p-4"; wrap.innerHTML = `
${title}
${html}
`; chat.appendChild(wrap); chat.scrollTop = chat.scrollHeight; } function setStatus(txt, type="idle") { statusPill.textContent = txt; statusPill.className = "px-2 py-1 rounded-lg border text-xs"; if (type === "ok") statusPill.classList.add("bg-emerald-500/10","border-emerald-400/20","text-emerald-200"); else if (type === "work") statusPill.classList.add("bg-amber-500/10","border-amber-400/20","text-amber-200"); else if (type === "err") statusPill.classList.add("bg-rose-500/10","border-rose-400/20","text-rose-200"); else statusPill.classList.add("bg-white/5","border-white/10","text-slate-200"); } function applyPreview() { previewFrame.srcdoc = codeEl.value; } function switchTab(tab) { document.querySelectorAll('.tabBtn').forEach(b=>{ const active = b.dataset.tab === tab; b.className = "tabBtn px-3 py-1.5 rounded-xl border text-xs " + (active ? "bg-indigo-500/20 border-indigo-400/20" : "bg-white/5 border-white/10 hover:bg-white/10"); }); document.getElementById('panel-code').classList.toggle('hidden', tab !== 'code'); document.getElementById('panel-preview').classList.toggle('hidden', tab !== 'preview'); document.getElementById('panel-media').classList.toggle('hidden', tab !== 'media'); } document.querySelectorAll('.tabBtn').forEach(b=>b.addEventListener('click', ()=>switchTab(b.dataset.tab))); document.getElementById('btnApply').addEventListener('click', ()=>{ applyPreview(); switchTab('preview'); }); document.getElementById('btnReloadPreview').addEventListener('click', applyPreview); document.getElementById('btnRefresh').addEventListener('click', applyPreview); document.getElementById('btnCopy').addEventListener('click', async ()=>{ try { await navigator.clipboard.writeText(codeEl.value); } catch {} }); function micStart() { // Micro simple (Web Speech API) - si dispo Chrome const SR = window.SpeechRecognition || window.webkitSpeechRecognition; if (!SR) { addMsg("sys","Système","Micro indisponible sur ce navigateur. Utilise Chrome Desktop."); return; } const rec = new SR(); rec.lang = "fr-FR"; rec.interimResults = false; rec.maxAlternatives = 1; setStatus("Écoute…","work"); rec.onresult = (e)=>{ const txt = e.results[0][0].transcript; promptEl.value = txt; setStatus("Prête","ok"); }; rec.onerror = ()=>setStatus("Micro erreur","err"); rec.onend = ()=>setStatus("Prête","ok"); rec.start(); } document.getElementById('btnMic').addEventListener('click', micStart); /** ====== "Agent" local (simulation front) * Ici on montre le comportement stable: * - découpe en étapes * - n'abandonne pas * - envoie du code dans la colonne droite */ function agentGenerate(userPrompt) { setStatus("Travail…","work"); addMsg("user","Toi", escapeHtml(userPrompt)); // Démo: génération simple d'une landing + injection dans le panneau code const generated = buildLanding(userPrompt); addMsg("agent","Rosalinda • Plan d'action", ` 1) Je construis la page (structure + sections).
2) Je vérifie la responsivité (desktop/mobile).
3) J'envoie le code à droite et j'active la preview.
Mode anti-interruption: si une étape échoue, je relance automatiquement. ` ); // Push code codeEl.value = generated; applyPreview(); setStatus("Terminé","ok"); } function escapeHtml(s) { return s.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">"); } function buildLanding(topic) { const safeTopic = topic && topic.trim() ? topic.trim() : "un projet"; return ` Landing - ${safeTopic}
🐋
DeepSite
Theme rebuild • rapide • propre
Démarrer
🔥 Nouvelle version

Construis ${safeTopic} sans lenteur, sans blocage.

Interface 3 colonnes: navigation à gauche, agent IA au centre, code + preview + médias à droite. Optimisée pour travailler vite et proprement.

Aperçu
Preview prêt ✅
Responsive • Tailwind • Clean
⚡ Rapide
🛡️ Stable
🧠 IA-ready
Colonne 1
Navigation, projets, bibliothèque, paramètres.
Colonne 2
Agent IA explique, planifie, corrige, n'abandonne pas.
Colonne 3
Code, preview, images/vidéos via moteur local.
`; } // Event listeners sendBtn.addEventListener('click', () => { if (promptEl.value.trim()) { agentGenerate(promptEl.value); promptEl.value = ''; } }); promptEl.addEventListener('keypress', (e) => { if (e.key === 'Enter' && promptEl.value.trim()) { agentGenerate(promptEl.value); promptEl.value = ''; } }); // Initialize setStatus("Prête", "ok"); switchTab('code');