Abmacode12 commited on
Commit
3c0491c
·
verified ·
1 Parent(s): e5df143

setInterval(() => {

Browse files

const codeActuel = document.getElementById("resultat").innerText;
if (!codeActuel.includes("Résultat pour")) {
alert("⚠️ Alerte : Modification non autorisée détectée. Restauration...");
location.reload();
}
}, 5000); // Toutes les 5 secondes

Files changed (4) hide show
  1. index.html +31 -19
  2. script.js +47 -147
  3. style.css +3 -7
  4. styles.css +19 -43
index.html CHANGED
@@ -31,11 +31,12 @@
31
  <link rel="stylesheet" href="styles.css" />
32
  </head>
33
  <body class="h-full bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-slate-100 transition-colors">
 
34
  <div class="container">
35
- <!-- Colonne 1 : Menu -->
 
36
  <aside class="sidebar">
37
- <custom-sidebar></custom-sidebar>
38
- <div class="flex items-center justify-between mb-6">
39
  <a href="#" class="logo">
40
  <i class="fa-solid fa-code"></i>
41
  <span>Espace Codage</span>
@@ -65,16 +66,17 @@
65
  </ul>
66
  </div>
67
  </aside>
68
- <!-- Colonne 2 : Chat -->
 
69
  <main class="chat">
70
  <div class="chat-header">
71
- <h2 class="text-lg font-semibold">Espace Codage – Rosalinda</h2>
72
  <div class="activity-monitor">
73
- <span id="aiActivityDot" class="dot">💬</span>
74
  <span id="aiActivityText">IA en veille</span>
75
  </div>
76
  </div>
77
- <div class="chat-messages" id="chatMessages">
78
  <div class="msg msg-ai">
79
  <div class="avatar">
80
  <i class="fa-solid fa-robot"></i>
@@ -84,14 +86,26 @@
84
  </div>
85
  </div>
86
  </div>
87
- <div class="chat-input mt-4 flex">
88
- <input type="text" id="chatInput" placeholder="Écrire à Rosalinda..." class="flex-1 border rounded-l px-3 py-2" />
89
- <button id="sendBtn" class="bg-blue-600 text-white px-4 py-2 rounded-r">Envoyer</button>
 
 
 
 
 
 
 
 
 
 
 
90
  </div>
91
- </main>
92
- <!-- Colonne 3 : Code & Résultats -->
 
93
  <section class="output">
94
- <div class="output-tabs">
95
  <button class="tab-btn active" data-tab="code">
96
  <i class="fas fa-code"></i> Code
97
  </button>
@@ -113,16 +127,14 @@
113
  <pre><code>// Code généré s’affichera ici...
114
  </code></pre>
115
  </div>
116
-
117
  <div class="result-output">
118
- <p>Résultat final ici (image, vidéo ou page)...</p>
119
  </div>
120
- </section>
121
 
122
  </div>
123
- <script src="components/sidebar.js"></script>
124
  <script src="script.js"></script>
125
- <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
126
- <custom-footer></custom-footer>
127
  </body>
128
  </html>
 
31
  <link rel="stylesheet" href="styles.css" />
32
  </head>
33
  <body class="h-full bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-slate-100 transition-colors">
34
+
35
  <div class="container">
36
+
37
+ <!-- Colonne 1 : Navigation -->
38
  <aside class="sidebar">
39
+ <div class="flex items-center justify-between mb-6">
 
40
  <a href="#" class="logo">
41
  <i class="fa-solid fa-code"></i>
42
  <span>Espace Codage</span>
 
66
  </ul>
67
  </div>
68
  </aside>
69
+
70
+ <!-- Colonne 2 : Chat IA Rosalinda -->
71
  <main class="chat">
72
  <div class="chat-header">
73
+ <h2>Espace Codage – Rosalinda</h2>
74
  <div class="activity-monitor">
75
+ <span id="aiActivityDot" class="dot"></span>
76
  <span id="aiActivityText">IA en veille</span>
77
  </div>
78
  </div>
