secutorpro commited on
Commit
bd8dcdc
·
verified ·
1 Parent(s): 61e6960

🐳 26/06 - 15:28 - e va ajouté mistral en holograme qui predit et qui gere le systeme cognitive

Browse files
Files changed (2) hide show
  1. components/mistral-hologram.js +1207 -0
  2. index.html +9 -0
components/mistral-hologram.js ADDED
@@ -0,0 +1,1207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class MistralHologram extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.isActive = true;
5
+ this.cognitiveLoad = 72;
6
+ this.predictionQueue = [];
7
+ this.neuralPulseActive = true;
8
+ this.hologramPhase = 0;
9
+ this.orbitAngle = 0;
10
+ this.particles = [];
11
+ this.predictionHistory = [];
12
+ this.cognitiveNodes = [
13
+ { id: 'N1', label: 'Perception', load: 68, active: true },
14
+ { id: 'N2', label: 'Analyse', load: 85, active: true },
15
+ { id: 'N3', label: 'Prédiction', load: 91, active: true },
16
+ { id: 'N4', label: 'Décision', load: 54, active: true },
17
+ { id: 'N5', label: 'Apprentissage', load: 77, active: true },
18
+ { id: 'N6', label: 'Mémoire', load: 63, active: true }
19
+ ];
20
+ this.currentPrediction = null;
21
+ this.speechLines = [];
22
+ this.speechIndex = 0;
23
+ }
24
+
25
+ connectedCallback() {
26
+ this.attachShadow({ mode: 'open' });
27
+ this.render();
28
+ this.startAnimations();
29
+ this.generatePrediction();
30
+ this.startCognitiveCycle();
31
+ }
32
+
33
+ disconnectedCallback() {
34
+ this.isActive = false;
35
+ }
36
+
37
+ render() {
38
+ this.shadowRoot.innerHTML = `
39
+ <style>
40
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Orbitron:wght@400;500;600;700;800;900&display=swap');
41
+
42
+ :host {
43
+ display: block;
44
+ width: 100%;
45
+ --mistral-primary: #ff6b00;
46
+ --mistral-secondary: #ff9500;
47
+ --mistral-accent: #ffb800;
48
+ --mistral-glow: rgba(255, 107, 0, 0.4);
49
+ --mistral-dim: rgba(255, 149, 0, 0.15);
50
+ --holo-blue: #00d4ff;
51
+ --holo-purple: #a855f7;
52
+ --holo-green: #10b981;
53
+ }
54
+
55
+ * { box-sizing: border-box; margin: 0; padding: 0; }
56
+
57
+ .hologram-container {
58
+ position: relative;
59
+ background: rgba(15, 23, 42, 0.85);
60
+ backdrop-filter: blur(25px);
61
+ border: 1px solid rgba(255, 107, 0, 0.25);
62
+ border-radius: 1rem;
63
+ overflow: hidden;
64
+ font-family: 'Inter', sans-serif;
65
+ color: #e2e8f0;
66
+ }
67
+
68
+ .hologram-container::before {
69
+ content: '';
70
+ position: absolute;
71
+ top: 0; left: 0; right: 0;
72
+ height: 2px;
73
+ background: linear-gradient(90deg, transparent, var(--mistral-primary), var(--mistral-accent), var(--mistral-primary), transparent);
74
+ animation: topScan 3s linear infinite;
75
+ }
76
+
77
+ @keyframes topScan {
78
+ 0% { opacity: 0.3; }
79
+ 50% { opacity: 1; }
80
+ 100% { opacity: 0.3; }
81
+ }
82
+
83
+ .header {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ padding: 1rem 1.25rem;
88
+ border-bottom: 1px solid rgba(255, 107, 0, 0.15);
89
+ background: rgba(255, 107, 0, 0.05);
90
+ }
91
+
92
+ .header-left {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: 0.75rem;
96
+ }
97
+
98
+ .mistral-badge {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 0.5rem;
102
+ padding: 0.35rem 0.85rem;
103
+ background: linear-gradient(135deg, rgba(255,107,0,0.2), rgba(255,149,0,0.1));
104
+ border: 1px solid rgba(255, 107, 0, 0.4);
105
+ border-radius: 2rem;
106
+ font-family: 'Orbitron', monospace;
107
+ font-size: 0.7rem;
108
+ font-weight: 700;
109
+ color: var(--mistral-accent);
110
+ letter-spacing: 0.1em;
111
+ text-transform: uppercase;
112
+ }
113
+
114
+ .mistral-badge .dot {
115
+ width: 6px; height: 6px;
116
+ background: var(--mistral-primary);
117
+ border-radius: 50%;
118
+ animation: dotPulse 1.5s infinite;
119
+ }
120
+
121
+ @keyframes dotPulse {
122
+ 0%, 100% { opacity: 1; transform: scale(1); }
123
+ 50% { opacity: 0.4; transform: scale(1.3); }
124
+ }
125
+
126
+ .header-title {
127
+ font-family: 'Orbitron', monospace;
128
+ font-size: 0.85rem;
129
+ font-weight: 600;
130
+ color: var(--mistral-accent);
131
+ letter-spacing: 0.05em;
132
+ }
133
+
134
+ .cognitive-status {
135
+ display: flex;
136
+ align-items: center;
137
+ gap: 0.5rem;
138
+ font-size: 0.7rem;
139
+ color: #94a3b8;
140
+ }
141
+
142
+ .cognitive-status .pulse {
143
+ width: 8px; height: 8px;
144
+ background: var(--holo-green);
145
+ border-radius: 50%;
146
+ animation: dotPulse 2s infinite;
147
+ }
148
+
149
+ /* Main Layout */
150
+ .main-grid {
151
+ display: grid;
152
+ grid-template-columns: 280px 1fr 280px;
153
+ gap: 0;
154
+ min-height: 520px;
155
+ }
156
+
157
+ @media (max-width: 1024px) {
158
+ .main-grid {
159
+ grid-template-columns: 1fr;
160
+ }
161
+ .hologram-core { min-height: 350px; }
162
+ }
163
+
164
+ /* Left Panel - Cognitive Nodes */
165
+ .cognitive-panel {
166
+ padding: 1rem;
167
+ border-right: 1px solid rgba(255, 107, 0, 0.1);
168
+ display: flex;
169
+ flex-direction: column;
170
+ gap: 0.75rem;
171
+ overflow-y: auto;
172
+ }
173
+
174
+ .panel-title {
175
+ font-family: 'Orbitron', monospace;
176
+ font-size: 0.65rem;
177
+ font-weight: 600;
178
+ color: var(--mistral-secondary);
179
+ letter-spacing: 0.15em;
180
+ text-transform: uppercase;
181
+ margin-bottom: 0.25rem;
182
+ }
183
+
184
+ .cognitive-node {
185
+ background: rgba(30, 41, 59, 0.6);
186
+ border: 1px solid rgba(255, 107, 0, 0.12);
187
+ border-radius: 0.5rem;
188
+ padding: 0.65rem 0.75rem;
189
+ transition: all 0.3s ease;
190
+ position: relative;
191
+ overflow: hidden;
192
+ }
193
+
194
+ .cognitive-node::before {
195
+ content: '';
196
+ position: absolute;
197
+ top: 0; left: 0;
198
+ width: 3px; height: 100%;
199
+ background: var(--mistral-primary);
200
+ opacity: 0.5;
201
+ transition: opacity 0.3s;
202
+ }
203
+
204
+ .cognitive-node:hover {
205
+ border-color: rgba(255, 107, 0, 0.3);
206
+ background: rgba(30, 41, 59, 0.8);
207
+ }
208
+
209
+ .cognitive-node:hover::before { opacity: 1; }
210
+
211
+ .node-header {
212
+ display: flex;
213
+ align-items: center;
214
+ justify-content: space-between;
215
+ margin-bottom: 0.4rem;
216
+ }
217
+
218
+ .node-label {
219
+ font-size: 0.75rem;
220
+ font-weight: 600;
221
+ color: #e2e8f0;
222
+ }
223
+
224
+ .node-id {
225
+ font-family: 'Orbitron', monospace;
226
+ font-size: 0.6rem;
227
+ color: var(--mistral-secondary);
228
+ }
229
+
230
+ .node-load-bar {
231
+ height: 4px;
232
+ background: rgba(255, 107, 0, 0.1);
233
+ border-radius: 2px;
234
+ overflow: hidden;
235
+ margin-bottom: 0.3rem;
236
+ }
237
+
238
+ .node-load-fill {
239
+ height: 100%;
240
+ border-radius: 2px;
241
+ transition: width 1s ease;
242
+ }
243
+
244
+ .node-load-text {
245
+ font-size: 0.6rem;
246
+ color: #64748b;
247
+ display: flex;
248
+ justify-content: space-between;
249
+ }
250
+
251
+ .node-status {
252
+ font-size: 0.6rem;
253
+ display: flex;
254
+ align-items: center;
255
+ gap: 0.3rem;
256
+ }
257
+
258
+ .node-status .indicator {
259
+ width: 5px; height: 5px;
260
+ border-radius: 50%;
261
+ }
262
+
263
+ .indicator-active { background: var(--holo-green); }
264
+ .indicator-warning { background: #f59e0b; }
265
+ .indicator-critical { background: #ef4444; }
266
+
267
+ /* Center - Hologram Core */
268
+ .hologram-core {
269
+ position: relative;
270
+ display: flex;
271
+ flex-direction: column;
272
+ align-items: center;
273
+ justify-content: center;
274
+ background: radial-gradient(ellipse at center, rgba(255,107,0,0.06) 0%, transparent 70%);
275
+ overflow: hidden;
276
+ padding: 1.5rem;
277
+ }
278
+
279
+ /* Scanline effect */
280
+ .hologram-core::after {
281
+ content: '';
282
+ position: absolute;
283
+ top: 0; left: 0; right: 0; bottom: 0;
284
+ background: repeating-linear-gradient(
285
+ 0deg,
286
+ transparent,
287
+ transparent 2px,
288
+ rgba(255, 107, 0, 0.015) 2px,
289
+ rgba(255, 107, 0, 0.015) 4px
290
+ );
291
+ pointer-events: none;
292
+ z-index: 1;
293
+ }
294
+
295
+ .holo-scanner {
296
+ position: absolute;
297
+ top: 0; left: 0; right: 0;
298
+ height: 100%;
299
+ background: linear-gradient(180deg, transparent 0%, rgba(255,107,0,0.05) 50%, transparent 100%);
300
+ animation: scanMove 4s ease-in-out infinite;
301
+ pointer-events: none;
302
+ z-index: 1;
303
+ }
304
+
305
+ @keyframes scanMove {
306
+ 0% { transform: translateY(-100%); }
307
+ 100% { transform: translateY(100%); }
308
+ }
309
+
310
+ .avatar-container {
311
+ position: relative;
312
+ width: 200px; height: 200px;
313
+ z-index: 2;
314
+ }
315
+
316
+ .avatar-ring-outer {
317
+ position: absolute;
318
+ top: -15px; left: -15px;
319
+ width: 230px; height: 230px;
320
+ border: 1px solid rgba(255, 107, 0, 0.2);
321
+ border-radius: 50%;
322
+ animation: ringRotate 20s linear infinite;
323
+ }
324
+
325
+ .avatar-ring-outer::before {
326
+ content: '';
327
+ position: absolute;
328
+ top: -2px; left: 50%;
329
+ width: 6px; height: 6px;
330
+ background: var(--mistral-primary);
331
+ border-radius: 50%;
332
+ box-shadow: 0 0 12px var(--mistral-glow);
333
+ }
334
+
335
+ @keyframes ringRotate {
336
+ from { transform: rotate(0deg); }
337
+ to { transform: rotate(360deg); }
338
+ }
339
+
340
+ .avatar-ring-inner {
341
+ position: absolute;
342
+ top: -5px; left: -5px;
343
+ width: 210px; height: 210px;
344
+ border: 1px dashed rgba(255, 149, 0, 0.15);
345
+ border-radius: 50%;
346
+ animation: ringRotate 15s linear infinite reverse;
347
+ }
348
+
349
+ .avatar-core {
350
+ width: 200px; height: 200px;
351
+ border-radius: 50%;
352
+ background: radial-gradient(circle at 35% 35%, rgba(255,149,0,0.25) 0%, rgba(255,107,0,0.1) 40%, rgba(15,23,42,0.9) 100%);
353
+ border: 2px solid rgba(255, 107, 0, 0.4);
354
+ display: flex;
355
+ align-items: center;
356
+ justify-content: center;
357
+ position: relative;
358
+ animation: coreBreath 4s ease-in-out infinite;
359
+ box-shadow:
360
+ 0 0 40px rgba(255, 107, 0, 0.15),
361
+ 0 0 80px rgba(255, 107, 0, 0.08),
362
+ inset 0 0 40px rgba(255, 107, 0, 0.1);
363
+ }
364
+
365
+ @keyframes coreBreath {
366
+ 0%, 100% { transform: scale(1); box-shadow: 0 0 40px rgba(255,107,0,0.15), 0 0 80px rgba(255,107,0,0.08), inset 0 0 40px rgba(255,107,0,0.1); }
367
+ 50% { transform: scale(1.03); box-shadow: 0 0 60px rgba(255,107,0,0.25), 0 0 120px rgba(255,107,0,0.12), inset 0 0 60px rgba(255,107,0,0.15); }
368
+ }
369
+
370
+ .avatar-icon {
371
+ font-family: 'Orbitron', monospace;
372
+ font-size: 2.5rem;
373
+ font-weight: 900;
374
+ color: var(--mistral-accent);
375
+ text-shadow: 0 0 20px var(--mistral-glow), 0 0 40px rgba(255,107,0,0.3);
376
+ letter-spacing: 0.05em;
377
+ }
378
+
379
+ .avatar-label {
380
+ position: absolute;
381
+ bottom: -35px;
382
+ font-family: 'Orbitron', monospace;
383
+ font-size: 0.65rem;
384
+ font-weight: 600;
385
+ color: var(--mistral-secondary);
386
+ letter-spacing: 0.2em;
387
+ text-transform: uppercase;
388
+ text-shadow: 0 0 10px var(--mistral-glow);
389
+ }
390
+
391
+ /* Prediction Speech Bubble */
392
+ .prediction-bubble {
393
+ position: relative;
394
+ margin-top: 3rem;
395
+ background: rgba(30, 41, 59, 0.7);
396
+ border: 1px solid rgba(255, 107, 0, 0.25);
397
+ border-radius: 0.75rem;
398
+ padding: 1rem 1.25rem;
399
+ max-width: 400px;
400
+ width: 100%;
401
+ z-index: 2;
402
+ backdrop-filter: blur(10px);
403
+ }
404
+
405
+ .prediction-bubble::before {
406
+ content: '';
407
+ position: absolute;
408
+ top: -8px; left: 50%;
409
+ transform: translateX(-50%) rotate(45deg);
410
+ width: 14px; height: 14px;
411
+ background: rgba(30, 41, 59, 0.7);
412
+ border-left: 1px solid rgba(255, 107, 0, 0.25);
413
+ border-top: 1px solid rgba(255, 107, 0, 0.25);
414
+ }
415
+
416
+ .prediction-category {
417
+ font-family: 'Orbitron', monospace;
418
+ font-size: 0.55rem;
419
+ font-weight: 600;
420
+ color: var(--mistral-primary);
421
+ letter-spacing: 0.15em;
422
+ text-transform: uppercase;
423
+ margin-bottom: 0.5rem;
424
+ display: flex;
425
+ align-items: center;
426
+ gap: 0.4rem;
427
+ }
428
+
429
+ .prediction-category .cat-dot {
430
+ width: 4px; height: 4px;
431
+ background: var(--mistral-primary);
432
+ border-radius: 50%;
433
+ animation: dotPulse 1s infinite;
434
+ }
435
+
436
+ .prediction-text {
437
+ font-size: 0.82rem;
438
+ line-height: 1.5;
439
+ color: #cbd5e1;
440
+ }
441
+
442
+ .prediction-meta {
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: space-between;
446
+ margin-top: 0.75rem;
447
+ padding-top: 0.5rem;
448
+ border-top: 1px solid rgba(255, 107, 0, 0.1);
449
+ }
450
+
451
+ .confidence {
452
+ display: flex;
453
+ align-items: center;
454
+ gap: 0.4rem;
455
+ font-size: 0.65rem;
456
+ }
457
+
458
+ .confidence-bar {
459
+ width: 60px; height: 3px;
460
+ background: rgba(255, 107, 0, 0.1);
461
+ border-radius: 2px;
462
+ overflow: hidden;
463
+ }
464
+
465
+ .confidence-fill {
466
+ height: 100%;
467
+ background: var(--holo-green);
468
+ border-radius: 2px;
469
+ transition: width 1s ease;
470
+ }
471
+
472
+ .prediction-time {
473
+ font-family: 'Orbitron', monospace;
474
+ font-size: 0.55rem;
475
+ color: #475569;
476
+ }
477
+
478
+ /* Floating Particles */
479
+ .particle {
480
+ position: absolute;
481
+ width: 2px; height: 2px;
482
+ background: var(--mistral-primary);
483
+ border-radius: 50%;
484
+ pointer-events: none;
485
+ z-index: 1;
486
+ opacity: 0;
487
+ animation: particleFloat 6s infinite;
488
+ }
489
+
490
+ @keyframes particleFloat {
491
+ 0% { opacity: 0; transform: translateY(0) scale(0); }
492
+ 10% { opacity: 0.8; transform: scale(1); }
493
+ 90% { opacity: 0.3; }
494
+ 100% { opacity: 0; transform: translateY(-150px) scale(0.5); }
495
+ }
496
+
497
+ /* Right Panel - System Management */
498
+ .management-panel {
499
+ padding: 1rem;
500
+ border-left: 1px solid rgba(255, 107, 0, 0.1);
501
+ display: flex;
502
+ flex-direction: column;
503
+ gap: 0.75rem;
504
+ overflow-y: auto;
505
+ }
506
+
507
+ /* Cognitive Load Gauge */
508
+ .cognitive-gauge {
509
+ background: rgba(30, 41, 59, 0.6);
510
+ border: 1px solid rgba(255, 107, 0, 0.12);
511
+ border-radius: 0.5rem;
512
+ padding: 0.75rem;
513
+ text-align: center;
514
+ }
515
+
516
+ .gauge-circle {
517
+ width: 80px; height: 80px;
518
+ margin: 0.5rem auto;
519
+ position: relative;
520
+ }
521
+
522
+ .gauge-circle svg {
523
+ width: 100%; height: 100%;
524
+ transform: rotate(-90deg);
525
+ }
526
+
527
+ .gauge-circle .bg-ring {
528
+ fill: none;
529
+ stroke: rgba(255, 107, 0, 0.1);
530
+ stroke-width: 6;
531
+ }
532
+
533
+ .gauge-circle .fg-ring {
534
+ fill: none;
535
+ stroke: var(--mistral-primary);
536
+ stroke-width: 6;
537
+ stroke-linecap: round;
538
+ transition: stroke-dashoffset 1s ease;
539
+ filter: drop-shadow(0 0 4px var(--mistral-glow));
540
+ }
541
+
542
+ .gauge-value {
543
+ position: absolute;
544
+ top: 50%; left: 50%;
545
+ transform: translate(-50%, -50%);
546
+ font-family: 'Orbitron', monospace;
547
+ font-size: 1.1rem;
548
+ font-weight: 700;
549
+ color: var(--mistral-accent);
550
+ }
551
+
552
+ .gauge-label {
553
+ font-size: 0.6rem;
554
+ color: #64748b;
555
+ margin-top: 0.25rem;
556
+ }
557
+
558
+ /* Prediction History */
559
+ .prediction-history {
560
+ background: rgba(30, 41, 59, 0.6);
561
+ border: 1px solid rgba(255, 107, 0, 0.12);
562
+ border-radius: 0.5rem;
563
+ padding: 0.75rem;
564
+ flex: 1;
565
+ overflow-y: auto;
566
+ }
567
+
568
+ .history-item {
569
+ display: flex;
570
+ align-items: flex-start;
571
+ gap: 0.5rem;
572
+ padding: 0.5rem 0;
573
+ border-bottom: 1px solid rgba(255, 107, 0, 0.06);
574
+ animation: slideInItem 0.3s ease-out;
575
+ }
576
+
577
+ .history-item:last-child { border-bottom: none; }
578
+
579
+ @keyframes slideInItem {
580
+ from { opacity: 0; transform: translateX(10px); }
581
+ to { opacity: 1; transform: translateX(0); }
582
+ }
583
+
584
+ .history-icon {
585
+ width: 18px; height: 18px;
586
+ border-radius: 4px;
587
+ display: flex;
588
+ align-items: center;
589
+ justify-content: center;
590
+ font-size: 0.6rem;
591
+ flex-shrink: 0;
592
+ margin-top: 1px;
593
+ }
594
+
595
+ .history-icon.alert { background: rgba(239, 68, 68, 0.2); color: #ef4444; }
596
+ .history-icon.insight { background: rgba(59, 130, 246, 0.2); color: #3b82f6; }
597
+ .history-icon.success { background: rgba(16, 185, 129, 0.2); color: #10b981; }
598
+ .history-icon.warning { background: rgba(245, 158, 11, 0.2); color: #f59e0b; }
599
+
600
+ .history-content { flex: 1; min-width: 0; }
601
+
602
+ .history-text {
603
+ font-size: 0.7rem;
604
+ color: #94a3b8;
605
+ line-height: 1.4;
606
+ }
607
+
608
+ .history-time {
609
+ font-family: 'Orbitron', monospace;
610
+ font-size: 0.5rem;
611
+ color: #475569;
612
+ margin-top: 0.15rem;
613
+ }
614
+
615
+ /* Action Buttons */
616
+ .holo-actions {
617
+ display: grid;
618
+ grid-template-columns: 1fr 1fr;
619
+ gap: 0.4rem;
620
+ }
621
+
622
+ .holo-action-btn {
623
+ padding: 0.5rem;
624
+ border-radius: 0.4rem;
625
+ border: 1px solid rgba(255, 107, 0, 0.15);
626
+ background: rgba(255, 107, 0, 0.05);
627
+ color: #94a3b8;
628
+ font-size: 0.65rem;
629
+ font-weight: 500;
630
+ cursor: pointer;
631
+ transition: all 0.2s;
632
+ display: flex;
633
+ align-items: center;
634
+ justify-content: center;
635
+ gap: 0.35rem;
636
+ font-family: 'Inter', sans-serif;
637
+ }
638
+
639
+ .holo-action-btn:hover {
640
+ background: rgba(255, 107, 0, 0.15);
641
+ border-color: rgba(255, 107, 0, 0.3);
642
+ color: var(--mistral-accent);
643
+ }
644
+
645
+ .holo-action-btn:active {
646
+ transform: scale(0.97);
647
+ }
648
+
649
+ .holo-action-btn.danger {
650
+ border-color: rgba(239, 68, 68, 0.2);
651
+ background: rgba(239, 68, 68, 0.05);
652
+ }
653
+
654
+ .holo-action-btn.danger:hover {
655
+ background: rgba(239, 68, 68, 0.15);
656
+ border-color: rgba(239, 68, 68, 0.3);
657
+ color: #ef4444;
658
+ }
659
+
660
+ /* Footer */
661
+ .hologram-footer {
662
+ display: flex;
663
+ align-items: center;
664
+ justify-content: space-between;
665
+ padding: 0.6rem 1.25rem;
666
+ border-top: 1px solid rgba(255, 107, 0, 0.1);
667
+ background: rgba(255, 107, 0, 0.03);
668
+ font-size: 0.6rem;
669
+ color: #475569;
670
+ }
671
+
672
+ .footer-left {
673
+ display: flex;
674
+ align-items: center;
675
+ gap: 1rem;
676
+ }
677
+
678
+ .footer-stat {
679
+ display: flex;
680
+ align-items: center;
681
+ gap: 0.3rem;
682
+ }
683
+
684
+ .footer-stat .val {
685
+ font-family: 'Orbitron', monospace;
686
+ color: var(--mistral-secondary);
687
+ font-weight: 600;
688
+ }
689
+
690
+ .neural-wave {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 1px;
694
+ height: 12px;
695
+ }
696
+
697
+ .neural-bar {
698
+ width: 2px;
699
+ background: var(--mistral-primary);
700
+ border-radius: 1px;
701
+ animation: neuralPulse 1.5s ease-in-out infinite;
702
+ opacity: 0.6;
703
+ }
704
+
705
+ @keyframes neuralPulse {
706
+ 0%, 100% { height: 3px; }
707
+ 50% { height: 10px; }
708
+ }
709
+
710
+ /* Expand/Collapse */
711
+ .toggle-btn {
712
+ position: absolute;
713
+ top: 0.75rem;
714
+ right: 0.75rem;
715
+ width: 24px; height: 24px;
716
+ border-radius: 4px;
717
+ border: 1px solid rgba(255, 107, 0, 0.2);
718
+ background: rgba(255, 107, 0, 0.05);
719
+ color: #94a3b8;
720
+ cursor: pointer;
721
+ display: flex;
722
+ align-items: center;
723
+ justify-content: center;
724
+ font-size: 0.75rem;
725
+ z-index: 10;
726
+ transition: all 0.2s;
727
+ }
728
+
729
+ .toggle-btn:hover {
730
+ background: rgba(255, 107, 0, 0.15);
731
+ color: var(--mistral-accent);
732
+ }
733
+
734
+ .collapsed .main-grid { display: none; }
735
+ .collapsed .hologram-footer { display: none; }
736
+ .collapsed { min-height: auto; }
737
+ </style>
738
+
739
+ <div class="hologram-container" id="holoContainer">
740
+ <button class="toggle-btn" id="toggleBtn" title="Expand/Collapse">▼</button>
741
+
742
+ <div class="header">
743
+ <div class="header-left">
744
+ <div class="mistral-badge">
745
+ <span class="dot"></span>
746
+ MISTRAL AI
747
+ </div>
748
+ <span class="header-title">Hologramme Cognitif</span>
749
+ </div>
750
+ <div class="cognitive-status">
751
+ <span class="pulse"></span>
752
+ <span id="statusText">Système Cognitif Actif</span>
753
+ </div>
754
+ </div>
755
+
756
+ <div class="main-grid">
757
+ <!-- Left: Cognitive Nodes -->
758
+ <div class="cognitive-panel">
759
+ <div class="panel-title">Nœuds Cognitifs</div>
760
+ <div id="nodesContainer"></div>
761
+ </div>
762
+
763
+ <!-- Center: Hologram Core -->
764
+ <div class="hologram-core">
765
+ <div class="holo-scanner"></div>
766
+ <div id="particlesContainer"></div>
767
+
768
+ <div class="avatar-container">
769
+ <div class="avatar-ring-outer"></div>
770
+ <div class="avatar-ring-inner"></div>
771
+ <div class="avatar-core">
772
+ <span class="avatar-icon">M</span>
773
+ </div>
774
+ <span class="avatar-label">Mistral Large</span>
775
+ </div>
776
+
777
+ <div class="prediction-bubble" id="predictionBubble">
778
+ <div class="prediction-category">
779
+ <span class="cat-dot"></span>
780
+ <span id="predCategory">ANALYSE EN COURS</span>
781
+ </div>
782
+ <div class="prediction-text" id="predText">Initialisation du système cognitif Mistral... Connexion aux nœuds neuronaux établie.</div>
783
+ <div class="prediction-meta">
784
+ <div class="confidence">
785
+ <span style="color: #64748b; font-family: 'Orbitron', monospace;">CONF</span>
786
+ <div class="confidence-bar">
787
+ <div class="confidence-fill" id="confFill" style="width: 0%"></div>
788
+ </div>
789
+ <span id="confValue" style="color: var(--holo-green); font-family: 'Orbitron', monospace;">0%</span>
790
+ </div>
791
+ <span class="prediction-time" id="predTime">--:--:--</span>
792
+ </div>
793
+ </div>
794
+ </div>
795
+
796
+ <!-- Right: Management Panel -->
797
+ <div class="management-panel">
798
+ <div class="panel-title">Gestion Cognitive</div>
799
+
800
+ <div class="cognitive-gauge">
801
+ <div class="panel-title" style="margin-bottom: 0.25rem;">Charge Cognitive</div>
802
+ <div class="gauge-circle">
803
+ <svg viewBox="0 0 100 100">
804
+ <circle class="bg-ring" cx="50" cy="50" r="42"/>
805
+ <circle class="fg-ring" id="gaugeRing" cx="50" cy="50" r="42"
806
+ stroke-dasharray="263.9"
807
+ stroke-dashoffset="263.9"/>
808
+ </svg>
809
+ <span class="gauge-value" id="gaugeValue">0%</span>
810
+ </div>
811
+ <div class="gauge-label">Capacité neuronale active</div>
812
+ </div>
813
+
814
+ <div class="prediction-history" id="historyPanel">
815
+ <div class="panel-title" style="margin-bottom: 0.4rem;">Historique Prédictions</div>
816
+ <div id="historyList"></div>
817
+ </div>
818
+
819
+ <div class="holo-actions">
820
+ <button class="holo-action-btn" onclick="this.getRootNode().host.triggerPrediction()">
821
+ ⚡ Prédire
822
+ </button>
823
+ <button class="holo-action-btn" onclick="this.getRootNode().host.optimizeCognitive()">
824
+ 🧠 Optimiser
825
+ </button>
826
+ <button class="holo-action-btn" onclick="this.getRootNode().host.runDiagnostics()">
827
+ 🔍 Diagnostiquer
828
+ </button>
829
+ <button class="holo-action-btn danger" onclick="this.getRootNode().host.emergencyReset()">
830
+ 🔄 Reset
831
+ </button>
832
+ </div>
833
+ </div>
834
+ </div>
835
+
836
+ <div class="hologram-footer">
837
+ <div class="footer-left">
838
+ <div class="footer-stat">
839
+ <span>Latence:</span>
840
+ <span class="val" id="latencyVal">12ms</span>
841
+ </div>
842
+ <div class="footer-stat">
843
+ <span>Tokens:</span>
844
+ <span class="val" id="tokensVal">0</span>
845
+ </div>
846
+ <div class="footer-stat">
847
+ <span>Prédictions:</span>
848
+ <span class="val" id="predCount">0</span>
849
+ </div>
850
+ <div class="neural-wave" id="neuralWave"></div>
851
+ </div>
852
+ <span style="font-family: 'Orbitron', monospace; color: #475569;">Mistral-Large v2 • Cognitive Engine</span>
853
+ </div>
854
+ </div>
855
+ `;
856
+
857
+ this.setupParticles();
858
+ this.setupNeuralWave();
859
+ this.renderNodes();
860
+ this.setupToggle();
861
+ }
862
+
863
+ setupToggle() {
864
+ const btn = this.shadowRoot.getElementById('toggleBtn');
865
+ const container = this.shadowRoot.getElementById('holoContainer');
866
+ btn.addEventListener('click', () => {
867
+ container.classList.toggle('collapsed');
868
+ btn.textContent = container.classList.contains('collapsed') ? '▲' : '▼';
869
+ });
870
+ }
871
+
872
+ setupParticles() {
873
+ const container = this.shadowRoot.getElementById('particlesContainer');
874
+ if (!container) return;
875
+ for (let i = 0; i < 20; i++) {
876
+ const p = document.createElement('div');
877
+ p.className = 'particle';
878
+ p.style.left = Math.random() * 100 + '%';
879
+ p.style.top = 60 + Math.random() * 40 + '%';
880
+ p.style.animationDelay = Math.random() * 6 + 's';
881
+ p.style.animationDuration = (4 + Math.random() * 4) + 's';
882
+ container.appendChild(p);
883
+ }
884
+ }
885
+
886
+ setupNeuralWave() {
887
+ const wave = this.shadowRoot.getElementById('neuralWave');
888
+ if (!wave) return;
889
+ for (let i = 0; i < 15; i++) {
890
+ const bar = document.createElement('div');
891
+ bar.className = 'neural-bar';
892
+ bar.style.animationDelay = (i * 0.1) + 's';
893
+ wave.appendChild(bar);
894
+ }
895
+ }
896
+
897
+ renderNodes() {
898
+ const container = this.shadowRoot.getElementById('nodesContainer');
899
+ if (!container) return;
900
+ container.innerHTML = this.cognitiveNodes.map(node => {
901
+ const loadColor = node.load > 80 ? '#ef4444' : node.load > 60 ? '#f59e0b' : '#10b981';
902
+ const indicatorClass = node.load > 80 ? 'indicator-critical' : node.load > 60 ? 'indicator-warning' : 'indicator-active';
903
+ return `
904
+ <div class="cognitive-node" data-node="${node.id}">
905
+ <div class="node-header">
906
+ <span class="node-label">${node.label}</span>
907
+ <span class="node-id">${node.id}</span>
908
+ </div>
909
+ <div class="node-load-bar">
910
+ <div class="node-load-fill" style="width: ${node.load}%; background: ${loadColor};"></div>
911
+ </div>
912
+ <div class="node-load-text">
913
+ <span class="node-status">
914
+ <span class="indicator ${indicatorClass}"></span>
915
+ ${node.active ? 'Actif' : 'Inactif'}
916
+ </span>
917
+ <span>${node.load}%</span>
918
+ </div>
919
+ </div>
920
+ `;
921
+ }).join('');
922
+ }
923
+
924
+ startAnimations() {
925
+ // Update gauge
926
+ this.updateGauge();
927
+
928
+ // Token counter
929
+ let tokens = 0;
930
+ const tokenEl = this.shadowRoot.getElementById('tokensVal');
931
+ const interval = setInterval(() => {
932
+ if (!this.isActive) { clearInterval(interval); return; }
933
+ tokens += Math.floor(Math.random() * 50 + 10);
934
+ if (tokenEl) tokenEl.textContent = tokens.toLocaleString();
935
+ }, 2000);
936
+
937
+ // Latency
938
+ const latencyEl = this.shadowRoot.getElementById('latencyVal');
939
+ const latInterval = setInterval(() => {
940
+ if (!this.isActive) { clearInterval(latInterval); return; }
941
+ if (latencyEl) latencyEl.textContent = Math.floor(8 + Math.random() * 20) + 'ms';
942
+ }, 3000);
943
+ }
944
+
945
+ updateGauge() {
946
+ const ring = this.shadowRoot.getElementById('gaugeRing');
947
+ const value = this.shadowRoot.getElementById('gaugeValue');
948
+ if (!ring || !value) return;
949
+
950
+ const circumference = 2 * Math.PI * 42; // ~263.9
951
+ const offset = circumference - (this.cognitiveLoad / 100) * circumference;
952
+ ring.style.strokeDashoffset = offset;
953
+ value.textContent = this.cognitiveLoad + '%';
954
+
955
+ // Color based on load
956
+ if (this.cognitiveLoad > 80) {
957
+ ring.style.stroke = '#ef4444';
958
+ value.style.color = '#ef4444';
959
+ } else if (this.cognitiveLoad > 60) {
960
+ ring.style.stroke = '#f59e0b';
961
+ value.style.color = '#f59e0b';
962
+ } else {
963
+ ring.style.stroke = 'var(--mistral-primary)';
964
+ value.style.color = 'var(--mistral-accent)';
965
+ }
966
+ }
967
+
968
+ generatePrediction() {
969
+ const predictions = [
970
+ {
971
+ category: 'MOUVEMENT ÉQUIPE',
972
+ text: 'Optimisation de trajectoire détectée pour Secteur 7. Recommandation : redéployer 2 unités vers le point de convergence nord. Gain estimé : 18 min.',
973
+ confidence: 94,
974
+ type: 'insight'
975
+ },
976
+ {
977
+ category: 'RISQUE OPÉRATIONNEL',
978
+ text: 'Anomalie comportementale identifiée — Zone 3B. Probabilité d\'incident : 23%. Recommandation : surveillance renforcée + patrouille supplémentaire.',
979
+ confidence: 77,
980
+ type: 'warning'
981
+ },
982
+ {
983
+ category: 'RESSOURCES CRITIQUES',
984
+ text: 'Seuil de consommation batterie prévu à 15% dans 4h pour 3 devices. Planification recharge urgente recommandée sur Base Camp.',
985
+ confidence: 89,
986
+ type: 'alert'
987
+ },
988
+ {
989
+ category: 'SÉCURITÉ RÉSEAU',
990
+ text: 'Pattern de connexion inhabituel détecté depuis le nœud 192.168.3.45. Analyse : tentative d\'accès non autorisée probable. Verrouillage suggéré.',
991
+ confidence: 82,
992
+ type: 'alert'
993
+ },
994
+ {
995
+ category: 'OPTIMISATION FM',
996
+ text: 'Fréquence 462.550 MHz — interférence détectée à 18:00. Basculement recommandé vers canal 5 (446.006 MHz) entre 17:45 et 18:30.',
997
+ confidence: 91,
998
+ type: 'insight'
999
+ },
1000
+ {
1001
+ category: 'PRÉDICTION MÉTÉO',
1002
+ text: 'Conditions météo défavorables prévues : orage 62% probabilité 16h-19h. Impact operations outdoor : élevé. Plan B intérieur recommandé.',
1003
+ confidence: 68,
1004
+ type: 'warning'
1005
+ },
1006
+ {
1007
+ category: 'CHARGE COGNITIVE',
1008
+ text: 'Système neuronal en surcharge détectée (N2: 91%). Recommandation : redistribution des tâches analytiques vers N4 et N6.',
1009
+ confidence: 96,
1010
+ type: 'insight'
1011
+ },
1012
+ {
1013
+ category: 'PERFORMANCE IA',
1014
+ text: 'Modèle prédictif accuracy : 96.7%. Dérive détectée sur cluster périmètre. Recalibration recommandée dans les 2 heures.',
1015
+ confidence: 88,
1016
+ type: 'warning'
1017
+ },
1018
+ {
1019
+ category: 'COORDINATION MISSION',
1020
+ text: 'Convergence optimale des équipes détectée à 15:30 au point Alpha. Synchronisation FM + Bluetooth recommandée pour confirmation.',
1021
+ confidence: 85,
1022
+ type: 'success'
1023
+ },
1024
+ {
1025
+ category: 'ANOMALIE SYSTÈME',
1026
+ text: 'Latence anormale sur le nœud cognitif N5 (Apprentissage). Cycle de rétropropagation ralenti de 12%. Reset partiel suggéré.',
1027
+ confidence: 73,
1028
+ type: 'alert'
1029
+ }
1030
+ ];
1031
+
1032
+ const pred = predictions[Math.floor(Math.random() * predictions.length)];
1033
+ this.currentPrediction = pred;
1034
+ this.displayPrediction(pred);
1035
+ this.addToHistory(pred);
1036
+
1037
+ // Schedule next prediction
1038
+ const delay = 8000 + Math.random() * 12000;
1039
+ setTimeout(() => {
1040
+ if (this.isActive) this.generatePrediction();
1041
+ }, delay);
1042
+ }
1043
+
1044
+ displayPrediction(pred) {
1045
+ const catEl = this.shadowRoot.getElementById('predCategory');
1046
+ const textEl = this.shadowRoot.getElementById('predText');
1047
+ const confFill = this.shadowRoot.getElementById('confFill');
1048
+ const confValue = this.shadowRoot.getElementById('confValue');
1049
+ const predTime = this.shadowRoot.getElementById('predTime');
1050
+
1051
+ if (!catEl) return;
1052
+
1053
+ // Animate transition
1054
+ const bubble = this.shadowRoot.getElementById('predictionBubble');
1055
+ if (bubble) {
1056
+ bubble.style.opacity = '0';
1057
+ bubble.style.transform = 'translateY(5px)';
1058
+ setTimeout(() => {
1059
+ catEl.textContent = pred.category;
1060
+ textEl.textContent = pred.text;
1061
+ confFill.style.width = pred.confidence + '%';
1062
+ confValue.textContent = pred.confidence + '%';
1063
+ const now = new Date();
1064
+ predTime.textContent = now.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit', second: '2-digit' });
1065
+
1066
+ // Confidence color
1067
+ if (pred.confidence > 85) {
1068
+ confFill.style.background = '#10b981';
1069
+ confValue.style.color = '#10b981';
1070
+ } else if (pred.confidence > 70) {
1071
+ confFill.style.background = '#f59e0b';
1072
+ confValue.style.color = '#f59e0b';
1073
+ } else {
1074
+ confFill.style.background = '#ef4444';
1075
+ confValue.style.color = '#ef4444';
1076
+ }
1077
+
1078
+ bubble.style.opacity = '1';
1079
+ bubble.style.transform = 'translateY(0)';
1080
+ bubble.style.transition = 'all 0.5s ease';
1081
+ }, 300);
1082
+ }
1083
+
1084
+ // Update prediction count
1085
+ const countEl = this.shadowRoot.getElementById('predCount');
1086
+ if (countEl) {
1087
+ const current = parseInt(countEl.textContent) || 0;
1088
+ countEl.textContent = current + 1;
1089
+ }
1090
+ }
1091
+
1092
+ addToHistory(pred) {
1093
+ const list = this.shadowRoot.getElementById('historyList');
1094
+ if (!list) return;
1095
+
1096
+ const icons = {
1097
+ alert: '⚠',
1098
+ insight: '💡',
1099
+ success: '✓',
1100
+ warning: '⚡'
1101
+ };
1102
+
1103
+ const item = document.createElement('div');
1104
+ item.className = 'history-item';
1105
+ item.innerHTML = `
1106
+ <div class="history-icon ${pred.type}">${icons[pred.type] || '•'}</div>
1107
+ <div class="history-content">
1108
+ <div class="history-text">${pred.text.substring(0, 80)}${pred.text.length > 80 ? '...' : ''}</div>
1109
+ <div class="history-time">${new Date().toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })} • CONF ${pred.confidence}%</div>
1110
+ </div>
1111
+ `;
1112
+
1113
+ list.insertBefore(item, list.firstChild);
1114
+
1115
+ // Keep max 8 items
1116
+ while (list.children.length > 8) {
1117
+ list.removeChild(list.lastChild);
1118
+ }
1119
+ }
1120
+
1121
+ startCognitiveCycle() {
1122
+ setInterval(() => {
1123
+ if (!this.isActive) return;
1124
+
1125
+ // Fluctuate node loads
1126
+ this.cognitiveNodes.forEach(node => {
1127
+ const delta = Math.floor(Math.random() * 10) - 4;
1128
+ node.load = Math.max(15, Math.min(98, node.load + delta));
1129
+ node.active = node.load < 95;
1130
+ });
1131
+
1132
+ // Update cognitive load
1133
+ this.cognitiveLoad = Math.round(
1134
+ this.cognitiveNodes.reduce((sum, n) => sum + n.load, 0) / this.cognitiveNodes.length
1135
+ );
1136
+
1137
+ this.renderNodes();
1138
+ this.updateGauge();
1139
+
1140
+ // Update status
1141
+ const statusEl = this.shadowRoot.getElementById('statusText');
1142
+ if (statusEl) {
1143
+ if (this.cognitiveLoad > 85) {
1144
+ statusEl.textContent = '⚠ Surcharge Cognitive';
1145
+ statusEl.style.color = '#ef4444';
1146
+ } else if (this.cognitiveLoad > 65) {
1147
+ statusEl.textContent = 'Charge Élevée';
1148
+ statusEl.style.color = '#f59e0b';
1149
+ } else {
1150
+ statusEl.textContent = 'Système Cognitif Actif';
1151
+ statusEl.style.color = '#10b981';
1152
+ }
1153
+ }
1154
+ }, 5000);
1155
+ }
1156
+
1157
+ // Public methods for action buttons
1158
+ triggerPrediction() {
1159
+ this.generatePrediction();
1160
+ }
1161
+
1162
+ optimizeCognitive() {
1163
+ this.cognitiveNodes.forEach(node => {
1164
+ node.load = Math.max(20, node.load - Math.floor(Math.random() * 20 + 10));
1165
+ });
1166
+ this.cognitiveLoad = Math.round(
1167
+ this.cognitiveNodes.reduce((sum, n) => sum + n.load, 0) / this.cognitiveNodes.length
1168
+ );
1169
+ this.renderNodes();
1170
+ this.updateGauge();
1171
+
1172
+ // Add optimization to history
1173
+ this.addToHistory({
1174
+ type: 'success',
1175
+ text: 'Optimisation cognitive effectuée — charge réduite de ' + Math.floor(Math.random() * 15 + 5) + '%. Nœuds redistribués.',
1176
+ confidence: 95
1177
+ });
1178
+ }
1179
+
1180
+ runDiagnostics() {
1181
+ this.addToHistory({
1182
+ type: 'insight',
1183
+ text: 'Diagnostic complet lancé — 6 nœuds analysés. Tous systèmes nominaux. Aucune corruption détectée dans les poids neuronaux.',
1184
+ confidence: 98
1185
+ });
1186
+ }
1187
+
1188
+ emergencyReset() {
1189
+ this.cognitiveNodes.forEach(node => {
1190
+ node.load = 30 + Math.floor(Math.random() * 15);
1191
+ node.active = true;
1192
+ });
1193
+ this.cognitiveLoad = Math.round(
1194
+ this.cognitiveNodes.reduce((sum, n) => sum + n.load, 0) / this.cognitiveNodes.length
1195
+ );
1196
+ this.renderNodes();
1197
+ this.updateGauge();
1198
+
1199
+ this.addToHistory({
1200
+ type: 'warning',
1201
+ text: '🔄 Reset cognitive effectué — Tous nœuds réinitialisés. Charge revenue à niveau optimal. Recalibration en cours...',
1202
+ confidence: 100
1203
+ });
1204
+ }
1205
+ }
1206
+
1207
+ customElements.define('mistral-hologram', MistralHologram);
index.html CHANGED
@@ -206,8 +206,14 @@
206
  <!-- Custom Navigation -->
