@hanzo/browser-extension 1.9.34 → 1.9.36

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 (71) hide show
  1. package/package.json +1 -1
  2. package/src/answer/AnswerEngine.tsx +8 -0
  3. package/src/onboarding.css +78 -0
  4. package/src/onboarding.html +45 -0
  5. package/src/popup.html +28 -0
  6. package/dist/browser-extension/README.md +0 -43
  7. package/dist/browser-extension/background-firefox.js +0 -5983
  8. package/dist/browser-extension/background.js +0 -8670
  9. package/dist/browser-extension/browser-control.js +0 -1317
  10. package/dist/browser-extension/chrome/ai-worker.js +0 -571
  11. package/dist/browser-extension/chrome/background.js +0 -8670
  12. package/dist/browser-extension/chrome/callback.html +0 -17
  13. package/dist/browser-extension/chrome/content-script.js +0 -2789
  14. package/dist/browser-extension/chrome/icon128.png +0 -0
  15. package/dist/browser-extension/chrome/icon16.png +0 -0
  16. package/dist/browser-extension/chrome/icon48.png +0 -0
  17. package/dist/browser-extension/chrome/manifest.json +0 -81
  18. package/dist/browser-extension/chrome/newtab.css +0 -277
  19. package/dist/browser-extension/chrome/newtab.html +0 -13
  20. package/dist/browser-extension/chrome/newtab.js +0 -64
  21. package/dist/browser-extension/chrome/popup.css +0 -761
  22. package/dist/browser-extension/chrome/popup.html +0 -381
  23. package/dist/browser-extension/chrome/popup.js +0 -1716
  24. package/dist/browser-extension/chrome/sidebar.css +0 -1792
  25. package/dist/browser-extension/chrome/sidebar.html +0 -463
  26. package/dist/browser-extension/chrome/sidebar.js +0 -26541
  27. package/dist/browser-extension/cli.js +0 -233
  28. package/dist/browser-extension/content-script.js +0 -2789
  29. package/dist/browser-extension/firefox/ai-worker.js +0 -571
  30. package/dist/browser-extension/firefox/background.js +0 -5983
  31. package/dist/browser-extension/firefox/callback.html +0 -17
  32. package/dist/browser-extension/firefox/content-script.js +0 -2789
  33. package/dist/browser-extension/firefox/icon128.png +0 -0
  34. package/dist/browser-extension/firefox/icon16.png +0 -0
  35. package/dist/browser-extension/firefox/icon48.png +0 -0
  36. package/dist/browser-extension/firefox/manifest.json +0 -85
  37. package/dist/browser-extension/firefox/newtab.css +0 -277
  38. package/dist/browser-extension/firefox/newtab.html +0 -13
  39. package/dist/browser-extension/firefox/newtab.js +0 -64
  40. package/dist/browser-extension/firefox/popup.css +0 -761
  41. package/dist/browser-extension/firefox/popup.html +0 -381
  42. package/dist/browser-extension/firefox/popup.js +0 -1716
  43. package/dist/browser-extension/firefox/sidebar.css +0 -1792
  44. package/dist/browser-extension/firefox/sidebar.html +0 -463
  45. package/dist/browser-extension/firefox/sidebar.js +0 -26541
  46. package/dist/browser-extension/icon128.png +0 -0
  47. package/dist/browser-extension/icon16.png +0 -0
  48. package/dist/browser-extension/icon48.png +0 -0
  49. package/dist/browser-extension/manifest.json +0 -81
  50. package/dist/browser-extension/newtab.js +0 -64
  51. package/dist/browser-extension/package.json +0 -41
  52. package/dist/browser-extension/popup.js +0 -1716
  53. package/dist/browser-extension/safari/Info.plist +0 -21
  54. package/dist/browser-extension/safari/ai-worker.js +0 -571
  55. package/dist/browser-extension/safari/background.js +0 -8670
  56. package/dist/browser-extension/safari/callback.html +0 -17
  57. package/dist/browser-extension/safari/content-script.js +0 -2789
  58. package/dist/browser-extension/safari/icon128.png +0 -0
  59. package/dist/browser-extension/safari/icon16.png +0 -0
  60. package/dist/browser-extension/safari/icon48.png +0 -0
  61. package/dist/browser-extension/safari/newtab.css +0 -277
  62. package/dist/browser-extension/safari/newtab.html +0 -13
  63. package/dist/browser-extension/safari/newtab.js +0 -64
  64. package/dist/browser-extension/safari/popup.css +0 -761
  65. package/dist/browser-extension/safari/popup.html +0 -381
  66. package/dist/browser-extension/safari/popup.js +0 -1716
  67. package/dist/browser-extension/safari/sidebar.css +0 -1792
  68. package/dist/browser-extension/safari/sidebar.html +0 -463
  69. package/dist/browser-extension/safari/sidebar.js +0 -26541
  70. package/dist/browser-extension/sidebar.js +0 -26541
  71. package/dist/browser-extension/webgpu-ai.js +0 -568
@@ -1,1792 +0,0 @@
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); }