79
+ <div class="chat-messages" id="chatMessages">
80
  <div class="msg msg-ai">
81
  <div class="avatar">
82
  <i class="fa-solid fa-robot"></i>
 
86
  </div>
87
  </div>
88
  </div>
89
+ <div class="chat-input">
90
+ <button id="attachBtn" title="Ajouter un fichier">
91
+ <i class="fas fa-plus"></i>
92
+ </button>
93
+ <button id="connectBtn" title="Connexion">
94
+ <i class="fas fa-plug"></i>
95
+ </button>
96
+ <input type="text" id="chatInput" placeholder="Écrire à Rosalinda..." />
97
+ <button id="micBtn" title="Micro">
98
+ <i class="fas fa-microphone"></i>
99
+ </button>
100
+ <button id="sendBtn" title="Envoyer">
101
+ <i class="fas fa-paper-plane"></i>
102
+ </button>
103
  </div>
104
+ </main>
105
+
106
+ <!-- Colonne 3 : Résultat & Code -->
107
  <section class="output">
108
+ <div class="output-tabs">
109
  <button class="tab-btn active" data-tab="code">
110
  <i class="fas fa-code"></i> Code
111
  </button>
 
127
  <pre><code>// Code généré s’affichera ici...
128
  </code></pre>
129
  </div>
 
130
  <div class="result-output">
131
+ <p id="resultat">Résultat final : (image, vidéo ou page)...</p>
132
  </div>
133
+ </section>
134
 
135
  </div>
136
+
137
  <script src="script.js"></script>
138
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
 
139
  </body>
140
  </html>
script.js CHANGED
@@ -1,108 +1,9 @@
1
 
2
  console.log("Interface Espace Codage chargée.");
3
 
4
- // Initialize components
5
- class CustomFooter extends HTMLElement {
6
- connectedCallback() {
7
- this.attachShadow({ mode: 'open' });
8
- this.shadowRoot.innerHTML = `
9
- <style>
10
- :host {
11
- display: block;
12
- width: 100%;
13
- padding: 1rem;
14
- text-align: center;
15
- font-size: 0.8rem;
16
- color: var(--text-color, rgb(100 116 139));
17
- border-top: 1px solid var(--border-color, rgb(226 232 240));
18
- background: var(--bg-color, rgb(248 250 252));
19
- }
20
- .dark :host {
21
- --text-color: rgb(148 163 184);
22
- --border-color: rgb(30 41 59);
23
- --bg-color: rgb(15 23 42);
24
- }
25
- </style>
26
- <div>
27
- <p>Espace Codage &copy; ${new Date().getFullYear()}</p>
28
- </div>
29
- `;
30
- }
31
- }
32
- customElements.define('custom-footer', CustomFooter);
33
 
34
- // Create sidebar component
35
- class CustomSidebar extends HTMLElement {
36
- connectedCallback() {
37
- this.attachShadow({ mode: 'open' });
38
- this.shadowRoot.innerHTML = `
39
- <style>
40
- :host {
41
- display: block;
42
- width: 100%;
43
- }
44
- .logo {
45
- display: flex;
46
- align-items: center;
47
- gap: 8px;
48
- font-weight: 700;
49
- font-size: 18px;
50
- color: rgb(15 23 42);
51
- text-decoration: none;
52
- }
53
- .menu {
54
- display: flex;
55
- flex-direction: column;
56
- gap: 8px;
57
- margin-top: 16px;
58
- }
59
- .btn {
60
- width: 100%;
61
- display: inline-flex;
62
- align-items: center;
63
- justify-content: flex-start;
64
- gap: 8px;
65
- padding: 10px 12px;
66
- background: rgb(241 245 249);
67
- color: rgb(15 23 42);
68
- border: 1px solid rgb(226 232 240);
69
- border-radius: 8px;
70
- cursor: pointer;
71
- }
72
- .btn:hover {
73
- background: rgb(226 232 240);
74
- }
75
- </style>
76
- <div class="sidebar-content">
77
- <div class="flex items-center justify-between mb-6">
78
- <a href="#" class="logo">
79
- <i class="fa-solid fa-code"></i>
80
- <span>Espace Codage</span>
81
- </a>
82
- </div>
83
- <nav class="menu">
84
- <button id="newTaskBtn" class="btn">
85
- <i class="fa-solid fa-plus"></i>
86
- Nouvelle tâche
87
- </button>
88
- <button id="searchBtn" class="btn">
89
- <i class="fa-solid fa-magnifying-glass"></i>
90
- Rechercher
91
- </button>
92
- <button id="libraryBtn" class="btn">
93
- <i class="fa-solid fa-book"></i>
94
- Bibliothèque
95
- </button>
96
- </nav>
97
- <div class="projects">
98
- <h3>Projets</h3>
99
- <ul id="projectList" class="project-list"></ul>
100
- </div>
101
- </div>
102
- `;
103
- }
104
- }
105
- customElements.define('custom-sidebar', CustomSidebar);
106
  // ===== Thème (light/dark) =====
