Spaces:
Running
<!doctype html>
Browse files<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Espace Codage — 3 Colonnes</title>
<style>
:root{
--bg:#0b0f1a;
--panel:#0f172a;
--panel2:#0b1222;
--border:#1f2a44;
--text:#e7eefc;
--muted:#98a6c7;
--accent:#23f3c7;
--accent2:#ff2d7a;
}
*{ box-sizing:border-box; margin:0; padding:0; font-family:system-ui, -apple-system, Segoe UI, Roboto, Arial; }
body{ background:var(--bg); color:var(--text); height:100vh; }
.app{
height:100vh;
display:grid;
grid-template-columns: 280px 1fr 360px; /* ✅ 3 colonnes */
}
/* ===== COLONNE 1 (inchangée) ===== */
.sidebar{
background: linear-gradient(180deg, #0e1424, #0a1020);
border-right:1px solid var(--border);
padding:18px;
display:flex;
flex-direction:column;
gap:14px;
}
.brand{ display:flex; align-items:center; gap:10px; }
.logo{
width:40px; height:40px; border-radius:12px;
display:flex; align-items:center; justify-content:center;
background:#121b33; border:1px solid var(--border);
}
.brandName{ font-weight:800; font-size:20px; color:#7cf5dc; }
.brandSub{ font-size:12px; color:var(--muted); }
.btnPrimary{
width:100%;
padding:12px;
border:none;
border-radius:10px;
background: linear-gradient(90deg, var(--accent2), #ff6aa3);
color:white;
font-weight:700;
cursor:pointer;
}
.nav{ display:flex; flex-direction:column; gap:10px; margin-top:6px; }
.navBtn{
width:100%;
padding:12px;
background:#121b33;
border:1px solid var(--border);
border-radius:10px;
color:var(--text);
text-align:left;
cursor:pointer;
}
.sectionTitle{
margin-top:10px;
font-size:12px;
letter-spacing:1px;
color:#7cf5dc;
font-weight:800;
}
.projects{ display:flex; flex-direction:column; gap:10px; }
.projectItem{
width:100%;
padding:12px;
background:#0f1a33;
border:1px solid var(--border);
border-radius:12px;
color:var(--text);
display:flex;
align-items:center;
justify-content:space-between;
cursor:pointer;
}
.projectItem.active{ outline:2px solid rgba(35,243,199,0.25); }
.pill{
font-size:11px;
padding:4px 8px;
border-radius:999px;
border:1px solid var(--border);
}
.pill.green{ background:rgba(40,199,111,.15); }
.pill.orange{ background:rgba(255,159,67,.15); }
.pill.blue{ background:rgba(54,162,235,.15); }
.pill.purple{ background:rgba(153,102,255,.15); }
.sidebarFooter{ margin-top:auto; color:var(--muted); font-size:12px; }
/* ===== COLONNE 2 ===== */
.main{
padding:22px;
display:flex;
flex-direction:column;
gap:16px;
min-width:0;
}
.smallHeader h1{ font-size:22px; font-weight:900; }
.smallHeader p{ color:var(--muted); margin-top:4px; font-size:12px; }
.codePanel{
background:rgba(5, 9, 20, .85);
border:1px solid var(--border);
border-radius:16px;
padding:16px;
min-height:260px;
}
.codeTop{
display:flex;
align-items:center;
justify-content:space-between;
gap:12px;
margin-bottom:10px;
}
.codeTop h2{ font-size:16px; color:#7cf5dc; }
.codeActions{ display:flex; gap:10px; }
.smallBtn{
padding:10px 12px;
background:#121b33;
border:1px solid var(--border);
color:var(--text);
border-radius:10px;
cursor:pointer;
}
.smallBtn.danger{ background:rgba(255,45,122,.15); }
pre.codeOutput{
white-space:pre-wrap;
line-height:1.5;
color:#d9e6ff;
font-size:13px;
}
.examples{
background:rgba(15,23,42,.35);
border:1px solid var(--border);
border-radius:16px;
padding:14px;
}
.examplesTitle{ color:#7cf5dc; font-weight:800; margin-bottom:10px; }
.chips{ display:flex; gap:10px; flex-wrap:wrap; }
.chip{
padding:10px 12px;
border-radius:999px;
background:#0f1a33;
border:1px solid var(--border);
color:var(--text);
cursor:pointer;
}
/* ✅ barre en bas */
.promptDock{
margin-top:auto;
background:rgba(15,23,42,.35);
border:1px solid var(--border);
border-radius:16px;
padding:14px;
}
/* ✅ Générer + Micro à GAUCHE du champ */
.promptBar{
display:flex;
gap:10px;
align-items:center;
}
.generateBtn{
padding:14px 16px;
border-radius:12px;
border:none;
background: linear-gradient(90deg, var(--accent2), #ff6aa3);
color:white;
font-weight:900;
cursor:pointer;
white-space:nowrap;
}
.micBtn{
padding:14px 16px;
border-radius:12px;
border:1px solid var(--border);
background:#121b33;
color:var(--text);
cursor:pointer;
white-space:nowrap;
}
#promptInput{
flex:1;
padding:14px;
border-radius:12px;
border:1px solid var(--border);
background:#0b1222;
color:var(--text);
outline:none;
min-width:0;
}
/* ===== COLONNE 3 : VIDE 100% ===== */
.right{
border-left:1px solid var(--border);
background: transparent;
}
/* toast discret */
.toast{
position:fixed;
bottom:18px;
left:50%;
transform:translateX(-50%);
background:rgba(15,23,42,.92);
border:1px solid rgba(124,245,220,.25);
color:#e7eefc;
padding:10px 14px;
border-radius:12px;
font-size:13px;
z-index:9999;
}
</style>
</head>
<body>
<div class="app">
<!-- COL 1 -->
<aside class="sidebar" id="colLeft">
<div class="brand">
<div class="logo">🚀</div>
<div class="brandText">
<div class="brandName">DeepSeed</div>
<div class="brandSub">Interface</div>
</div>
</div>
<button class="btnPrimary">+ Nouvelle tâche</button>
<div class="nav">
<button class="navBtn">🔍 Rechercher</button>
<button class="navBtn">📚 Bibliothèque</button>
</div>
<div class="sectionTitle">PROJETS</div>
<div class="projects">
<button class="projectItem">
<span>API Utilisateurs</span>
<span class="pill green">TERMINÉ</span>
</button>
<button class="projectItem active">
<span>Composant React</span>
<span class="pill orange">EN COURS</span>
</button>
<button class="projectItem">
<span>Base de données</span>
<span class="pill blue">BROUILLON</span>
</button>
<button class="projectItem">
<span>API REST</span>
<span class="pill purple">NOUVEAU</span>
</button>
</div>
<div class="sidebarFooter">
<div class="hint">✅ Colonne 1 fixe</div>
</div>
</aside>
<!-- COL 2 -->
<main class="main" id="colCenter">
<header class="smallHeader" id="mainHeader">
<h1 id="appTitle">Espace Codage</h1>
<p id="appSubtitle">Génération de code IA (mode simple)</p>
</header>
<section class="codePanel">
<div class="codeTop">
<h2>Code généré</h2>
<div class="codeActions">
<button id="copyBtn" class="smallBtn">📄 Copier</button>
<button id="clearBtn" class="smallBtn danger">🗑️ Effacer</button>
</div>
</div>
<pre id="codeOutput" class="codeOutput">// Le code généré apparaîtra ici…</pre>
</section>
<section class="examples">
<div class="examplesTitle">Exemples de demandes :</div>
<div class="chips">
<button class="chip" data-prompt="Crée une fonction Python qui calcule une factorielle.">Factorielle Python</button>
<button class="chip" data-prompt="Génère un composant React Card avec titre et bouton.">Composant React</button>
<button class="chip" data-prompt="Crée une classe Java simple pour gérer une pile (stack).">Classe Java</button>
<button class="chip" data-prompt="Écris du CSS pour une carte moderne (ombre, radius, hover).">CSS Carte</button>
</div>
</section>
<!-- ✅ BARRE EN BAS : actions à gauche -->
<section class="promptDock">
<div class="promptBar">
<button id="generateBtn" class="generateBtn">Générer ✨</button>
<button id="micBtn" class="micBtn" title="Parler">🎤</button>
<input id="promptInput" type="text" placeholder="Écrivez ici… (ex: bonjour)" />
</div>
</section>
</main>
<!-- COL 3 : vide -->
<aside class="right" id="colRight"></aside>
</div>
<div id="toast" class="toast" hidden></div>
<script>
// ===== util =====
const toastEl = document.getElementById("toast");
function toast(msg){
toastEl.hidden = false;
toastEl.textContent = msg;
clearTimeout(toast._t);
toast._t = setTimeout(()=>toastEl.hidden=true, 1400);
}
// ===== éléments =====
const promptInput = document.getElementById("promptInput");
const generateBtn = document.getElementById("generateBtn");
const micBtn = document.getElementById("micBtn");
const codeOutput = document.getElementById("codeOutput");
const copyBtn = document.getElementById("copyBtn");
const clearBtn = document.getElementById("clearBtn");
const colRight = document.getElementById("colRight");
const appTitle = document.getElementById("appTitle");
const appSubtitle = document.getElementById("appSubtitle");
// ===== générateur de code (temporaire) =====
function fakeGenerate(prompt){
const p = (prompt || "").trim();
if(!p) return "// Écris une demande puis clique sur Générer ✨";
return `// ✅ Demande reçue : ${p}
function main() {
console.log("Hello Espace Codage!");
}
main();`;
}
// ===== moteur de consignes UI (simple et efficace) =
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
title: Espace Codage 3 Cols
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
title: Espace Codage 3 Cols
|
| 3 |
+
colorFrom: red
|
| 4 |
+
colorTo: green
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
|
@@ -1,19 +1,103 @@
|
|
| 1 |
<!doctype html>
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
<!doctype html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 6 |
+
<title>Espace Codage — 3 Colonnes</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css" />
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
</head>
|
| 10 |
+
<body class="bg-slate-950 text-slate-100 min-h-screen">
|
| 11 |
+
<div class="min-h-screen grid" style="grid-template-columns: 280px 1fr 360px;">
|
| 12 |
+
<!-- COL 1 -->
|
| 13 |
+
<aside class="border-r border-slate-800 bg-gradient-to-b from-slate-900/80 to-slate-950/80 p-4 flex flex-col gap-4">
|
| 14 |
+
<div class="flex items-center gap-3">
|
| 15 |
+
<div class="w-10 h-10 rounded-xl bg-slate-900/60 border border-slate-800 flex items-center justify-center text-xl">🚀</div>
|
| 16 |
+
<div>
|
| 17 |
+
<div class="font-extrabold text-slate-100">DeepSeed</div>
|
| 18 |
+
<div class="text-xs text-slate-400">Interface</div>
|
| 19 |
+
</div>
|
| 20 |
+
</div>
|
| 21 |
+
|
| 22 |
+
<button class="w-full py-3 rounded-xl bg-rose-500 hover:bg-rose-600 text-white font-bold transition">+ Nouvelle tâche</button>
|
| 23 |
+
|
| 24 |
+
<div class="flex flex-col gap-2">
|
| 25 |
+
<button class="w-full text-left py-3 rounded-xl bg-slate-900/60 border border-slate-800 hover:bg-slate-900 transition">🔍 Rechercher</button>
|
| 26 |
+
<button class="w-full text-left py-3 rounded-xl bg-slate-900/60 border border-slate-800 hover:bg-slate-900 transition">📚 Bibliothèque</button>
|
| 27 |
+
</div>
|
| 28 |
+
|
| 29 |
+
<div class="mt-2 text-xs tracking-widest font-extrabold uppercase text-rose-400">Projets</div>
|
| 30 |
+
<div class="flex flex-col gap-2">
|
| 31 |
+
<button class="project-item">
|
| 32 |
+
<span>API Utilisateurs</span>
|
| 33 |
+
<span class="pill green">TERMINÉ</span>
|
| 34 |
+
</button>
|
| 35 |
+
<button class="project-item active">
|
| 36 |
+
<span>Composant React</span>
|
| 37 |
+
<span class="pill orange">EN COURS</span>
|
| 38 |
+
</button>
|
| 39 |
+
<button class="project-item">
|
| 40 |
+
<span>Base de données</span>
|
| 41 |
+
<span class="pill blue">BROUILLON</span>
|
| 42 |
+
</button>
|
| 43 |
+
<button class="project-item">
|
| 44 |
+
<span>API REST</span>
|
| 45 |
+
<span class="pill purple">NOUVEAU</span>
|
| 46 |
+
</button>
|
| 47 |
+
</div>
|
| 48 |
+
|
| 49 |
+
<div class="mt-auto text-xs text-slate-400">
|
| 50 |
+
<div class="hint">✅ Colonne 1 fixe</div>
|
| 51 |
+
</div>
|
| 52 |
+
</aside>
|
| 53 |
+
|
| 54 |
+
<!-- COL 2 -->
|
| 55 |
+
<main class="p-6 flex flex-col gap-4 min-w-0">
|
| 56 |
+
<header>
|
| 57 |
+
<h1 id="appTitle" class="text-2xl font-black">Espace Codage</h1>
|
| 58 |
+
<p id="appSubtitle" class="text-slate-400 mt-1 text-sm">Génération de code IA (mode simple)</p>
|
| 59 |
+
</header>
|
| 60 |
+
|
| 61 |
+
<section class="rounded-2xl border border-slate-800 bg-slate-950/80 p-4">
|
| 62 |
+
<div class="flex items-center justify-between gap-3 mb-3">
|
| 63 |
+
<h2 class="text-rose-300 font-bold">Code généré</h2>
|
| 64 |
+
<div class="flex gap-2">
|
| 65 |
+
<button id="copyBtn" class="px-3 py-2 rounded-xl bg-slate-900/60 border border-slate-800 hover:bg-slate-900 transition">📄 Copier</button>
|
| 66 |
+
<button id="clearBtn" class="px-3 py-2 rounded-xl bg-rose-500/15 border border-rose-500/40 text-rose-200 hover:bg-rose-500/25 transition">🗑️ Effacer</button>
|
| 67 |
+
</div>
|
| 68 |
+
</div>
|
| 69 |
+
<pre id="codeOutput" class="text-slate-200 leading-relaxed whitespace-pre-wrap text-sm">// Le code généré apparaîtra ici…</pre>
|
| 70 |
+
</section>
|
| 71 |
+
|
| 72 |
+
<section class="rounded-2xl border border-slate-800 bg-slate-900/30 p-4">
|
| 73 |
+
<div class="font-extrabold text-rose-300 mb-2">Exemples de demandes :</div>
|
| 74 |
+
<div class="flex flex-wrap gap-2">
|
| 75 |
+
<button class="chip" data-prompt="Crée une fonction Python qui calcule une factorielle.">Factorielle Python</button>
|
| 76 |
+
<button class="chip" data-prompt="Génère un composant React Card avec titre et bouton.">Composant React</button>
|
| 77 |
+
<button class="chip" data-prompt="Crée une classe Java simple pour gérer une pile (stack).">Classe Java</button>
|
| 78 |
+
<button class="chip" data-prompt="Écris du CSS pour une carte moderne (ombre, radius, hover).">CSS Carte</button>
|
| 79 |
+
</div>
|
| 80 |
+
</section>
|
| 81 |
+
|
| 82 |
+
<!-- Barre en bas -->
|
| 83 |
+
<section class="mt-auto rounded-2xl border border-slate-800 bg-slate-900/30 p-4">
|
| 84 |
+
<div class="flex items-center gap-3">
|
| 85 |
+
<button id="generateBtn" class="px-4 py-3 rounded-xl bg-rose-500 hover:bg-rose-600 text-white font-black transition">Générer ✨</button>
|
| 86 |
+
<button id="micBtn" class="px-4 py-3 rounded-xl border border-slate-800 bg-slate-900/60 hover:bg-slate-900 transition" title="Parler">🎤</button>
|
| 87 |
+
<input id="promptInput" class="flex-1 px-4 py-3 rounded-xl bg-slate-900/60 border border-slate-800 focus:outline-none focus:ring-2 focus:ring-rose-500/40" type="text" placeholder="Écrivez ici… (ex: bonjour)" />
|
| 88 |
+
</div>
|
| 89 |
+
</section>
|
| 90 |
+
</main>
|
| 91 |
+
|
| 92 |
+
<!-- COL 3 -->
|
| 93 |
+
<aside id="colRight" class="border-l border-slate-800 bg-transparent p-4">
|
| 94 |
+
<!-- Colonne vide par défaut -->
|
| 95 |
+
</aside>
|
| 96 |
+
</div>
|
| 97 |
+
|
| 98 |
+
<div id="toast" class="toast" hidden></div>
|
| 99 |
+
|
| 100 |
+
<script src="script.js"></script>
|
| 101 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 102 |
+
</body>
|
| 103 |
+
</html>
|
|
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// ===== util =====
|
| 2 |
+
const toastEl = document.getElementById("toast");
|
| 3 |
+
function toast(msg){
|
| 4 |
+
toastEl.hidden = false;
|
| 5 |
+
toastEl.textContent = msg;
|
| 6 |
+
clearTimeout(toast._t);
|
| 7 |
+
toast._t = setTimeout(()=>toastEl.hidden=true, 1400);
|
| 8 |
+
}
|
| 9 |
+
|
| 10 |
+
// ===== éléments =====
|
| 11 |
+
const promptInput = document.getElementById("promptInput");
|
| 12 |
+
const generateBtn = document.getElementById("generateBtn");
|
| 13 |
+
const micBtn = document.getElementById("micBtn");
|
| 14 |
+
const codeOutput = document.getElementById("codeOutput");
|
| 15 |
+
const copyBtn = document.getElementById("copyBtn");
|
| 16 |
+
const clearBtn = document.getElementById("clearBtn");
|
| 17 |
+
|
| 18 |
+
const colRight = document.getElementById("colRight");
|
| 19 |
+
const appTitle = document.getElementById("appTitle");
|
| 20 |
+
const appSubtitle = document.getElementById("appSubtitle");
|
| 21 |
+
|
| 22 |
+
// ===== générateur de code (temporaire) =====
|
| 23 |
+
function fakeGenerate(prompt){
|
| 24 |
+
const p = (prompt || "").trim();
|
| 25 |
+
if(!p) return "// Écris une demande puis clique sur Générer ✨";
|
| 26 |
+
return `// ✅ Demande reçue : ${p}
|
| 27 |
+
|
| 28 |
+
function main() {
|
| 29 |
+
console.log("Hello Espace Codage!");
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
main();`;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
// ===== moteur de consignes UI (simple et efficace) =====
|
| 36 |
+
function isUiCommand(text){
|
| 37 |
+
const t = (text||"").toLowerCase();
|
| 38 |
+
return ["colonne","cache","affiche","vide","titre","sous-titre","espace codage"].some(k=>t.includes(k));
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
function applyUiCommand(text){
|
| 42 |
+
const raw = text || "";
|
| 43 |
+
const t = raw.toLowerCase();
|
| 44 |
+
|
| 45 |
+
if(t.includes("cache") && (t.includes("colonne 3") || t.includes("colonne trois") || t.includes("droite"))){
|
| 46 |
+
colRight.style.display = "none";
|
| 47 |
+
toast("✅ Colonne 3 masquée");
|
| 48 |
+
return true;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
if((t.includes("affiche") || t.includes("montre")) && (t.includes("colonne 3") || t.includes("droite"))){
|
| 52 |
+
colRight.style.display = "";
|
| 53 |
+
toast("✅ Colonne 3 affichée");
|
| 54 |
+
return true;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
if(t.includes("colonne 3") && t.includes("vide")){
|
| 58 |
+
colRight.innerHTML = "";
|
| 59 |
+
colRight.style.display = "";
|
| 60 |
+
toast("✅ Colonne 3 vidée");
|
| 61 |
+
return true;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
// Titre: ...
|
| 65 |
+
const mTitle = raw.match(/(?:titre|nom)\s*[:=]\s*(.+)$/i);
|
| 66 |
+
if(mTitle){
|
| 67 |
+
appTitle.textContent = mTitle[1].trim();
|
| 68 |
+
toast("✅ Titre mis à jour");
|
| 69 |
+
return true;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
// Sous-titre: ...
|
| 73 |
+
const mSub = raw.match(/(?:sous[-\s]?titre|description)\s*[:=]\s*(.+)$/i);
|
| 74 |
+
if(mSub){
|
| 75 |
+
appSubtitle.textContent = mSub[1].trim();
|
| 76 |
+
toast("✅ Sous-titre mis à jour");
|
| 77 |
+
return true;
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
toast("ℹ️ Consigne non reconnue");
|
| 81 |
+
return false;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
// ===== actions =====
|
| 85 |
+
generateBtn.addEventListener("click", ()=>{
|
| 86 |
+
const text = promptInput.value;
|
| 87 |
+
|
| 88 |
+
if(isUiCommand(text)){
|
| 89 |
+
if(applyUiCommand(text)) return;
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
codeOutput.textContent = fakeGenerate(text);
|
| 93 |
+
});
|
| 94 |
+
|
| 95 |
+
document.querySelectorAll(".chip").forEach(btn=>{
|
| 96 |
+
btn.addEventListener("click", ()=>{
|
| 97 |
+
const p = btn.dataset.prompt || "";
|
| 98 |
+
promptInput.value = p;
|
| 99 |
+
codeOutput.textContent = fakeGenerate(p);
|
| 100 |
+
});
|
| 101 |
+
});
|
| 102 |
+
|
| 103 |
+
copyBtn.addEventListener("click", async ()=>{
|
| 104 |
+
try{
|
| 105 |
+
await navigator.clipboard.writeText(codeOutput.textContent);
|
| 106 |
+
toast("✅ Copié");
|
| 107 |
+
}catch{
|
| 108 |
+
alert("Copie impossible automatiquement.");
|
| 109 |
+
}
|
| 110 |
+
});
|
| 111 |
+
|
| 112 |
+
clearBtn.addEventListener("click", ()=>{
|
| 113 |
+
promptInput.value = "";
|
| 114 |
+
codeOutput.textContent = "// Le code généré apparaîtra ici…";
|
| 115 |
+
toast("✅ Effacé");
|
| 116 |
+
});
|
| 117 |
+
|
| 118 |
+
// Micro (si dispo)
|
| 119 |
+
let recognition = null;
|
| 120 |
+
if ("webkitSpeechRecognition" in window || "SpeechRecognition" in window) {
|
| 121 |
+
const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
|
| 122 |
+
recognition = new SR();
|
| 123 |
+
recognition.lang = "fr-FR";
|
| 124 |
+
recognition.interimResults = true;
|
| 125 |
+
recognition.onresult = (event) => {
|
| 126 |
+
let transcript = "";
|
| 127 |
+
for (let i = event.resultIndex; i < event.results.length; i++) {
|
| 128 |
+
transcript += event.results[i][0].transcript;
|
| 129 |
+
}
|
| 130 |
+
promptInput.value = transcript.trim();
|
| 131 |
+
};
|
| 132 |
+
}
|
| 133 |
+
micBtn.addEventListener("click", ()=>{
|
| 134 |
+
if(!recognition){ alert("Micro non disponible sur ce navigateur."); return; }
|
| 135 |
+
try{ recognition.start(); }catch{}
|
| 136 |
+
});
|
| 137 |
+
|
| 138 |
+
// ✅ preuve que le JS charge
|
| 139 |
+
toast("✅ Espace Codage prêt");
|
|
@@ -1,28 +1,62 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
}
|
|
|
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
|
|
|
| 16 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:root{
|
| 2 |
+
--bg:#0b0f1a;
|
| 3 |
+
--panel:#0f172a;
|
| 4 |
+
--panel2:#0b1222;
|
| 5 |
+
--border:#1f2a44;
|
| 6 |
+
--text:#e7eefc;
|
| 7 |
+
--muted:#98a6c7;
|
| 8 |
+
--accent:#23f3c7;
|
| 9 |
+
--accent2:#ff2d7a;
|
| 10 |
}
|
| 11 |
|
| 12 |
+
/* Project item styles (extend Tailwind with a few custom bits) */
|
| 13 |
+
.project-item{
|
| 14 |
+
width:100%;
|
| 15 |
+
padding:12px;
|
| 16 |
+
background:#0f1a33;
|
| 17 |
+
border:1px solid var(--border);
|
| 18 |
+
border-radius:12px;
|
| 19 |
+
color:var(--text);
|
| 20 |
+
display:flex;
|
| 21 |
+
align-items:center;
|
| 22 |
+
justify-content:space-between;
|
| 23 |
+
cursor:pointer;
|
| 24 |
}
|
| 25 |
+
.project-item.active{ outline:2px solid rgba(244,63,94,0.25); }
|
| 26 |
|
| 27 |
+
/* Pills */
|
| 28 |
+
.pill{
|
| 29 |
+
font-size:11px;
|
| 30 |
+
padding:4px 8px;
|
| 31 |
+
border-radius:999px;
|
| 32 |
+
border:1px solid var(--border);
|
| 33 |
}
|
| 34 |
+
.pill.green{ background:rgba(40,199,111,.15); }
|
| 35 |
+
.pill.orange{ background:rgba(255,159,67,.15); }
|
| 36 |
+
.pill.blue{ background:rgba(54,162,235,.15); }
|
| 37 |
+
.pill.purple{ background:rgba(153,102,255,.15); }
|
| 38 |
|
| 39 |
+
/* Chips */
|
| 40 |
+
.chip{
|
| 41 |
+
padding:10px 12px;
|
| 42 |
+
border-radius:999px;
|
| 43 |
+
background:#0f1a33;
|
| 44 |
+
border:1px solid var(--border);
|
| 45 |
+
color:var(--text);
|
| 46 |
+
cursor:pointer;
|
| 47 |
}
|
| 48 |
|
| 49 |
+
/* Toast */
|
| 50 |
+
.toast{
|
| 51 |
+
position:fixed;
|
| 52 |
+
bottom:18px;
|
| 53 |
+
left:50%;
|
| 54 |
+
transform:translateX(-50%);
|
| 55 |
+
background:rgba(15,23,42,.92);
|
| 56 |
+
border:1px solid rgba(244,63,94,.35);
|
| 57 |
+
color:#e7eefc;
|
| 58 |
+
padding:10px 14px;
|
| 59 |
+
border-radius:12px;
|
| 60 |
+
font-size:13px;
|
| 61 |
+
z-index:9999;
|
| 62 |
+
}
|