207
  <div id="vanta-bg" class="fixed inset-0 z-0"></div>
208
  <script src="components/navbar.js"></script>
 
209
  <custom-navbar></custom-navbar>
210
 
 
 
 
 
 
211
  <!-- Quick Actions FAB -->
212
  <div class="fab-container">
213
  <div id="fabMenu" class="fab-menu flex flex-col-reverse gap-3 mb-4">
@@ -250,6 +256,9 @@
250
  <i data-feather="bell" class="w-5 h-5"></i>
251
  <span id="notifBadge" class="absolute -top-1 -right-1 w-5 h-5 bg-red-500 rounded-full text-xs flex items-center justify-center">3</span>
252
  </button>
 
 
 
253
  <button class="btn-primary">
254
  <i data-feather="plus" class="w-4 h-4 mr-2"></i>
255
  New Mission
 
206
  <!-- Custom Navigation -->
207
  <div id="vanta-bg" class="fixed inset-0 z-0"></div>
208
  <script src="components/navbar.js"></script>
209
+ <script src="components/mistral-hologram.js"></script>
210
  <custom-navbar></custom-navbar>
211
 
212
+ <!-- Mistral Hologram -->
213
+ <div class="mb-8">
214
+ <mistral-hologram></mistral-hologram>
215
+ </div>
216
+
217
  <!-- Quick Actions FAB -->
218
  <div class="fab-container">
219
  <div id="fabMenu" class="fab-menu flex flex-col-reverse gap-3 mb-4">
 
256
  <i data-feather="bell" class="w-5 h-5"></i>
257
  <span id="notifBadge" class="absolute -top-1 -right-1 w-5 h-5 bg-red-500 rounded-full text-xs flex items-center justify-center">3</span>
258
  </button>
259
+ <a href="radio-poc.html" class="mode-toggle p-3 bg-orange-700/50 rounded-xl hover:bg-orange-600/50" title="Radio POC API">
260
+ <i data-feather="radio" class="w-5 h-5 text-orange-400"></i>
261
+ </a>
262
  <button class="btn-primary">
263
  <i data-feather="plus" class="w-4 h-4 mr-2"></i>
264
  New Mission