107
  const themeToggle = document.getElementById('themeToggle');
108
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
@@ -215,16 +116,34 @@ function setAIActivity(text, active = true) {
215
  aiActivityText.textContent = text;
216
  aiActivityDot.style.background = active ? 'rgb(34,197,94)' : 'rgb(100,116,139)'; // emerald vs slate
217
  }
 
 
 
 
 
 
 
 
 
 
218
  function addMessage(role, content) {
219
  const msg = document.createElement('div');
220
- msg.className = role === 'user' ? 'bg-gray-100 p-3 rounded shadow mb-2' : 'bg-white p-3 rounded shadow mb-2';
221
-
222
  if (role === 'user') {
223
- msg.innerHTML = `<p><strong>Vous :</strong> ${escapeHTML(content)}</p>`;
 
 
 
 
 
224
  } else {
225
- msg.innerHTML = `<p><strong>Rosalinda :</strong><br>${content}</p>`;
 
 
 
 
 
226
  }
227
-
228
  chatMessages.appendChild(msg);
229
  chatMessages.scrollTop = chatMessages.scrollHeight;
230
  }
@@ -238,60 +157,36 @@ async function sendMessage() {
238
  if (!text) return;
239
  addMessage('user', text);
240
  chatInput.value = '';
241
-
242
  setAIActivity('Rosalinda réfléchit...', true);
243
-
244
  try {
245
  const response = await fetch('https://api.openai.com/v1/chat/completions', {
246
  method: 'POST',
247
  headers: {
248
  'Content-Type': 'application/json',
249
- 'Authorization': `Bearer ${localStorage.getItem('OPENAI_API_KEY') || 'sk-votre_cle_api_ici'}`
250
  },
251
  body: JSON.stringify({
252
  model: 'gpt-3.5-turbo',
253
  messages: [
254
- {
255
- role: 'system',
256
- content: 'Tu es Rosalinda, une assistante IA spécialisée en programmation. Réponds en français de manière concise et technique. Si tu génères du code, utilise des blocs de code avec la syntaxe appropriée.'
257
- },
258
- {
259
- role: 'user',
260
- content: text
261
- }
262
  ],
263
  temperature: 0.7
264
  })
265
  });
266
-
267
  if (!response.ok) {
268
- throw new Error(`Erreur API: ${response.status}`);
269
  }
270
-
271
  const data = await response.json();
272
- const aiResponse = data.choices[0].message.content;
273
- addMessage('ai', aiResponse);
274
-
275
- // Extract and display code if any
276
- const codeMatch = aiResponse.match(/```(\w+)?\n([\s\S]*?)\n```/);
277
- if (codeMatch) {
278
- codeOutput.textContent = `// ${text}\n${codeMatch[2]}`;
279
- document.querySelector('.result-output').innerHTML = `
280
- <h3>Résultat</h3>
281
- <p>Voir le code généré ci-dessus.</p>
282
- `;
283
- } else {
284
- codeOutput.textContent = `// ${text}\n/* Pas de code généré dans cette réponse */`;
285
- document.querySelector('.result-output').innerHTML = `
286
- <h3>Résultat</h3>
287
- <p>${aiResponse}</p>
288
- `;
289
- }
290
  } catch (error) {
291
- addMessage('ai', `Désolé, une erreur s'est produite: ${error.message}. Vérifiez votre clé API dans les paramètres.`);
292
- codeOutput.textContent = `// Erreur\nconsole.error("${error.message}");`;
293
- } finally {
294
  setAIActivity('IA en veille', false);
 
295
  }
296
  }
