@symerian/symi 3.5.0 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/bundled/boot-md/handler.js +4 -4
  3. package/dist/bundled/session-memory/handler.js +4 -4
  4. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  5. package/dist/{chrome-C_I81hbq.js → chrome-B7-rO4i9.js} +4 -4
  6. package/dist/{chrome-BKUACyeO.js → chrome-DPjznJQ-.js} +4 -4
  7. package/dist/control-ui/css/revert-red-theme.md +141 -0
  8. package/dist/control-ui/css/style.css +5843 -0
  9. package/dist/control-ui/css/style.css.backup-2026-03-03-162525 +3546 -0
  10. package/dist/control-ui/css/style.css.backup-before-red-2026-03-03-162525 +3546 -0
  11. package/dist/control-ui/css/style.css.backup-before-red-theme-2026-03-03-162530 +3546 -0
  12. package/dist/control-ui/css/style.css.pre-2row +2165 -0
  13. package/dist/control-ui/css/style.css.pre-brand +1776 -0
  14. package/dist/control-ui/css/style.css.pre-history +1974 -0
  15. package/dist/control-ui/css/style.css.pre-nav +2264 -0
  16. package/dist/control-ui/css/style.css.pre-newsession +1898 -0
  17. package/dist/control-ui/css/style.css.pre-queue +2195 -0
  18. package/dist/control-ui/css/style.css.pre-red-prompt +2524 -0
  19. package/dist/control-ui/css/style.css.pre-stop +2239 -0
  20. package/dist/control-ui/css/style.css.pre-textarea +2184 -0
  21. package/dist/control-ui/css/style.css.pre-watchdog +1848 -0
  22. package/dist/control-ui/css/style.css.red-theme +2999 -0
  23. package/dist/control-ui/index.html +1049 -0
  24. package/dist/control-ui/js/app.js +1304 -0
  25. package/dist/control-ui/js/app.js.pre-2row +463 -0
  26. package/dist/control-ui/js/app.js.pre-heartbeat-filter +595 -0
  27. package/dist/control-ui/js/app.js.pre-newsession +408 -0
  28. package/dist/control-ui/js/app.js.pre-queue +476 -0
  29. package/dist/control-ui/js/app.js.pre-stop +564 -0
  30. package/dist/control-ui/js/app.js.pre-textarea +467 -0
  31. package/dist/control-ui/js/app.js.pre-watchdog +293 -0
  32. package/dist/control-ui/js/connections.js +438 -0
  33. package/dist/control-ui/js/gateway.js +233 -0
  34. package/dist/control-ui/js/gateway.js.pre-stop +110 -0
  35. package/dist/control-ui/js/history.js +732 -0
  36. package/dist/control-ui/js/logs.js +238 -0
  37. package/dist/control-ui/js/menu.js +232 -0
  38. package/dist/control-ui/js/menu.js.pre-nav +66 -0
  39. package/dist/control-ui/js/metrics.js +53 -0
  40. package/dist/control-ui/js/models.js +138 -0
  41. package/dist/control-ui/js/render.js +882 -0
  42. package/dist/control-ui/js/render.test.js +112 -0
  43. package/dist/control-ui/js/scheduling.js +461 -0
  44. package/dist/control-ui/js/settings.js +910 -0
  45. package/dist/control-ui/js/slash-autocomplete.js +168 -0
  46. package/dist/control-ui/js/subagents.js +560 -0
  47. package/dist/control-ui/js/utils.js +29 -0
  48. package/dist/control-ui/vendor/highlight.min.js +2518 -0
  49. package/dist/control-ui/vendor/marked.min.js +69 -0
  50. package/dist/{deliver-DyO3QD8O.js → deliver-DTRkeYm3.js} +4 -4
  51. package/dist/{deliver-Cjyb6h4g.js → deliver-oWGJwzFf.js} +4 -4
  52. package/dist/extensionAPI.js +4 -4
  53. package/dist/llm-slug-generator.js +4 -4
  54. package/dist/{manager-rvtFoeFT.js → manager-CFenq_aO.js} +1 -1
  55. package/dist/{manager-PTSjHNVq.js → manager-CsxTf96V.js} +1 -1
  56. package/dist/{pi-embedded-BPuUM-gD.js → pi-embedded-Cdub5Vs9.js} +10 -10
  57. package/dist/{pw-ai-BFS9ezWe.js → pw-ai-BOOB8qoi.js} +1 -1
  58. package/dist/{pw-ai-Cx-Ko_FL.js → pw-ai-D2pEVS5n.js} +1 -1
  59. package/dist/{synthesis-7UL3pCpj.js → synthesis-Be9nYyDd.js} +4 -4
  60. package/dist/{synthesis-fD8J2vag.js → synthesis-CBIT6Vnk.js} +4 -4
  61. package/dist/{unified-runner-BIiKFnNF.js → unified-runner-BVvvnjXW.js} +10 -10
  62. package/package.json +1 -1
