@symerian/symi 3.5.0 → 3.5.2

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 +3 -3
@@ -0,0 +1,1848 @@
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
+ /* ── Keyframes ── */
455
+ @keyframes aso-spin {
456
+ from { transform: rotate(0deg); }
457
+ to { transform: rotate(360deg); }
458
+ }
459
+ @keyframes aso-breathe {
460
+ 0%, 100% { transform: scale(1); opacity: 0.75; }
461
+ 50% { transform: scale(1.45); opacity: 1; }
462
+ }
463
+ @keyframes aso-pulse {
464
+ 0%, 100% { transform: scale(1); }
465
+ 50% { transform: scale(1.6); }
466
+ }
467
+ @keyframes aso-flash {
468
+ 0% { transform: scale(2.5); opacity: 1; }
469
+ 60% { transform: scale(1.2); opacity: 1; }
470
+ 100% { transform: scale(1); opacity: 1; }
471
+ }
472
+
473
+ /* ── Status label & sub-text ── */
474
+ .aso-label {
475
+ font-family: var(--font-mono);
476
+ font-size: 11px;
477
+ font-weight: 700;
478
+ letter-spacing: 0.22em;
479
+ color: var(--aso-color);
480
+ margin-bottom: 5px;
481
+ text-shadow: 0 0 8px var(--aso-color);
482
+ transition: color 0.4s ease, text-shadow 0.4s ease;
483
+ }
484
+ .aso-sub {
485
+ font-size: 10px;
486
+ color: var(--text-dim);
487
+ letter-spacing: 0.04em;
488
+ }
489
+
490
+ /* ── Layout columns ───────────────────────────────────────────────── */
491
+ .metrics-col {
492
+ position: fixed;
493
+ top: 24px;
494
+ bottom: 120px;
495
+ width: 360px;
496
+ display: flex;
497
+ flex-direction: column;
498
+ gap: 12px;
499
+ z-index: 10;
500
+ overflow-y: auto;
501
+ scrollbar-width: none;
502
+ padding-bottom: 8px;
503
+ }
504
+ .metrics-col::-webkit-scrollbar { display: none; }
505
+
506
+ /* Anchor panels adjacent to the centered 740px chat column, 16px gap */
507
+ .metrics-left { left: calc(50% - 370px - 16px - 360px); }
508
+ .metrics-right { right: calc(50% - 370px - 16px - 360px); }
509
+
510
+ /* ── Response Area ────────────────────────────────────────────────── */
511
+ .response-area {
512
+ position: fixed;
513
+ top: 0;
514
+ left: calc(50% - 370px);
515
+ right: calc(50% - 370px);
516
+ bottom: 110px;
517
+ z-index: 5;
518
+ display: flex;
519
+ flex-direction: column;
520
+ justify-content: flex-start;
521
+ padding: 32px 0 16px;
522
+ overflow-y: auto;
523
+ overflow-x: hidden;
524
+ pointer-events: none;
525
+ }
526
+
527
+ /* Constrain all response content to a readable column, centered */
528
+ .response-area > * {
529
+ width: 100%;
530
+ max-width: 740px;
531
+ margin-left: auto;
532
+ margin-right: auto;
533
+ flex-shrink: 0;
534
+ pointer-events: auto;
535
+ }
536
+
537
+ /* ── Message Bubbles ──────────────────────────────────────────────── */
538
+ .message {
539
+ pointer-events: auto;
540
+ width: 100%;
541
+ max-width: 740px;
542
+ margin-bottom: 16px;
543
+ animation: waterfall 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
544
+ opacity: 0;
545
+ transform: translateY(-20px);
546
+ /* Allow bubble to fit content — don't impose a forced width on the child */
547
+ display: block;
548
+ }
549
+
550
+ @keyframes waterfall {
551
+ to { opacity: 1; transform: translateY(0); }
552
+ }
553
+
554
+ .message.user-msg .bubble {
555
+ background: rgba(0,212,255,0.07);
556
+ border: 1px solid rgba(0,212,255,0.18);
557
+ border-radius: 12px 12px 4px 12px;
558
+ padding: 10px 14px;
559
+ display: inline-block;
560
+ float: right;
561
+ max-width: 75%;
562
+ backdrop-filter: blur(12px);
563
+ color: var(--text);
564
+ font-size: 14.5px;
565
+ clear: both;
566
+ }
567
+
568
+ .message.symi-msg .bubble {
569
+ background: var(--glass-bg);
570
+ border: 1px solid var(--glass-border);
571
+ border-radius: 4px 12px 12px 12px;
572
+ padding: 12px 16px;
573
+ backdrop-filter: var(--blur);
574
+ -webkit-backdrop-filter: var(--blur);
575
+ box-shadow: var(--shadow), inset 0 1px 0 rgba(255,255,255,0.04);
576
+ font-size: 14.5px;
577
+ line-height: 1.75;
578
+ color: var(--text);
579
+ position: relative;
580
+ clear: both;
581
+ display: inline-block;
582
+ width: fit-content;
583
+ max-width: 100%;
584
+ box-sizing: border-box;
585
+ overflow: visible;
586
+ }
587
+
588
+ .message.symi-msg .bubble::before {
589
+ content: '';
590
+ position: absolute;
591
+ top: 0; left: 0; right: 0;
592
+ height: 1px;
593
+ background: linear-gradient(90deg, transparent, rgba(0,212,255,0.3), transparent);
594
+ }
595
+
596
+ .message-clearfix { clear: both; }
597
+
598
+ .typing-cursor {
599
+ display: inline-block;
600
+ width: 2px;
601
+ height: 1em;
602
+ background: var(--accent-cyan);
603
+ margin-left: 2px;
604
+ vertical-align: text-bottom;
605
+ animation: blink 1s step-end infinite;
606
+ box-shadow: 0 0 4px var(--accent-cyan);
607
+ }
608
+ @keyframes blink {
609
+ 0%, 100% { opacity: 1; }
610
+ 50% { opacity: 0; }
611
+ }
612
+
613
+ /* ── Floating Prompt Bar ──────────────────────────────────────────── */
614
+ .prompt-wrap {
615
+ position: fixed;
616
+ bottom: 28px;
617
+ left: calc(50% - 370px);
618
+ right: calc(50% - 370px);
619
+ z-index: 20;
620
+ display: flex;
621
+ justify-content: center;
622
+ }
623
+
624
+ .prompt-bar {
625
+ width: 100%;
626
+ max-width: 720px;
627
+ display: flex;
628
+ align-items: center;
629
+ gap: 12px;
630
+ background: rgba(255,255,255,0.05);
631
+ backdrop-filter: blur(32px) saturate(200%);
632
+ -webkit-backdrop-filter: blur(32px) saturate(200%);
633
+ border: 1px solid rgba(255,255,255,0.12);
634
+ border-radius: 99px;
635
+ padding: 12px 16px;
636
+ box-shadow:
637
+ 0 0 0 1px rgba(0,212,255,0.08),
638
+ 0 8px 40px rgba(0,0,0,0.6),
639
+ 0 0 60px rgba(0,212,255,0.04),
640
+ inset 0 1px 0 rgba(255,255,255,0.08);
641
+ transition: border-color 0.3s, box-shadow 0.3s;
642
+ cursor: text;
643
+ }
644
+
645
+ .prompt-bar:focus-within {
646
+ border-color: rgba(0,212,255,0.3);
647
+ box-shadow:
648
+ 0 0 0 1px rgba(0,212,255,0.15),
649
+ 0 8px 40px rgba(0,0,0,0.6),
650
+ 0 0 80px rgba(0,212,255,0.08),
651
+ inset 0 1px 0 rgba(255,255,255,0.1);
652
+ }
653
+
654
+ .prompt-icon {
655
+ color: var(--accent-cyan);
656
+ opacity: 0.7;
657
+ flex-shrink: 0;
658
+ display: flex;
659
+ align-items: center;
660
+ filter: drop-shadow(0 0 4px var(--accent-cyan));
661
+ }
662
+
663
+ .prompt-bar input {
664
+ flex: 1;
665
+ background: transparent;
666
+ border: none;
667
+ outline: none;
668
+ color: var(--text);
669
+ font-family: var(--font);
670
+ font-size: 14px;
671
+ letter-spacing: 0.01em;
672
+ caret-color: var(--accent-cyan);
673
+ }
674
+
675
+ .prompt-bar input::placeholder {
676
+ color: var(--text-dim);
677
+ }
678
+
679
+ .send-btn {
680
+ background: rgba(0,212,255,0.12);
681
+ border: 1px solid rgba(0,212,255,0.2);
682
+ border-radius: 50%;
683
+ width: 32px;
684
+ height: 32px;
685
+ display: flex;
686
+ align-items: center;
687
+ justify-content: center;
688
+ color: var(--accent-cyan);
689
+ cursor: pointer;
690
+ flex-shrink: 0;
691
+ transition: background 0.2s, transform 0.15s, box-shadow 0.2s;
692
+ }
693
+
694
+ .send-btn:hover {
695
+ background: rgba(0,212,255,0.22);
696
+ box-shadow: 0 0 16px rgba(0,212,255,0.25);
697
+ transform: scale(1.05);
698
+ }
699
+
700
+ .send-btn:active {
701
+ transform: scale(0.95);
702
+ }
703
+
704
+ /* ── Thinking Bubble ──────────────────────────────────────────────── */
705
+ .thinking-bubble {
706
+ background: rgba(0,212,255,0.04) !important;
707
+ border-color: rgba(0,212,255,0.15) !important;
708
+ padding: 10px 16px !important;
709
+ }
710
+
711
+ .think-header {
712
+ display: flex;
713
+ align-items: center;
714
+ gap: 10px;
715
+ margin-bottom: 8px;
716
+ }
717
+
718
+ .think-badge {
719
+ font-family: var(--font-mono);
720
+ font-size: 9px;
721
+ font-weight: 700;
722
+ letter-spacing: 0.15em;
723
+ color: var(--accent-cyan);
724
+ text-shadow: 0 0 8px var(--accent-cyan);
725
+ }
726
+
727
+ .think-dots span {
728
+ display: inline-block;
729
+ color: var(--accent-cyan);
730
+ animation: dot-pulse 1.2s ease-in-out infinite;
731
+ font-size: 14px;
732
+ opacity: 0;
733
+ }
734
+ .think-dots span:nth-child(1) { animation-delay: 0s; }
735
+ .think-dots span:nth-child(2) { animation-delay: 0.2s; }
736
+ .think-dots span:nth-child(3) { animation-delay: 0.4s; }
737
+
738
+ @keyframes dot-pulse {
739
+ 0%, 100% { opacity: 0; transform: translateY(0); }
740
+ 50% { opacity: 1; transform: translateY(-3px); }
741
+ }
742
+
743
+ .think-bar-wrap {
744
+ height: 2px;
745
+ background: rgba(255,255,255,0.06);
746
+ border-radius: 99px;
747
+ overflow: hidden;
748
+ }
749
+
750
+ .think-bar {
751
+ height: 100%;
752
+ width: 0%;
753
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
754
+ border-radius: 99px;
755
+ animation: think-scan 1s ease-in-out infinite;
756
+ }
757
+
758
+ @keyframes think-scan {
759
+ 0% { width: 0%; margin-left: 0%; opacity: 1; }
760
+ 50% { width: 60%; margin-left: 20%; opacity: 1; }
761
+ 100% { width: 0%; margin-left: 100%; opacity: 0; }
762
+ }
763
+
764
+ /* ── Streaming Bubble ─────────────────────────────────────────────── */
765
+ .stream-bubble {
766
+ position: relative;
767
+ }
768
+
769
+ .stream-bubble.streaming {
770
+ width: 100% !important;
771
+ border-color: rgba(0,212,255,0.25) !important;
772
+ box-shadow:
773
+ 0 8px 32px rgba(0,0,0,0.5),
774
+ 0 0 20px rgba(0,212,255,0.06),
775
+ inset 0 1px 0 rgba(255,255,255,0.06) !important;
776
+ animation: stream-pulse 1.8s ease-in-out infinite;
777
+ }
778
+
779
+ @keyframes stream-pulse {
780
+ 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); }
781
+ 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); }
782
+ }
783
+
784
+ .stream-bubble.streaming::after {
785
+ content: '';
786
+ position: absolute;
787
+ top: 0; left: 0; right: 0;
788
+ height: 1px;
789
+ background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
790
+ opacity: 0.6;
791
+ animation: top-scan 2s linear infinite;
792
+ }
793
+
794
+ @keyframes top-scan {
795
+ 0% { transform: scaleX(0); transform-origin: left; opacity: 0.8; }
796
+ 50% { transform: scaleX(1); transform-origin: left; opacity: 0.6; }
797
+ 100% { transform: scaleX(0); transform-origin: right; opacity: 0; }
798
+ }
799
+
800
+ .stream-bubble.done {
801
+ width: fit-content;
802
+ max-width: 100%;
803
+ border-color: rgba(255,255,255,0.1) !important;
804
+ transition: border-color 0.8s, box-shadow 0.8s, width 0.3s ease;
805
+ }
806
+
807
+ /* ── Character spawn animation ────────────────────────────────────── */
808
+ .char-spawn {
809
+ display: inline;
810
+ color: transparent;
811
+ text-shadow: none;
812
+ transition: color 0.12s ease, text-shadow 0.2s ease;
813
+ }
814
+
815
+ .char-spawn.char-visible {
816
+ color: var(--text);
817
+ text-shadow: 0 0 8px rgba(0,212,255,0.4);
818
+ animation: char-settle 0.4s ease forwards;
819
+ }
820
+
821
+ @keyframes char-settle {
822
+ 0% { color: var(--accent-cyan); text-shadow: 0 0 12px var(--accent-cyan), 0 0 24px rgba(0,212,255,0.3); }
823
+ 40% { color: rgba(200,240,255,0.95); text-shadow: 0 0 6px rgba(0,212,255,0.2); }
824
+ 100% { color: var(--text); text-shadow: none; }
825
+ }
826
+
827
+ /* ── Telemetry footer ─────────────────────────────────────────────── */
828
+ .telemetry {
829
+ display: flex;
830
+ align-items: center;
831
+ gap: 6px;
832
+ margin-top: 10px;
833
+ padding-top: 8px;
834
+ border-top: 1px solid rgba(255,255,255,0.05);
835
+ opacity: 0;
836
+ transform: translateY(4px);
837
+ transition: opacity 0.5s ease 0.2s, transform 0.5s ease 0.2s;
838
+ }
839
+
840
+ .telemetry.tele-visible {
841
+ opacity: 1;
842
+ transform: translateY(0);
843
+ }
844
+
845
+ .tele-item {
846
+ font-family: var(--font-mono);
847
+ font-size: 9px;
848
+ color: var(--text-dim);
849
+ letter-spacing: 0.06em;
850
+ }
851
+
852
+ .tele-sep {
853
+ color: rgba(255,255,255,0.12);
854
+ font-size: 9px;
855
+ }
856
+
857
+ /* ── Send button loading state ────────────────────────────────────── */
858
+ .send-btn.btn-loading {
859
+ animation: btn-spin 1s linear infinite;
860
+ }
861
+ @keyframes btn-spin {
862
+ to { transform: rotate(360deg); }
863
+ }
864
+
865
+ /* ── Connection status ────────────────────────────────────────────── */
866
+ .conn-status {
867
+ position: fixed;
868
+ top: 16px;
869
+ left: 50%;
870
+ transform: translateX(-50%);
871
+ z-index: 30;
872
+ display: flex;
873
+ align-items: center;
874
+ gap: 7px;
875
+ background: var(--glass-bg);
876
+ backdrop-filter: var(--blur);
877
+ -webkit-backdrop-filter: var(--blur);
878
+ border: 1px solid var(--glass-border);
879
+ border-radius: 99px;
880
+ padding: 5px 12px;
881
+ pointer-events: none;
882
+ }
883
+
884
+ .conn-label {
885
+ font-family: var(--font-mono);
886
+ font-size: 9px;
887
+ letter-spacing: 0.1em;
888
+ color: var(--text-dim);
889
+ }
890
+
891
+ .dot-red { background: #f87171; box-shadow: 0 0 6px #f87171; }
892
+
893
+ /* ── UI Toggle button ─────────────────────────────────────────────── */
894
+ .ui-toggle {
895
+ position: fixed;
896
+ top: 16px;
897
+ right: 24px;
898
+ z-index: 30;
899
+ display: flex;
900
+ align-items: center;
901
+ gap: 7px;
902
+ background: var(--glass-bg);
903
+ backdrop-filter: var(--blur);
904
+ -webkit-backdrop-filter: var(--blur);
905
+ border: 1px solid var(--glass-border);
906
+ border-radius: 99px;
907
+ padding: 6px 14px;
908
+ color: var(--text-muted);
909
+ font-size: 11px;
910
+ font-family: var(--font-mono);
911
+ letter-spacing: 0.05em;
912
+ text-decoration: none;
913
+ transition: border-color 0.2s, color 0.2s, box-shadow 0.2s;
914
+ }
915
+
916
+ .ui-toggle:hover {
917
+ border-color: var(--glass-border-strong);
918
+ color: var(--text);
919
+ box-shadow: 0 0 16px rgba(0,212,255,0.08);
920
+ }
921
+
922
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
923
+ .response-area::-webkit-scrollbar { display: none; }
924
+ .response-area { scrollbar-width: none; }
925
+
926
+ /* ═══════════════════════════════════════════════════════════════════
927
+ CONTENT TYPES — Markdown, Thinking, Tool Cards, Code
928
+ ═══════════════════════════════════════════════════════════════════ */
929
+
930
+ /* ── Markdown prose ────────────────────────────────────────────────── */
931
+ .msg-text {
932
+ font-size: 14.5px;
933
+ line-height: 1.75;
934
+ color: var(--text);
935
+ word-wrap: break-word;
936
+ overflow-wrap: anywhere;
937
+ word-break: break-word;
938
+ }
939
+
940
+ /* Paragraph spacing */
941
+ .msg-text :where(p, ul, ol, pre, blockquote, table) { margin: 0; }
942
+ .msg-text :where(p + p,
943
+ p + ul, p + ol, p + pre, p + blockquote, p + table,
944
+ ul + p, ol + p, pre + p, blockquote + p, table + p) { margin-top: 0.75em; }
945
+ .msg-text :where(li + li) { margin-top: 0.25em; }
946
+
947
+ /* Headings */
948
+ .msg-text :where(h1, h2, h3, h4, h5, h6) {
949
+ font-weight: 600;
950
+ line-height: 1.3;
951
+ color: rgba(255,255,255,0.96);
952
+ margin: 1.1em 0 0.4em;
953
+ }
954
+ .msg-text :where(h1) { font-size: 1.35em; border-bottom: 1px solid var(--glass-border); padding-bottom: 0.3em; }
955
+ .msg-text :where(h2) { font-size: 1.18em; border-bottom: 1px solid rgba(255,255,255,0.05); padding-bottom: 0.2em; }
956
+ .msg-text :where(h3) { font-size: 1.06em; }
957
+ .msg-text :where(h4, h5, h6) { font-size: 1em; color: rgba(255,255,255,0.8); }
958
+ .msg-text :where(h1, h2, h3, h4, h5, h6):first-child { margin-top: 0.3em; }
959
+
960
+ /* Lists */
961
+ .msg-text :where(ul, ol) { padding-left: 1.4em; }
962
+ .msg-text :where(ul) { list-style-type: disc; }
963
+ .msg-text :where(ol) { list-style-type: decimal; }
964
+ .msg-text :where(ul ul) { list-style-type: circle; margin-top: 0.25em; }
965
+
966
+ /* Text formatting */
967
+ .msg-text :where(strong) { font-weight: 600; color: rgba(255,255,255,0.97); }
968
+ .msg-text :where(em) { font-style: italic; color: rgba(255,255,255,0.82); }
969
+ .msg-text :where(del) { text-decoration: line-through; opacity: 0.6; }
970
+ .msg-text :where(mark) { background: rgba(251,191,36,0.2); color: #fbbf24; border-radius: 2px; padding: 0 3px; }
971
+ .msg-text :where(sup) { font-size: 0.75em; vertical-align: super; }
972
+ .msg-text :where(sub) { font-size: 0.75em; vertical-align: sub; }
973
+
974
+ /* Links */
975
+ .msg-text :where(a) { color: var(--accent-cyan); text-decoration: none; border-bottom: 1px solid rgba(0,212,255,0.3); }
976
+ .msg-text :where(a:hover) { border-bottom-color: var(--accent-cyan); }
977
+
978
+ /* Horizontal rule */
979
+ .msg-text :where(hr) {
980
+ border: none;
981
+ border-top: 1px solid var(--glass-border);
982
+ margin: 1em 0;
983
+ }
984
+
985
+ /* Blockquote */
986
+ .msg-text :where(blockquote) {
987
+ border-left: 2px solid rgba(0,212,255,0.3);
988
+ margin: 0.6em 0;
989
+ padding: 6px 14px;
990
+ background: rgba(0,212,255,0.03);
991
+ color: var(--text-muted);
992
+ border-radius: 0 6px 6px 0;
993
+ }
994
+ .msg-text :where(blockquote blockquote) {
995
+ border-left-color: rgba(139,92,246,0.4);
996
+ background: rgba(139,92,246,0.03);
997
+ margin-top: 6px;
998
+ }
999
+
1000
+ /* ── Tables ─────────────────────────────────────────────────────────── */
1001
+ .msg-text :where(table) {
1002
+ width: 100%;
1003
+ border-collapse: collapse;
1004
+ font-size: 13px;
1005
+ margin-top: 0.75em;
1006
+ border: 1px solid var(--glass-border);
1007
+ border-radius: 8px;
1008
+ overflow: hidden;
1009
+ }
1010
+
1011
+ .msg-text :where(thead) {
1012
+ background: rgba(0,212,255,0.06);
1013
+ }
1014
+
1015
+ .msg-text :where(th) {
1016
+ font-family: var(--font-mono);
1017
+ font-size: 10.5px;
1018
+ font-weight: 600;
1019
+ letter-spacing: 0.08em;
1020
+ text-transform: uppercase;
1021
+ color: var(--accent-cyan);
1022
+ border: 1px solid var(--glass-border);
1023
+ padding: 8px 12px;
1024
+ text-align: left;
1025
+ background: rgba(0,0,0,0.15);
1026
+ }
1027
+
1028
+ .msg-text :where(td) {
1029
+ border: 1px solid var(--glass-border);
1030
+ padding: 7px 12px;
1031
+ vertical-align: top;
1032
+ color: var(--text);
1033
+ line-height: 1.5;
1034
+ }
1035
+
1036
+ .msg-text :where(tr:nth-child(even) td) {
1037
+ background: rgba(255,255,255,0.015);
1038
+ }
1039
+
1040
+ .msg-text :where(tr:hover td) {
1041
+ background: rgba(0,212,255,0.03);
1042
+ }
1043
+
1044
+ /* ── Inline code ────────────────────────────────────────────────────── */
1045
+ .inline-code,
1046
+ .msg-text :where(:not(pre) > code) {
1047
+ font-family: var(--font-mono);
1048
+ font-size: 0.875em;
1049
+ background: rgba(255,255,255,0.08);
1050
+ border: 1px solid rgba(255,255,255,0.1);
1051
+ border-radius: 4px;
1052
+ padding: 0.1em 0.4em;
1053
+ color: var(--accent-cyan);
1054
+ }
1055
+
1056
+ /* ── Code blocks — full-featured ────────────────────────────────────── */
1057
+ .code-block {
1058
+ margin: 0.75em 0;
1059
+ border: 1px solid var(--glass-border);
1060
+ border-radius: 10px;
1061
+ overflow: hidden;
1062
+ background: rgba(0,0,0,0.45);
1063
+ font-family: var(--font-mono);
1064
+ }
1065
+
1066
+ /* Full-width breakout — code gets the whole column regardless of bubble */
1067
+ .code-block-full {
1068
+ width: 100%;
1069
+ max-width: 100%;
1070
+ }
1071
+
1072
+ /* ── Header ── */
1073
+ .code-header {
1074
+ display: flex;
1075
+ align-items: center;
1076
+ justify-content: space-between;
1077
+ padding: 7px 12px;
1078
+ background: rgba(255,255,255,0.04);
1079
+ border-bottom: 1px solid var(--glass-border);
1080
+ gap: 10px;
1081
+ }
1082
+
1083
+ .code-header-left { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
1084
+ .code-header-right { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
1085
+
1086
+ /* Language badge with per-language color */
1087
+ .code-lang-badge {
1088
+ font-family: var(--font-mono);
1089
+ font-size: 10px;
1090
+ font-weight: 700;
1091
+ letter-spacing: 0.06em;
1092
+ text-transform: uppercase;
1093
+ color: var(--lang-color, var(--accent-cyan));
1094
+ display: flex;
1095
+ align-items: center;
1096
+ gap: 2px;
1097
+ flex-shrink: 0;
1098
+ text-shadow: 0 0 8px var(--lang-color, var(--accent-cyan));
1099
+ }
1100
+
1101
+ /* Filename */
1102
+ .code-filename {
1103
+ font-family: var(--font-mono);
1104
+ font-size: 11px;
1105
+ color: var(--text-muted);
1106
+ background: rgba(255,255,255,0.05);
1107
+ border: 1px solid var(--glass-border);
1108
+ border-radius: 4px;
1109
+ padding: 1px 7px;
1110
+ white-space: nowrap;
1111
+ overflow: hidden;
1112
+ text-overflow: ellipsis;
1113
+ max-width: 200px;
1114
+ }
1115
+
1116
+ /* Line count */
1117
+ .code-lines-count {
1118
+ font-family: var(--font-mono);
1119
+ font-size: 9.5px;
1120
+ color: var(--text-dim);
1121
+ white-space: nowrap;
1122
+ }
1123
+
1124
+ /* Expand button */
1125
+ .code-expand-btn {
1126
+ font-size: 14px;
1127
+ background: transparent;
1128
+ border: none;
1129
+ color: var(--text-dim);
1130
+ cursor: pointer;
1131
+ padding: 0 4px;
1132
+ line-height: 1;
1133
+ transition: color 0.2s;
1134
+ }
1135
+ .code-expand-btn:hover { color: var(--text); }
1136
+
1137
+ /* Copy button */
1138
+ .code-copy {
1139
+ display: flex;
1140
+ align-items: center;
1141
+ gap: 5px;
1142
+ font-family: var(--font-mono);
1143
+ font-size: 10px;
1144
+ color: var(--text-dim);
1145
+ background: transparent;
1146
+ border: none;
1147
+ cursor: pointer;
1148
+ padding: 3px 8px;
1149
+ border-radius: 4px;
1150
+ transition: color 0.2s, background 0.2s;
1151
+ white-space: nowrap;
1152
+ }
1153
+ .code-copy:hover { color: var(--text); background: rgba(255,255,255,0.06); }
1154
+ .code-copy.copied { color: var(--accent-green); }
1155
+
1156
+ /* ── Code body ── */
1157
+ .code-body { overflow: hidden; }
1158
+ .code-body-collapsed { max-height: 400px; overflow: hidden; position: relative; }
1159
+ .code-body-collapsed::after {
1160
+ content: '';
1161
+ position: absolute;
1162
+ bottom: 0; left: 0; right: 0;
1163
+ height: 80px;
1164
+ background: linear-gradient(to bottom, transparent, rgba(0,0,0,0.8));
1165
+ pointer-events: none;
1166
+ }
1167
+ .code-expanded .code-body-collapsed { max-height: none; overflow: auto; }
1168
+ .code-expanded .code-body-collapsed::after { display: none; }
1169
+
1170
+ /* Show more button */
1171
+ .code-show-more {
1172
+ display: block;
1173
+ width: 100%;
1174
+ padding: 8px;
1175
+ background: rgba(255,255,255,0.03);
1176
+ border: none;
1177
+ border-top: 1px solid var(--glass-border);
1178
+ color: var(--text-dim);
1179
+ font-family: var(--font-mono);
1180
+ font-size: 10px;
1181
+ cursor: pointer;
1182
+ letter-spacing: 0.06em;
1183
+ transition: background 0.2s, color 0.2s;
1184
+ text-align: center;
1185
+ }
1186
+ .code-show-more:hover { background: rgba(255,255,255,0.06); color: var(--text); }
1187
+
1188
+ /* ── Line numbers ── */
1189
+ .code-pre {
1190
+ margin: 0;
1191
+ padding: 12px 0;
1192
+ overflow-x: auto;
1193
+ font-size: 12.5px;
1194
+ line-height: 1.65;
1195
+ }
1196
+
1197
+ .code-numbered { display: block; }
1198
+
1199
+ .code-line {
1200
+ display: flex;
1201
+ min-height: 1.65em;
1202
+ }
1203
+
1204
+ .code-line:hover { background: rgba(255,255,255,0.03); }
1205
+
1206
+ .line-num {
1207
+ display: inline-block;
1208
+ min-width: 44px;
1209
+ padding: 0 12px 0 14px;
1210
+ color: rgba(255,255,255,0.2);
1211
+ text-align: right;
1212
+ user-select: none;
1213
+ border-right: 1px solid rgba(255,255,255,0.06);
1214
+ flex-shrink: 0;
1215
+ font-size: 11px;
1216
+ line-height: inherit;
1217
+ }
1218
+
1219
+ .line-content {
1220
+ display: inline-block;
1221
+ padding: 0 16px;
1222
+ white-space: pre;
1223
+ flex: 1;
1224
+ }
1225
+
1226
+ .hljs { background: transparent !important; padding: 0 !important; }
1227
+
1228
+ /* ── Thinking block ─────────────────────────────────────────────────── */
1229
+ .msg-thinking { margin: 4px 0 8px; }
1230
+
1231
+ .thinking-toggle {
1232
+ display: flex;
1233
+ align-items: center;
1234
+ gap: 7px;
1235
+ background: transparent;
1236
+ border: none;
1237
+ cursor: pointer;
1238
+ padding: 4px 0;
1239
+ color: var(--text-dim);
1240
+ font-size: 11px;
1241
+ font-family: var(--font-mono);
1242
+ letter-spacing: 0.05em;
1243
+ transition: color 0.2s;
1244
+ }
1245
+ .thinking-toggle:hover { color: var(--text-muted); }
1246
+ .thinking-icon { color: var(--accent-purple); }
1247
+ .thinking-chevron { font-size: 9px; transition: transform 0.2s; }
1248
+
1249
+ .thinking-body {
1250
+ max-height: 0;
1251
+ overflow: hidden;
1252
+ transition: max-height 0.35s ease;
1253
+ }
1254
+ .thinking-body.thinking-open { max-height: 600px; overflow-y: auto; }
1255
+
1256
+ .thinking-text {
1257
+ margin-top: 6px;
1258
+ padding: 10px 14px;
1259
+ border: 1px dashed rgba(139,92,246,0.25);
1260
+ border-radius: 8px;
1261
+ background: rgba(139,92,246,0.04);
1262
+ font-size: 12px;
1263
+ line-height: 1.65;
1264
+ color: var(--text-muted);
1265
+ white-space: pre-wrap;
1266
+ font-family: var(--font-mono);
1267
+ }
1268
+
1269
+ /* ── Tool call card ─────────────────────────────────────────────────── */
1270
+ .msg-tool-card {
1271
+ margin: 4px 0;
1272
+ border: 1px solid var(--glass-border);
1273
+ border-radius: 8px;
1274
+ overflow: hidden;
1275
+ background: rgba(255,255,255,0.02);
1276
+ }
1277
+
1278
+ .tool-header {
1279
+ display: flex;
1280
+ align-items: center;
1281
+ gap: 8px;
1282
+ width: 100%;
1283
+ padding: 8px 12px;
1284
+ background: transparent;
1285
+ border: none;
1286
+ cursor: pointer;
1287
+ text-align: left;
1288
+ color: var(--text-muted);
1289
+ font-size: 12px;
1290
+ transition: background 0.2s;
1291
+ }
1292
+ .tool-header:hover { background: rgba(255,255,255,0.03); }
1293
+ .tool-icon { font-size: 13px; flex-shrink: 0; }
1294
+ .tool-name { flex: 1; font-family: var(--font-mono); font-size: 11px; color: var(--text); }
1295
+ .tool-chevron { font-size: 9px; color: var(--text-dim); }
1296
+
1297
+ .tool-body {
1298
+ max-height: 0;
1299
+ overflow: hidden;
1300
+ transition: max-height 0.3s ease;
1301
+ border-top: 0 solid var(--glass-border);
1302
+ }
1303
+ .tool-body.tool-open { max-height: 320px; overflow-y: auto; border-top-width: 1px; }
1304
+
1305
+ .tool-input {
1306
+ margin: 0;
1307
+ padding: 10px 14px;
1308
+ font-family: var(--font-mono);
1309
+ font-size: 11.5px;
1310
+ line-height: 1.5;
1311
+ color: var(--text-muted);
1312
+ white-space: pre-wrap;
1313
+ word-break: break-all;
1314
+ background: rgba(0,0,0,0.25);
1315
+ }
1316
+
1317
+ /* ── Tool result ────────────────────────────────────────────────────── */
1318
+ .msg-tool-result {
1319
+ margin: 2px 0 6px;
1320
+ border: 1px solid rgba(52,211,153,0.14);
1321
+ border-radius: 8px;
1322
+ overflow: hidden;
1323
+ background: rgba(52,211,153,0.02);
1324
+ }
1325
+
1326
+ .result-header {
1327
+ display: flex;
1328
+ align-items: center;
1329
+ gap: 8px;
1330
+ padding: 6px 12px;
1331
+ font-size: 11px;
1332
+ color: var(--text-dim);
1333
+ }
1334
+ .result-icon { color: var(--accent-green); font-size: 12px; }
1335
+ .result-label { font-family: var(--font-mono); letter-spacing: 0.06em; flex: 1; }
1336
+
1337
+ .result-expand {
1338
+ font-family: var(--font-mono);
1339
+ font-size: 9px;
1340
+ background: transparent;
1341
+ border: 1px solid var(--glass-border);
1342
+ border-radius: 4px;
1343
+ color: var(--text-dim);
1344
+ cursor: pointer;
1345
+ padding: 2px 8px;
1346
+ transition: color 0.2s;
1347
+ }
1348
+ .result-expand:hover { color: var(--text); }
1349
+
1350
+ .result-preview { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; border-top: 0 solid rgba(52,211,153,0.14); }
1351
+ .result-open { max-height: 260px; overflow-y: auto; border-top-width: 1px; }
1352
+
1353
+ .result-text {
1354
+ margin: 0;
1355
+ padding: 8px 14px;
1356
+ font-family: var(--font-mono);
1357
+ font-size: 11.5px;
1358
+ line-height: 1.5;
1359
+ color: var(--text-muted);
1360
+ white-space: pre-wrap;
1361
+ word-break: break-all;
1362
+ background: rgba(0,0,0,0.2);
1363
+ }
1364
+
1365
+ /* ── Message image ──────────────────────────────────────────────────── */
1366
+ .msg-image img {
1367
+ max-width: 100%;
1368
+ border-radius: 8px;
1369
+ border: 1px solid var(--glass-border);
1370
+ margin: 4px 0;
1371
+ }
1372
+
1373
+ /* ── Copy button ────────────────────────────────────────────────────── */
1374
+ .msg-copy-btn {
1375
+ position: absolute;
1376
+ top: 8px;
1377
+ right: 8px;
1378
+ background: rgba(255,255,255,0.06);
1379
+ border: 1px solid var(--glass-border);
1380
+ border-radius: 6px;
1381
+ color: var(--text-dim);
1382
+ cursor: pointer;
1383
+ padding: 5px 6px;
1384
+ opacity: 0;
1385
+ transition: opacity 0.2s, color 0.2s, background 0.2s;
1386
+ display: flex;
1387
+ align-items: center;
1388
+ line-height: 1;
1389
+ }
1390
+ .stream-bubble:hover .msg-copy-btn,
1391
+ .msg-copy-visible { opacity: 1; }
1392
+ .msg-copy-btn:hover { color: var(--text); background: rgba(255,255,255,0.1); }
1393
+ .msg-copy-btn.copied { color: var(--accent-green); }
1394
+
1395
+ /* ── Timestamp ──────────────────────────────────────────────────────── */
1396
+ .msg-timestamp {
1397
+ font-family: var(--font-mono);
1398
+ font-size: 9.5px;
1399
+ color: var(--text-dim);
1400
+ margin-top: 10px;
1401
+ letter-spacing: 0.05em;
1402
+ }
1403
+
1404
+
1405
+ /* ── Task lists ─────────────────────────────────────────────────────── */
1406
+ .msg-text :where(li.task-item) {
1407
+ list-style: none;
1408
+ margin-left: -1.4em;
1409
+ padding-left: 0.2em;
1410
+ display: flex;
1411
+ align-items: baseline;
1412
+ gap: 7px;
1413
+ }
1414
+
1415
+ .task-cb {
1416
+ appearance: none;
1417
+ -webkit-appearance: none;
1418
+ width: 14px;
1419
+ height: 14px;
1420
+ border: 1.5px solid var(--glass-border-strong);
1421
+ border-radius: 3px;
1422
+ background: transparent;
1423
+ flex-shrink: 0;
1424
+ position: relative;
1425
+ top: 2px;
1426
+ cursor: default;
1427
+ }
1428
+
1429
+ .task-cb:checked {
1430
+ background: var(--accent-cyan);
1431
+ border-color: var(--accent-cyan);
1432
+ }
1433
+
1434
+ .task-cb:checked::after {
1435
+ content: '';
1436
+ position: absolute;
1437
+ top: 1px; left: 3px;
1438
+ width: 5px; height: 8px;
1439
+ border: 2px solid #000;
1440
+ border-top: none;
1441
+ border-left: none;
1442
+ transform: rotate(45deg);
1443
+ }
1444
+
1445
+ .task-done > * { opacity: 0.55; }
1446
+ .task-done .task-cb + span,
1447
+ .task-done .task-cb ~ * { text-decoration: line-through; }
1448
+
1449
+ /* ── Table overflow wrapper ──────────────────────────────────────────── */
1450
+ .msg-text :where(table) {
1451
+ display: block;
1452
+ overflow-x: auto;
1453
+ white-space: nowrap;
1454
+ }
1455
+ /* Allow cells to wrap when content isn't too wide */
1456
+ .msg-text :where(th, td) {
1457
+ white-space: normal;
1458
+ min-width: 80px;
1459
+ }
1460
+
1461
+ /* ── Details / Summary (collapsible sections) ─────────────────────────── */
1462
+ .msg-text :where(details) {
1463
+ border: 1px solid var(--glass-border);
1464
+ border-radius: 8px;
1465
+ padding: 0;
1466
+ margin: 0.6em 0;
1467
+ overflow: hidden;
1468
+ background: rgba(255,255,255,0.02);
1469
+ }
1470
+
1471
+ .msg-text :where(summary) {
1472
+ padding: 8px 14px;
1473
+ cursor: pointer;
1474
+ font-weight: 600;
1475
+ font-size: 13px;
1476
+ color: var(--text-muted);
1477
+ list-style: none;
1478
+ display: flex;
1479
+ align-items: center;
1480
+ gap: 8px;
1481
+ user-select: none;
1482
+ transition: background 0.2s;
1483
+ }
1484
+ .msg-text :where(summary):hover { background: rgba(255,255,255,0.03); }
1485
+ .msg-text :where(summary)::before {
1486
+ content: '▸';
1487
+ font-size: 9px;
1488
+ color: var(--accent-cyan);
1489
+ transition: transform 0.2s;
1490
+ }
1491
+ .msg-text :where(details[open] summary)::before {
1492
+ transform: rotate(90deg);
1493
+ }
1494
+ .msg-text :where(details) > *:not(summary) {
1495
+ padding: 0 14px 10px;
1496
+ }
1497
+
1498
+ /* ── Spacing improvements ────────────────────────────────────────────── */
1499
+ .bubble-content + .bubble-content { margin-top: 0.5em; }
1500
+
1501
+ .msg-text :where(h1 + p, h2 + p, h3 + p) { margin-top: 0.4em; }
1502
+ .msg-text :where(p:last-child, ul:last-child, ol:last-child) { margin-bottom: 0; }
1503
+
1504
+ /* Separator after heading when followed by block content */
1505
+ .msg-text :where(h2, h3) {
1506
+ padding-top: 0.3em;
1507
+ }
1508
+
1509
+ /* Better nested list indent */
1510
+ .msg-text :where(ul ul, ol ol, ul ol, ol ul) {
1511
+ margin-top: 0.25em;
1512
+ margin-bottom: 0.25em;
1513
+ padding-left: 1.2em;
1514
+ }
1515
+
1516
+ /* ── Keyboard shortcut styling ───────────────────────────────────────── */
1517
+ .msg-text :where(kbd) {
1518
+ font-family: var(--font-mono);
1519
+ font-size: 0.8em;
1520
+ background: rgba(255,255,255,0.1);
1521
+ border: 1px solid rgba(255,255,255,0.2);
1522
+ border-bottom: 2px solid rgba(255,255,255,0.15);
1523
+ border-radius: 4px;
1524
+ padding: 1px 5px;
1525
+ color: var(--text);
1526
+ }
1527
+
1528
+ /* ── Abbr tooltip ────────────────────────────────────────────────────── */
1529
+ .msg-text :where(abbr[title]) {
1530
+ border-bottom: 1px dotted var(--text-muted);
1531
+ cursor: help;
1532
+ text-decoration: none;
1533
+ }
1534
+
1535
+ /* ── Scrollbar ────────────────────────────────────────────────────── */
1536
+ .response-area::-webkit-scrollbar { display: none; }
1537
+ .response-area { scrollbar-width: none; }
1538
+
1539
+ /* ══════════════════════════════════════════════════════════════════════
1540
+ COMMAND MENU SYSTEM
1541
+ ══════════════════════════════════════════════════════════════════════ */
1542
+
1543
+ /* ── Group accent colours ─────────────────────────────────────────── */
1544
+ :root {
1545
+ --cmd-chat: #00d4ff;
1546
+ --cmd-control: #60a5fa;
1547
+ --cmd-agent: #a78bfa;
1548
+ --cmd-settings: #f59e0b;
1549
+ --cmd-resources: #34d399;
1550
+ }
1551
+
1552
+ /* ── Menu Trigger Button ──────────────────────────────────────────── */
1553
+ .menu-trigger {
1554
+ position: fixed;
1555
+ top: 20px;
1556
+ left: 20px;
1557
+ z-index: 50;
1558
+ width: 38px;
1559
+ height: 38px;
1560
+ display: flex;
1561
+ align-items: center;
1562
+ justify-content: center;
1563
+ background: var(--glass-bg);
1564
+ backdrop-filter: var(--blur);
1565
+ -webkit-backdrop-filter: var(--blur);
1566
+ border: 1px solid var(--glass-border);
1567
+ border-radius: 10px;
1568
+ color: var(--text-muted);
1569
+ cursor: pointer;
1570
+ transition: color 0.2s, border-color 0.2s, box-shadow 0.2s, transform 0.2s;
1571
+ }
1572
+ .menu-trigger:hover {
1573
+ color: var(--accent-cyan);
1574
+ border-color: rgba(0,212,255,0.35);
1575
+ box-shadow: 0 0 12px rgba(0,212,255,0.15);
1576
+ }
1577
+ .menu-trigger:active { transform: scale(0.93); }
1578
+
1579
+ /* Icon swap: grid → close */
1580
+ .menu-icon-close { display: none; }
1581
+ .menu-trigger.menu-open .menu-icon-grid { display: none; }
1582
+ .menu-trigger.menu-open .menu-icon-close { display: block; color: var(--accent-cyan); }
1583
+ .menu-trigger.menu-open {
1584
+ color: var(--accent-cyan);
1585
+ border-color: rgba(0,212,255,0.4);
1586
+ box-shadow: 0 0 16px rgba(0,212,255,0.2);
1587
+ }
1588
+
1589
+ /* ── Full-Screen Overlay ──────────────────────────────────────────── */
1590
+ .cmd-overlay {
1591
+ position: fixed;
1592
+ inset: 0;
1593
+ z-index: 40;
1594
+ display: flex;
1595
+ align-items: center;
1596
+ justify-content: center;
1597
+ /* Hidden state */
1598
+ opacity: 0;
1599
+ pointer-events: none;
1600
+ transform: scale(0.97);
1601
+ transition: opacity 0.28s ease, transform 0.28s ease;
1602
+ }
1603
+ .cmd-overlay.open {
1604
+ opacity: 1;
1605
+ pointer-events: auto;
1606
+ transform: scale(1);
1607
+ }
1608
+
1609
+ /* Dark glass backdrop */
1610
+ .cmd-backdrop {
1611
+ position: absolute;
1612
+ inset: 0;
1613
+ background: rgba(6, 8, 14, 0.9);
1614
+ backdrop-filter: blur(24px);
1615
+ -webkit-backdrop-filter: blur(24px);
1616
+ }
1617
+
1618
+ /* Shell (content on top of backdrop) */
1619
+ .cmd-shell {
1620
+ position: relative;
1621
+ z-index: 1;
1622
+ width: 100%;
1623
+ max-width: 1080px;
1624
+ padding: 0 32px;
1625
+ display: flex;
1626
+ flex-direction: column;
1627
+ gap: 24px;
1628
+ }
1629
+
1630
+ /* ── Header Bar ───────────────────────────────────────────────────── */
1631
+ .cmd-header {
1632
+ display: flex;
1633
+ align-items: center;
1634
+ justify-content: space-between;
1635
+ padding-bottom: 16px;
1636
+ border-bottom: 1px solid var(--glass-border);
1637
+ }
1638
+ .cmd-brand {
1639
+ display: flex;
1640
+ align-items: center;
1641
+ gap: 10px;
1642
+ }
1643
+ .cmd-brand-glyph {
1644
+ font-size: 22px;
1645
+ color: var(--accent-cyan);
1646
+ text-shadow: 0 0 12px var(--accent-cyan);
1647
+ animation: aso-breathe 3s ease-in-out infinite;
1648
+ }
1649
+ .cmd-brand-name {
1650
+ font-family: var(--font-mono);
1651
+ font-size: 18px;
1652
+ font-weight: 700;
1653
+ color: var(--text);
1654
+ letter-spacing: 0.15em;
1655
+ }
1656
+ .cmd-brand-sep {
1657
+ font-size: 16px;
1658
+ color: var(--text-dim);
1659
+ margin: 0 2px;
1660
+ }
1661
+ .cmd-brand-sub {
1662
+ font-family: var(--font-mono);
1663
+ font-size: 11px;
1664
+ color: var(--text-dim);
1665
+ letter-spacing: 0.22em;
1666
+ padding-top: 2px;
1667
+ }
1668
+ .cmd-esc-hint {
1669
+ font-size: 11px;
1670
+ color: var(--text-dim);
1671
+ display: flex;
1672
+ align-items: center;
1673
+ gap: 5px;
1674
+ }
1675
+ .cmd-kbd {
1676
+ font-family: var(--font-mono);
1677
+ font-size: 10px;
1678
+ padding: 2px 6px;
1679
+ background: rgba(255,255,255,0.07);
1680
+ border: 1px solid rgba(255,255,255,0.12);
1681
+ border-radius: 4px;
1682
+ color: var(--text-muted);
1683
+ }
1684
+
1685
+ /* ── Command Grid ─────────────────────────────────────────────────── */
1686
+ .cmd-grid {
1687
+ display: grid;
1688
+ grid-template-columns: 200px 1fr 200px;
1689
+ grid-template-rows: auto auto;
1690
+ gap: 14px;
1691
+ width: 100%;
1692
+ }
1693
+
1694
+ .cmd-group--chat { grid-column: 1; grid-row: 1 / 3; }
1695
+ .cmd-group--control { grid-column: 2; grid-row: 1; }
1696
+ .cmd-group--agent { grid-column: 3; grid-row: 1; }
1697
+ .cmd-group--settings { grid-column: 2; grid-row: 2; }
1698
+ .cmd-group--resources { grid-column: 3; grid-row: 2; }
1699
+
1700
+ /* ── Group Card ───────────────────────────────────────────────────── */
1701
+ .cmd-group {
1702
+ background: var(--glass-bg);
1703
+ border: 1px solid var(--glass-border);
1704
+ border-radius: 16px;
1705
+ padding: 18px;
1706
+ display: flex;
1707
+ flex-direction: column;
1708
+ gap: 14px;
1709
+ /* Stagger-reveal when overlay opens */
1710
+ opacity: 0;
1711
+ transform: translateY(14px);
1712
+ transition: border-color 0.25s, box-shadow 0.25s;
1713
+ }
1714
+ .cmd-overlay.open .cmd-group {
1715
+ animation: cmd-card-in 0.32s ease forwards;
1716
+ }
1717
+ .cmd-overlay.open .cmd-group:nth-child(1) { animation-delay: 30ms; }
1718
+ .cmd-overlay.open .cmd-group:nth-child(2) { animation-delay: 80ms; }
1719
+ .cmd-overlay.open .cmd-group:nth-child(3) { animation-delay: 130ms; }
1720
+ .cmd-overlay.open .cmd-group:nth-child(4) { animation-delay: 180ms; }
1721
+ .cmd-overlay.open .cmd-group:nth-child(5) { animation-delay: 230ms; }
1722
+
1723
+ @keyframes cmd-card-in {
1724
+ from { opacity: 0; transform: translateY(14px); }
1725
+ to { opacity: 1; transform: translateY(0); }
1726
+ }
1727
+
1728
+ /* Per-group accent borders & hover glow */
1729
+ .cmd-group--chat:hover { border-color: rgba(0,212,255,0.35); box-shadow: 0 0 20px rgba(0,212,255,0.06); }
1730
+ .cmd-group--control:hover { border-color: rgba(96,165,250,0.35); box-shadow: 0 0 20px rgba(96,165,250,0.06); }
1731
+ .cmd-group--agent:hover { border-color: rgba(167,139,250,0.35); box-shadow: 0 0 20px rgba(167,139,250,0.06); }
1732
+ .cmd-group--settings:hover { border-color: rgba(245,158,11,0.35); box-shadow: 0 0 20px rgba(245,158,11,0.06); }
1733
+ .cmd-group--resources:hover { border-color: rgba(52,211,153,0.35); box-shadow: 0 0 20px rgba(52,211,153,0.06); }
1734
+
1735
+ /* ── Group Header ─────────────────────────────────────────────────── */
1736
+ .cmd-group-hd {
1737
+ display: flex;
1738
+ align-items: center;
1739
+ gap: 9px;
1740
+ padding-bottom: 10px;
1741
+ border-bottom: 1px solid var(--glass-border);
1742
+ }
1743
+ .cmd-group-svg {
1744
+ width: 16px;
1745
+ height: 16px;
1746
+ flex-shrink: 0;
1747
+ }
1748
+ .cmd-group-label {
1749
+ font-family: var(--font-mono);
1750
+ font-size: 10px;
1751
+ font-weight: 700;
1752
+ letter-spacing: 0.2em;
1753
+ }
1754
+
1755
+ /* Accent colours on group labels and icons */
1756
+ .cmd-group--chat .cmd-group-hd { color: var(--cmd-chat); }
1757
+ .cmd-group--control .cmd-group-hd { color: var(--cmd-control); }
1758
+ .cmd-group--agent .cmd-group-hd { color: var(--cmd-agent); }
1759
+ .cmd-group--settings .cmd-group-hd { color: var(--cmd-settings); }
1760
+ .cmd-group--resources .cmd-group-hd { color: var(--cmd-resources); }
1761
+
1762
+ /* ── Items List ───────────────────────────────────────────────────── */
1763
+ .cmd-items {
1764
+ display: flex;
1765
+ flex-direction: column;
1766
+ gap: 6px;
1767
+ flex: 1;
1768
+ }
1769
+
1770
+ /* 3-column sub-grid for CONTROL (6 items) */
1771
+ .cmd-items--grid {
1772
+ display: grid;
1773
+ grid-template-columns: 1fr 1fr 1fr;
1774
+ gap: 8px;
1775
+ }
1776
+
1777
+ /* ── Individual Item ──────────────────────────────────────────────── */
1778
+ .cmd-item {
1779
+ display: flex;
1780
+ align-items: center;
1781
+ gap: 10px;
1782
+ padding: 10px 12px;
1783
+ border-radius: 10px;
1784
+ border: 1px solid transparent;
1785
+ background: rgba(255,255,255,0.025);
1786
+ text-decoration: none;
1787
+ cursor: pointer;
1788
+ transition: background 0.18s, border-color 0.18s, transform 0.15s;
1789
+ }
1790
+ .cmd-item:hover {
1791
+ background: rgba(255,255,255,0.06);
1792
+ transform: translateY(-1px);
1793
+ }
1794
+ /* Per-group item hover accent */
1795
+ .cmd-group--chat .cmd-item:hover { border-color: rgba(0,212,255,0.3); }
1796
+ .cmd-group--control .cmd-item:hover { border-color: rgba(96,165,250,0.3); }
1797
+ .cmd-group--agent .cmd-item:hover { border-color: rgba(167,139,250,0.3); }
1798
+ .cmd-group--settings .cmd-item:hover { border-color: rgba(245,158,11,0.3); }
1799
+ .cmd-group--resources .cmd-item:hover { border-color: rgba(52,211,153,0.3); }
1800
+
1801
+ .cmd-item-icon {
1802
+ font-size: 16px;
1803
+ flex-shrink: 0;
1804
+ width: 20px;
1805
+ text-align: center;
1806
+ opacity: 0.7;
1807
+ }
1808
+ .cmd-group--chat .cmd-item-icon { color: var(--cmd-chat); }
1809
+ .cmd-group--control .cmd-item-icon { color: var(--cmd-control); }
1810
+ .cmd-group--agent .cmd-item-icon { color: var(--cmd-agent); }
1811
+ .cmd-group--settings .cmd-item-icon { color: var(--cmd-settings); }
1812
+ .cmd-group--resources .cmd-item-icon { color: var(--cmd-resources); }
1813
+
1814
+ .cmd-item-body {
1815
+ display: flex;
1816
+ flex-direction: column;
1817
+ gap: 2px;
1818
+ min-width: 0;
1819
+ flex: 1;
1820
+ }
1821
+ .cmd-item-name {
1822
+ font-family: var(--font-mono);
1823
+ font-size: 12px;
1824
+ font-weight: 600;
1825
+ color: var(--text);
1826
+ white-space: nowrap;
1827
+ overflow: hidden;
1828
+ text-overflow: ellipsis;
1829
+ }
1830
+ .cmd-item-desc {
1831
+ font-size: 10px;
1832
+ color: var(--text-dim);
1833
+ white-space: nowrap;
1834
+ overflow: hidden;
1835
+ text-overflow: ellipsis;
1836
+ }
1837
+ .cmd-item-badge {
1838
+ font-family: var(--font-mono);
1839
+ font-size: 8px;
1840
+ font-weight: 700;
1841
+ letter-spacing: 0.1em;
1842
+ padding: 2px 6px;
1843
+ border-radius: 99px;
1844
+ background: rgba(0,212,255,0.12);
1845
+ color: var(--accent-cyan);
1846
+ border: 1px solid rgba(0,212,255,0.25);
1847
+ flex-shrink: 0;
1848
+ }