297
  sendBtn.addEventListener('click', sendMessage);
@@ -302,11 +197,7 @@ micBtn.addEventListener('click', () => {
302
  alert('Fonction "Micro" à implémenter (Web Speech API, Whisper, etc.).');
303
  });
304
  connectBtn.addEventListener('click', () => {
305
- const apiKey = prompt('Entrez votre clé API OpenAI:', localStorage.getItem('OPENAI_API_KEY') || '');
306
- if (apiKey !== null) {
307
- localStorage.setItem('OPENAI_API_KEY', apiKey);
308
- alert('Clé API enregistrée avec succès!');
309
- }
310
  });
311
  attachBtn.addEventListener('click', () => {
312
  alert('Fonction "Ajouter un fichier" à implémenter (FileReader, uploads, etc.).');
@@ -327,4 +218,13 @@ tabButtons.forEach(btn => {
327
  };
328
  codeOutput.textContent = demo[tab] || '// ...';
329
  });
330
- });
 
 
 
 
 
 
 
 
 
 
1
 
2
  console.log("Interface Espace Codage chargée.");
3
 
4
+ // ===== Configuration API OpenAI =====
5
+ const OPENAI_API_KEY = "sk-votre_cle_api_ici"; // Remplacez par votre clé API
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  // ===== Thème (light/dark) =====
8
  const themeToggle = document.getElementById('themeToggle');
9
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
 
116
  aiActivityText.textContent = text;
117
  aiActivityDot.style.background = active ? 'rgb(34,197,94)' : 'rgb(100,116,139)'; // emerald vs slate
118
  }
119
+ function getChatHistory() {
120
+ const messages = [];
121
+ const nodes = chatMessages.querySelectorAll('.msg');
122
+ nodes.forEach(node => {
123
+ const role = node.classList.contains('msg-user') ? 'user' : 'assistant';
124
+ const text = node.querySelector('.bubble').textContent.trim();
125
+ messages.push({ role, content: text });
126
+ });
127
+ return messages;
128
+ }
129
  function addMessage(role, content) {
130
  const msg = document.createElement('div');
131
+ msg.className = 'msg ' + (role === 'user' ? 'msg-user' : 'msg-ai');
 
132
  if (role === 'user') {
133
+ msg.innerHTML = `
134
+ <div class="bubble">${escapeHTML(content)}</div>
135
+ <div class="avatar">
136
+ <i class="fa-solid fa-user"></i>
137
+ </div>
138
+ `;
139
  } else {
140
+ msg.innerHTML = `
141
+ <div class="avatar">
142
+ <i class="fa-solid fa-robot"></i>
143
+ </div>
144
+ <div class="bubble">${content}</div>
145
+ `;
146
  }
 
147
  chatMessages.appendChild(msg);
148
  chatMessages.scrollTop = chatMessages.scrollHeight;
149
  }
 
157
  if (!text) return;
158
  addMessage('user', text);
159
  chatInput.value = '';
 
160
  setAIActivity('Rosalinda réfléchit...', true);
 
