@hanzo/browser-extension 1.9.33 → 1.9.34

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 (68) hide show
  1. package/dist/browser-extension/README.md +43 -0
  2. package/dist/browser-extension/background-firefox.js +5983 -0
  3. package/dist/browser-extension/background.js +8670 -0
  4. package/dist/browser-extension/browser-control.js +1317 -0
  5. package/dist/browser-extension/chrome/ai-worker.js +571 -0
  6. package/dist/browser-extension/chrome/background.js +8670 -0
  7. package/dist/browser-extension/chrome/callback.html +17 -0
  8. package/dist/browser-extension/chrome/content-script.js +2789 -0
  9. package/dist/browser-extension/chrome/icon128.png +0 -0
  10. package/dist/browser-extension/chrome/icon16.png +0 -0
  11. package/dist/browser-extension/chrome/icon48.png +0 -0
  12. package/dist/browser-extension/chrome/manifest.json +81 -0
  13. package/dist/browser-extension/chrome/newtab.css +277 -0
  14. package/dist/browser-extension/chrome/newtab.html +13 -0
  15. package/dist/browser-extension/chrome/newtab.js +64 -0
  16. package/dist/browser-extension/chrome/popup.css +761 -0
  17. package/dist/browser-extension/chrome/popup.html +381 -0
  18. package/dist/browser-extension/chrome/popup.js +1716 -0
  19. package/dist/browser-extension/chrome/sidebar.css +1792 -0
  20. package/dist/browser-extension/chrome/sidebar.html +463 -0
  21. package/dist/browser-extension/chrome/sidebar.js +26541 -0
  22. package/dist/browser-extension/cli.js +233 -0
  23. package/dist/browser-extension/firefox/ai-worker.js +571 -0
  24. package/dist/browser-extension/firefox/background.js +5983 -0
  25. package/dist/browser-extension/firefox/callback.html +17 -0
  26. package/dist/browser-extension/firefox/content-script.js +2789 -0
  27. package/dist/browser-extension/firefox/icon128.png +0 -0
  28. package/dist/browser-extension/firefox/icon16.png +0 -0
  29. package/dist/browser-extension/firefox/icon48.png +0 -0
  30. package/dist/browser-extension/firefox/manifest.json +85 -0
  31. package/dist/browser-extension/firefox/newtab.css +277 -0
  32. package/dist/browser-extension/firefox/newtab.html +13 -0
  33. package/dist/browser-extension/firefox/newtab.js +64 -0
  34. package/dist/browser-extension/firefox/popup.css +761 -0
  35. package/dist/browser-extension/firefox/popup.html +381 -0
  36. package/dist/browser-extension/firefox/popup.js +1716 -0
  37. package/dist/browser-extension/firefox/sidebar.css +1792 -0
  38. package/dist/browser-extension/firefox/sidebar.html +463 -0
  39. package/dist/browser-extension/firefox/sidebar.js +26541 -0
  40. package/dist/browser-extension/icon128.png +0 -0
  41. package/dist/browser-extension/icon16.png +0 -0
  42. package/dist/browser-extension/icon48.png +0 -0
  43. package/dist/browser-extension/manifest.json +81 -0
  44. package/dist/browser-extension/newtab.js +64 -0
  45. package/dist/browser-extension/package.json +41 -0
  46. package/dist/browser-extension/popup.js +1716 -0
  47. package/dist/browser-extension/safari/Info.plist +21 -0
  48. package/dist/browser-extension/safari/ai-worker.js +571 -0
  49. package/dist/browser-extension/safari/background.js +8670 -0
  50. package/dist/browser-extension/safari/callback.html +17 -0
  51. package/dist/browser-extension/safari/content-script.js +2789 -0
  52. package/dist/browser-extension/safari/icon128.png +0 -0
  53. package/dist/browser-extension/safari/icon16.png +0 -0
  54. package/dist/browser-extension/safari/icon48.png +0 -0
  55. package/dist/browser-extension/safari/newtab.css +277 -0
  56. package/dist/browser-extension/safari/newtab.html +13 -0
  57. package/dist/browser-extension/safari/newtab.js +64 -0
  58. package/dist/browser-extension/safari/popup.css +761 -0
  59. package/dist/browser-extension/safari/popup.html +381 -0
  60. package/dist/browser-extension/safari/popup.js +1716 -0
  61. package/dist/browser-extension/safari/sidebar.css +1792 -0
  62. package/dist/browser-extension/safari/sidebar.html +463 -0
  63. package/dist/browser-extension/safari/sidebar.js +26541 -0
  64. package/dist/browser-extension/sidebar.js +26541 -0
  65. package/dist/browser-extension/webgpu-ai.js +568 -0
  66. package/package.json +2 -1
  67. package/src/manifest-firefox.json +1 -1
  68. package/src/manifest.json +1 -1