@@ -0,0 +1,2264 @@
1
+ /* ── Reset & Base ─────────────────────────────────────────────────── */
2
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
+
4
+ :root {
5
+ --bg: #07070f;
6
+ --glass-bg: rgba(255,255,255,0.04);
7
+ --glass-bg-hover: rgba(255,255,255,0.07);
8
+ --glass-border: rgba(255,255,255,0.08);
9
+ --glass-border-strong: rgba(255,255,255,0.14);
10
+ --text: rgba(255,255,255,0.92);
11
+ --text-muted: rgba(255,255,255,0.45);
12
+ --text-dim: rgba(255,255,255,0.25);
13
+ --accent-cyan: #00d4ff;
14
+ --accent-purple: #8b5cf6;
15
+ --accent-pink: #f472b6;
16
+ --accent-green: #34d399;
17
+ --accent-blue: #60a5fa;
18
+ --shadow: 0 8px 32px rgba(0,0,0,0.5);
19
+ --blur: blur(24px) saturate(160%);
20
+ --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
21
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace;
22
+ }
23
+
24
+ html, body {
25
+ height: 100%;
26
+ width: 100%;
27
+ overflow: hidden;
28
+ background: var(--bg);
29
+ color: var(--text);
30
+ font-family: var(--font);
31
+ font-size: 13px;
32
+ line-height: 1.5;
33
+ -webkit-font-smoothing: antialiased;
34
+ }
35
+
36
+ /* ── Background ───────────────────────────────────────────────────── */
37
+ .bg-orbs {
38
+ position: fixed;
39
+ inset: 0;
40
+ pointer-events: none;
41
+ z-index: 0;
42
+ overflow: hidden;
43
+ }
44
+
45
+ .orb {
46
+ position: absolute;
47
+ border-radius: 50%;
48
+ filter: blur(120px);
49
+ opacity: 0.18;
50
+ animation: drift 20s ease-in-out infinite alternate;
51
+ }
52
+
53
+ .orb-1 {
54
+ width: 700px; height: 700px;
55
+ background: radial-gradient(circle, var(--accent-cyan), transparent 70%);
56
+ top: -200px; left: -150px;
57
+ animation-duration: 25s;
58
+ }
59
+
60
+ .orb-2 {
61
+ width: 600px; height: 600px;
62
+ background: radial-gradient(circle, var(--accent-purple), transparent 70%);
63
+ bottom: -100px; right: -100px;
64
+ animation-duration: 30s;
65
+ animation-delay: -8s;
66
+ }
67
+
68
+ .orb-3 {
69
+ width: 500px; height: 500px;
70
+ background: radial-gradient(circle, var(--accent-pink), transparent 70%);
71
+ top: 40%; left: 45%;
72
+ animation-duration: 22s;
73
+ animation-delay: -4s;
74
+ opacity: 0.1;
75
+ }
76
+
77
+ @keyframes drift {
78
+ 0% { transform: translate(0, 0) scale(1); }
79
+ 33% { transform: translate(60px, -40px) scale(1.05); }
80
+ 66% { transform: translate(-40px, 60px) scale(0.95); }
81
+ 100% { transform: translate(30px, 20px) scale(1.02); }
82
+ }
83
+
84
+ .bg-grid {
85
+ position: fixed;
86
+ inset: 0;
87
+ z-index: 0;
88
+ pointer-events: none;
89
+ background-image:
90
+ linear-gradient(rgba(255,255,255,0.015) 1px, transparent 1px),
91
+ linear-gradient(90deg, rgba(255,255,255,0.015) 1px, transparent 1px);
92
+ background-size: 48px 48px;
93
+ mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 40%, transparent 100%);
94
+ }
95
+
96
+ /* ── Glass Panel ──────────────────────────────────────────────────── */
97
+ .glass-panel {
98
+ position: relative;
99
+ background: var(--glass-bg);
100
+ backdrop-filter: var(--blur);
101
+ -webkit-backdrop-filter: var(--blur);
102
+ border: 1px solid var(--glass-border);
103
+ border-radius: 14px;
104
+ padding: 14px;
105
+ box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.06);
106
+ transition: border-color 0.3s, box-shadow 0.3s;
107
+ }
108
+
109
+ .glass-panel:hover {
110
+ border-color: var(--glass-border-strong);
111
+ box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.1), 0 0 0 1px rgba(0,212,255,0.05);
112
+ }
113
+
114
+ .glass-panel::before {
115
+ content: '';
116
+ position: absolute;
117
+ inset: 0;
118
+ border-radius: 16px;
119
+ background: linear-gradient(135deg, rgba(255,255,255,0.04) 0%, transparent 60%);
120
+ pointer-events: none;
121
+ }
122
+
123
+ .panel-sm { padding: 10px 12px; }
124
+
125
+ .panel-label {
126
+ font-size: 10px;
127
+ font-family: var(--font-mono);
128
+ font-weight: 600;
129
+ letter-spacing: 0.18em;
130
+ color: var(--accent-cyan);
131
+ margin-bottom: 12px;
132
+ opacity: 0.9;
133
+ }
134
+
135
+ /* ── Brand Panel ─────────────────────────────────────────────────── */
136
+ .brand-panel {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 14px;
140
+ padding: 14px 16px;
141
+ overflow: hidden;
142
+ }
143
+
144
+ .brand-panel::after {
145
+ content: '';
146
+ position: absolute;
147
+ inset: 0;
148
+ border-radius: 14px;
149
+ background: linear-gradient(
150
+ 120deg,
151
+ rgba(0,212,255,0.06) 0%,
152
+ rgba(139,92,246,0.06) 50%,
153
+ rgba(0,212,255,0.03) 100%
154
+ );
155
+ pointer-events: none;
156
+ }
157
+
158
+ .brand-mark {
159
+ flex-shrink: 0;
160
+ width: 36px;
161
+ height: 36px;
162
+ border-radius: 10px;
163
+ background: linear-gradient(135deg, rgba(0,212,255,0.15), rgba(139,92,246,0.15));
164
+ border: 1px solid rgba(0,212,255,0.2);
165
+ display: flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ font-size: 16px;
169
+ box-shadow: 0 0 16px rgba(0,212,255,0.1), inset 0 1px 0 rgba(255,255,255,0.1);
170
+ }
171
+
172
+ .brand-text {
173
+ display: flex;
174
+ flex-direction: column;
175
+ gap: 2px;
176
+ min-width: 0;
177
+ }
178
+
179
+ .brand-name {
180
+ font-family: var(--font-mono);
181
+ font-size: 18px;
182
+ font-weight: 700;
183
+ letter-spacing: 0.22em;
184
+ background: linear-gradient(90deg, #00d4ff 0%, #a78bfa 60%, #00d4ff 120%);
185
+ background-size: 200% auto;
186
+ -webkit-background-clip: text;
187
+ -webkit-text-fill-color: transparent;
188
+ background-clip: text;
189
+ animation: brand-shimmer 6s linear infinite;
190
+ line-height: 1;
191
+ }
192
+
193
+ .brand-sub {
194
+ font-family: var(--font-mono);
195
+ font-size: 9px;
196
+ letter-spacing: 0.16em;
197
+ color: var(--text-dim);
198
+ opacity: 0.6;
199
+ text-transform: uppercase;
200
+ }
201
+
202
+ @keyframes brand-shimmer {
203
+ 0% { background-position: 0% center; }
204
+ 100% { background-position: 200% center; }
205
+ }
206
+
207
+ /* ── Metric Rows ──────────────────────────────────────────────────── */
208
+ .metric-row {
209
+ display: flex;
210
+ align-items: center;
211
+ gap: 8px;
212
+ margin-bottom: 7px;
213
+ }
214
+
215
+ .metric-row:last-child { margin-bottom: 0; }
216
+
217
+ .metric-name {
218
+ font-family: var(--font-mono);
219
+ font-size: 10px;
220
+ color: var(--text-muted);
221
+ width: 38px;
222
+ flex-shrink: 0;
223
+ }
224
+
225
+ .metric-bar {
226
+ flex: 1;
227
+ height: 3px;
228
+ background: rgba(255,255,255,0.08);
229
+ border-radius: 99px;
230
+ overflow: hidden;
231
+ }
232
+
233
+ .metric-fill {
234
+ --accent: var(--accent-cyan);
235
+ height: 100%;
236
+ width: 0%;
237
+ border-radius: 99px;
238
+ background: var(--accent);
239
+ box-shadow: 0 0 6px var(--accent);
240
+ transition: width 1s cubic-bezier(0.4, 0, 0.2, 1);
241
+ }
242
+
243
+ .metric-val {
244
+ font-family: var(--font-mono);
245
+ font-size: 10px;
246
+ color: var(--text-muted);
247
+ width: 40px;
248
+ text-align: right;
249
+ flex-shrink: 0;
250
+ }
251
+
252
+ /* ── Network / Status Rows ────────────────────────────────────────── */
253
+ .net-row {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 7px;
257
+ margin-bottom: 8px;
258
+ min-height: 20px;
259
+ }
260
+ .net-row:last-child { margin-bottom: 0; }
261
+
262
+ .net-name {
263
+ font-size: 12px;
264
+ color: var(--text);
265
+ flex: 1;
266
+ }
267
+ .net-name.muted { color: var(--text-muted); }
268
+
269
+ .net-ip {
270
+ font-family: var(--font-mono);
271
+ font-size: 11px;
272
+ color: var(--text-muted);
273
+ }
274
+
275
+ .status-dot {
276
+ width: 7px; height: 7px;
277
+ border-radius: 50%;
278
+ flex-shrink: 0;
279
+ }
280
+ .dot-green { background: var(--accent-green); box-shadow: 0 0 6px var(--accent-green); }
281
+ .dot-blue { background: var(--accent-blue); box-shadow: 0 0 6px var(--accent-blue); }
282
+ .dot-yellow { background: #fbbf24; box-shadow: 0 0 6px #fbbf24; }
283
+
284
+ .pulse {
285
+ animation: pulse-glow 2s ease-in-out infinite;
286
+ }
287
+ @keyframes pulse-glow {
288
+ 0%, 100% { opacity: 1; box-shadow: 0 0 6px var(--accent-green); }
289
+ 50% { opacity: 0.5; box-shadow: 0 0 12px var(--accent-green), 0 0 24px var(--accent-green); }
290
+ }
291
+
292
+ .divider {
293
+ height: 1px;
294
+ background: var(--glass-border);
295
+ margin: 8px 0;
296
+ }
297
+
298
+ .badge {
299
+ font-family: var(--font-mono);
300
+ font-size: 9px;
301
+ font-weight: 700;
302
+ letter-spacing: 0.08em;
303
+ padding: 2px 7px;
304
+ border-radius: 99px;
305
+ }
306
+ .badge-green { background: rgba(52,211,153,0.12); color: var(--accent-green); border: 1px solid rgba(52,211,153,0.2); }
307
+ .badge-blue { background: rgba(96,165,250,0.12); color: var(--accent-blue); border: 1px solid rgba(96,165,250,0.2); }
308
+ .badge-cyan { background: rgba(0,212,255,0.10); color: var(--accent-cyan); border: 1px solid rgba(0,212,255,0.2); }
309
+
310
+ /* ── Big Stats ────────────────────────────────────────────────────── */
311
+ .big-stat {
312
+ font-family: var(--font-mono);
313
+ font-size: 15px;
314
+ font-weight: 600;
315
+ color: var(--text);
316
+ letter-spacing: 0.02em;
317
+ margin: 2px 0 2px;
318
+ }
319
+ .stat-sub {
320
+ font-size: 10px;
321
+ color: var(--text-dim);
322
+ letter-spacing: 0.05em;
323
+ }
324
+
325
+ /* ── Model rows ───────────────────────────────────────────────────── */
326
+ .model-row {
327
+ display: flex;
328
+ align-items: center;
329
+ gap: 8px;
330
+ margin-bottom: 8px;
331
+ }
332
+ .model-row:last-child { margin-bottom: 0; }
333
+
334
+ .model-icon {
335
+ font-size: 15px;
336
+ color: var(--accent-cyan);
337
+ flex-shrink: 0;
338
+ text-shadow: 0 0 8px var(--accent-cyan);
339
+ }
340
+ .model-icon.dim { color: var(--text-dim); text-shadow: none; }
341
+
342
+ .model-name {
343
+ font-family: var(--font-mono);
344
+ font-size: 12px;
345
+ color: var(--text);
346
+ }
347
+ .model-name.dim { color: var(--text-dim); }
348
+
349
+ .model-sub {
350
+ font-size: 10px;
351
+ color: var(--text-dim);
352
+ letter-spacing: 0.06em;
353
+ margin-top: 2px;
354
+ }
355
+
356
+ .active-model .model-name { color: var(--accent-cyan); }
357
+
358
+ /* ── Agent Status Orb ─────────────────────────────────────────────── */
359
+ .agent-status-panel { text-align: center; }
360
+
361
+ .aso-orb-wrap {
362
+ width: 120px;
363
+ height: 120px;
364
+ margin: 10px auto 14px;
365
+ }
366
+
367
+ .aso-svg {
368
+ width: 100%;
369
+ height: 100%;
370
+ overflow: visible;
371
+ }
372
+
373
+ /* Orbit guide tracks — faint rings */
374
+ .aso-track {
375
+ fill: none;
376
+ stroke: rgba(255,255,255,0.07);
377
+ stroke-width: 1;
378
+ }
379
+
380
+ /* Arc segments */
381
+ .aso-arc {
382
+ fill: none;
383
+ stroke: var(--aso-color);
384
+ stroke-width: 1.8;
385
+ stroke-linecap: round;
386
+ filter: drop-shadow(0 0 3px var(--aso-color));
387
+ }
388
+ .aso-arc-dim { opacity: 0.5; }
389
+
390
+ /* Core halo */
391
+ .aso-core-halo {
392
+ fill: var(--aso-color);
393
+ opacity: 0.12;
394
+ filter: blur(6px);
395
+ }
396
+
397
+ /* Core dot */
398
+ .aso-core {
399
+ fill: var(--aso-color);
400
+ filter: drop-shadow(0 0 5px var(--aso-color));
401
+ }
402
+
403
+ /* Rotation groups — transform-origin at SVG center (50,50) */
404
+ .aso-rot {
405
+ transform-box: fill-box;
406
+ transform-origin: center;
407
+ }
408
+
409
+ /* ── State: idle — slow cyan ── */
410
+ #agent-status-panel[data-state="idle"] { --aso-color: rgba(0,212,255,0.75); }
411
+ #agent-status-panel[data-state="idle"] .aso-rot1 { animation: aso-spin 8s linear infinite; }
412
+ #agent-status-panel[data-state="idle"] .aso-rot2 { animation: aso-spin 13s linear infinite reverse; }
413
+ #agent-status-panel[data-state="idle"] .aso-rot3 { animation: aso-spin 10s linear infinite; }
414
+ #agent-status-panel[data-state="idle"] .aso-rot4 { animation: aso-spin 17s linear infinite reverse; }
415
+ #agent-status-panel[data-state="idle"] .aso-rot5 { animation: aso-spin 12s linear infinite; }
416
+ #agent-status-panel[data-state="idle"] .aso-core { animation: aso-breathe 3.5s ease-in-out infinite; }
417
+
418
+ /* ── State: waiting — amber, a bit faster ── */
419
+ #agent-status-panel[data-state="waiting"] { --aso-color: #f59e0b; }
420
+ #agent-status-panel[data-state="waiting"] .aso-rot1 { animation: aso-spin 4s linear infinite; }
421
+ #agent-status-panel[data-state="waiting"] .aso-rot2 { animation: aso-spin 6s linear infinite reverse; }
422
+ #agent-status-panel[data-state="waiting"] .aso-rot3 { animation: aso-spin 5s linear infinite; }
423
+ #agent-status-panel[data-state="waiting"] .aso-rot4 { animation: aso-spin 9s linear infinite reverse; }
424
+ #agent-status-panel[data-state="waiting"] .aso-rot5 { animation: aso-spin 6s linear infinite; }
425
+ #agent-status-panel[data-state="waiting"] .aso-core { animation: aso-pulse 1s ease-in-out infinite; }
426
+
427
+ /* ── State: thinking — violet, fast spin ── */
428
+ #agent-status-panel[data-state="thinking"] { --aso-color: #a78bfa; }
429
+ #agent-status-panel[data-state="thinking"] .aso-rot1 { animation: aso-spin 1.1s linear infinite; }
430
+ #agent-status-panel[data-state="thinking"] .aso-rot2 { animation: aso-spin 0.7s linear infinite reverse; }
431
+ #agent-status-panel[data-state="thinking"] .aso-rot3 { animation: aso-spin 1.4s linear infinite; }
432
+ #agent-status-panel[data-state="thinking"] .aso-rot4 { animation: aso-spin 0.5s linear infinite reverse; }
433
+ #agent-status-panel[data-state="thinking"] .aso-rot5 { animation: aso-spin 1.8s linear infinite; }
434
+ #agent-status-panel[data-state="thinking"] .aso-core { animation: aso-pulse 0.45s ease-in-out infinite; }
435
+
436
+ /* ── State: streaming — green, medium flow ── */
437
+ #agent-status-panel[data-state="streaming"] { --aso-color: #34d399; }
438
+ #agent-status-panel[data-state="streaming"] .aso-rot1 { animation: aso-spin 2.2s linear infinite; }
439
+ #agent-status-panel[data-state="streaming"] .aso-rot2 { animation: aso-spin 3.5s linear infinite reverse; }
440
+ #agent-status-panel[data-state="streaming"] .aso-rot3 { animation: aso-spin 2.8s linear infinite; }
441
+ #agent-status-panel[data-state="streaming"] .aso-rot4 { animation: aso-spin 4.5s linear infinite reverse; }
442
+ #agent-status-panel[data-state="streaming"] .aso-rot5 { animation: aso-spin 3.2s linear infinite; }
443
+ #agent-status-panel[data-state="streaming"] .aso-core { animation: aso-pulse 0.7s ease-in-out infinite; }
444
+
445
+ /* ── State: done — brief flash, stays green ── */
446
+ #agent-status-panel[data-state="done"] { --aso-color: #34d399; }
447
+ #agent-status-panel[data-state="done"] .aso-rot1 { animation: aso-spin 0.4s linear infinite; }
448
+ #agent-status-panel[data-state="done"] .aso-rot2 { animation: aso-spin 0.3s linear infinite reverse; }
449
+ #agent-status-panel[data-state="done"] .aso-rot3 { animation: aso-spin 0.5s linear infinite; }
450
+ #agent-status-panel[data-state="done"] .aso-rot4 { animation: aso-spin 0.25s linear infinite reverse; }
451
+ #agent-status-panel[data-state="done"] .aso-rot5 { animation: aso-spin 0.6s linear infinite; }
452
+ #agent-status-panel[data-state="done"] .aso-core { animation: aso-flash 0.4s ease-out forwards; }
453
+
454
+ /* ERROR state — red/pink, irregular erratic pulse to signal distress */
455
+ #agent-status-panel[data-state="error"] { --aso-color: #f87171; }
456
+ #agent-status-panel[data-state="error"] .aso-rot1 { animation: aso-spin 2.1s linear infinite; }
457
+ #agent-status-panel[data-state="error"] .aso-rot2 { animation: aso-spin 1.4s linear infinite reverse; }
458
+ #agent-status-panel[data-state="error"] .aso-rot3 { animation: aso-spin 3.3s linear infinite; }
459
+ #agent-status-panel[data-state="error"] .aso-rot4 { animation: aso-spin 1.8s linear infinite reverse; }
460
+ #agent-status-panel[data-state="error"] .aso-rot5 { animation: aso-spin 2.7s linear infinite; }
461
+ #agent-status-panel[data-state="error"] .aso-core { animation: aso-error-pulse 0.6s ease-in-out infinite; }
462
+
463
+ @keyframes aso-error-pulse {
464
+ 0%, 100% { opacity: 1; transform: scale(1); }
465
+ 50% { opacity: 0.4; transform: scale(0.75); }
466
+ }
467
+
468
+ /* ── Run error bubble (failure message in the feed) ──────────────── */
469
+ .run-error-bubble {
470
+ display: flex;
471
+ align-items: flex-start;
472
+ gap: 10px;
473
+ background: rgba(248, 113, 113, 0.06) !important;
474
+ border-color: rgba(248, 113, 113, 0.25) !important;
475
+ }
476
+
477
+ .run-error-icon {
478
+ font-size: 15px;
479
+ flex-shrink: 0;
480
+ margin-top: 1px;
481
+ color: #f87171;
482
+ filter: drop-shadow(0 0 4px rgba(248,113,113,0.5));
483
+ }
484
+
485
+ .run-error-text {
486
+ color: #fca5a5 !important;
487
+ font-size: 13px;
488
+ line-height: 1.5;
489
+ }
490
+
491
+ /* Partial/failed stream bubble — dim to indicate incomplete */
492
+ .stream-failed {
493
+ opacity: 0.6;
494
+ border-color: rgba(248,113,113,0.2) !important;
495
+ }
496
+ .stream-failed::after {
497
+ content: ' [incomplete]';
498
+ font-size: 11px;
499
+ color: #f87171;
500
+ font-family: var(--font-mono);
501
+ opacity: 0.7;
502
+ }
503
+
504
+ /* ── Keyframes ── */
505
+ @keyframes aso-spin {
506
+ from { transform: rotate(0deg); }
507
+ to { transform: rotate(360deg); }
508
+ }
509
+ @keyframes aso-breathe {
510
+ 0%, 100% { transform: scale(1); opacity: 0.75; }
511
+ 50% { transform: scale(1.45); opacity: 1; }
512
+ }
513
+ @keyframes aso-pulse {
514
+ 0%, 100% { transform: scale(1); }
515
+ 50% { transform: scale(1.6); }
516
+ }
517
+ @keyframes aso-flash {
518
+ 0% { transform: scale(2.5); opacity: 1; }
519
+ 60% { transform: scale(1.2); opacity: 1; }
520
+ 100% { transform: scale(1); opacity: 1; }
521
+ }
522
+
523
+ /* ── Status label & sub-text ── */
524
+ .aso-label {
525
+ font-family: var(--font-mono);
526
+ font-size: 11px;
527
+ font-weight: 700;
528
+ letter-spacing: 0.22em;
529
+ color: var(--aso-color);
530
+ margin-bottom: 5px;
531
+ text-shadow: 0 0 8px var(--aso-color);
532
+ transition: color 0.4s ease, text-shadow 0.4s ease;
533
+ }
534
+ .aso-sub {
535
+ font-size: 10px;
536
+ color: var(--text-dim);
537
+ letter-spacing: 0.04em;
538
+ }
539
+
540
+ /* ── Layout columns ───────────────────────────────────────────────── */
541
+ .metrics-col {
542
+ position: fixed;
543
+ top: 24px;
544
+ bottom: 120px;
545
+ width: 360px;
546
+ display: flex;
547
+ flex-direction: column;
548
+ gap: 12px;
549
+ z-index: 10;
550
+ overflow-y: auto;
551
+ scrollbar-width: none;
552
+ padding-bottom: 8px;
553
+ }
554
+ .metrics-col::-webkit-scrollbar { display: none; }
555
+
556
+ /* Anchor panels adjacent to the centered 740px chat column, 16px gap */
557
+ .metrics-left { left: calc(50% - 370px - 16px - 360px); }
558
+ .metrics-right { right: calc(50% - 370px - 16px - 360px); }
559
+
560
+ /* ── Response Area ────────────────────────────────────────────────── */
561
+ .response-area {
562
+ position: fixed;
563
+ top: 0;
564
+ left: calc(50% - 370px);
565
+ right: calc(50% - 370px);
566
+ bottom: 150px;
567
+ z-index: 5;
568
+ display: flex;
569
+ flex-direction: column;
570
+ justify-content: flex-start;
571
+ padding: 32px 0 16px;
572
+ overflow-y: auto;
573
+ overflow-x: hidden;
574
+ pointer-events: none;
575
+ }
576
+
577
+ /* Constrain all response content to a readable column, centered */
578
+ .response-area > * {
579
+ width: 100%;
580
+ max-width: 740px;
581
+ margin-left: auto;
582
+ margin-right: auto;
583
+ flex-shrink: 0;
584
+ pointer-events: auto;
585
+ }
586
+
587
+ /* ── Message Bubbles ──────────────────────────────────────────────── */
588
+ .message {
589
+ pointer-events: auto;
590
+ width: 100%;
591
+ max-width: 740px;
592
+ margin-bottom: 16px;
593
+ animation: waterfall 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
594
+ opacity: 0;
595
+ transform: translateY(-20px);
596
+ /* Allow bubble to fit content — don't impose a forced width on the child */
597
+ display: block;
598
+ }
599
+
600
+ @keyframes waterfall {
601
+ to { opacity: 1; transform: translateY(0); }
602
+ }
603
+
604
+ .message.user-msg .bubble {
605
+ background: rgba(0,212,255,0.07);
606
+ border: 1px solid rgba(0,212,255,0.18);
607
+ border-radius: 12px 12px 4px 12px;
608
+ padding: 10px 14px;
609
+ display: inline-block;
610
+ float: right;
611
+ max-width: 75%;
612
+ backdrop-filter: blur(12px);
613
+ color: var(--text);
614
+ font-size: 14.5px;
615
+ clear: both;
616
+ }
617
+
618
+ .message.symi-msg .bubble {
619
+ background: var(--glass-bg);
620
+ border: 1px solid var(--glass-border);
621
+ border-radius: 4px 12px 12px 12px;
622
+ padding: 12px 16px;
623
+ backdrop-filter: var(--blur);
624
+ -webkit-backdrop-filter: var(--blur);
625
+ box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.04);
626
+ font-size: 14.5px;
627
+ line-height: 1.75;
628
+ color: var(--text);
629
+ position: relative;
630
+ clear: both;
631
+ display: inline-block;
632
+ width: fit-content;
633
+ max-width: 100%;
634
+ box-sizing: border-box;
635
+ overflow: visible;
636
+ }
637
+
638
+ .message.symi-msg .bubble::before {
639
+ content: '';
640
+ position: absolute;
641
+ top: 0; left: 0; right: 0;
642
+ height: 1px;
643
+ background: linear-gradient(90deg, transparent, rgba(0,212,255,0.3), transparent);
644
+ }
645
+
646
+ .message-clearfix { clear: both; }
647
+
648
+ .typing-cursor {
649
+ display: inline-block;
650
+ width: 2px;
651
+ height: 1em;
652
+ background: var(--accent-cyan);
653
+ margin-left: 2px;
654
+ vertical-align: text-bottom;
655
+ animation: blink 1s step-end infinite;
656
+ box-shadow: 0 0 4px var(--accent-cyan);
657
+ }
658
+ @keyframes blink {
659
+ 0%, 100% { opacity: 1; }
660
+ 50% { opacity: 0; }
661
+ }
662
+
663
+ /* ── Floating Prompt Bar ──────────────────────────────────────────── */
664
+ .prompt-wrap {
665
+ position: fixed;
666
+ bottom: 28px;
667
+ left: calc(50% - 370px);
668
+ right: calc(50% - 370px);
669
+ z-index: 20;
670
+ display: flex;
671
+ justify-content: center;
672
+ }
673
+
674
+ .prompt-bar {
675
+ width: 100%;
676
+ max-width: 720px;
677
+ display: flex;
678
+ flex-direction: column;
679
+ gap: 10px;
680
+ background: rgba(255,255,255,0.05);
681
+ backdrop-filter: blur(32px) saturate(200%);
682
+ -webkit-backdrop-filter: blur(32px) saturate(200%);
683
+ border: 1px solid rgba(255,255,255,0.12);
684
+ border-radius: 20px;
685
+ padding: 14px 16px 12px;
686
+ box-shadow:
687
+ 0 0 0 1px rgba(0,212,255,0.08),
688
+ 0 8px 40px rgba(0,0,0,0.6),
689
+ 0 0 60px rgba(0,212,255,0.04),
690
+ inset 0 1px 0 rgba(255,255,255,0.08);
691
+ transition: border-color 0.3s, box-shadow 0.3s;
692
+ cursor: text;
693
+ }
694
+
695
+ /* ── Prompt rows ──────────────────────────────────────────────────── */
696
+ .prompt-row-main {
697
+ display: flex;
698
+ align-items: center;
699
+ gap: 12px;
700
+ width: 100%;
701
+ }
702
+
703
+ .prompt-row-actions {
704
+ display: flex;
705
+ align-items: center;
706
+ justify-content: flex-end;
707
+ gap: 8px;
708
+ width: 100%;
709
+ padding-top: 2px;
710
+ border-top: 1px solid rgba(255,255,255,0.05);
711
+ }
712
+
713
+ .prompt-bar:focus-within {
714
+ border-color: rgba(0,212,255,0.3);
715
+ box-shadow:
716
+ 0 0 0 1px rgba(0,212,255,0.15),
717
+ 0 8px 40px rgba(0,0,0,0.6),
718
+ 0 0 80px rgba(0,212,255,0.08),
719
+ inset 0 1px 0 rgba(255,255,255,0.1);
720
+ }
721
+
722
+ .prompt-icon {
723
+ color: var(--accent-cyan);
724
+ opacity: 0.7;
725
+ flex-shrink: 0;
726
+ display: flex;
727
+ align-items: center;
728
+ filter: drop-shadow(0 0 4px var(--accent-cyan));
729
+ }
730
+
731
+ .prompt-bar textarea {
732
+ flex: 1;
733
+ background: transparent;
734
+ border: none;
735
+ outline: none;
736
+ color: var(--text);
737
+ font-family: var(--font);
738
+ font-size: 14px;
739
+ line-height: 1.55;
740
+ letter-spacing: 0.01em;
741
+ caret-color: var(--accent-cyan);
742
+ resize: none;
743
+ overflow-y: hidden;
744
+ min-height: 22px;
745
+ max-height: calc(3 * 1.55 * 14px); /* 3 lines */
746
+ padding: 0;
747
+ margin: 0;
748
+ display: block;
749
+ scrollbar-width: none;
750
+ }
751
+
752
+ .prompt-bar textarea::-webkit-scrollbar { display: none; }
753
+
754
+ .prompt-bar textarea::placeholder {
755
+ color: var(--text-dim);
756
+ }
757
+
758
+ .send-btn {
759
+ background: rgba(0,212,255,0.12);
760
+ border: 1px solid rgba(0,212,255,0.2);
761
+ border-radius: 50%;
762
+ width: 32px;
763
+ height: 32px;
764
+ display: flex;
765
+ align-items: center;
766
+ justify-content: center;
767
+ color: var(--accent-cyan);
768
+ cursor: pointer;
769
+ flex-shrink: 0;
770
+ transition: background 0.2s, transform 0.15s, box-shadow 0.2s;
771
+ }
772
+
773
+ .send-btn:hover {
774
+ background: rgba(0,212,255,0.22);
775
+ box-shadow: 0 0 16px rgba(0,212,255,0.25);
776
+ transform: scale(1.05);
777
+ }
778
+
779
+ .send-btn:active {
780
+ transform: scale(0.95);
781
+ }
782
+
783
+ /* ── New Session Button ───────────────────────────────────────────── */
784
+ .prompt-divider {
785
+ width: 1px;
786
+ height: 18px;
787
+ background: rgba(255,255,255,0.08);
788
+ flex-shrink: 0;
789
+ }
790
+
791
+ .new-session-btn {
792
+ display: flex;
793
+ align-items: center;
794
+ gap: 5px;
795
+ background: rgba(139,92,246,0.1);
796
+ border: 1px solid rgba(139,92,246,0.2);
797
+ border-radius: 8px;
798
+ padding: 0 11px;
799
+ height: 28px;
800
+ color: rgba(139,92,246,0.85);
801
+ cursor: pointer;
802
+ flex-shrink: 0;
803
+ transition: background 0.2s, box-shadow 0.2s, transform 0.15s, opacity 0.2s;
804
+ }
805
+
806
+ .new-session-btn:hover {
807
+ background: rgba(139,92,246,0.2);
808
+ box-shadow: 0 0 16px rgba(139,92,246,0.2);
809
+ transform: scale(1.03);
810
+ }
811
+
812
+ .new-session-btn:active {
813
+ transform: scale(0.96);
814
+ }
815
+
816
+ .new-session-btn:disabled {
817
+ opacity: 0.3;
818
+ cursor: not-allowed;
819
+ transform: none;
820
+ }
821
+
822
+ .new-session-label {
823
+ font-family: var(--font-mono);
824
+ font-size: 11px;
825
+ letter-spacing: 0.08em;
826
+ font-weight: 600;
827
+ }
828
+
829
+ /* ── New Session Cleared State ───────────────────────────────────── */
830
+ .session-cleared {
831
+ display: flex;
832
+ flex-direction: column;
833
+ align-items: center;
834
+ justify-content: center;
835
+ gap: 10px;
836
+ padding: 60px 20px;
837
+ opacity: 0;
838
+ animation: session-cleared-in 0.5s ease forwards;
839
+ }
840
+
841
+ .session-cleared-icon {
842
+ font-size: 28px;
843
+ opacity: 0.3;
844
+ }
845
+
846
+ .session-cleared-text {
847
+ font-family: var(--font-mono);
848
+ font-size: 12px;
849
+ letter-spacing: 0.12em;
850
+ color: var(--text-dim);
851
+ opacity: 0.5;
852
+ }
853
+
854
+ @keyframes session-cleared-in {
855
+ from { opacity: 0; transform: translateY(8px); }
856
+ to { opacity: 1; transform: translateY(0); }
857
+ }
858
+
859
+ /* ── Thinking Bubble ──────────────────────────────────────────────── */
860
+ .thinking-bubble {
861
+ background: rgba(0,212,255,0.04) !important;
862
+ border-color: rgba(0,212,255,0.15) !important;
863
+ padding: 10px 16px !important;
864
+ }
865
+
866
+ .think-header {
867
+ display: flex;
868
+ align-items: center;
869
+ gap: 10px;
870
+ margin-bottom: 8px;
871
+ }
872
+
873
+ .think-badge {
874
+ font-family: var(--font-mono);
875
+ font-size: 9px;
876
+ font-weight: 700;
877
+ letter-spacing: 0.15em;
878
+ color: var(--accent-cyan);
879
+ text-shadow: 0 0 8px var(--accent-cyan);
880
+ }
881
+
882
+ .think-dots span {
883
+ display: inline-block;
884
+ color: var(--accent-cyan);
885
+ animation: dot-pulse 1.2s ease-in-out infinite;
886
+ font-size: 14px;
887
+ opacity: 0;
888
+ }
889
+ .think-dots span:nth-child(1) { animation-delay: 0s; }
890
+ .think-dots span:nth-child(2) { animation-delay: 0.2s; }
891
+ .think-dots span:nth-child(3) { animation-delay: 0.4s; }
892
+
893
+ @keyframes dot-pulse {
894
+ 0%, 100% { opacity: 0; transform: translateY(0); }
895
+ 50% { opacity: 1; transform: translateY(-3px); }
896
+ }
897
+
898
+ .think-bar-wrap {
899
+ height: 2px;
900
+ background: rgba(255,255,255,0.06);
901
+ border-radius: 99px;
902
+ overflow: hidden;
903
+ }
904
+
905
+ .think-bar {
906
+ height: 100%;
907
+ width: 0%;
908
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
909
+ border-radius: 99px;
910
+ animation: think-scan 1s ease-in-out infinite;
911
+ }
912
+
913
+ @keyframes think-scan {
914
+ 0% { width: 0%; margin-left: 0%; opacity: 1; }
915
+ 50% { width: 60%; margin-left: 20%; opacity: 1; }
916
+ 100% { width: 0%; margin-left: 100%; opacity: 0; }
917
+ }
918
+
919
+ /* ── Streaming Bubble ─────────────────────────────────────────────── */
920
+ .stream-bubble {
921
+ position: relative;
922
+ }
923
+
924
+ .stream-bubble.streaming {
925
+ width: 100% !important;
926
+ border-color: rgba(0,212,255,0.25) !important;
927
+ box-shadow:
928
+ 0 8px 32px rgba(0,0,0,0.5),
929
+ 0 0 20px rgba(0,212,255,0.06),
930
+ inset 0 1px 0 rgba(255,255,255,0.06) !important;
931
+ animation: stream-pulse 1.8s ease-in-out infinite;
932
+ }
933
+
934
+ @keyframes stream-pulse {
935
+ 0%, 100% { box-shadow: 0 8px 32px rgba(0,0,0,0.5), 0 0 20px rgba(0,212,255,0.06), inset 0 1px 0 rgba(255,255,255,0.06); }
936
+ 50% { box-shadow: 0 8px 32px rgba(0,0,0,0.5), 0 0 40px rgba(0,212,255,0.12), inset 0 1px 0 rgba(255,255,255,0.06); }
937
+ }
938
+
939
+ .stream-bubble.streaming::after {
940
+ content: '';
941
+ position: absolute;
942
+ top: 0; left: 0; right: 0;
943
+ height: 1px;
944
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
945
+ opacity: 0.6;
946
+ animation: top-scan 2s linear infinite;
947
+ }
948
+
949
+ @keyframes top-scan {
950
+ 0% { transform: scaleX(0); transform-origin: left; opacity: 0.8; }
951
+ 50% { transform: scaleX(1); transform-origin: left; opacity: 0.6; }
952
+ 100% { transform: scaleX(0); transform-origin: right; opacity: 0; }
953
+ }
954
+
955
+ .stream-bubble.done {
956
+ width: fit-content;
957
+ max-width: 100%;
958
+ border-color: rgba(255,255,255,0.1) !important;
959
+ transition: border-color 0.8s, box-shadow 0.8s, width 0.3s ease;
960
+ }
961
+
962
+ /* ── Character spawn animation ────────────────────────────────────── */
963
+ .char-spawn {
964
+ display: inline;
965
+ color: transparent;
966
+ text-shadow: none;
967
+ transition: color 0.12s ease, text-shadow 0.2s ease;
968
+ }
969
+
970
+ .char-spawn.char-visible {
971
+ color: var(--text);
972
+ text-shadow: 0 0 8px rgba(0,212,255,0.4);
973
+ animation: char-settle 0.4s ease forwards;
974
+ }
975
+
976
+ @keyframes char-settle {
977
+ 0% { color: var(--accent-cyan); text-shadow: 0 0 12px var(--accent-cyan), 0 0 24px rgba(0,212,255,0.3); }
978
+ 40% { color: rgba(200,240,255,0.95); text-shadow: 0 0 6px rgba(0,212,255,0.2); }
979
+ 100% { color: var(--text); text-shadow: none; }
980
+ }
981
+
982
+ /* ── Telemetry footer ─────────────────────────────────────────────── */
983
+ .telemetry {
984
+ display: flex;
985
+ align-items: center;
986
+ gap: 6px;
987
+ margin-top: 10px;
988
+ padding-top: 8px;
989
+ border-top: 1px solid rgba(255,255,255,0.05);
990
+ opacity: 0;
991
+ transform: translateY(4px);
992
+ transition: opacity 0.5s ease 0.2s, transform 0.5s ease 0.2s;
993
+ }
994
+
995
+ .telemetry.tele-visible {
996
+ opacity: 1;
997
+ transform: translateY(0);
998
+ }
999
+
1000
+ .tele-item {
1001
+ font-family: var(--font-mono);
1002
+ font-size: 9px;
1003
+ color: var(--text-dim);
1004
+ letter-spacing: 0.06em;
1005
+ }
1006
+
1007
+ .tele-sep {
1008
+ color: rgba(255,255,255,0.12);
1009
+ font-size: 9px;
1010
+ }
1011
+
1012
+ /* ── Send button loading state ────────────────────────────────────── */
1013
+ .send-btn.btn-loading {
1014
+ animation: btn-spin 1s linear infinite;
1015
+ }
1016
+ @keyframes btn-spin {
1017
+ to { transform: rotate(360deg); }
1018
+ }
1019
+
1020
+ /* ── Connection status ────────────────────────────────────────────── */
1021
+ .conn-status {
1022
+ position: fixed;
1023
+ top: 16px;
1024
+ left: 50%;
1025
+ transform: translateX(-50%);
1026
+ z-index: 30;
1027
+ display: flex;
1028
+ align-items: center;
1029
+ gap: 7px;
1030
+ background: var(--glass-bg);
1031
+ backdrop-filter: var(--blur);
1032
+ -webkit-backdrop-filter: var(--blur);
1033
+ border: 1px solid var(--glass-border);
1034
+ border-radius: 99px;
1035
+ padding: 5px 12px;
1036
+ pointer-events: none;
1037
+ }
1038
+
1039
+ .conn-label {
1040
+ font-family: var(--font-mono);
1041
+ font-size: 9px;
1042
+ letter-spacing: 0.1em;
1043
+ color: var(--text-dim);
1044
+ }
1045
+
1046
+ .dot-red { background: #f87171; box-shadow: 0 0 6px #f87171; }
1047
+
1048
+ /* ── UI Toggle button ─────────────────────────────────────────────── */
1049
+ .ui-toggle {
1050
+ position: fixed;
1051
+ top: 16px;
1052
+ right: 24px;
1053
+ z-index: 30;
1054
+ display: flex;
1055
+ align-items: center;
1056
+ gap: 7px;
1057
+ background: var(--glass-bg);
1058
+ backdrop-filter: var(--blur);
1059
+ -webkit-backdrop-filter: var(--blur);
1060
+ border: 1px solid var(--glass-border);
1061
+ border-radius: 99px;
1062
+ padding: 6px 14px;
1063
+ color: var(--text-muted);
1064
+ font-size: 11px;
1065
+ font-family: var(--font-mono);
1066
+ letter-spacing: 0.05em;
1067
+ text-decoration: none;
1068
+ transition: border-color 0.2s, color 0.2s, box-shadow 0.2s;
1069
+ }
1070
+
1071
+ .ui-toggle:hover {
1072
+ border-color: var(--glass-border-strong);
1073
+ color: var(--text);
1074
+ box-shadow: 0 0 16px rgba(0,212,255,0.08);
1075
+ }
1076
+
1077
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
1078
+ .response-area::-webkit-scrollbar { display: none; }
1079
+ .response-area { scrollbar-width: none; }
1080
+
1081
+ /* ═══════════════════════════════════════════════════════════════════
1082
+ CONTENT TYPES — Markdown, Thinking, Tool Cards, Code
1083
+ ═══════════════════════════════════════════════════════════════════ */
1084
+
1085
+ /* ── Markdown prose ────────────────────────────────────────────────── */
1086
+ .msg-text {
1087
+ font-size: 14.5px;
1088
+ line-height: 1.75;
1089
+ color: var(--text);
1090
+ word-wrap: break-word;
1091
+ overflow-wrap: anywhere;
1092
+ word-break: break-word;
1093
+ }
1094
+
1095
+ /* Paragraph spacing */
1096
+ .msg-text :where(p, ul, ol, pre, blockquote, table) { margin: 0; }
1097
+ .msg-text :where(p + p,
1098
+ p + ul, p + ol, p + pre, p + blockquote, p + table,
1099
+ ul + p, ol + p, pre + p, blockquote + p, table + p) { margin-top: 0.75em; }
1100
+ .msg-text :where(li + li) { margin-top: 0.25em; }
1101
+
1102
+ /* Headings */
1103
+ .msg-text :where(h1, h2, h3, h4, h5, h6) {
1104
+ font-weight: 600;
1105
+ line-height: 1.3;
1106
+ color: rgba(255,255,255,0.96);
1107
+ margin: 1.1em 0 0.4em;
1108
+ }
1109
+ .msg-text :where(h1) { font-size: 1.35em; border-bottom: 1px solid var(--glass-border); padding-bottom: 0.3em; }
1110
+ .msg-text :where(h2) { font-size: 1.18em; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 0.2em; }
1111
+ .msg-text :where(h3) { font-size: 1.06em; }
1112
+ .msg-text :where(h4, h5, h6) { font-size: 1em; color: rgba(255,255,255,0.8); }
1113
+ .msg-text :where(h1, h2, h3, h4, h5, h6):first-child { margin-top: 0.3em; }
1114
+
1115
+ /* Lists */
1116
+ .msg-text :where(ul, ol) { padding-left: 1.4em; }
1117
+ .msg-text :where(ul) { list-style-type: disc; }
1118
+ .msg-text :where(ol) { list-style-type: decimal; }
1119
+ .msg-text :where(ul ul) { list-style-type: circle; margin-top: 0.25em; }
1120
+
1121
+ /* Text formatting */
1122
+ .msg-text :where(strong) { font-weight: 600; color: rgba(255,255,255,0.97); }
1123
+ .msg-text :where(em) { font-style: italic; color: rgba(255,255,255,0.82); }
1124
+ .msg-text :where(del) { text-decoration: line-through; opacity: 0.6; }
1125
+ .msg-text :where(mark) { background: rgba(251,191,36,0.2); color: #fbbf24; border-radius: 2px; padding: 0 3px; }
1126
+ .msg-text :where(sup) { font-size: 0.75em; vertical-align: super; }
1127
+ .msg-text :where(sub) { font-size: 0.75em; vertical-align: sub; }
1128
+
1129
+ /* Links */
1130
+ .msg-text :where(a) { color: var(--accent-cyan); text-decoration: none; border-bottom: 1px solid rgba(0,212,255,0.3); }
1131
+ .msg-text :where(a:hover) { border-bottom-color: var(--accent-cyan); }
1132
+
1133
+ /* Horizontal rule */
1134
+ .msg-text :where(hr) {
1135
+ border: none;
1136
+ border-top: 1px solid var(--glass-border);
1137
+ margin: 1em 0;
1138
+ }
1139
+
1140
+ /* Blockquote */
1141
+ .msg-text :where(blockquote) {
1142
+ border-left: 2px solid rgba(0,212,255,0.3);
1143
+ margin: 0.6em 0;
1144
+ padding: 6px 14px;
1145
+ background: rgba(0,212,255,0.03);
1146
+ color: var(--text-muted);
1147
+ border-radius: 0 6px 6px 0;
1148
+ }
1149
+ .msg-text :where(blockquote blockquote) {
1150
+ border-left-color: rgba(139,92,246,0.4);
1151
+ background: rgba(139,92,246,0.03);
1152
+ margin-top: 6px;
1153
+ }
1154
+
1155
+ /* ── Tables ─────────────────────────────────────────────────────────── */
1156
+ .msg-text :where(table) {
1157
+ width: 100%;
1158
+ border-collapse: collapse;
1159
+ font-size: 13px;
1160
+ margin-top: 0.75em;
1161
+ border: 1px solid var(--glass-border);
1162
+ border-radius: 8px;
1163
+ overflow: hidden;
1164
+ }
1165
+
1166
+ .msg-text :where(thead) {
1167
+ background: rgba(0,212,255,0.06);
1168
+ }
1169
+
1170
+ .msg-text :where(th) {
1171
+ font-family: var(--font-mono);
1172
+ font-size: 10.5px;
1173
+ font-weight: 600;
1174
+ letter-spacing: 0.08em;
1175
+ text-transform: uppercase;
1176
+ color: var(--accent-cyan);
1177
+ border: 1px solid var(--glass-border);
1178
+ padding: 8px 12px;
1179
+ text-align: left;
1180
+ background: rgba(0,0,0,0.15);
1181
+ }
1182
+
1183
+ .msg-text :where(td) {
1184
+ border: 1px solid var(--glass-border);
1185
+ padding: 7px 12px;
1186
+ vertical-align: top;
1187
+ color: var(--text);
1188
+ line-height: 1.5;
1189
+ }
1190
+
1191
+ .msg-text :where(tr:nth-child(even) td) {
1192
+ background: rgba(255,255,255,0.015);
1193
+ }
1194
+
1195
+ .msg-text :where(tr:hover td) {
1196
+ background: rgba(0,212,255,0.03);
1197
+ }
1198
+
1199
+ /* ── Inline code ────────────────────────────────────────────────────── */
1200
+ .inline-code,
1201
+ .msg-text :where(:not(pre) > code) {
1202
+ font-family: var(--font-mono);
1203
+ font-size: 0.875em;
1204
+ background: rgba(255,255,255,0.08);
1205
+ border: 1px solid rgba(255,255,255,0.1);
1206
+ border-radius: 4px;
1207
+ padding: 0.1em 0.4em;
1208
+ color: var(--accent-cyan);
1209
+ }
1210
+
1211
+ /* ── Code blocks — full-featured ────────────────────────────────────── */
1212
+ .code-block {
1213
+ margin: 0.75em 0;
1214
+ border: 1px solid var(--glass-border);
1215
+ border-radius: 10px;
1216
+ overflow: hidden;
1217
+ background: rgba(0,0,0,0.45);
1218
+ font-family: var(--font-mono);
1219
+ }
1220
+
1221
+ /* Full-width breakout — code gets the whole column regardless of bubble */
1222
+ .code-block-full {
1223
+ width: 100%;
1224
+ max-width: 100%;
1225
+ }
1226
+
1227
+ /* ── Header ── */
1228
+ .code-header {
1229
+ display: flex;
1230
+ align-items: center;
1231
+ justify-content: space-between;
1232
+ padding: 7px 12px;
1233
+ background: rgba(255,255,255,0.04);
1234
+ border-bottom: 1px solid var(--glass-border);
1235
+ gap: 10px;
1236
+ }
1237
+
1238
+ .code-header-left { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
1239
+ .code-header-right { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
1240
+
1241
+ /* Language badge with per-language color */
1242
+ .code-lang-badge {
1243
+ font-family: var(--font-mono);
1244
+ font-size: 10px;
1245
+ font-weight: 700;
1246
+ letter-spacing: 0.06em;
1247
+ text-transform: uppercase;
1248
+ color: var(--lang-color, var(--accent-cyan));
1249
+ display: flex;
1250
+ align-items: center;
1251
+ gap: 2px;
1252
+ flex-shrink: 0;
1253
+ text-shadow: 0 0 8px var(--lang-color, var(--accent-cyan));
1254
+ }
1255
+
1256
+ /* Filename */
1257
+ .code-filename {
1258
+ font-family: var(--font-mono);
1259
+ font-size: 11px;
1260
+ color: var(--text-muted);
1261
+ background: rgba(255,255,255,0.05);
1262
+ border: 1px solid var(--glass-border);
1263
+ border-radius: 4px;
1264
+ padding: 1px 7px;
1265
+ white-space: nowrap;
1266
+ overflow: hidden;
1267
+ text-overflow: ellipsis;
1268
+ max-width: 200px;
1269
+ }
1270
+
1271
+ /* Line count */
1272
+ .code-lines-count {
1273
+ font-family: var(--font-mono);
1274
+ font-size: 9.5px;
1275
+ color: var(--text-dim);
1276
+ white-space: nowrap;
1277
+ }
1278
+
1279
+ /* Expand button */
1280
+ .code-expand-btn {
1281
+ font-size: 14px;
1282
+ background: transparent;
1283
+ border: none;
1284
+ color: var(--text-dim);
1285
+ cursor: pointer;
1286
+ padding: 0 4px;
1287
+ line-height: 1;
1288
+ transition: color 0.2s;
1289
+ }
1290
+ .code-expand-btn:hover { color: var(--text); }
1291
+
1292
+ /* Copy button */
1293
+ .code-copy {
1294
+ display: flex;
1295
+ align-items: center;
1296
+ gap: 5px;
1297
+ font-family: var(--font-mono);
1298
+ font-size: 10px;
1299
+ color: var(--text-dim);
1300
+ background: transparent;
1301
+ border: none;
1302
+ cursor: pointer;
1303
+ padding: 3px 8px;
1304
+ border-radius: 4px;
1305
+ transition: color 0.2s, background 0.2s;
1306
+ white-space: nowrap;
1307
+ }
1308
+ .code-copy:hover { color: var(--text); background: rgba(255,255,255,0.06); }
1309
+ .code-copy.copied { color: var(--accent-green); }
1310
+
1311
+ /* ── Code body ── */
1312
+ .code-body { overflow: hidden; }
1313
+ .code-body-collapsed { max-height: 400px; overflow: hidden; position: relative; }
1314
+ .code-body-collapsed::after {
1315
+ content: '';
1316
+ position: absolute;
1317
+ bottom: 0; left: 0; right: 0;
1318
+ height: 80px;
1319
+ background: linear-gradient(to bottom, transparent, rgba(0,0,0,0.8));
1320
+ pointer-events: none;
1321
+ }
1322
+ .code-expanded .code-body-collapsed { max-height: none; overflow: auto; }
1323
+ .code-expanded .code-body-collapsed::after { display: none; }
1324
+
1325
+ /* Show more button */
1326
+ .code-show-more {
1327
+ display: block;
1328
+ width: 100%;
1329
+ padding: 8px;
1330
+ background: rgba(255,255,255,0.03);
1331
+ border: none;
1332
+ border-top: 1px solid var(--glass-border);
1333
+ color: var(--text-dim);
1334
+ font-family: var(--font-mono);
1335
+ font-size: 10px;
1336
+ cursor: pointer;
1337
+ letter-spacing: 0.06em;
1338
+ transition: background 0.2s, color 0.2s;
1339
+ text-align: center;
1340
+ }
1341
+ .code-show-more:hover { background: rgba(255,255,255,0.06); color: var(--text); }
1342
+
1343
+ /* ── Line numbers ── */
1344
+ .code-pre {
1345
+ margin: 0;
1346
+ padding: 12px 0;
1347
+ overflow-x: auto;
1348
+ font-size: 12.5px;
1349
+ line-height: 1.65;
1350
+ }
1351
+
1352
+ .code-numbered { display: block; }
1353
+
1354
+ .code-line {
1355
+ display: flex;
1356
+ min-height: 1.65em;
1357
+ }
1358
+
1359
+ .code-line:hover { background: rgba(255,255,255,0.03); }
1360
+
1361
+ .line-num {
1362
+ display: inline-block;
1363
+ min-width: 44px;
1364
+ padding: 0 12px 0 14px;
1365
+ color: rgba(255,255,255,0.2);
1366
+ text-align: right;
1367
+ user-select: none;
1368
+ border-right: 1px solid rgba(255,255,255,0.06);
1369
+ flex-shrink: 0;
1370
+ font-size: 11px;
1371
+ line-height: inherit;
1372
+ }
1373
+
1374
+ .line-content {
1375
+ display: inline-block;
1376
+ padding: 0 16px;
1377
+ white-space: pre;
1378
+ flex: 1;
1379
+ }
1380
+
1381
+ .hljs { background: transparent !important; padding: 0 !important; }
1382
+
1383
+ /* ── Thinking block ─────────────────────────────────────────────────── */
1384
+ .msg-thinking { margin: 4px 0 8px; }
1385
+
1386
+ .thinking-toggle {
1387
+ display: flex;
1388
+ align-items: center;
1389
+ gap: 7px;
1390
+ background: transparent;
1391
+ border: none;
1392
+ cursor: pointer;
1393
+ padding: 4px 0;
1394
+ color: var(--text-dim);
1395
+ font-size: 11px;
1396
+ font-family: var(--font-mono);
1397
+ letter-spacing: 0.05em;
1398
+ transition: color 0.2s;
1399
+ }
1400
+ .thinking-toggle:hover { color: var(--text-muted); }
1401
+ .thinking-icon { color: var(--accent-purple); }
1402
+ .thinking-chevron { font-size: 9px; transition: transform 0.2s; }
1403
+
1404
+ .thinking-body {
1405
+ max-height: 0;
1406
+ overflow: hidden;
1407
+ transition: max-height 0.35s ease;
1408
+ }
1409
+ .thinking-body.thinking-open { max-height: 600px; overflow-y: auto; }
1410
+
1411
+ .thinking-text {
1412
+ margin-top: 6px;
1413
+ padding: 10px 14px;
1414
+ border: 1px dashed rgba(139,92,246,0.25);
1415
+ border-radius: 8px;
1416
+ background: rgba(139,92,246,0.04);
1417
+ font-size: 12px;
1418
+ line-height: 1.65;
1419
+ color: var(--text-muted);
1420
+ white-space: pre-wrap;
1421
+ font-family: var(--font-mono);
1422
+ }
1423
+
1424
+ /* ── Tool call card ─────────────────────────────────────────────────── */
1425
+ .msg-tool-card {
1426
+ margin: 4px 0;
1427
+ border: 1px solid var(--glass-border);
1428
+ border-radius: 8px;
1429
+ overflow: hidden;
1430
+ background: rgba(255,255,255,0.02);
1431
+ }
1432
+
1433
+ .tool-header {
1434
+ display: flex;
1435
+ align-items: center;
1436
+ gap: 8px;
1437
+ width: 100%;
1438
+ padding: 8px 12px;
1439
+ background: transparent;
1440
+ border: none;
1441
+ cursor: pointer;
1442
+ text-align: left;
1443
+ color: var(--text-muted);
1444
+ font-size: 12px;
1445
+ transition: background 0.2s;
1446
+ }
1447
+ .tool-header:hover { background: rgba(255,255,255,0.03); }
1448
+ .tool-icon { font-size: 13px; flex-shrink: 0; }
1449
+ .tool-name { flex: 1; font-family: var(--font-mono); font-size: 11px; color: var(--text); }
1450
+ .tool-chevron { font-size: 9px; color: var(--text-dim); }
1451
+
1452
+ .tool-body {
1453
+ max-height: 0;
1454
+ overflow: hidden;
1455
+ transition: max-height 0.3s ease;
1456
+ border-top: 0 solid var(--glass-border);
1457
+ }
1458
+ .tool-body.tool-open { max-height: 320px; overflow-y: auto; border-top-width: 1px; }
1459
+
1460
+ .tool-input {
1461
+ margin: 0;
1462
+ padding: 10px 14px;
1463
+ font-family: var(--font-mono);
1464
+ font-size: 11.5px;
1465
+ line-height: 1.5;
1466
+ color: var(--text-muted);
1467
+ white-space: pre-wrap;
1468
+ word-break: break-all;
1469
+ background: rgba(0,0,0,0.25);
1470
+ }
1471
+
1472
+ /* ── Tool result ────────────────────────────────────────────────────── */
1473
+ .msg-tool-result {
1474
+ margin: 2px 0 6px;
1475
+ border: 1px solid rgba(52,211,153,0.14);
1476
+ border-radius: 8px;
1477
+ overflow: hidden;
1478
+ background: rgba(52,211,153,0.02);
1479
+ }
1480
+
1481
+ .result-header {
1482
+ display: flex;
1483
+ align-items: center;
1484
+ gap: 8px;
1485
+ padding: 6px 12px;
1486
+ font-size: 11px;
1487
+ color: var(--text-dim);
1488
+ }
1489
+ .result-icon { color: var(--accent-green); font-size: 12px; }
1490
+ .result-label { font-family: var(--font-mono); letter-spacing: 0.06em; flex: 1; }
1491
+
1492
+ .result-expand {
1493
+ font-family: var(--font-mono);
1494
+ font-size: 9px;
1495
+ background: transparent;
1496
+ border: 1px solid var(--glass-border);
1497
+ border-radius: 4px;
1498
+ color: var(--text-dim);
1499
+ cursor: pointer;
1500
+ padding: 2px 8px;
1501
+ transition: color 0.2s;
1502
+ }
1503
+ .result-expand:hover { color: var(--text); }
1504
+
1505
+ .result-preview { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; border-top: 0 solid rgba(52,211,153,0.14); }
1506
+ .result-open { max-height: 260px; overflow-y: auto; border-top-width: 1px; }
1507
+
1508
+ .result-text {
1509
+ margin: 0;
1510
+ padding: 8px 14px;
1511
+ font-family: var(--font-mono);
1512
+ font-size: 11.5px;
1513
+ line-height: 1.5;
1514
+ color: var(--text-muted);
1515
+ white-space: pre-wrap;
1516
+ word-break: break-all;
1517
+ background: rgba(0,0,0,0.2);
1518
+ }
1519
+
1520
+ /* ── Message image ──────────────────────────────────────────────────── */
1521
+ .msg-image img {
1522
+ max-width: 100%;
1523
+ border-radius: 8px;
1524
+ border: 1px solid var(--glass-border);
1525
+ margin: 4px 0;
1526
+ }
1527
+
1528
+ /* ── Copy button ────────────────────────────────────────────────────── */
1529
+ .msg-copy-btn {
1530
+ position: absolute;
1531
+ top: 8px;
1532
+ right: 8px;
1533
+ background: rgba(255,255,255,0.06);
1534
+ border: 1px solid var(--glass-border);
1535
+ border-radius: 6px;
1536
+ color: var(--text-dim);
1537
+ cursor: pointer;
1538
+ padding: 5px 6px;
1539
+ opacity: 0;
1540
+ transition: opacity 0.2s, color 0.2s, background 0.2s;
1541
+ display: flex;
1542
+ align-items: center;
1543
+ line-height: 1;
1544
+ }
1545
+ .stream-bubble:hover .msg-copy-btn,
1546
+ .msg-copy-visible { opacity: 1; }
1547
+ .msg-copy-btn:hover { color: var(--text); background: rgba(255,255,255,0.1); }
1548
+ .msg-copy-btn.copied { color: var(--accent-green); }
1549
+
1550
+ /* ── Timestamp ──────────────────────────────────────────────────────── */
1551
+ .msg-timestamp {
1552
+ font-family: var(--font-mono);
1553
+ font-size: 9.5px;
1554
+ color: var(--text-dim);
1555
+ margin-top: 10px;
1556
+ letter-spacing: 0.05em;
1557
+ }
1558
+
1559
+
1560
+ /* ── Task lists ─────────────────────────────────────────────────────── */
1561
+ .msg-text :where(li.task-item) {
1562
+ list-style: none;
1563
+ margin-left: -1.4em;
1564
+ padding-left: 0.2em;
1565
+ display: flex;
1566
+ align-items: baseline;
1567
+ gap: 7px;
1568
+ }
1569
+
1570
+ .task-cb {
1571
+ appearance: none;
1572
+ -webkit-appearance: none;
1573
+ width: 14px;
1574
+ height: 14px;
1575
+ border: 1.5px solid var(--glass-border-strong);
1576
+ border-radius: 3px;
1577
+ background: transparent;
1578
+ flex-shrink: 0;
1579
+ position: relative;
1580
+ top: 2px;
1581
+ cursor: default;
1582
+ }
1583
+
1584
+ .task-cb:checked {
1585
+ background: var(--accent-cyan);
1586
+ border-color: var(--accent-cyan);
1587
+ }
1588
+
1589
+ .task-cb:checked::after {
1590
+ content: '';
1591
+ position: absolute;
1592
+ top: 1px; left: 3px;
1593
+ width: 5px; height: 8px;
1594
+ border: 2px solid #000;
1595
+ border-top: none;
1596
+ border-left: none;
1597
+ transform: rotate(45deg);
1598
+ }
1599
+
1600
+ .task-done > * { opacity: 0.55; }
1601
+ .task-done .task-cb + span,
1602
+ .task-done .task-cb ~ * { text-decoration: line-through; }
1603
+
1604
+ /* ── Table overflow wrapper ──────────────────────────────────────────── */
1605
+ .msg-text :where(table) {
1606
+ display: block;
1607
+ overflow-x: auto;
1608
+ white-space: nowrap;
1609
+ }
1610
+ /* Allow cells to wrap when content isn't too wide */
1611
+ .msg-text :where(th, td) {
1612
+ white-space: normal;
1613
+ min-width: 80px;
1614
+ }
1615
+
1616
+ /* ── Details / Summary (collapsible sections) ─────────────────────────── */
1617
+ .msg-text :where(details) {
1618
+ border: 1px solid var(--glass-border);
1619
+ border-radius: 8px;
1620
+ padding: 0;
1621
+ margin: 0.6em 0;
1622
+ overflow: hidden;
1623
+ background: rgba(255,255,255,0.02);
1624
+ }
1625
+
1626
+ .msg-text :where(summary) {
1627
+ padding: 8px 14px;
1628
+ cursor: pointer;
1629
+ font-weight: 600;
1630
+ font-size: 13px;
1631
+ color: var(--text-muted);
1632
+ list-style: none;
1633
+ display: flex;
1634
+ align-items: center;
1635
+ gap: 8px;
1636
+ user-select: none;
1637
+ transition: background 0.2s;
1638
+ }
1639
+ .msg-text :where(summary):hover { background: rgba(255,255,255,0.03); }
1640
+ .msg-text :where(summary)::before {
1641
+ content: '▸';
1642
+ font-size: 9px;
1643
+ color: var(--accent-cyan);
1644
+ transition: transform 0.2s;
1645
+ }
1646
+ .msg-text :where(details[open] summary)::before {
1647
+ transform: rotate(90deg);
1648
+ }
1649
+ .msg-text :where(details) > *:not(summary) {
1650
+ padding: 0 14px 10px;
1651
+ }
1652
+
1653
+ /* ── Spacing improvements ────────────────────────────────────────────── */
1654
+ .bubble-content + .bubble-content { margin-top: 0.5em; }
1655
+
1656
+ .msg-text :where(h1 + p, h2 + p, h3 + p) { margin-top: 0.4em; }
1657
+ .msg-text :where(p:last-child, ul:last-child, ol:last-child) { margin-bottom: 0; }
1658
+
1659
+ /* Separator after heading when followed by block content */
1660
+ .msg-text :where(h2, h3) {
1661
+ padding-top: 0.3em;
1662
+ }
1663
+
1664
+ /* Better nested list indent */
1665
+ .msg-text :where(ul ul, ol ol, ul ol, ol ul) {
1666
+ margin-top: 0.25em;
1667
+ margin-bottom: 0.25em;
1668
+ padding-left: 1.2em;
1669
+ }
1670
+
1671
+ /* ── Keyboard shortcut styling ───────────────────────────────────────── */
1672
+ .msg-text :where(kbd) {
1673
+ font-family: var(--font-mono);
1674
+ font-size: 0.8em;
1675
+ background: rgba(255,255,255,0.1);
1676
+ border: 1px solid rgba(255,255,255,0.2);
1677
+ border-bottom: 2px solid rgba(255,255,255,0.15);
1678
+ border-radius: 4px;
1679
+ padding: 1px 5px;
1680
+ color: var(--text);
1681
+ }
1682
+
1683
+ /* ── Abbr tooltip ────────────────────────────────────────────────────── */
1684
+ .msg-text :where(abbr[title]) {
1685
+ border-bottom: 1px dotted var(--text-muted);
1686
+ cursor: help;
1687
+ text-decoration: none;
1688
+ }
1689
+
1690
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
1691
+ .response-area::-webkit-scrollbar { display: none; }
1692
+ .response-area { scrollbar-width: none; }
1693
+
1694
+ /* ══════════════════════════════════════════════════════════════════════
1695
+ COMMAND MENU SYSTEM
1696
+ ══════════════════════════════════════════════════════════════════════ */
1697
+
1698
+ /* ── Group accent colours ─────────────────────────────────────────── */
1699
+ :root {
1700
+ --cmd-chat: #00d4ff;
1701
+ --cmd-control: #60a5fa;
1702
+ --cmd-agent: #a78bfa;
1703
+ --cmd-settings: #f59e0b;
1704
+ --cmd-resources: #34d399;
1705
+ }
1706
+
1707
+ /* ── Menu Trigger Button ──────────────────────────────────────────── */
1708
+ .menu-trigger {
1709
+ position: fixed;
1710
+ top: 20px;
1711
+ left: 20px;
1712
+ z-index: 50;
1713
+ width: 38px;
1714
+ height: 38px;
1715
+ display: flex;
1716
+ align-items: center;
1717
+ justify-content: center;
1718
+ background: var(--glass-bg);
1719
+ backdrop-filter: var(--blur);
1720
+ -webkit-backdrop-filter: var(--blur);
1721
+ border: 1px solid var(--glass-border);
1722
+ border-radius: 10px;
1723
+ color: var(--text-muted);
1724
+ cursor: pointer;
1725
+ transition: color 0.2s, border-color 0.2s, box-shadow 0.2s, transform 0.2s;
1726
+ }
1727
+ .menu-trigger:hover {
1728
+ color: var(--accent-cyan);
1729
+ border-color: rgba(0,212,255,0.35);
1730
+ box-shadow: 0 0 12px rgba(0,212,255,0.15);
1731
+ }
1732
+ .menu-trigger:active { transform: scale(0.93); }
1733
+
1734
+ /* Icon swap: grid → close */
1735
+ .menu-icon-close { display: none; }
1736
+ .menu-trigger.menu-open .menu-icon-grid { display: none; }
1737
+ .menu-trigger.menu-open .menu-icon-close { display: block; color: var(--accent-cyan); }
1738
+ .menu-trigger.menu-open {
1739
+ color: var(--accent-cyan);
1740
+ border-color: rgba(0,212,255,0.4);
1741
+ box-shadow: 0 0 16px rgba(0,212,255,0.2);
1742
+ }
1743
+
1744
+ /* ── Full-Screen Overlay ──────────────────────────────────────────── */
1745
+ .cmd-overlay {
1746
+ position: fixed;
1747
+ inset: 0;
1748
+ z-index: 40;
1749
+ display: flex;
1750
+ align-items: center;
1751
+ justify-content: center;
1752
+ /* Hidden state */
1753
+ opacity: 0;
1754
+ pointer-events: none;
1755
+ transform: scale(0.97);
1756
+ transition: opacity 0.28s ease, transform 0.28s ease;
1757
+ }
1758
+ .cmd-overlay.open {
1759
+ opacity: 1;
1760
+ pointer-events: auto;
1761
+ transform: scale(1);
1762
+ }
1763
+
1764
+ /* Dark glass backdrop */
1765
+ .cmd-backdrop {
1766
+ position: absolute;
1767
+ inset: 0;
1768
+ background: rgba(6, 8, 14, 0.9);
1769
+ backdrop-filter: blur(24px);
1770
+ -webkit-backdrop-filter: blur(24px);
1771
+ }
1772
+
1773
+ /* Shell (content on top of backdrop) */
1774
+ .cmd-shell {
1775
+ position: relative;
1776
+ z-index: 1;
1777
+ width: 100%;
1778
+ max-width: 1080px;
1779
+ padding: 0 32px;
1780
+ display: flex;
1781
+ flex-direction: column;
1782
+ gap: 24px;
1783
+ }
1784
+
1785
+ /* ── Header Bar ───────────────────────────────────────────────────── */
1786
+ .cmd-header {
1787
+ display: flex;
1788
+ align-items: center;
1789
+ justify-content: space-between;
1790
+ padding-bottom: 16px;
1791
+ border-bottom: 1px solid var(--glass-border);
1792
+ }
1793
+ .cmd-brand {
1794
+ display: flex;
1795
+ align-items: center;
1796
+ gap: 10px;
1797
+ }
1798
+ .cmd-brand-glyph {
1799
+ font-size: 22px;
1800
+ color: var(--accent-cyan);
1801
+ text-shadow: 0 0 12px var(--accent-cyan);
1802
+ animation: aso-breathe 3s ease-in-out infinite;
1803
+ }
1804
+ .cmd-brand-name {
1805
+ font-family: var(--font-mono);
1806
+ font-size: 18px;
1807
+ font-weight: 700;
1808
+ color: var(--text);
1809
+ letter-spacing: 0.15em;
1810
+ }
1811
+ .cmd-brand-sep {
1812
+ font-size: 16px;
1813
+ color: var(--text-dim);
1814
+ margin: 0 2px;
1815
+ }
1816
+ .cmd-brand-sub {
1817
+ font-family: var(--font-mono);
1818
+ font-size: 11px;
1819
+ color: var(--text-dim);
1820
+ letter-spacing: 0.22em;
1821
+ padding-top: 2px;
1822
+ }
1823
+ .cmd-esc-hint {
1824
+ font-size: 11px;
1825
+ color: var(--text-dim);
1826
+ display: flex;
1827
+ align-items: center;
1828
+ gap: 5px;
1829
+ }
1830
+ .cmd-kbd {
1831
+ font-family: var(--font-mono);
1832
+ font-size: 10px;
1833
+ padding: 2px 6px;
1834
+ background: rgba(255,255,255,0.07);
1835
+ border: 1px solid rgba(255,255,255,0.12);
1836
+ border-radius: 4px;
1837
+ color: var(--text-muted);
1838
+ }
1839
+
1840
+ /* ── Command Grid ─────────────────────────────────────────────────── */
1841
+ .cmd-grid {
1842
+ display: grid;
1843
+ grid-template-columns: 200px 1fr 200px;
1844
+ grid-template-rows: auto auto;
1845
+ gap: 14px;
1846
+ width: 100%;
1847
+ }
1848
+
1849
+ .cmd-group--chat { grid-column: 1; grid-row: 1 / 3; }
1850
+ .cmd-group--control { grid-column: 2; grid-row: 1; }
1851
+ .cmd-group--agent { grid-column: 3; grid-row: 1; }
1852
+ .cmd-group--settings { grid-column: 2; grid-row: 2; }
1853
+ .cmd-group--resources { grid-column: 3; grid-row: 2; }
1854
+
1855
+ /* ── Group Card ───────────────────────────────────────────────────── */
1856
+ .cmd-group {
1857
+ background: var(--glass-bg);
1858
+ border: 1px solid var(--glass-border);
1859
+ border-radius: 16px;
1860
+ padding: 18px;
1861
+ display: flex;
1862
+ flex-direction: column;
1863
+ gap: 14px;
1864
+ /* Stagger-reveal when overlay opens */
1865
+ opacity: 0;
1866
+ transform: translateY(14px);
1867
+ transition: border-color 0.25s, box-shadow 0.25s;
1868
+ }
1869
+ .cmd-overlay.open .cmd-group {
1870
+ animation: cmd-card-in 0.32s ease forwards;
1871
+ }
1872
+ .cmd-overlay.open .cmd-group:nth-child(1) { animation-delay: 30ms; }
1873
+ .cmd-overlay.open .cmd-group:nth-child(2) { animation-delay: 80ms; }
1874
+ .cmd-overlay.open .cmd-group:nth-child(3) { animation-delay: 130ms; }
1875
+ .cmd-overlay.open .cmd-group:nth-child(4) { animation-delay: 180ms; }
1876
+ .cmd-overlay.open .cmd-group:nth-child(5) { animation-delay: 230ms; }
1877
+
1878
+ @keyframes cmd-card-in {
1879
+ from { opacity: 0; transform: translateY(14px); }
1880
+ to { opacity: 1; transform: translateY(0); }
1881
+ }
1882
+
1883
+ /* Per-group accent borders & hover glow */
1884
+ .cmd-group--chat:hover { border-color: rgba(0,212,255,0.35); box-shadow: 0 0 20px rgba(0,212,255,0.06); }
1885
+ .cmd-group--control:hover { border-color: rgba(96,165,250,0.35); box-shadow: 0 0 20px rgba(96,165,250,0.06); }
1886
+ .cmd-group--agent:hover { border-color: rgba(167,139,250,0.35); box-shadow: 0 0 20px rgba(167,139,250,0.06); }
1887
+ .cmd-group--settings:hover { border-color: rgba(245,158,11,0.35); box-shadow: 0 0 20px rgba(245,158,11,0.06); }
1888
+ .cmd-group--resources:hover { border-color: rgba(52,211,153,0.35); box-shadow: 0 0 20px rgba(52,211,153,0.06); }
1889
+
1890
+ /* ── Group Header ─────────────────────────────────────────────────── */
1891
+ .cmd-group-hd {
1892
+ display: flex;
1893
+ align-items: center;
1894
+ gap: 9px;
1895
+ padding-bottom: 10px;
1896
+ border-bottom: 1px solid var(--glass-border);
1897
+ }
1898
+ .cmd-group-svg {
1899
+ width: 16px;
1900
+ height: 16px;
1901
+ flex-shrink: 0;
1902
+ }
1903
+ .cmd-group-label {
1904
+ font-family: var(--font-mono);
1905
+ font-size: 10px;
1906
+ font-weight: 700;
1907
+ letter-spacing: 0.2em;
1908
+ }
1909
+
1910
+ /* Accent colours on group labels and icons */
1911
+ .cmd-group--chat .cmd-group-hd { color: var(--cmd-chat); }
1912
+ .cmd-group--control .cmd-group-hd { color: var(--cmd-control); }
1913
+ .cmd-group--agent .cmd-group-hd { color: var(--cmd-agent); }
1914
+ .cmd-group--settings .cmd-group-hd { color: var(--cmd-settings); }
1915
+ .cmd-group--resources .cmd-group-hd { color: var(--cmd-resources); }
1916
+
1917
+ /* ── Items List ───────────────────────────────────────────────────── */
1918
+ .cmd-items {
1919
+ display: flex;
1920
+ flex-direction: column;
1921
+ gap: 6px;
1922
+ flex: 1;
1923
+ }
1924
+
1925
+ /* 3-column sub-grid for CONTROL (6 items) */
1926
+ .cmd-items--grid {
1927
+ display: grid;
1928
+ grid-template-columns: 1fr 1fr 1fr;
1929
+ gap: 8px;
1930
+ }
1931
+
1932
+ /* ── Individual Item ──────────────────────────────────────────────── */
1933
+ .cmd-item {
1934
+ display: flex;
1935
+ align-items: center;
1936
+ gap: 10px;
1937
+ padding: 10px 12px;
1938
+ border-radius: 10px;
1939
+ border: 1px solid transparent;
1940
+ background: rgba(255,255,255,0.025);
1941
+ text-decoration: none;
1942
+ cursor: pointer;
1943
+ transition: background 0.18s, border-color 0.18s, transform 0.15s;
1944
+ }
1945
+ .cmd-item:hover {
1946
+ background: rgba(255,255,255,0.06);
1947
+ transform: translateY(-1px);
1948
+ }
1949
+ /* Per-group item hover accent */
1950
+ .cmd-group--chat .cmd-item:hover { border-color: rgba(0,212,255,0.3); }
1951
+ .cmd-group--control .cmd-item:hover { border-color: rgba(96,165,250,0.3); }
1952
+ .cmd-group--agent .cmd-item:hover { border-color: rgba(167,139,250,0.3); }
1953
+ .cmd-group--settings .cmd-item:hover { border-color: rgba(245,158,11,0.3); }
1954
+ .cmd-group--resources .cmd-item:hover { border-color: rgba(52,211,153,0.3); }
1955
+
1956
+ .cmd-item-icon {
1957
+ font-size: 16px;
1958
+ flex-shrink: 0;
1959
+ width: 20px;
1960
+ text-align: center;
1961
+ opacity: 0.7;
1962
+ }
1963
+ .cmd-group--chat .cmd-item-icon { color: var(--cmd-chat); }
1964
+ .cmd-group--control .cmd-item-icon { color: var(--cmd-control); }
1965
+ .cmd-group--agent .cmd-item-icon { color: var(--cmd-agent); }
1966
+ .cmd-group--settings .cmd-item-icon { color: var(--cmd-settings); }
1967
+ .cmd-group--resources .cmd-item-icon { color: var(--cmd-resources); }
1968
+
1969
+ .cmd-item-body {
1970
+ display: flex;
1971
+ flex-direction: column;
1972
+ gap: 2px;
1973
+ min-width: 0;
1974
+ flex: 1;
1975
+ }
1976
+ .cmd-item-name {
1977
+ font-family: var(--font-mono);
1978
+ font-size: 12px;
1979
+ font-weight: 600;
1980
+ color: var(--text);
1981
+ white-space: nowrap;
1982
+ overflow: hidden;
1983
+ text-overflow: ellipsis;
1984
+ }
1985
+ .cmd-item-desc {
1986
+ font-size: 10px;
1987
+ color: var(--text-dim);
1988
+ white-space: nowrap;
1989
+ overflow: hidden;
1990
+ text-overflow: ellipsis;
1991
+ }
1992
+ .cmd-item-badge {
1993
+ font-family: var(--font-mono);
1994
+ font-size: 8px;
1995
+ font-weight: 700;
1996
+ letter-spacing: 0.1em;
1997
+ padding: 2px 6px;
1998
+ border-radius: 99px;
1999
+ background: rgba(0,212,255,0.12);
2000
+ color: var(--accent-cyan);
2001
+ border: 1px solid rgba(0,212,255,0.25);
2002
+ flex-shrink: 0;
2003
+ }
2004
+
2005
+ /* ── History button ─────────────────────────────────────────────────── */
2006
+ .history-btn {
2007
+ display: flex; align-items: center; gap: 5px;
2008
+ padding: 5px 11px;
2009
+ height: 28px;
2010
+ background: rgba(139,92,246,0.08);
2011
+ border: 1px solid rgba(139,92,246,0.2);
2012
+ border-radius: 8px;
2013
+ color: rgba(139,92,246,0.85);
2014
+ font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
2015
+ cursor: pointer; transition: all 0.2s; white-space: nowrap; flex-shrink: 0;
2016
+ }
2017
+ .history-btn:hover {
2018
+ background: rgba(139,92,246,0.16);
2019
+ border-color: rgba(139,92,246,0.4);
2020
+ box-shadow: 0 0 12px rgba(139,92,246,0.12);
2021
+ }
2022
+ .history-btn-label { font-size: 10px; }
2023
+
2024
+ /* ── History overlay + drawer ───────────────────────────────────────── */
2025
+ .history-overlay {
2026
+ position: fixed; inset: 0; z-index: 1100;
2027
+ background: rgba(0,0,0,0.55);
2028
+ backdrop-filter: blur(4px);
2029
+ opacity: 0; pointer-events: none;
2030
+ transition: opacity 0.25s ease;
2031
+ }
2032
+ .history-overlay.open { opacity: 1; pointer-events: auto; }
2033
+
2034
+ .history-drawer {
2035
+ position: fixed; top: 0; right: -440px; height: 100vh; width: 420px;
2036
+ z-index: 1101;
2037
+ background: rgba(10,12,20,0.97);
2038
+ border-left: 1px solid rgba(139,92,246,0.25);
2039
+ box-shadow: -20px 0 60px rgba(0,0,0,0.6);
2040
+ display: flex; flex-direction: column;
2041
+ transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2042
+ }
2043
+ .history-drawer.open { right: 0; }
2044
+
2045
+ .history-drawer-header {
2046
+ display: flex; align-items: center; justify-content: space-between;
2047
+ padding: 16px 18px 14px;
2048
+ border-bottom: 1px solid rgba(139,92,246,0.15);
2049
+ flex-shrink: 0;
2050
+ }
2051
+ .history-drawer-title {
2052
+ display: flex; align-items: center; gap: 7px;
2053
+ font-family: var(--font-mono); font-size: 11px; font-weight: 700;
2054
+ letter-spacing: 0.14em; color: rgba(139,92,246,0.9);
2055
+ }
2056
+ .history-close-btn {
2057
+ background: none; border: none; color: var(--text-dim);
2058
+ font-size: 13px; cursor: pointer; padding: 4px 6px; border-radius: 4px;
2059
+ transition: color 0.15s, background 0.15s;
2060
+ }
2061
+ .history-close-btn:hover { color: var(--text-primary); background: rgba(255,255,255,0.06); }
2062
+
2063
+ .history-drawer-body {
2064
+ flex: 1; overflow-y: auto; padding: 12px 0;
2065
+ }
2066
+ .history-drawer-body::-webkit-scrollbar { width: 4px; }
2067
+ .history-drawer-body::-webkit-scrollbar-track { background: transparent; }
2068
+ .history-drawer-body::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2069
+
2070
+ .history-loading {
2071
+ padding: 24px 18px;
2072
+ color: var(--text-dim);
2073
+ font-size: 12px; font-family: var(--font-mono);
2074
+ text-align: center;
2075
+ }
2076
+
2077
+ /* ── Session list items ─────────────────────────────────────────────── */
2078
+ .history-session-item {
2079
+ padding: 12px 18px;
2080
+ cursor: pointer;
2081
+ border-bottom: 1px solid rgba(255,255,255,0.04);
2082
+ transition: background 0.15s;
2083
+ position: relative;
2084
+ }
2085
+ .history-session-item:hover { background: rgba(139,92,246,0.07); }
2086
+ .history-session-item:last-child { border-bottom: none; }
2087
+
2088
+ .history-session-meta {
2089
+ display: flex; align-items: center; justify-content: space-between;
2090
+ margin-bottom: 5px;
2091
+ }
2092
+ .history-session-date {
2093
+ font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2094
+ color: rgba(139,92,246,0.8); letter-spacing: 0.06em;
2095
+ }
2096
+ .history-session-count {
2097
+ font-family: var(--font-mono); font-size: 9px;
2098
+ color: var(--text-dim); letter-spacing: 0.05em;
2099
+ }
2100
+ .history-session-preview {
2101
+ font-size: 12px; color: var(--text-secondary);
2102
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
2103
+ line-height: 1.4;
2104
+ }
2105
+ .history-session-badge {
2106
+ display: inline-block; margin-bottom: 4px;
2107
+ font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2108
+ letter-spacing: 0.1em; padding: 2px 6px; border-radius: 99px;
2109
+ }
2110
+ .history-session-badge.live {
2111
+ background: rgba(0,212,255,0.12); color: var(--accent-cyan);
2112
+ border: 1px solid rgba(0,212,255,0.25);
2113
+ }
2114
+ .history-session-badge.archived {
2115
+ background: rgba(139,92,246,0.1); color: rgba(139,92,246,0.7);
2116
+ border: 1px solid rgba(139,92,246,0.2);
2117
+ }
2118
+
2119
+ /* ── Archive viewer banner ──────────────────────────────────────────── */
2120
+ .archive-banner {
2121
+ display: flex; align-items: center; justify-content: space-between;
2122
+ padding: 10px 14px; margin: 0 0 8px;
2123
+ background: rgba(139,92,246,0.1);
2124
+ border-bottom: 1px solid rgba(139,92,246,0.2);
2125
+ flex-shrink: 0;
2126
+ }
2127
+ .archive-banner-label {
2128
+ font-family: var(--font-mono); font-size: 10px;
2129
+ color: rgba(139,92,246,0.8); letter-spacing: 0.08em;
2130
+ }
2131
+ .archive-banner-back {
2132
+ font-family: var(--font-mono); font-size: 10px; font-weight: 600;
2133
+ color: rgba(139,92,246,0.9); cursor: pointer;
2134
+ background: none; border: none; padding: 3px 8px;
2135
+ border: 1px solid rgba(139,92,246,0.3); border-radius: 6px;
2136
+ transition: all 0.15s;
2137
+ }
2138
+ .archive-banner-back:hover { background: rgba(139,92,246,0.15); }
2139
+
2140
+ .history-transcript {
2141
+ flex: 1; overflow-y: auto; padding: 8px 12px;
2142
+ }
2143
+ .history-transcript::-webkit-scrollbar { width: 4px; }
2144
+ .history-transcript::-webkit-scrollbar-thumb { background: rgba(139,92,246,0.3); border-radius: 2px; }
2145
+
2146
+ .history-msg {
2147
+ margin-bottom: 12px; font-size: 12.5px; line-height: 1.5;
2148
+ }
2149
+ .history-msg-role {
2150
+ font-family: var(--font-mono); font-size: 9px; font-weight: 700;
2151
+ letter-spacing: 0.1em; margin-bottom: 3px;
2152
+ }
2153
+ .history-msg-role.user { color: var(--accent-cyan); }
2154
+ .history-msg-role.assistant { color: rgba(139,92,246,0.8); }
2155
+ .history-msg-text {
2156
+ color: var(--text-secondary); padding: 6px 10px;
2157
+ background: rgba(255,255,255,0.025);
2158
+ border-radius: 6px; border-left: 2px solid rgba(255,255,255,0.08);
2159
+ white-space: pre-wrap; word-break: break-word;
2160
+ }
2161
+ .history-msg.assistant .history-msg-text {
2162
+ border-left-color: rgba(139,92,246,0.3);
2163
+ }
2164
+ .history-msg.user .history-msg-text {
2165
+ border-left-color: rgba(0,212,255,0.25);
2166
+ }
2167
+
2168
+ .history-empty {
2169
+ padding: 32px 18px; text-align: center;
2170
+ color: var(--text-dim); font-size: 12px; font-family: var(--font-mono);
2171
+ }
2172
+
2173
+ /* ── Archive toast ──────────────────────────────────────────────────── */
2174
+ .session-archive-toast {
2175
+ position: fixed; bottom: 80px; left: 50%; transform: translateX(-50%) translateY(20px);
2176
+ z-index: 1200;
2177
+ display: flex; align-items: center; gap: 7px;
2178
+ padding: 8px 16px;
2179
+ background: rgba(15,17,28,0.95);
2180
+ border: 1px solid rgba(139,92,246,0.35);
2181
+ border-radius: 99px;
2182
+ font-size: 11.5px; font-family: var(--font-mono); color: var(--text-secondary);
2183
+ box-shadow: 0 4px 24px rgba(0,0,0,0.5), 0 0 20px rgba(139,92,246,0.08);
2184
+ opacity: 0; pointer-events: none;
2185
+ transition: opacity 0.25s ease, transform 0.25s ease;
2186
+ white-space: nowrap;
2187
+ }
2188
+ .session-archive-toast.show {
2189
+ opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0);
2190
+ }
2191
+ #session-archive-link {
2192
+ color: rgba(139,92,246,0.9); cursor: pointer; font-weight: 600;
2193
+ text-decoration: underline; text-underline-offset: 2px;
2194
+ }
2195
+ #session-archive-link:hover { color: rgba(139,92,246,1); }
2196
+
2197
+ /* ── Queue button ───────────────────────────────────────────────────── */
2198
+ .queue-btn {
2199
+ display: none; /* hidden until streaming starts */
2200
+ align-items: center;
2201
+ gap: 5px;
2202
+ padding: 0 11px;
2203
+ height: 28px;
2204
+ background: rgba(0,212,255,0.08);
2205
+ border: 1px solid rgba(0,212,255,0.2);
2206
+ border-radius: 8px;
2207
+ color: rgba(0,212,255,0.8);
2208
+ font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
2209
+ cursor: pointer; flex-shrink: 0;
2210
+ transition: background 0.2s, border-color 0.2s, box-shadow 0.2s;
2211
+ white-space: nowrap;
2212
+ }
2213
+ .queue-btn.visible { display: flex; }
2214
+ .queue-btn:hover {
2215
+ background: rgba(0,212,255,0.15);
2216
+ border-color: rgba(0,212,255,0.4);
2217
+ box-shadow: 0 0 12px rgba(0,212,255,0.12);
2218
+ }
2219
+
2220
+ /* Active state — item is queued */
2221
+ .queue-btn.has-queue {
2222
+ background: rgba(0,212,255,0.14);
2223
+ border-color: rgba(0,212,255,0.45);
2224
+ color: var(--accent-cyan);
2225
+ box-shadow: 0 0 14px rgba(0,212,255,0.1);
2226
+ }
2227
+
2228
+ .queue-cancel-x {
2229
+ display: none;
2230
+ margin-left: 2px;
2231
+ font-size: 10px;
2232
+ opacity: 0.6;
2233
+ line-height: 1;
2234
+ padding: 1px 3px;
2235
+ border-radius: 3px;
2236
+ transition: opacity 0.15s, background 0.15s;
2237
+ }
2238
+ .queue-btn.has-queue .queue-cancel-x { display: inline; }
2239
+ .queue-cancel-x:hover { opacity: 1; background: rgba(255,255,255,0.1); }
2240
+
2241
+ /* ── Stop button ────────────────────────────────────────────────────── */
2242
+ .stop-btn {
2243
+ display: none; /* hidden until streaming starts */
2244
+ align-items: center;
2245
+ gap: 5px;
2246
+ padding: 0 11px;
2247
+ height: 28px;
2248
+ background: rgba(239,68,68,0.08);
2249
+ border: 1px solid rgba(239,68,68,0.22);
2250
+ border-radius: 8px;
2251
+ color: rgba(239,68,68,0.85);
2252
+ font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.08em; font-weight: 600;
2253
+ cursor: pointer; flex-shrink: 0;
2254
+ transition: background 0.2s, border-color 0.2s, box-shadow 0.2s;
2255
+ white-space: nowrap;
2256
+ }
2257
+ .stop-btn.visible { display: flex; }
2258
+ .stop-btn:hover {
2259
+ background: rgba(239,68,68,0.18);
2260
+ border-color: rgba(239,68,68,0.5);
2261
+ box-shadow: 0 0 14px rgba(239,68,68,0.14);
2262
+ color: rgba(239,68,68,1);
2263
+ }
2264
+ .stop-btn-label { font-size: 10px; }