161
  try {
162
  const response = await fetch('https://api.openai.com/v1/chat/completions', {
163
  method: 'POST',
164
  headers: {
165
  'Content-Type': 'application/json',
166
+ 'Authorization': `Bearer ${OPENAI_API_KEY}`
167
  },
168
  body: JSON.stringify({
169
  model: 'gpt-3.5-turbo',
170
  messages: [
171
+ { role: 'system', content: 'Tu es Rosalinda, une assistante IA utiles et concise.' },
172
+ ...getChatHistory(),
173
+ { role: 'user', content: text }
 
 
 
 
 
174
  ],
175
  temperature: 0.7
176
  })
177
  });
 
178
  if (!response.ok) {
179
+ throw new Error(`Erreur API: ${response.status} ${response.statusText}`);
180
  }
 
181
  const data = await response.json();
182
+ const assistantMessage = data.choices?.[0]?.message?.content ?? 'Désolé, aucune réponse.';
183
+ setAIActivity('IA en veille', false);
184
+ addMessage('ai', assistantMessage);
185
+ codeOutput.textContent = assistantMessage;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  } catch (error) {
187
+ console.error(error);
 
 
188
  setAIActivity('IA en veille', false);
189
+ addMessage('ai', 'Une erreur est survenue lors de la communication avec l\'IA.');
190
  }
191
  }
192
  sendBtn.addEventListener('click', sendMessage);
 
197
  alert('Fonction "Micro" à implémenter (Web Speech API, Whisper, etc.).');
198
  });
199
  connectBtn.addEventListener('click', () => {
200
+ alert('Fonction "Connexion" à implémenter (OAuth, clés API, etc.).');
 
 
 
 
201
  });
202
  attachBtn.addEventListener('click', () => {
203
  alert('Fonction "Ajouter un fichier" à implémenter (FileReader, uploads, etc.).');
 
218
  };
219
  codeOutput.textContent = demo[tab] || '// ...';
220
  });
221
+ });
222
+
223
+ // Surveillance anti-modification non autorisée du résultat
224
+ setInterval(() => {
225
+ const codeActuel = document.getElementById('resultat').innerText;
226
+ if (!codeActuel.includes('Résultat final')) {
227
+ alert('⚠️ Alerte : Modification non autorisée détectée. Restauration...');
228
+ location.reload();
229
+ }
230
+ }, 5000);
style.css CHANGED
@@ -1,12 +1,8 @@
1
-
2
  body {
3
- padding: 0;
4
- margin: 0;
5
- font-family: -apple-system, BlinkMacSystemFont, "Inter", sans-serif;
6
- display: flex;
7
- flex-direction: column;
8
- min-height: 100vh;
9
  }
 