@@ -0,0 +1,1792 @@
1
+ /* Hanzo AI Browser Extension Sidebar — Hanzo brand: strictly monochrome.
2
+ See ~/work/hanzo/brand/brand.json — primaryColor #FFFFFF, no chromatic
3
+ accents. Status states are conveyed by intensity, not hue. */
4
+
5
+ :root {
6
+ --bg-primary: #0a0a0a;
7
+ --bg-secondary: #0f0f0f;
8
+ --bg-tertiary: #171717;
9
+ --bg-hover: #262626;
10
+
11
+ --text-primary: #fafafa;
12
+ --text-secondary: #a3a3a3;
13
+ --text-tertiary: #666666;
14
+
15
+ --accent: #fafafa;
16
+ --accent-hover: #d4d4d4;
17
+ --accent-dim: rgba(255,255,255,0.06);
18
+ --accent-glow: rgba(255,255,255,0.03);
19
+
20
+ /* Status: monochrome by hue, distinguished by opacity / weight.
21
+ Brand is strict monochrome, so success/warn/error use luminance. */
22
+ --success: #fafafa;
23
+ --warning: #d4d4d4;
24
+ --error: rgba(255,255,255,0.55);
25
+
26
+ --border: rgba(255,255,255,0.10);
27
+ --border-strong: rgba(255,255,255,0.16);
28
+ --input-border: rgba(255,255,255,0.15);
29
+ --glass: rgba(255,255,255,0.04);
30
+ --glass-strong: rgba(255,255,255,0.07);
31
+ --shadow: 0 4px 12px rgba(0,0,0,0.6);
32
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.5);
33
+ --radius: 10px;
34
+ --radius-md: 8px;
35
+ --radius-sm: 6px;
36
+ }
37
+
38
+ * {
39
+ margin: 0;
40
+ padding: 0;
41
+ box-sizing: border-box;
42
+ }
43
+
44
+ body {
45
+ font-family: 'Geist Sans', -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', sans-serif;
46
+ background: var(--bg-primary);
47
+ color: var(--text-primary);
48
+ font-size: 13px;
49
+ line-height: 1.6;
50
+ overflow: hidden;
51
+ width: 100%;
52
+ height: 100vh;
53
+ -webkit-font-smoothing: antialiased;
54
+ -moz-osx-font-smoothing: grayscale;
55
+ }
56
+
57
+ html {
58
+ overflow: hidden;
59
+ height: 100vh;
60
+ }
61
+
62
+ .hidden { display: none !important; }
63
+
64
+ /* ==================== Shimmer Keyframes ==================== */
65
+
66
+ @keyframes shimmer {
67
+ 0% { background-position: -200% 0; }
68
+ 100% { background-position: 200% 0; }
69
+ }
70
+
71
+ @keyframes breathe {
72
+ 0%, 100% { opacity: 0.5; }
73
+ 50% { opacity: 1; }
74
+ }
75
+
76
+ @keyframes fadeIn {
77
+ from { opacity: 0; transform: translateY(4px); }
78
+ to { opacity: 1; transform: translateY(0); }
79
+ }
80
+
81
+ @keyframes slideUp {
82
+ from { transform: translateY(20px); opacity: 0; }
83
+ to { transform: translateY(0); opacity: 1; }
84
+ }
85
+
86
+ @keyframes typingBounce {
87
+ 0%, 60%, 100% { transform: translateY(0); }
88
+ 30% { transform: translateY(-4px); }
89
+ }
90
+
91
+ @keyframes glowPulse {
92
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,255,0); }
93
+ 50% { box-shadow: 0 0 12px 2px rgba(255,255,255,0.06); }
94
+ }
95
+
96
+ @keyframes pulse {
97
+ 0%, 100% { opacity: 1; }
98
+ 50% { opacity: 0.5; }
99
+ }
100
+
101
+ /* ==================== Layout ==================== */
102
+
103
+ .sidebar-container {
104
+ width: 100%;
105
+ min-width: 0;
106
+ height: 100vh;
107
+ display: flex;
108
+ flex-direction: column;
109
+ background: var(--bg-secondary);
110
+ border-left: 1px solid var(--border);
111
+ position: relative;
112
+ overflow: hidden;
113
+ }
114
+
115
+ /* Ambient glow behind sidebar */
116
+ .sidebar-container::before {
117
+ content: '';
118
+ position: absolute;
119
+ top: 0;
120
+ left: 0;
121
+ right: 0;
122
+ height: 200px;
123
+ background: radial-gradient(ellipse at 50% 0%, rgba(255,255,255,0.03) 0%, transparent 70%);
124
+ pointer-events: none;
125
+ z-index: 0;
126
+ }
127
+
128
+ /* ==================== Header ==================== */
129
+
130
+ .sidebar-header {
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: space-between;
134
+ padding: 12px 16px;
135
+ border-bottom: 1px solid var(--border);
136
+ background: rgba(0,0,0,0.6);
137
+ backdrop-filter: blur(20px) saturate(180%);
138
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
139
+ flex-shrink: 0;
140
+ position: relative;
141
+ z-index: 10;
142
+ }
143
+
144
+ .brand {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 10px;
148
+ font-weight: 600;
149
+ font-size: 15px;
150
+ letter-spacing: -0.01em;
151
+ }
152
+
153
+ .logo {
154
+ width: 22px;
155
+ height: 22px;
156
+ color: var(--accent);
157
+ filter: drop-shadow(0 0 6px rgba(255,255,255,0.15));
158
+ transition: filter 0.3s ease;
159
+ }
160
+
161
+ .logo:hover {
162
+ filter: drop-shadow(0 0 10px rgba(255,255,255,0.3));
163
+ }
164
+
165
+ .header-right {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: 8px;
169
+ }
170
+
171
+ .user-badge {
172
+ width: 28px;
173
+ height: 28px;
174
+ border-radius: 50%;
175
+ overflow: hidden;
176
+ cursor: pointer;
177
+ border: 1px solid var(--border);
178
+ transition: border-color 0.2s, box-shadow 0.2s;
179
+ }
180
+
181
+ .user-badge:hover {
182
+ border-color: var(--border-strong);
183
+ box-shadow: 0 0 8px rgba(255,255,255,0.08);
184
+ }
185
+
186
+ .header-avatar {
187
+ width: 100%;
188
+ height: 100%;
189
+ object-fit: cover;
190
+ }
191
+
192
+ /* ==================== Auth ==================== */
193
+
194
+ .auth-section {
195
+ flex: 1;
196
+ display: flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ padding: 32px 20px;
200
+ }
201
+
202
+ .auth-card {
203
+ text-align: center;
204
+ }
205
+
206
+ .auth-logo {
207
+ width: 56px;
208
+ height: 56px;
209
+ color: var(--text-primary);
210
+ margin-bottom: 20px;
211
+ }
212
+
213
+ .auth-card h2 {
214
+ font-size: 18px;
215
+ font-weight: 600;
216
+ margin-bottom: 8px;
217
+ }
218
+
219
+ .auth-card p {
220
+ color: var(--text-secondary);
221
+ font-size: 13px;
222
+ margin-bottom: 24px;
223
+ line-height: 1.5;
224
+ }
225
+
226
+ /* In-chat login prompt */
227
+ .chat-login-prompt {
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ padding: 40px 24px;
232
+ flex: 1;
233
+ animation: fadeIn 0.4s ease;
234
+ }
235
+
236
+ .auth-card.compact {
237
+ text-align: center;
238
+ max-width: 280px;
239
+ width: 100%;
240
+ }
241
+
242
+ .auth-card.compact .auth-logo {
243
+ width: 56px;
244
+ height: 56px;
245
+ color: var(--text-primary);
246
+ margin: 0 auto 24px;
247
+ display: block;
248
+ filter: drop-shadow(0 0 12px rgba(255, 255, 255, 0.15));
249
+ }
250
+
251
+ .auth-card.compact .auth-headline {
252
+ font-size: 22px;
253
+ font-weight: 700;
254
+ color: var(--text-primary);
255
+ margin-bottom: 10px;
256
+ letter-spacing: -0.02em;
257
+ }
258
+
259
+ .auth-card.compact .auth-sub {
260
+ font-size: 13px;
261
+ color: var(--text-secondary);
262
+ margin-bottom: 24px;
263
+ line-height: 1.5;
264
+ }
265
+
266
+ /* Sign-in button — matches @hanzo/gui primary button on dark (monochrome) */
267
+ .auth-signin-btn {
268
+ width: 100%;
269
+ padding: 10px 16px;
270
+ height: 40px;
271
+ background: var(--accent);
272
+ color: #0a0a0a;
273
+ border: none;
274
+ border-radius: var(--radius-md);
275
+ font-size: 14px;
276
+ font-weight: 600;
277
+ cursor: pointer;
278
+ transition: background 0.15s, box-shadow 0.15s;
279
+ margin-bottom: 10px;
280
+ letter-spacing: -0.01em;
281
+ }
282
+
283
+ .auth-signin-btn:hover {
284
+ background: var(--accent-hover);
285
+ box-shadow: 0 0 12px rgba(255, 255, 255, 0.1);
286
+ }
287
+
288
+ .auth-signin-btn:active {
289
+ transform: scale(0.98);
290
+ }
291
+
292
+ .auth-signin-btn:disabled {
293
+ opacity: 0.5;
294
+ cursor: not-allowed;
295
+ }
296
+
297
+ /* Ghost create account button */
298
+ .auth-create-btn {
299
+ width: 100%;
300
+ padding: 10px 16px;
301
+ height: 36px;
302
+ background: transparent;
303
+ color: var(--text-secondary);
304
+ border: 1px solid var(--border);
305
+ border-radius: var(--radius-md);
306
+ font-size: 13px;
307
+ font-weight: 500;
308
+ cursor: pointer;
309
+ transition: all 0.15s;
310
+ margin-bottom: 16px;
311
+ }
312
+
313
+ .auth-create-btn:hover {
314
+ color: var(--text-primary);
315
+ background: var(--glass);
316
+ border-color: var(--border-strong);
317
+ }
318
+
319
+ .auth-card.compact .auth-note {
320
+ font-size: 11px;
321
+ color: var(--text-tertiary);
322
+ margin-bottom: 0;
323
+ line-height: 1.5;
324
+ }
325
+
326
+ .auth-card.compact .auth-note a {
327
+ color: var(--text-secondary);
328
+ text-decoration: underline;
329
+ text-underline-offset: 2px;
330
+ }
331
+
332
+ .auth-card.compact .auth-note a:hover {
333
+ color: var(--text-primary);
334
+ }
335
+
336
+ /* Glass login card */
337
+ .chat-modern-login-card {
338
+ width: min(320px, 100%);
339
+ border: 1px solid var(--border-strong);
340
+ border-radius: var(--radius);
341
+ background: var(--glass-strong);
342
+ backdrop-filter: blur(24px) saturate(180%);
343
+ -webkit-backdrop-filter: blur(24px) saturate(180%);
344
+ color: var(--text-primary);
345
+ box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,0.05);
346
+ padding: 28px 24px;
347
+ animation: fadeIn 0.5s ease;
348
+ }
349
+
350
+ .chat-modern-login-card .chat-modern-auth-btn {
351
+ width: 100%;
352
+ margin-bottom: 14px;
353
+ }
354
+
355
+ .chat-modern-login-card #signup-btn {
356
+ width: 100%;
357
+ margin-bottom: 14px;
358
+ }
359
+
360
+ .chat-modern-login-card .auth-note {
361
+ font-size: 11px;
362
+ color: var(--text-tertiary);
363
+ margin: 0;
364
+ }
365
+
366
+ .chat-modern-login-card .auth-note a {
367
+ color: var(--text-secondary);
368
+ text-decoration: underline;
369
+ text-underline-offset: 2px;
370
+ }
371
+
372
+ .chat-modern-login-card .auth-note a:hover {
373
+ color: var(--text-primary);
374
+ }
375
+
376
+ /* ==================== Tab Bar ==================== */
377
+
378
+ .tab-bar {
379
+ display: flex;
380
+ border-bottom: 1px solid var(--border);
381
+ background: rgba(0,0,0,0.5);
382
+ backdrop-filter: blur(16px) saturate(180%);
383
+ -webkit-backdrop-filter: blur(16px) saturate(180%);
384
+ flex-shrink: 0;
385
+ position: relative;
386
+ z-index: 10;
387
+ }
388
+
389
+ .tab {
390
+ flex: 1;
391
+ padding: 10px 8px;
392
+ background: none;
393
+ border: none;
394
+ border-bottom: 2px solid transparent;
395
+ color: var(--text-secondary);
396
+ font-size: 13px;
397
+ font-weight: 500;
398
+ cursor: pointer;
399
+ display: flex;
400
+ align-items: center;
401
+ justify-content: center;
402
+ gap: 4px;
403
+ transition: all 0.25s ease;
404
+ position: relative;
405
+ }
406
+
407
+ .tab:hover {
408
+ color: var(--text-primary);
409
+ background: var(--glass);
410
+ }
411
+
412
+ .tab.active {
413
+ color: var(--accent);
414
+ border-bottom-color: var(--accent);
415
+ }
416
+
417
+ /* Shimmer on active tab */
418
+ .tab.active::after {
419
+ content: '';
420
+ position: absolute;
421
+ bottom: -1px;
422
+ left: 20%;
423
+ right: 20%;
424
+ height: 1px;
425
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent);
426
+ animation: shimmer 3s infinite linear;
427
+ background-size: 200% 100%;
428
+ }
429
+
430
+ /* ==================== Tab Content ==================== */
431
+
432
+ .tab-content {
433
+ flex: 1;
434
+ min-height: 0;
435
+ display: flex;
436
+ flex-direction: column;
437
+ overflow: hidden;
438
+ animation: fadeIn 0.2s ease;
439
+ }
440
+
441
+ .tools-scroll,
442
+ .settings-scroll {
443
+ flex: 1;
444
+ min-height: 0;
445
+ overflow-y: auto;
446
+ padding-bottom: 8px;
447
+ overflow-x: hidden;
448
+ padding: 16px;
449
+ display: flex;
450
+ flex-direction: column;
451
+ gap: 16px;
452
+ scrollbar-width: thin;
453
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
454
+ }
455
+
456
+ /* ==================== Chat ==================== */
457
+
458
+ .chat-messages {
459
+ flex: 1;
460
+ min-height: 0;
461
+ overflow-y: auto;
462
+ overflow-x: hidden;
463
+ padding: 16px;
464
+ display: flex;
465
+ flex-direction: column;
466
+ gap: 12px;
467
+ scrollbar-width: thin;
468
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
469
+ }
470
+
471
+ .chat-welcome {
472
+ display: flex;
473
+ flex-direction: column;
474
+ align-items: center;
475
+ justify-content: center;
476
+ flex: 1;
477
+ text-align: center;
478
+ color: var(--text-tertiary);
479
+ padding: 40px 20px;
480
+ font-size: 12px;
481
+ letter-spacing: 0.01em;
482
+ gap: 8px;
483
+ }
484
+
485
+ .chat-welcome p {
486
+ animation: breathe 4s infinite ease-in-out;
487
+ }
488
+
489
+ .msg {
490
+ max-width: 90%;
491
+ padding: 10px 14px;
492
+ border-radius: var(--radius);
493
+ font-size: 13px;
494
+ line-height: 1.5;
495
+ word-wrap: break-word;
496
+ animation: fadeIn 0.3s ease;
497
+ }
498
+
499
+ .msg-user {
500
+ align-self: flex-end;
501
+ background: var(--glass-strong);
502
+ backdrop-filter: blur(12px);
503
+ -webkit-backdrop-filter: blur(12px);
504
+ color: var(--text-primary);
505
+ border: 1px solid var(--border);
506
+ border-bottom-right-radius: 4px;
507
+ }
508
+
509
+ .msg-assistant {
510
+ align-self: flex-start;
511
+ background: var(--bg-tertiary);
512
+ color: var(--text-primary);
513
+ border-bottom-left-radius: 4px;
514
+ border: 1px solid var(--border);
515
+ }
516
+
517
+ .msg-assistant pre {
518
+ background: var(--bg-primary);
519
+ border: 1px solid var(--border);
520
+ border-radius: var(--radius-sm);
521
+ padding: 10px 12px;
522
+ margin: 8px 0;
523
+ overflow-x: auto;
524
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
525
+ font-size: 12px;
526
+ line-height: 1.4;
527
+ }
528
+
529
+ .msg-assistant code {
530
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
531
+ font-size: 12px;
532
+ background: rgba(255,255,255,0.06);
533
+ padding: 2px 5px;
534
+ border-radius: 3px;
535
+ }
536
+
537
+ .msg-assistant pre code {
538
+ background: none;
539
+ padding: 0;
540
+ }
541
+
542
+ .msg-error {
543
+ align-self: center;
544
+ background: var(--error);
545
+ color: white;
546
+ font-size: 12px;
547
+ padding: 6px 12px;
548
+ border-radius: var(--radius-sm);
549
+ }
550
+
551
+ .typing-indicator {
552
+ align-self: flex-start;
553
+ color: var(--text-tertiary);
554
+ font-size: 12px;
555
+ padding: 6px 0;
556
+ display: flex;
557
+ align-items: center;
558
+ gap: 4px;
559
+ }
560
+
561
+ .typing-indicator span {
562
+ display: inline-block;
563
+ width: 6px;
564
+ height: 6px;
565
+ background: var(--text-tertiary);
566
+ border-radius: 50%;
567
+ animation: typingBounce 1.4s infinite;
568
+ }
569
+
570
+ .typing-indicator span:nth-child(2) { animation-delay: 0.2s; }
571
+ .typing-indicator span:nth-child(3) { animation-delay: 0.4s; }
572
+
573
+ /* ==================== Composer (Modern Chat Input) ==================== */
574
+
575
+ .composer {
576
+ padding: 10px;
577
+ flex-shrink: 0;
578
+ position: relative;
579
+ z-index: 10;
580
+ border-top: 1px solid rgba(255,255,255,0.10);
581
+ background: #0f0f0f;
582
+ }
583
+
584
+ .composer-box {
585
+ background: #171717;
586
+ border: 1px solid rgba(255,255,255,0.15);
587
+ border-radius: 10px;
588
+ overflow: hidden;
589
+ transition: border-color 0.2s, box-shadow 0.2s;
590
+ }
591
+
592
+ .composer-box:focus-within {
593
+ border-color: rgba(255,255,255,0.22);
594
+ box-shadow: 0 0 0 2px rgba(255,255,255,0.06);
595
+ }
596
+
597
+ .composer-box textarea {
598
+ display: block;
599
+ width: 100%;
600
+ padding: 10px 12px 4px;
601
+ background: transparent;
602
+ border: none;
603
+ color: #fafafa;
604
+ font-size: 13px;
605
+ font-family: 'Geist Sans', -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', sans-serif;
606
+ line-height: 1.5;
607
+ resize: none;
608
+ outline: none;
609
+ min-height: 36px;
610
+ max-height: 120px;
611
+ box-sizing: border-box;
612
+ }
613
+
614
+ .composer-box textarea::placeholder {
615
+ color: #666;
616
+ }
617
+
618
+ .composer-bar {
619
+ display: flex;
620
+ align-items: center;
621
+ justify-content: space-between;
622
+ padding: 4px 8px 8px;
623
+ gap: 4px;
624
+ }
625
+
626
+ .composer-controls {
627
+ display: flex;
628
+ align-items: center;
629
+ gap: 4px;
630
+ flex: 1;
631
+ min-width: 0;
632
+ overflow: hidden;
633
+ }
634
+
635
+ .composer-model {
636
+ padding: 3px 18px 3px 6px;
637
+ background: rgba(255,255,255,0.07);
638
+ border: 1px solid rgba(255,255,255,0.10);
639
+ border-radius: 6px;
640
+ color: #a3a3a3;
641
+ font-size: 10px;
642
+ font-family: inherit;
643
+ cursor: pointer;
644
+ -webkit-appearance: none;
645
+ -moz-appearance: none;
646
+ appearance: none;
647
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10' fill='none'%3E%3Cpath d='M2.5 4l2.5 2.5 2.5-2.5' stroke='%236B6B6B' stroke-width='1.2'/%3E%3C/svg%3E");
648
+ background-repeat: no-repeat;
649
+ background-position: right 4px center;
650
+ white-space: nowrap;
651
+ max-width: 110px;
652
+ text-overflow: ellipsis;
653
+ overflow: hidden;
654
+ transition: border-color 0.2s;
655
+ height: 22px;
656
+ flex-shrink: 0;
657
+ line-height: 16px;
658
+ }
659
+
660
+ .composer-model:hover {
661
+ border-color: rgba(255,255,255,0.16);
662
+ }
663
+
664
+ .composer-model:focus {
665
+ border-color: rgba(255,255,255,0.16);
666
+ outline: none;
667
+ }
668
+
669
+ .composer-toggle {
670
+ display: inline-flex;
671
+ align-items: center;
672
+ gap: 2px;
673
+ font-size: 10px;
674
+ color: #666;
675
+ user-select: none;
676
+ cursor: pointer;
677
+ white-space: nowrap;
678
+ padding: 2px 4px;
679
+ border-radius: 4px;
680
+ transition: background 0.15s;
681
+ flex-shrink: 0;
682
+ }
683
+
684
+ .composer-toggle:hover {
685
+ background: rgba(255,255,255,0.04);
686
+ }
687
+
688
+ .composer-toggle input[type="checkbox"] {
689
+ width: 11px;
690
+ height: 11px;
691
+ accent-color: #fafafa;
692
+ cursor: pointer;
693
+ margin: 0;
694
+ }
695
+
696
+ .composer-toggle:has(input:checked) {
697
+ color: #a3a3a3;
698
+ }
699
+
700
+ .composer-status {
701
+ font-size: 9px;
702
+ color: var(--text-tertiary);
703
+ white-space: nowrap;
704
+ padding: 1px 5px;
705
+ border-radius: 3px;
706
+ background: var(--glass);
707
+ }
708
+
709
+ .composer-send {
710
+ width: 30px;
711
+ height: 30px;
712
+ display: flex;
713
+ align-items: center;
714
+ justify-content: center;
715
+ background: var(--accent);
716
+ border: none;
717
+ border-radius: 50%;
718
+ color: #000;
719
+ cursor: pointer;
720
+ flex-shrink: 0;
721
+ transition: all 0.2s;
722
+ }
723
+
724
+ .composer-send:hover {
725
+ background: var(--accent-hover);
726
+ box-shadow: 0 0 12px rgba(255,255,255,0.15);
727
+ transform: scale(1.05);
728
+ }
729
+
730
+ .composer-send:active {
731
+ transform: scale(0.95);
732
+ }
733
+
734
+ .composer-send:disabled {
735
+ opacity: 0.15;
736
+ cursor: not-allowed;
737
+ box-shadow: none;
738
+ transform: none;
739
+ }
740
+
741
+ .composer-send svg {
742
+ width: 13px;
743
+ height: 13px;
744
+ }
745
+
746
+ /* ==================== Buttons ==================== */
747
+
748
+ .icon-btn {
749
+ width: 32px;
750
+ height: 32px;
751
+ display: flex;
752
+ align-items: center;
753
+ justify-content: center;
754
+ background: transparent;
755
+ border: none;
756
+ border-radius: var(--radius-sm);
757
+ color: var(--text-secondary);
758
+ cursor: pointer;
759
+ transition: all 0.2s;
760
+ }
761
+
762
+ .icon-btn:hover {
763
+ background: var(--glass-strong);
764
+ color: var(--text-primary);
765
+ }
766
+
767
+ .icon-btn.small {
768
+ width: 24px;
769
+ height: 24px;
770
+ }
771
+
772
+ .icon-btn svg {
773
+ width: 18px;
774
+ height: 18px;
775
+ }
776
+
777
+ .settings-scroll > .primary-btn {
778
+ margin-top: 4px;
779
+ margin-bottom: 12px;
780
+ flex-shrink: 0;
781
+ }
782
+
783
+ .primary-btn {
784
+ width: 100%;
785
+ padding: 10px 16px;
786
+ background: var(--accent);
787
+ color: #000000;
788
+ border: none;
789
+ border-radius: var(--radius-md);
790
+ font-weight: 600;
791
+ font-size: 13px;
792
+ cursor: pointer;
793
+ transition: all 0.25s ease;
794
+ position: relative;
795
+ overflow: hidden;
796
+ }
797
+
798
+ /* Shimmer sweep on primary buttons */
799
+ .primary-btn::after {
800
+ content: '';
801
+ position: absolute;
802
+ top: 0;
803
+ left: -100%;
804
+ width: 100%;
805
+ height: 100%;
806
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
807
+ transition: left 0.5s ease;
808
+ }
809
+
810
+ .primary-btn:hover {
811
+ background: var(--accent-hover);
812
+ box-shadow: 0 0 16px rgba(255,255,255,0.12);
813
+ }
814
+
815
+ .primary-btn:hover::after {
816
+ left: 100%;
817
+ }
818
+
819
+ .primary-btn:disabled {
820
+ opacity: 0.4;
821
+ cursor: not-allowed;
822
+ }
823
+
824
+ .secondary-btn {
825
+ width: 100%;
826
+ padding: 8px 16px;
827
+ background: var(--bg-tertiary);
828
+ color: var(--text-primary);
829
+ border: 1px solid var(--border);
830
+ border-radius: var(--radius-md);
831
+ font-size: 12px;
832
+ font-family: inherit;
833
+ cursor: pointer;
834
+ transition: all 0.2s;
835
+ }
836
+
837
+ .secondary-btn:hover {
838
+ background: var(--bg-hover);
839
+ border-color: var(--border-strong);
840
+ }
841
+
842
+ .action-btn {
843
+ flex: 1;
844
+ display: flex;
845
+ align-items: center;
846
+ justify-content: center;
847
+ gap: 8px;
848
+ padding: 10px;
849
+ background: var(--bg-tertiary);
850
+ border: 1px solid var(--border);
851
+ border-radius: var(--radius-md);
852
+ color: var(--text-primary);
853
+ font-size: 12px;
854
+ font-weight: 500;
855
+ font-family: inherit;
856
+ cursor: pointer;
857
+ transition: all 0.25s ease;
858
+ }
859
+
860
+ .action-btn:hover {
861
+ background: var(--bg-hover);
862
+ border-color: var(--border-strong);
863
+ }
864
+
865
+ .action-btn svg {
866
+ width: 16px;
867
+ height: 16px;
868
+ }
869
+
870
+ /* ==================== Glass Panels ==================== */
871
+
872
+ .panel {
873
+ background: var(--bg-tertiary);
874
+ border: 1px solid var(--border);
875
+ border-radius: var(--radius);
876
+ padding: 16px;
877
+ transition: border-color 0.3s;
878
+ position: relative;
879
+ overflow: visible;
880
+ }
881
+
882
+ /* Subtle top highlight on glass panels */
883
+ .panel::before {
884
+ content: '';
885
+ position: absolute;
886
+ top: 0;
887
+ left: 0;
888
+ right: 0;
889
+ height: 1px;
890
+ background: linear-gradient(90deg, transparent 10%, rgba(255,255,255,0.08) 50%, transparent 90%);
891
+ }
892
+
893
+ .panel:hover {
894
+ border-color: var(--border-strong);
895
+ }
896
+
897
+ .panel h3 {
898
+ font-size: 11px;
899
+ font-weight: 600;
900
+ color: var(--text-secondary);
901
+ margin-bottom: 12px;
902
+ text-transform: uppercase;
903
+ letter-spacing: 0.5px;
904
+ }
905
+
906
+ .panel-header {
907
+ display: flex;
908
+ align-items: center;
909
+ justify-content: space-between;
910
+ margin-bottom: 12px;
911
+ }
912
+
913
+ .badge {
914
+ background: var(--accent-dim);
915
+ color: var(--accent);
916
+ padding: 2px 8px;
917
+ border-radius: var(--radius);
918
+ font-size: 11px;
919
+ font-weight: 600;
920
+ }
921
+
922
+ /* Status Rows */
923
+ .status-row {
924
+ display: flex;
925
+ justify-content: space-between;
926
+ align-items: center;
927
+ padding: 8px 0;
928
+ border-bottom: 1px solid var(--border);
929
+ }
930
+
931
+ .status-row:last-child { border-bottom: none; }
932
+
933
+ .status-row span:first-child {
934
+ color: var(--text-secondary);
935
+ font-size: 12px;
936
+ }
937
+
938
+ .status-value {
939
+ display: flex;
940
+ align-items: center;
941
+ gap: 6px;
942
+ font-size: 12px;
943
+ font-weight: 500;
944
+ }
945
+
946
+ .status-indicator {
947
+ width: 8px;
948
+ height: 8px;
949
+ border-radius: 50%;
950
+ background: var(--text-tertiary);
951
+ transition: all 0.3s;
952
+ }
953
+
954
+ .status-indicator.connected {
955
+ background: var(--success);
956
+ box-shadow: 0 0 8px rgba(76, 175, 80, 0.3);
957
+ animation: glowPulse 3s infinite;
958
+ }
959
+
960
+ .status-indicator.warning {
961
+ background: var(--warning);
962
+ box-shadow: 0 0 8px rgba(255, 193, 7, 0.2);
963
+ }
964
+
965
+ .status-indicator.disconnected {
966
+ background: var(--error);
967
+ box-shadow: 0 0 8px rgba(244, 67, 54, 0.2);
968
+ }
969
+
970
+ .mono {
971
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
972
+ font-size: 11px;
973
+ }
974
+
975
+ .service-actions {
976
+ display: flex;
977
+ gap: 8px;
978
+ margin-top: 12px;
979
+ }
980
+
981
+ .action-btn.small {
982
+ padding: 6px 10px;
983
+ font-size: 11px;
984
+ gap: 4px;
985
+ }
986
+
987
+ .action-btn.small svg {
988
+ width: 10px;
989
+ height: 10px;
990
+ }
991
+
992
+ /* Element Inspector Panel */
993
+ .inspector-panel {
994
+ background: var(--bg-secondary);
995
+ border-color: var(--border-strong);
996
+ }
997
+
998
+ .inspector-actions {
999
+ display: flex;
1000
+ gap: 6px;
1001
+ }
1002
+
1003
+ .inspector-btn {
1004
+ flex: 1;
1005
+ padding: 8px 6px;
1006
+ font-size: 11px;
1007
+ gap: 4px;
1008
+ justify-content: center;
1009
+ border-radius: var(--radius-sm);
1010
+ background: var(--glass-strong);
1011
+ border: 1px solid var(--border);
1012
+ color: var(--text-primary);
1013
+ cursor: pointer;
1014
+ display: flex;
1015
+ align-items: center;
1016
+ transition: all 0.2s;
1017
+ }
1018
+
1019
+ .inspector-btn:hover {
1020
+ background: var(--bg-hover);
1021
+ border-color: var(--border-strong);
1022
+ }
1023
+
1024
+ .inspector-btn.active {
1025
+ background: rgba(255,255,255,0.12);
1026
+ border-color: var(--accent);
1027
+ box-shadow: 0 0 8px rgba(255,255,255,0.1);
1028
+ }
1029
+
1030
+ .inspector-btn svg {
1031
+ width: 14px;
1032
+ height: 14px;
1033
+ flex-shrink: 0;
1034
+ }
1035
+
1036
+ .inspector-result {
1037
+ margin-top: 8px;
1038
+ padding: 8px;
1039
+ background: var(--bg-primary);
1040
+ border: 1px solid var(--border);
1041
+ border-radius: var(--radius-sm);
1042
+ font-size: 11px;
1043
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
1044
+ color: var(--text-secondary);
1045
+ max-height: 200px;
1046
+ overflow-y: auto;
1047
+ scrollbar-width: thin;
1048
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
1049
+ white-space: pre-wrap;
1050
+ word-break: break-all;
1051
+ }
1052
+
1053
+ /* Element-syntax tinting — kept monochrome via opacity, not hue. */
1054
+ .inspector-result .element-tag {
1055
+ color: #fafafa;
1056
+ font-weight: 600;
1057
+ }
1058
+
1059
+ .inspector-result .element-id {
1060
+ color: rgba(255,255,255,0.78);
1061
+ }
1062
+
1063
+ .inspector-result .element-class {
1064
+ color: rgba(255,255,255,0.62);
1065
+ }
1066
+
1067
+ .inspector-result .element-size {
1068
+ color: var(--text-tertiary);
1069
+ }
1070
+
1071
+ .inspector-result .copy-line {
1072
+ display: block;
1073
+ cursor: pointer;
1074
+ padding: 1px 4px;
1075
+ border-radius: 3px;
1076
+ transition: background 0.15s;
1077
+ }
1078
+
1079
+ .inspector-result .copy-line:hover {
1080
+ background: rgba(255, 255, 255, 0.08);
1081
+ }
1082
+
1083
+ .inspector-result .copy-line.copied {
1084
+ background: rgba(76, 175, 80, 0.15);
1085
+ }
1086
+
1087
+ .inspector-result .info-label {
1088
+ color: var(--text-tertiary);
1089
+ user-select: none;
1090
+ }
1091
+
1092
+ .inspector-result img {
1093
+ max-width: 100%;
1094
+ border-radius: 4px;
1095
+ margin-top: 4px;
1096
+ }
1097
+
1098
+ /* Build Info */
1099
+ .build-info-panel .status-value.mono {
1100
+ font-size: 11px;
1101
+ }
1102
+
1103
+ .tool-list {
1104
+ max-height: 200px;
1105
+ overflow-y: auto;
1106
+ font-size: 11px;
1107
+ line-height: 1.4;
1108
+ color: var(--text-tertiary);
1109
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
1110
+ white-space: pre-wrap;
1111
+ word-break: break-all;
1112
+ scrollbar-width: thin;
1113
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
1114
+ }
1115
+
1116
+ .tool-category {
1117
+ padding: 4px 0;
1118
+ border-bottom: 1px solid var(--border);
1119
+ }
1120
+
1121
+ .tool-category:last-child {
1122
+ border-bottom: none;
1123
+ }
1124
+
1125
+ .tool-category-name {
1126
+ color: var(--text-secondary);
1127
+ font-weight: 600;
1128
+ font-family: inherit;
1129
+ font-size: 10px;
1130
+ text-transform: uppercase;
1131
+ letter-spacing: 0.3px;
1132
+ }
1133
+
1134
+ .tool-category-tools {
1135
+ color: var(--text-tertiary);
1136
+ font-size: 10px;
1137
+ }
1138
+
1139
+ /* MCP Server List */
1140
+ .mcp-server-list {
1141
+ display: flex;
1142
+ flex-direction: column;
1143
+ gap: 6px;
1144
+ }
1145
+
1146
+ .mcp-server-item {
1147
+ display: flex;
1148
+ align-items: center;
1149
+ justify-content: space-between;
1150
+ padding: 8px 10px;
1151
+ background: var(--glass);
1152
+ border: 1px solid var(--border);
1153
+ border-radius: var(--radius-sm);
1154
+ font-size: 12px;
1155
+ transition: border-color 0.2s;
1156
+ }
1157
+
1158
+ .mcp-server-item:hover {
1159
+ border-color: var(--border-strong);
1160
+ }
1161
+
1162
+ .mcp-server-info {
1163
+ display: flex;
1164
+ align-items: center;
1165
+ gap: 8px;
1166
+ min-width: 0;
1167
+ }
1168
+
1169
+ .mcp-server-name {
1170
+ font-weight: 500;
1171
+ color: var(--text-primary);
1172
+ white-space: nowrap;
1173
+ overflow: hidden;
1174
+ text-overflow: ellipsis;
1175
+ }
1176
+
1177
+ .mcp-server-tools {
1178
+ color: var(--text-tertiary);
1179
+ font-size: 11px;
1180
+ white-space: nowrap;
1181
+ flex-shrink: 0;
1182
+ }
1183
+
1184
+ /* ==================== User Profile ==================== */
1185
+
1186
+ .user-profile {
1187
+ display: flex;
1188
+ align-items: center;
1189
+ gap: 12px;
1190
+ }
1191
+
1192
+ .user-avatar {
1193
+ width: 36px;
1194
+ height: 36px;
1195
+ border-radius: 50%;
1196
+ background: var(--accent-dim);
1197
+ border: 1px solid var(--border);
1198
+ }
1199
+
1200
+ .user-details { flex: 1; }
1201
+
1202
+ .user-name {
1203
+ font-weight: 600;
1204
+ font-size: 13px;
1205
+ }
1206
+
1207
+ .user-email {
1208
+ color: var(--text-secondary);
1209
+ font-size: 11px;
1210
+ }
1211
+
1212
+ /* ==================== Agent List ==================== */
1213
+
1214
+ .agent-list {
1215
+ display: flex;
1216
+ flex-direction: column;
1217
+ gap: 8px;
1218
+ }
1219
+
1220
+ .agent-item {
1221
+ display: flex;
1222
+ align-items: center;
1223
+ gap: 10px;
1224
+ padding: 10px;
1225
+ background: var(--glass);
1226
+ border: 1px solid var(--border);
1227
+ border-radius: var(--radius-sm);
1228
+ transition: all 0.2s;
1229
+ }
1230
+
1231
+ .agent-item:hover {
1232
+ background: var(--glass-strong);
1233
+ border-color: var(--border-strong);
1234
+ }
1235
+
1236
+ .agent-icon {
1237
+ width: 32px;
1238
+ height: 32px;
1239
+ background: var(--accent-dim);
1240
+ border-radius: var(--radius-sm);
1241
+ display: flex;
1242
+ align-items: center;
1243
+ justify-content: center;
1244
+ color: var(--accent);
1245
+ }
1246
+
1247
+ .agent-info { flex: 1; }
1248
+ .agent-name { font-weight: 500; font-size: 13px; }
1249
+ .agent-status { color: var(--text-secondary); font-size: 11px; }
1250
+ .agent-actions { display: flex; gap: 4px; }
1251
+
1252
+ /* ==================== Tab Filesystem ==================== */
1253
+
1254
+ .tab-filesystem {
1255
+ max-height: 240px;
1256
+ overflow-y: auto;
1257
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
1258
+ font-size: 12px;
1259
+ scrollbar-width: thin;
1260
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
1261
+ }
1262
+
1263
+ .tab-item {
1264
+ display: flex;
1265
+ align-items: center;
1266
+ gap: 6px;
1267
+ padding: 6px 8px;
1268
+ border-radius: 4px;
1269
+ cursor: pointer;
1270
+ transition: all 0.2s;
1271
+ }
1272
+
1273
+ .tab-item:hover { background: var(--glass-strong); }
1274
+
1275
+ .tab-item.active {
1276
+ background: var(--accent-dim);
1277
+ color: var(--accent);
1278
+ }
1279
+
1280
+ /* ==================== Settings ==================== */
1281
+
1282
+ .setting-item {
1283
+ display: flex;
1284
+ align-items: center;
1285
+ justify-content: space-between;
1286
+ gap: 8px;
1287
+ padding: 8px 0;
1288
+ }
1289
+
1290
+ .setting-item > span {
1291
+ font-size: 12px;
1292
+ color: var(--text-secondary);
1293
+ white-space: nowrap;
1294
+ flex-shrink: 0;
1295
+ }
1296
+
1297
+ .setting-item input[type="text"],
1298
+ .setting-item input[type="password"],
1299
+ .setting-item select {
1300
+ width: 140px;
1301
+ padding: 6px 10px;
1302
+ background: var(--bg-tertiary);
1303
+ border: 1px solid var(--border);
1304
+ border-radius: var(--radius-sm);
1305
+ color: var(--text-primary);
1306
+ font-size: 12px;
1307
+ font-family: inherit;
1308
+ transition: border-color 0.2s;
1309
+ }
1310
+
1311
+ .setting-item select {
1312
+ -webkit-appearance: none;
1313
+ -moz-appearance: none;
1314
+ appearance: none;
1315
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 5l3 3 3-3' stroke='%23A0A0A0' stroke-width='1.5'/%3E%3C/svg%3E");
1316
+ background-repeat: no-repeat;
1317
+ background-position: right 8px center;
1318
+ padding-right: 28px;
1319
+ cursor: pointer;
1320
+ }
1321
+
1322
+ .setting-item input:focus,
1323
+ .setting-item select:focus {
1324
+ border-color: var(--border-strong);
1325
+ outline: none;
1326
+ }
1327
+
1328
+ .setting-item-column {
1329
+ flex-direction: column;
1330
+ align-items: flex-start;
1331
+ gap: 6px;
1332
+ }
1333
+
1334
+ .setting-item-column input[type="text"],
1335
+ .setting-item-column input[type="password"] {
1336
+ width: 100%;
1337
+ }
1338
+
1339
+ .setting-item input[type="number"] {
1340
+ width: 70px;
1341
+ padding: 6px 10px;
1342
+ background: var(--bg-tertiary);
1343
+ border: 1px solid var(--border);
1344
+ border-radius: var(--radius-sm);
1345
+ color: var(--text-primary);
1346
+ font-size: 12px;
1347
+ font-family: inherit;
1348
+ -moz-appearance: textfield;
1349
+ transition: border-color 0.2s;
1350
+ }
1351
+
1352
+ .setting-item input[type="number"]::-webkit-inner-spin-button,
1353
+ .setting-item input[type="number"]::-webkit-outer-spin-button {
1354
+ opacity: 0.5;
1355
+ }
1356
+
1357
+ .setting-item input[type="number"]:focus {
1358
+ border-color: var(--border-strong);
1359
+ outline: none;
1360
+ }
1361
+
1362
+ .setting-item input[type="checkbox"] {
1363
+ width: 16px;
1364
+ height: 16px;
1365
+ min-width: 16px;
1366
+ cursor: pointer;
1367
+ accent-color: var(--accent);
1368
+ flex-shrink: 0;
1369
+ }
1370
+
1371
+ /* Firefox: style option elements in dropdowns */
1372
+ select option {
1373
+ background: var(--bg-tertiary);
1374
+ color: var(--text-primary);
1375
+ padding: 4px 8px;
1376
+ }
1377
+
1378
+ /* Color scheme hint for native widgets */
1379
+ :root { color-scheme: dark; }
1380
+
1381
+ .settings-links {
1382
+ display: flex;
1383
+ justify-content: center;
1384
+ gap: 16px;
1385
+ padding: 8px 0;
1386
+ }
1387
+
1388
+ .settings-links a {
1389
+ color: var(--text-secondary);
1390
+ font-size: 12px;
1391
+ text-decoration: none;
1392
+ transition: color 0.2s;
1393
+ }
1394
+
1395
+ .settings-links a:hover {
1396
+ color: var(--accent);
1397
+ }
1398
+
1399
+ /* ==================== Actions ==================== */
1400
+
1401
+ .actions {
1402
+ display: flex;
1403
+ gap: 8px;
1404
+ }
1405
+
1406
+ /* ==================== Empty State ==================== */
1407
+
1408
+ .empty-state {
1409
+ text-align: center;
1410
+ padding: 20px;
1411
+ color: var(--text-tertiary);
1412
+ font-size: 12px;
1413
+ }
1414
+
1415
+ /* ==================== Notification ==================== */
1416
+
1417
+ .notification {
1418
+ position: fixed;
1419
+ bottom: 16px;
1420
+ left: 16px;
1421
+ right: 16px;
1422
+ padding: 10px 16px;
1423
+ background: var(--glass-strong);
1424
+ backdrop-filter: blur(20px);
1425
+ -webkit-backdrop-filter: blur(20px);
1426
+ border: 1px solid var(--border);
1427
+ border-radius: var(--radius-md);
1428
+ color: var(--text-primary);
1429
+ font-size: 12px;
1430
+ text-align: center;
1431
+ z-index: 200;
1432
+ animation: slideUp 0.3s ease;
1433
+ }
1434
+
1435
+ .notification.error {
1436
+ background: var(--error);
1437
+ border-color: var(--error);
1438
+ }
1439
+
1440
+ /* ==================== Scrollbar ==================== */
1441
+
1442
+ /* Firefox */
1443
+ * {
1444
+ scrollbar-width: thin;
1445
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
1446
+ }
1447
+
1448
+ /* Chrome / Safari */
1449
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
1450
+ ::-webkit-scrollbar-track { background: transparent; }
1451
+ ::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 3px; }
1452
+ ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.14); }
1453
+
1454
+ /* ==================== Loading ==================== */
1455
+
1456
+ .loading { animation: pulse 1.5s infinite; }
1457
+
1458
+ /* ==================== Footer ==================== */
1459
+
1460
+ .sidebar-footer {
1461
+ display: flex;
1462
+ align-items: center;
1463
+ justify-content: center;
1464
+ padding: 8px 16px;
1465
+ border-top: 1px solid var(--border);
1466
+ background: rgba(0,0,0,0.4);
1467
+ flex-shrink: 0;
1468
+ position: relative;
1469
+ z-index: 10;
1470
+ }
1471
+
1472
+ .footer-brand {
1473
+ display: flex;
1474
+ align-items: center;
1475
+ gap: 6px;
1476
+ color: var(--text-tertiary);
1477
+ text-decoration: none;
1478
+ font-size: 11px;
1479
+ transition: color 0.2s;
1480
+ }
1481
+
1482
+ .footer-brand:hover {
1483
+ color: var(--text-secondary);
1484
+ }
1485
+
1486
+ .footer-brand svg {
1487
+ opacity: 0.5;
1488
+ transition: opacity 0.2s;
1489
+ }
1490
+
1491
+ .footer-brand:hover svg {
1492
+ opacity: 0.8;
1493
+ }
1494
+
1495
+ /* ==================== Agent Launcher Modal ==================== */
1496
+
1497
+ .modal-overlay {
1498
+ position: fixed;
1499
+ top: 0;
1500
+ left: 0;
1501
+ right: 0;
1502
+ bottom: 0;
1503
+ background: rgba(0, 0, 0, 0.7);
1504
+ backdrop-filter: blur(8px);
1505
+ -webkit-backdrop-filter: blur(8px);
1506
+ display: flex;
1507
+ align-items: center;
1508
+ justify-content: center;
1509
+ z-index: 1000;
1510
+ animation: fadeIn 0.15s ease;
1511
+ }
1512
+
1513
+ .modal-content {
1514
+ background: var(--bg-secondary);
1515
+ border: 1px solid var(--border-strong);
1516
+ border-radius: var(--radius);
1517
+ width: calc(100% - 32px);
1518
+ max-width: 320px;
1519
+ overflow: hidden;
1520
+ box-shadow: var(--shadow-lg);
1521
+ backdrop-filter: blur(24px);
1522
+ -webkit-backdrop-filter: blur(24px);
1523
+ }
1524
+
1525
+ .modal-header {
1526
+ display: flex;
1527
+ align-items: center;
1528
+ justify-content: space-between;
1529
+ padding: 12px 16px;
1530
+ border-bottom: 1px solid var(--border);
1531
+ }
1532
+
1533
+ .modal-header h3 {
1534
+ margin: 0;
1535
+ font-size: 14px;
1536
+ font-weight: 600;
1537
+ color: var(--text-primary);
1538
+ }
1539
+
1540
+ .close-modal {
1541
+ background: none;
1542
+ border: none;
1543
+ color: var(--text-secondary);
1544
+ font-size: 20px;
1545
+ cursor: pointer;
1546
+ padding: 0 4px;
1547
+ line-height: 1;
1548
+ }
1549
+
1550
+ .close-modal:hover {
1551
+ color: var(--text-primary);
1552
+ }
1553
+
1554
+ .modal-body {
1555
+ padding: 16px;
1556
+ }
1557
+
1558
+ .modal-body textarea {
1559
+ width: 100%;
1560
+ background: var(--bg-tertiary);
1561
+ border: 1px solid var(--border);
1562
+ border-radius: var(--radius-sm);
1563
+ color: var(--text-primary);
1564
+ padding: 8px;
1565
+ font-family: inherit;
1566
+ font-size: 12px;
1567
+ resize: vertical;
1568
+ outline: none;
1569
+ }
1570
+
1571
+ .modal-body textarea:focus {
1572
+ border-color: var(--border-strong);
1573
+ }
1574
+
1575
+ .modal-footer {
1576
+ display: flex;
1577
+ gap: 8px;
1578
+ padding: 12px 16px;
1579
+ border-top: 1px solid var(--border);
1580
+ justify-content: flex-end;
1581
+ }
1582
+
1583
+ .cancel-modal {
1584
+ padding: 6px 16px;
1585
+ font-size: 12px;
1586
+ }
1587
+
1588
+ .launch-modal {
1589
+ padding: 6px 16px;
1590
+ font-size: 12px;
1591
+ }
1592
+
1593
+ /* ================================================================
1594
+ Usage & Billing
1595
+ ================================================================ */
1596
+
1597
+ .balance-card {
1598
+ background: var(--glass-strong);
1599
+ border: 1px solid var(--border);
1600
+ border-radius: var(--radius);
1601
+ padding: 10px 12px;
1602
+ margin-bottom: 10px;
1603
+ }
1604
+
1605
+ .balance-row {
1606
+ display: flex;
1607
+ justify-content: space-between;
1608
+ align-items: center;
1609
+ }
1610
+
1611
+ .balance-label {
1612
+ font-size: 10px;
1613
+ font-weight: 600;
1614
+ text-transform: uppercase;
1615
+ letter-spacing: 0.12em;
1616
+ color: var(--text-secondary);
1617
+ }
1618
+
1619
+ .balance-amount {
1620
+ font-size: 20px;
1621
+ font-weight: 700;
1622
+ color: var(--text-primary);
1623
+ font-variant-numeric: tabular-nums;
1624
+ }
1625
+
1626
+ .balance-tier {
1627
+ margin-top: 4px;
1628
+ }
1629
+
1630
+ .tier-badge {
1631
+ display: inline-flex;
1632
+ align-items: center;
1633
+ padding: 2px 8px;
1634
+ border-radius: 999px;
1635
+ font-size: 10px;
1636
+ font-weight: 700;
1637
+ text-transform: uppercase;
1638
+ letter-spacing: 0.08em;
1639
+ background: rgba(255,255,255,0.06);
1640
+ color: var(--text-secondary);
1641
+ border: 1px solid var(--border);
1642
+ }
1643
+
1644
+ .badge-link {
1645
+ text-decoration: none;
1646
+ cursor: pointer;
1647
+ transition: background 0.15s;
1648
+ }
1649
+ .badge-link:hover {
1650
+ background: var(--glass-strong);
1651
+ }
1652
+
1653
+ /* Usage bar system */
1654
+ .usage-meters {
1655
+ display: flex;
1656
+ flex-direction: column;
1657
+ gap: 8px;
1658
+ }
1659
+
1660
+ .usage-meter-header {
1661
+ display: flex;
1662
+ justify-content: space-between;
1663
+ align-items: center;
1664
+ font-size: 11px;
1665
+ color: var(--text-secondary);
1666
+ margin-bottom: 3px;
1667
+ }
1668
+
1669
+ .usage-meter-header .mono {
1670
+ font-family: 'Geist Mono', monospace;
1671
+ font-size: 11px;
1672
+ color: var(--text-primary);
1673
+ }
1674
+
1675
+ .usage-bar-track {
1676
+ width: 100%;
1677
+ height: 6px;
1678
+ border-radius: 3px;
1679
+ background: rgba(255,255,255,0.06);
1680
+ overflow: hidden;
1681
+ }
1682
+
1683
+ .usage-bar-fill {
1684
+ height: 100%;
1685
+ border-radius: 3px;
1686
+ transition: width 0.5s ease-out;
1687
+ min-width: 0;
1688
+ }
1689
+
1690
+ /* Usage bars: monochrome scale (brightest → dimmest) per @hanzo/brand.
1691
+ Class names kept for compatibility with existing markup. */
1692
+ .bar-blue { background: rgba(255,255,255,0.95); }
1693
+ .bar-violet { background: rgba(255,255,255,0.75); }
1694
+ .bar-emerald { background: rgba(255,255,255,0.55); }
1695
+ .bar-amber { background: rgba(255,255,255,0.40); }
1696
+ .bar-red { background: rgba(255,255,255,0.25); }
1697
+
1698
+ .usage-bar-group {
1699
+ margin-top: 8px;
1700
+ }
1701
+
1702
+ .usage-bar-labels {
1703
+ display: flex;
1704
+ justify-content: space-between;
1705
+ font-size: 10px;
1706
+ color: var(--text-tertiary);
1707
+ margin-top: 2px;
1708
+ }
1709
+
1710
+ .usage-meta {
1711
+ display: flex;
1712
+ gap: 6px;
1713
+ align-items: center;
1714
+ font-size: 10px;
1715
+ color: var(--text-tertiary);
1716
+ margin-top: 8px;
1717
+ padding-top: 6px;
1718
+ border-top: 1px solid var(--border);
1719
+ }
1720
+
1721
+ /* Model Hub */
1722
+ .model-hub-list {
1723
+ max-height: 200px;
1724
+ overflow-y: auto;
1725
+ margin-bottom: 8px;
1726
+ }
1727
+
1728
+ .model-hub-item {
1729
+ display: flex;
1730
+ justify-content: space-between;
1731
+ align-items: center;
1732
+ padding: 6px 8px;
1733
+ border-radius: var(--radius-sm);
1734
+ cursor: pointer;
1735
+ transition: background 0.15s;
1736
+ gap: 8px;
1737
+ }
1738
+ .model-hub-item:hover {
1739
+ background: var(--glass-strong);
1740
+ }
1741
+
1742
+ .model-hub-item-info {
1743
+ flex: 1;
1744
+ min-width: 0;
1745
+ }
1746
+
1747
+ .model-hub-item-name {
1748
+ font-size: 12px;
1749
+ font-weight: 500;
1750
+ color: var(--text-primary);
1751
+ white-space: nowrap;
1752
+ overflow: hidden;
1753
+ text-overflow: ellipsis;
1754
+ }
1755
+
1756
+ .model-hub-item-meta {
1757
+ font-size: 10px;
1758
+ color: var(--text-tertiary);
1759
+ display: flex;
1760
+ gap: 6px;
1761
+ }
1762
+
1763
+ .model-hub-item-badge {
1764
+ font-size: 9px;
1765
+ padding: 1px 5px;
1766
+ border-radius: 4px;
1767
+ font-weight: 600;
1768
+ text-transform: uppercase;
1769
+ letter-spacing: 0.05em;
1770
+ white-space: nowrap;
1771
+ }
1772
+ .badge-cloud { background: rgba(255,255,255,0.10); color: rgba(255,255,255,0.92); }
1773
+ .badge-local { background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.78); }
1774
+ .badge-hub { background: rgba(255,255,255,0.04); color: rgba(255,255,255,0.65); }
1775
+
1776
+ .model-hub-actions {
1777
+ display: flex;
1778
+ gap: 6px;
1779
+ }
1780
+
1781
+ .model-search {
1782
+ flex: 1;
1783
+ background: var(--bg-tertiary);
1784
+ border: 1px solid var(--border);
1785
+ border-radius: var(--radius-sm);
1786
+ padding: 5px 8px;
1787
+ font-size: 11px;
1788
+ color: var(--text-primary);
1789
+ outline: none;
1790
+ }
1791
+ .model-search::placeholder { color: var(--text-tertiary); }
1792
+ .model-search:focus { border-color: var(--border-strong); }