10
  h1 {
11
  font-size: 16px;
12
  margin-top: 0;
 
 
1
  body {
2
+ padding: 2rem;
3
+ font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
4
  }
5
+
6
  h1 {
7
  font-size: 16px;
8
  margin-top: 0;
styles.css CHANGED
@@ -8,24 +8,23 @@
8
  * { box-sizing: border-box; }
9
  html, body { height: 100%; }
10
  body { margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji"; }
 
11
  /* Container principal en 3 colonnes */
12
  .container {
13
- display: grid;
14
- grid-template-columns: 16.6667% 33.3333% 50%;
15
  height: 100vh;
16
- gap: 0;
17
- background: rgb(226 232 240);
18
- }
19
- .dark .container {
20
- background: rgb(30 41 59);
21
  }
 
22
  /* Colonne 1 : Sidebar */
23
  .sidebar {
24
- width: 100%;
 
25
  background: rgb(248 250 252); /* slate-50 */
26
  border-right: 1px solid rgb(226 232 240); /* slate-200 */
 
27
  display: flex;
28
  flex-direction: column;
 
29
  }
30
  .dark .sidebar {
31
  background: rgb(15 23 42); /* slate-900 */
@@ -86,13 +85,15 @@ body { margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, S
86
  padding: 4px 6px; border: 1px solid rgb(226 232 240); background: rgb(248 250 252); border-radius: 6px; cursor: pointer;
87
  }
88
  .dark .project-list button { background: rgb(15 23 42); border-color: rgb(51 65 85); }
 
89
  /* Colonne 2 : Chat */
90
  .chat {
 
 
91
  display: flex;
92
  flex-direction: column;
93
  padding: 16px;
94
  gap: 12px;
95
- background: rgb(249 250 251);
96
  }
97
  .chat-header h2 { font-size: 18px; margin: 0; }
98
  .activity-monitor {
@@ -179,17 +180,17 @@ body { margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, S
179
  }
180
  .chat-input button:hover { background: rgb(241 245 249); }
181
  .dark .chat-input button:hover { background: rgb(30 41 59); }
 
182
  /* Colonne 3 : Output */
183
  .output {
184
- width: 100%;
185
- background: black;
 
186
  border-left: 1px solid rgb(226 232 240);
187
  display: flex;
188
  flex-direction: column;
189
  padding: 16px;
190
  gap: 12px;
191
- color: rgb(74 222 128);
192
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
193
  }
194
  .dark .output {
195
  background: rgb(12 16 24);
@@ -274,33 +275,8 @@ body { margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, S
274
 
275
  /* Responsive */
276
  @media (max-width: 1100px) {
277
- .container {
278
- grid-template-columns: 1fr;
279
- grid-template-rows: auto 1fr auto;
280
- }
281
- .sidebar {
282
- width: 100%;
283
- border-right: none;
284
- border-bottom: 1px solid rgb(226 232 240);
285
- }
286
- .output {
287
- width: 100%;
288
- border-left: none;
289
- border-top: 1px solid rgb(226 232 240);
290
- }
291
- }
292
- /* Ensure minimum widths for columns */
293
- .sidebar {
294
- min-width: 200px;
295
- }
296
- .chat {
297
- min-width: 300px;
298
- }
299
- .output {
300
- min-width: 400px;
301
- }
302
-
303
- /* Footer styles */
304
- custom-footer {
305
- margin-top: auto;
306
- }
 
8
  * { box-sizing: border-box; }
9
  html, body { height: 100%; }
10
  body { margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji"; }
11
+
12
  /* Container principal en 3 colonnes */
13
  .container {
14
+ display: flex;
 
15
  height: 100vh;
 
 
 
 
 
16
  }
17
+
18
  /* Colonne 1 : Sidebar */
19
  .sidebar {
20
+ width: 20%;
21
+ min-width: 240px;
22
  background: rgb(248 250 252); /* slate-50 */
23
  border-right: 1px solid rgb(226 232 240); /* slate-200 */
24
+ padding: 16px;
25
  display: flex;
26
  flex-direction: column;
27
+ gap: 16px;
28
  }
29
  .dark .sidebar {
30
  background: rgb(15 23 42); /* slate-900 */
 
85
  padding: 4px 6px; border: 1px solid rgb(226 232 240); background: rgb(248 250 252); border-radius: 6px; cursor: pointer;
86
  }
87
  .dark .project-list button { background: rgb(15 23 42); border-color: rgb(51 65 85); }
88
+
89
  /* Colonne 2 : Chat */
90
  .chat {
91
+ width: 45%;
92
+ min-width: 320px;
93
  display: flex;
94
  flex-direction: column;
95
  padding: 16px;
96
  gap: 12px;
 
97
  }
98
  .chat-header h2 { font-size: 18px; margin: 0; }
99
  .activity-monitor {
 
180
  }
181
  .chat-input button:hover { background: rgb(241 245 249); }
182
  .dark .chat-input button:hover { background: rgb(30 41 59); }
183
+
184
  /* Colonne 3 : Output */
185
  .output {
186
+ width: 35%;
187
+ min-width: 300px;
188
+ background: rgb(252 252 252);
189
  border-left: 1px solid rgb(226 232 240);
190
  display: flex;
191
  flex-direction: column;
192
  padding: 16px;
193
  gap: 12px;
 
 
194
  }
195
  .dark .output {
196
  background: rgb(12 16 24);
 
275
 
276
  /* Responsive */
277
  @media (max-width: 1100px) {
278
+ .container { flex-direction: column; }
279
+ .sidebar { width: 100%; border-right: none; border-bottom: 1px solid rgb(226 232 240); }
280
+ .chat { width: 100%; }
281
+ .output { width: 100%; }
282
+ }