@hanzo/browser-extension 1.7.6 → 1.9.31

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 (135) hide show
  1. package/LICENSE +9 -18
  2. package/dist/browser-extension/README.md +1 -1
  3. package/dist/browser-extension/background-firefox.js +4180 -499
  4. package/dist/browser-extension/background.js +6932 -2419
  5. package/dist/browser-extension/browser-control.js +652 -18
  6. package/dist/browser-extension/chrome/background.js +6932 -2419
  7. package/dist/browser-extension/chrome/content-script.js +1642 -123
  8. package/dist/browser-extension/chrome/icon128.png +0 -0
  9. package/dist/browser-extension/chrome/icon16.png +0 -0
  10. package/dist/browser-extension/chrome/icon48.png +0 -0
  11. package/dist/browser-extension/chrome/manifest.json +20 -11
  12. package/dist/browser-extension/chrome/popup.css +352 -110
  13. package/dist/browser-extension/chrome/popup.html +159 -48
  14. package/dist/browser-extension/chrome/popup.js +1418 -46
  15. package/dist/browser-extension/chrome/sidebar.css +772 -156
  16. package/dist/browser-extension/chrome/sidebar.html +268 -85
  17. package/dist/browser-extension/chrome/sidebar.js +25846 -84
  18. package/dist/browser-extension/cli.js +2 -2
  19. package/dist/browser-extension/content-script.js +1642 -123
  20. package/dist/browser-extension/firefox/background.js +4180 -499
  21. package/dist/browser-extension/firefox/content-script.js +1642 -123
  22. package/dist/browser-extension/firefox/icon128.png +0 -0
  23. package/dist/browser-extension/firefox/icon16.png +0 -0
  24. package/dist/browser-extension/firefox/icon48.png +0 -0
  25. package/dist/browser-extension/firefox/manifest.json +24 -13
  26. package/dist/browser-extension/firefox/popup.css +352 -110
  27. package/dist/browser-extension/firefox/popup.html +159 -48
  28. package/dist/browser-extension/firefox/popup.js +1418 -46
  29. package/dist/browser-extension/firefox/sidebar.css +772 -156
  30. package/dist/browser-extension/firefox/sidebar.html +268 -85
  31. package/dist/browser-extension/firefox/sidebar.js +25846 -84
  32. package/dist/browser-extension/icon128.png +0 -0
  33. package/dist/browser-extension/icon16.png +0 -0
  34. package/dist/browser-extension/icon48.png +0 -0
  35. package/dist/browser-extension/manifest.json +20 -11
  36. package/dist/browser-extension/package.json +1 -1
  37. package/dist/browser-extension/popup.js +1418 -46
  38. package/dist/browser-extension/safari/Info.plist +3 -3
  39. package/dist/browser-extension/safari/background.js +6932 -2419
  40. package/dist/browser-extension/safari/content-script.js +1642 -123
  41. package/dist/browser-extension/safari/icon128.png +0 -0
  42. package/dist/browser-extension/safari/icon16.png +0 -0
  43. package/dist/browser-extension/safari/icon48.png +0 -0
  44. package/dist/browser-extension/safari/popup.css +352 -110
  45. package/dist/browser-extension/safari/popup.html +159 -48
  46. package/dist/browser-extension/safari/popup.js +1418 -46
  47. package/dist/browser-extension/safari/sidebar.css +772 -156
  48. package/dist/browser-extension/safari/sidebar.html +268 -85
  49. package/dist/browser-extension/safari/sidebar.js +25846 -84
  50. package/dist/browser-extension/sidebar.js +25846 -84
  51. package/dist/browser-extension/webgpu-ai.js +78 -5
  52. package/images/icon128.png +0 -0
  53. package/images/icon16.png +0 -0
  54. package/images/icon48.png +0 -0
  55. package/manifest.json +7 -2
  56. package/package.json +27 -10
  57. package/src/chat-widget.tsx +96 -0
  58. package/src/gui-primitives.tsx +116 -0
  59. package/src/icon128.png +0 -0
  60. package/src/icon16.png +0 -0
  61. package/src/icon32.png +0 -0
  62. package/src/icon48.png +0 -0
  63. package/src/manifest-firefox.json +23 -12
  64. package/src/manifest.json +19 -10
  65. package/src/package.json +1 -1
  66. package/src/popup.css +352 -110
  67. package/src/popup.html +159 -48
  68. package/src/popup.js +196 -0
  69. package/src/sidebar.css +772 -156
  70. package/src/sidebar.html +268 -85
  71. package/src/sidebar.js +885 -0
  72. package/.github/workflows/docs.yml +0 -44
  73. package/.github/workflows/release.yml +0 -55
  74. package/README.md +0 -126
  75. package/dist/browser-extension/ai-worker.js +0 -30
  76. package/dist/browser-extension/cdp-bridge-server.js +0 -444
  77. package/dist/browser-extension/chrome/icon32.png +0 -0
  78. package/dist/browser-extension/firefox/icon32.png +0 -0
  79. package/dist/browser-extension/hanzo-browser-extension-firefox-1.1.0.zip +0 -0
  80. package/dist/browser-extension/icon32.png +0 -0
  81. package/dist/browser-extension/popup.css +0 -468
  82. package/dist/browser-extension/popup.html +0 -191
  83. package/dist/browser-extension/safari/icon32.png +0 -0
  84. package/dist/browser-extension/sidebar.css +0 -718
  85. package/dist/browser-extension/sidebar.html +0 -184
  86. package/dist/cdp-bridge-server.js +0 -411
  87. package/dist/hanzo-ai-chrome-1.7.2.zip +0 -0
  88. package/dist/hanzo-ai-chrome-1.7.3.zip +0 -0
  89. package/dist/hanzo-ai-firefox-1.7.2.zip +0 -0
  90. package/dist/hanzo-ai-firefox-1.7.3.zip +0 -0
  91. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.pbxproj +0 -1047
  92. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  93. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +0 -11
  94. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  95. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png +0 -0
  96. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png +0 -0
  97. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png +0 -0
  98. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png +0 -0
  99. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png +0 -0
  100. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png +0 -0
  101. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png +0 -0
  102. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png +0 -0
  103. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png +0 -0
  104. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png +0 -0
  105. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/universal-icon-1024@1x.png +0 -0
  106. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/Contents.json +0 -6
  107. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json +0 -21
  108. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon128.png +0 -0
  109. package/dist/safari/Hanzo AI/Shared (App)/Resources/Base.lproj/Main.html +0 -20
  110. package/dist/safari/Hanzo AI/Shared (App)/Resources/Icon.png +0 -0
  111. package/dist/safari/Hanzo AI/Shared (App)/Resources/Script.js +0 -24
  112. package/dist/safari/Hanzo AI/Shared (App)/Resources/Style.css +0 -61
  113. package/dist/safari/Hanzo AI/Shared (App)/ViewController.swift +0 -81
  114. package/dist/safari/Hanzo AI/Shared (Extension)/SafariWebExtensionHandler.swift +0 -42
  115. package/dist/safari/Hanzo AI/iOS (App)/AppDelegate.swift +0 -24
  116. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/LaunchScreen.storyboard +0 -36
  117. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/Main.storyboard +0 -38
  118. package/dist/safari/Hanzo AI/iOS (App)/Info.plist +0 -27
  119. package/dist/safari/Hanzo AI/iOS (App)/SceneDelegate.swift +0 -18
  120. package/dist/safari/Hanzo AI/iOS (Extension)/Info.plist +0 -13
  121. package/dist/safari/Hanzo AI/macOS (App)/AppDelegate.swift +0 -21
  122. package/dist/safari/Hanzo AI/macOS (App)/Base.lproj/Main.storyboard +0 -124
  123. package/dist/safari/Hanzo AI/macOS (App)/Info.plist +0 -8
  124. package/dist/safari/Hanzo AI/macOS (Extension)/Info.plist +0 -13
  125. package/docs/_config.yml +0 -13
  126. package/docs/_layouts/default.html +0 -435
  127. package/docs/index.md +0 -54
  128. package/hanzo-ai-chrome-v1.7.6.zip +0 -0
  129. package/hanzo-ai-firefox-v1.7.6.zip +0 -0
  130. package/install-extension.sh +0 -75
  131. package/test/claude-integration.test.ts +0 -251
  132. package/test/server-frameworks-edge-cases.test.ts +0 -145
  133. package/test/server-frameworks.test.ts +0 -395
  134. package/test-cdp-connection.js +0 -140
  135. package/tsconfig.json +0 -19
@@ -1,30 +1,38 @@
1
- /* Hanzo AI Browser Extension Sidebar — Monochrome Vibrancy */
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. */
2
4
 
3
5
  :root {
4
- --bg-primary: #000000;
5
- --bg-secondary: #0A0A0A;
6
- --bg-tertiary: #141414;
7
- --bg-hover: #1F1F1F;
6
+ --bg-primary: #0a0a0a;
7
+ --bg-secondary: #0f0f0f;
8
+ --bg-tertiary: #171717;
9
+ --bg-hover: #262626;
8
10
 
9
- --text-primary: #FFFFFF;
10
- --text-secondary: #A0A0A0;
11
- --text-tertiary: #6B6B6B;
11
+ --text-primary: #fafafa;
12
+ --text-secondary: #a3a3a3;
13
+ --text-tertiary: #666666;
12
14
 
13
- --accent: #FFFFFF;
14
- --accent-hover: #D4D4D4;
15
+ --accent: #fafafa;
16
+ --accent-hover: #d4d4d4;
15
17
  --accent-dim: rgba(255,255,255,0.06);
16
18
  --accent-glow: rgba(255,255,255,0.03);
17
19
 
18
- --success: #4CAF50;
19
- --warning: #FFC107;
20
- --error: #F44336;
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);
21
25
 
22
- --border: rgba(255,255,255,0.08);
23
- --border-strong: rgba(255,255,255,0.14);
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);
24
29
  --glass: rgba(255,255,255,0.04);
25
30
  --glass-strong: rgba(255,255,255,0.07);
26
31
  --shadow: 0 4px 12px rgba(0,0,0,0.6);
27
32
  --shadow-lg: 0 8px 32px rgba(0,0,0,0.5);
33
+ --radius: 10px;
34
+ --radius-md: 8px;
35
+ --radius-sm: 6px;
28
36
  }
29
37
 
30
38
  * {
@@ -34,16 +42,23 @@
34
42
  }
35
43
 
36
44
  body {
37
- font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif;
45
+ font-family: 'Geist Sans', -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', sans-serif;
38
46
  background: var(--bg-primary);
39
47
  color: var(--text-primary);
40
48
  font-size: 13px;
41
49
  line-height: 1.6;
42
- overflow-x: hidden;
50
+ overflow: hidden;
51
+ width: 100%;
52
+ height: 100vh;
43
53
  -webkit-font-smoothing: antialiased;
44
54
  -moz-osx-font-smoothing: grayscale;
45
55
  }
46
56
 
57
+ html {
58
+ overflow: hidden;
59
+ height: 100vh;
60
+ }
61
+
47
62
  .hidden { display: none !important; }
48
63
 
49
64
  /* ==================== Shimmer Keyframes ==================== */
@@ -86,13 +101,15 @@ body {
86
101
  /* ==================== Layout ==================== */
87
102
 
88
103
  .sidebar-container {
89
- width: 320px;
104
+ width: 100%;
105
+ min-width: 0;
90
106
  height: 100vh;
91
107
  display: flex;
92
108
  flex-direction: column;
93
109
  background: var(--bg-secondary);
94
110
  border-left: 1px solid var(--border);
95
111
  position: relative;
112
+ overflow: hidden;
96
113
  }
97
114
 
98
115
  /* Ambient glow behind sidebar */
@@ -211,38 +228,99 @@ body {
211
228
  display: flex;
212
229
  align-items: center;
213
230
  justify-content: center;
214
- padding: 40px 20px;
231
+ padding: 40px 24px;
215
232
  flex: 1;
216
233
  animation: fadeIn 0.4s ease;
217
234
  }
218
235
 
219
236
  .auth-card.compact {
220
237
  text-align: center;
221
- max-width: 260px;
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));
222
249
  }
223
250
 
224
251
  .auth-card.compact .auth-headline {
225
- font-size: 16px;
226
- font-weight: 600;
252
+ font-size: 22px;
253
+ font-weight: 700;
227
254
  color: var(--text-primary);
228
- margin-bottom: 4px;
255
+ margin-bottom: 10px;
256
+ letter-spacing: -0.02em;
229
257
  }
230
258
 
231
259
  .auth-card.compact .auth-sub {
232
- font-size: 12px;
233
- color: var(--text-tertiary);
234
- margin-bottom: 20px;
260
+ font-size: 13px;
261
+ color: var(--text-secondary);
262
+ margin-bottom: 24px;
263
+ line-height: 1.5;
235
264
  }
236
265
 
237
- .auth-card.compact .primary-btn {
266
+ /* Sign-in button — matches @hanzo/gui primary button on dark (monochrome) */
267
+ .auth-signin-btn {
238
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;
239
310
  margin-bottom: 16px;
240
311
  }
241
312
 
313
+ .auth-create-btn:hover {
314
+ color: var(--text-primary);
315
+ background: var(--glass);
316
+ border-color: var(--border-strong);
317
+ }
318
+
242
319
  .auth-card.compact .auth-note {
243
320
  font-size: 11px;
244
321
  color: var(--text-tertiary);
245
322
  margin-bottom: 0;
323
+ line-height: 1.5;
246
324
  }
247
325
 
248
326
  .auth-card.compact .auth-note a {
@@ -259,7 +337,7 @@ body {
259
337
  .chat-modern-login-card {
260
338
  width: min(320px, 100%);
261
339
  border: 1px solid var(--border-strong);
262
- border-radius: 14px;
340
+ border-radius: var(--radius);
263
341
  background: var(--glass-strong);
264
342
  backdrop-filter: blur(24px) saturate(180%);
265
343
  -webkit-backdrop-filter: blur(24px) saturate(180%);
@@ -274,6 +352,11 @@ body {
274
352
  margin-bottom: 14px;
275
353
  }
276
354
 
355
+ .chat-modern-login-card #signup-btn {
356
+ width: 100%;
357
+ margin-bottom: 14px;
358
+ }
359
+
277
360
  .chat-modern-login-card .auth-note {
278
361
  font-size: 11px;
279
362
  color: var(--text-tertiary);
@@ -348,6 +431,7 @@ body {
348
431
 
349
432
  .tab-content {
350
433
  flex: 1;
434
+ min-height: 0;
351
435
  display: flex;
352
436
  flex-direction: column;
353
437
  overflow: hidden;
@@ -357,36 +441,55 @@ body {
357
441
  .tools-scroll,
358
442
  .settings-scroll {
359
443
  flex: 1;
444
+ min-height: 0;
360
445
  overflow-y: auto;
446
+ padding-bottom: 8px;
447
+ overflow-x: hidden;
361
448
  padding: 16px;
362
449
  display: flex;
363
450
  flex-direction: column;
364
451
  gap: 16px;
452
+ scrollbar-width: thin;
453
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
365
454
  }
366
455
 
367
456
  /* ==================== Chat ==================== */
368
457
 
369
458
  .chat-messages {
370
459
  flex: 1;
460
+ min-height: 0;
371
461
  overflow-y: auto;
462
+ overflow-x: hidden;
372
463
  padding: 16px;
373
464
  display: flex;
374
465
  flex-direction: column;
375
466
  gap: 12px;
467
+ scrollbar-width: thin;
468
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
376
469
  }
377
470
 
378
471
  .chat-welcome {
472
+ display: flex;
473
+ flex-direction: column;
474
+ align-items: center;
475
+ justify-content: center;
476
+ flex: 1;
379
477
  text-align: center;
380
478
  color: var(--text-tertiary);
381
479
  padding: 40px 20px;
382
- font-size: 13px;
480
+ font-size: 12px;
481
+ letter-spacing: 0.01em;
482
+ gap: 8px;
483
+ }
484
+
485
+ .chat-welcome p {
383
486
  animation: breathe 4s infinite ease-in-out;
384
487
  }
385
488
 
386
489
  .msg {
387
490
  max-width: 90%;
388
491
  padding: 10px 14px;
389
- border-radius: 12px;
492
+ border-radius: var(--radius);
390
493
  font-size: 13px;
391
494
  line-height: 1.5;
392
495
  word-wrap: break-word;
@@ -414,17 +517,17 @@ body {
414
517
  .msg-assistant pre {
415
518
  background: var(--bg-primary);
416
519
  border: 1px solid var(--border);
417
- border-radius: 6px;
520
+ border-radius: var(--radius-sm);
418
521
  padding: 10px 12px;
419
522
  margin: 8px 0;
420
523
  overflow-x: auto;
421
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
524
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
422
525
  font-size: 12px;
423
526
  line-height: 1.4;
424
527
  }
425
528
 
426
529
  .msg-assistant code {
427
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
530
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
428
531
  font-size: 12px;
429
532
  background: rgba(255,255,255,0.06);
430
533
  padding: 2px 5px;
@@ -442,7 +545,7 @@ body {
442
545
  color: white;
443
546
  font-size: 12px;
444
547
  padding: 6px 12px;
445
- border-radius: 6px;
548
+ border-radius: var(--radius-sm);
446
549
  }
447
550
 
448
551
  .typing-indicator {
@@ -467,138 +570,177 @@ body {
467
570
  .typing-indicator span:nth-child(2) { animation-delay: 0.2s; }
468
571
  .typing-indicator span:nth-child(3) { animation-delay: 0.4s; }
469
572
 
470
- /* Chat Input */
573
+ /* ==================== Composer (Modern Chat Input) ==================== */
471
574
 
472
- .chat-input-area {
473
- border-top: 1px solid var(--border);
474
- padding: 12px 16px;
475
- background: rgba(0,0,0,0.5);
476
- backdrop-filter: blur(20px) saturate(180%);
477
- -webkit-backdrop-filter: blur(20px) saturate(180%);
575
+ .composer {
576
+ padding: 10px;
478
577
  flex-shrink: 0;
479
578
  position: relative;
480
579
  z-index: 10;
580
+ border-top: 1px solid rgba(255,255,255,0.10);
581
+ background: #0f0f0f;
481
582
  }
482
583
 
483
- .chat-modern-composer {
484
- display: flex;
485
- flex-direction: column;
486
- gap: 8px;
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;
487
590
  }
488
591
 
489
- .model-selector {
490
- margin-bottom: 8px;
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);
491
595
  }
492
596
 
493
- .model-selector select {
597
+ .composer-box textarea {
598
+ display: block;
494
599
  width: 100%;
495
- padding: 6px 10px;
496
- background: var(--glass-strong);
497
- border: 1px solid var(--border);
498
- border-radius: 6px;
499
- color: var(--text-primary);
500
- font-size: 12px;
501
- cursor: pointer;
502
- backdrop-filter: blur(8px);
503
- -webkit-backdrop-filter: blur(8px);
504
- transition: border-color 0.2s;
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;
505
612
  }
506
613
 
507
- .model-selector select:focus {
508
- border-color: var(--border-strong);
509
- outline: none;
614
+ .composer-box textarea::placeholder {
615
+ color: #666;
510
616
  }
511
617
 
512
- .chat-flags {
618
+ .composer-bar {
513
619
  display: flex;
514
620
  align-items: center;
515
- gap: 10px;
516
- margin-bottom: 8px;
621
+ justify-content: space-between;
622
+ padding: 4px 8px 8px;
623
+ gap: 4px;
517
624
  }
518
625
 
519
- .flag-toggle {
520
- display: inline-flex;
626
+ .composer-controls {
627
+ display: flex;
521
628
  align-items: center;
522
629
  gap: 4px;
523
- font-size: 11px;
524
- color: var(--text-secondary);
525
- user-select: none;
630
+ flex: 1;
631
+ min-width: 0;
632
+ overflow: hidden;
526
633
  }
527
634
 
528
- .flag-toggle input[type="checkbox"] {
529
- width: 14px;
530
- height: 14px;
531
- accent-color: var(--accent);
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;
532
658
  }
533
659
 
534
- .rag-status {
535
- margin-left: auto;
536
- font-size: 11px;
537
- color: var(--text-tertiary);
660
+ .composer-model:hover {
661
+ border-color: rgba(255,255,255,0.16);
538
662
  }
539
663
 
540
- .input-row {
541
- display: flex;
542
- gap: 8px;
543
- align-items: flex-end;
664
+ .composer-model:focus {
665
+ border-color: rgba(255,255,255,0.16);
666
+ outline: none;
544
667
  }
545
668
 
546
- .input-row textarea {
547
- flex: 1;
548
- padding: 10px 14px;
549
- background: var(--glass-strong);
550
- border: 1px solid var(--border);
551
- border-radius: 10px;
552
- color: var(--text-primary);
553
- font-size: 13px;
554
- font-family: inherit;
555
- line-height: 1.4;
556
- resize: none;
557
- outline: none;
558
- max-height: 120px;
559
- transition: border-color 0.2s, box-shadow 0.2s;
560
- backdrop-filter: blur(8px);
561
- -webkit-backdrop-filter: blur(8px);
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;
562
682
  }
563
683
 
564
- .input-row textarea:focus {
565
- border-color: var(--border-strong);
566
- box-shadow: 0 0 0 1px rgba(255,255,255,0.08);
684
+ .composer-toggle:hover {
685
+ background: rgba(255,255,255,0.04);
567
686
  }
568
687
 
569
- .chat-modern-input {
570
- min-height: 40px;
688
+ .composer-toggle input[type="checkbox"] {
689
+ width: 11px;
690
+ height: 11px;
691
+ accent-color: #fafafa;
692
+ cursor: pointer;
693
+ margin: 0;
571
694
  }
572
695
 
573
- .send-btn {
574
- width: 36px;
575
- height: 36px;
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;
576
712
  display: flex;
577
713
  align-items: center;
578
714
  justify-content: center;
579
715
  background: var(--accent);
580
716
  border: none;
581
- border-radius: 10px;
582
- color: #000000;
717
+ border-radius: 50%;
718
+ color: #000;
583
719
  cursor: pointer;
584
720
  flex-shrink: 0;
585
721
  transition: all 0.2s;
586
722
  }
587
723
 
588
- .send-btn:hover {
724
+ .composer-send:hover {
589
725
  background: var(--accent-hover);
590
726
  box-shadow: 0 0 12px rgba(255,255,255,0.15);
727
+ transform: scale(1.05);
591
728
  }
592
729
 
593
- .send-btn:disabled {
594
- opacity: 0.3;
730
+ .composer-send:active {
731
+ transform: scale(0.95);
732
+ }
733
+
734
+ .composer-send:disabled {
735
+ opacity: 0.15;
595
736
  cursor: not-allowed;
596
737
  box-shadow: none;
738
+ transform: none;
597
739
  }
598
740
 
599
- .send-btn svg {
600
- width: 16px;
601
- height: 16px;
741
+ .composer-send svg {
742
+ width: 13px;
743
+ height: 13px;
602
744
  }
603
745
 
604
746
  /* ==================== Buttons ==================== */
@@ -611,7 +753,7 @@ body {
611
753
  justify-content: center;
612
754
  background: transparent;
613
755
  border: none;
614
- border-radius: 6px;
756
+ border-radius: var(--radius-sm);
615
757
  color: var(--text-secondary);
616
758
  cursor: pointer;
617
759
  transition: all 0.2s;
@@ -632,13 +774,19 @@ body {
632
774
  height: 18px;
633
775
  }
634
776
 
777
+ .settings-scroll > .primary-btn {
778
+ margin-top: 4px;
779
+ margin-bottom: 12px;
780
+ flex-shrink: 0;
781
+ }
782
+
635
783
  .primary-btn {
636
784
  width: 100%;
637
785
  padding: 10px 16px;
638
786
  background: var(--accent);
639
787
  color: #000000;
640
788
  border: none;
641
- border-radius: 8px;
789
+ border-radius: var(--radius-md);
642
790
  font-weight: 600;
643
791
  font-size: 13px;
644
792
  cursor: pointer;
@@ -676,21 +824,19 @@ body {
676
824
  .secondary-btn {
677
825
  width: 100%;
678
826
  padding: 8px 16px;
679
- background: var(--glass-strong);
827
+ background: var(--bg-tertiary);
680
828
  color: var(--text-primary);
681
829
  border: 1px solid var(--border);
682
- border-radius: 8px;
830
+ border-radius: var(--radius-md);
683
831
  font-size: 12px;
832
+ font-family: inherit;
684
833
  cursor: pointer;
685
834
  transition: all 0.2s;
686
- backdrop-filter: blur(8px);
687
- -webkit-backdrop-filter: blur(8px);
688
835
  }
689
836
 
690
837
  .secondary-btn:hover {
691
- background: var(--glass);
838
+ background: var(--bg-hover);
692
839
  border-color: var(--border-strong);
693
- box-shadow: 0 0 8px rgba(255,255,255,0.05);
694
840
  }
695
841
 
696
842
  .action-btn {
@@ -700,22 +846,20 @@ body {
700
846
  justify-content: center;
701
847
  gap: 8px;
702
848
  padding: 10px;
703
- background: var(--glass-strong);
849
+ background: var(--bg-tertiary);
704
850
  border: 1px solid var(--border);
705
- border-radius: 8px;
851
+ border-radius: var(--radius-md);
706
852
  color: var(--text-primary);
707
853
  font-size: 12px;
708
854
  font-weight: 500;
855
+ font-family: inherit;
709
856
  cursor: pointer;
710
857
  transition: all 0.25s ease;
711
- backdrop-filter: blur(8px);
712
- -webkit-backdrop-filter: blur(8px);
713
858
  }
714
859
 
715
860
  .action-btn:hover {
716
- background: var(--glass);
861
+ background: var(--bg-hover);
717
862
  border-color: var(--border-strong);
718
- box-shadow: 0 0 12px rgba(255,255,255,0.06);
719
863
  }
720
864
 
721
865
  .action-btn svg {
@@ -726,15 +870,13 @@ body {
726
870
  /* ==================== Glass Panels ==================== */
727
871
 
728
872
  .panel {
729
- background: var(--glass-strong);
730
- backdrop-filter: blur(16px) saturate(150%);
731
- -webkit-backdrop-filter: blur(16px) saturate(150%);
873
+ background: var(--bg-tertiary);
732
874
  border: 1px solid var(--border);
733
- border-radius: 10px;
875
+ border-radius: var(--radius);
734
876
  padding: 16px;
735
- transition: border-color 0.3s, box-shadow 0.3s;
877
+ transition: border-color 0.3s;
736
878
  position: relative;
737
- overflow: hidden;
879
+ overflow: visible;
738
880
  }
739
881
 
740
882
  /* Subtle top highlight on glass panels */
@@ -772,7 +914,7 @@ body {
772
914
  background: var(--accent-dim);
773
915
  color: var(--accent);
774
916
  padding: 2px 8px;
775
- border-radius: 12px;
917
+ border-radius: var(--radius);
776
918
  font-size: 11px;
777
919
  font-weight: 600;
778
920
  }
@@ -826,29 +968,217 @@ body {
826
968
  }
827
969
 
828
970
  .mono {
829
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
971
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
830
972
  font-size: 11px;
831
973
  }
832
974
 
833
- .tool-list-wrap {
834
- margin-top: 10px;
835
- padding-top: 10px;
836
- border-top: 1px solid var(--border);
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;
837
990
  }
838
991
 
839
- .tool-list-header {
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;
840
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 {
841
1100
  font-size: 11px;
842
- margin-bottom: 6px;
843
1101
  }
844
1102
 
845
1103
  .tool-list {
846
- max-height: 90px;
1104
+ max-height: 200px;
847
1105
  overflow-y: auto;
848
1106
  font-size: 11px;
849
1107
  line-height: 1.4;
850
1108
  color: var(--text-tertiary);
851
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
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;
852
1182
  }
853
1183
 
854
1184
  /* ==================== User Profile ==================== */
@@ -894,7 +1224,7 @@ body {
894
1224
  padding: 10px;
895
1225
  background: var(--glass);
896
1226
  border: 1px solid var(--border);
897
- border-radius: 6px;
1227
+ border-radius: var(--radius-sm);
898
1228
  transition: all 0.2s;
899
1229
  }
900
1230
 
@@ -907,7 +1237,7 @@ body {
907
1237
  width: 32px;
908
1238
  height: 32px;
909
1239
  background: var(--accent-dim);
910
- border-radius: 6px;
1240
+ border-radius: var(--radius-sm);
911
1241
  display: flex;
912
1242
  align-items: center;
913
1243
  justify-content: center;
@@ -922,10 +1252,12 @@ body {
922
1252
  /* ==================== Tab Filesystem ==================== */
923
1253
 
924
1254
  .tab-filesystem {
925
- max-height: 200px;
1255
+ max-height: 240px;
926
1256
  overflow-y: auto;
927
- font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
1257
+ font-family: 'Geist Mono', 'Monaco', 'Consolas', monospace;
928
1258
  font-size: 12px;
1259
+ scrollbar-width: thin;
1260
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
929
1261
  }
930
1262
 
931
1263
  .tab-item {
@@ -951,12 +1283,15 @@ body {
951
1283
  display: flex;
952
1284
  align-items: center;
953
1285
  justify-content: space-between;
1286
+ gap: 8px;
954
1287
  padding: 8px 0;
955
1288
  }
956
1289
 
957
- .setting-item span {
1290
+ .setting-item > span {
958
1291
  font-size: 12px;
959
1292
  color: var(--text-secondary);
1293
+ white-space: nowrap;
1294
+ flex-shrink: 0;
960
1295
  }
961
1296
 
962
1297
  .setting-item input[type="text"],
@@ -964,14 +1299,26 @@ body {
964
1299
  .setting-item select {
965
1300
  width: 140px;
966
1301
  padding: 6px 10px;
967
- background: var(--glass-strong);
1302
+ background: var(--bg-tertiary);
968
1303
  border: 1px solid var(--border);
969
- border-radius: 6px;
1304
+ border-radius: var(--radius-sm);
970
1305
  color: var(--text-primary);
971
1306
  font-size: 12px;
1307
+ font-family: inherit;
972
1308
  transition: border-color 0.2s;
973
1309
  }
974
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
+
975
1322
  .setting-item input:focus,
976
1323
  .setting-item select:focus {
977
1324
  border-color: var(--border-strong);
@@ -992,14 +1339,21 @@ body {
992
1339
  .setting-item input[type="number"] {
993
1340
  width: 70px;
994
1341
  padding: 6px 10px;
995
- background: var(--glass-strong);
1342
+ background: var(--bg-tertiary);
996
1343
  border: 1px solid var(--border);
997
- border-radius: 6px;
1344
+ border-radius: var(--radius-sm);
998
1345
  color: var(--text-primary);
999
1346
  font-size: 12px;
1347
+ font-family: inherit;
1348
+ -moz-appearance: textfield;
1000
1349
  transition: border-color 0.2s;
1001
1350
  }
1002
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
+
1003
1357
  .setting-item input[type="number"]:focus {
1004
1358
  border-color: var(--border-strong);
1005
1359
  outline: none;
@@ -1008,10 +1362,22 @@ body {
1008
1362
  .setting-item input[type="checkbox"] {
1009
1363
  width: 16px;
1010
1364
  height: 16px;
1365
+ min-width: 16px;
1011
1366
  cursor: pointer;
1012
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;
1013
1376
  }
1014
1377
 
1378
+ /* Color scheme hint for native widgets */
1379
+ :root { color-scheme: dark; }
1380
+
1015
1381
  .settings-links {
1016
1382
  display: flex;
1017
1383
  justify-content: center;
@@ -1058,7 +1424,7 @@ body {
1058
1424
  backdrop-filter: blur(20px);
1059
1425
  -webkit-backdrop-filter: blur(20px);
1060
1426
  border: 1px solid var(--border);
1061
- border-radius: 8px;
1427
+ border-radius: var(--radius-md);
1062
1428
  color: var(--text-primary);
1063
1429
  font-size: 12px;
1064
1430
  text-align: center;
@@ -1073,6 +1439,13 @@ body {
1073
1439
 
1074
1440
  /* ==================== Scrollbar ==================== */
1075
1441
 
1442
+ /* Firefox */
1443
+ * {
1444
+ scrollbar-width: thin;
1445
+ scrollbar-color: rgba(255,255,255,0.08) transparent;
1446
+ }
1447
+
1448
+ /* Chrome / Safari */
1076
1449
  ::-webkit-scrollbar { width: 5px; height: 5px; }
1077
1450
  ::-webkit-scrollbar-track { background: transparent; }
1078
1451
  ::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 3px; }
@@ -1082,6 +1455,43 @@ body {
1082
1455
 
1083
1456
  .loading { animation: pulse 1.5s infinite; }
1084
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
+
1085
1495
  /* ==================== Agent Launcher Modal ==================== */
1086
1496
 
1087
1497
  .modal-overlay {
@@ -1103,7 +1513,7 @@ body {
1103
1513
  .modal-content {
1104
1514
  background: var(--bg-secondary);
1105
1515
  border: 1px solid var(--border-strong);
1106
- border-radius: 12px;
1516
+ border-radius: var(--radius);
1107
1517
  width: calc(100% - 32px);
1108
1518
  max-width: 320px;
1109
1519
  overflow: hidden;
@@ -1147,14 +1557,19 @@ body {
1147
1557
 
1148
1558
  .modal-body textarea {
1149
1559
  width: 100%;
1150
- background: var(--glass-strong);
1560
+ background: var(--bg-tertiary);
1151
1561
  border: 1px solid var(--border);
1152
- border-radius: 6px;
1562
+ border-radius: var(--radius-sm);
1153
1563
  color: var(--text-primary);
1154
1564
  padding: 8px;
1155
1565
  font-family: inherit;
1156
1566
  font-size: 12px;
1157
1567
  resize: vertical;
1568
+ outline: none;
1569
+ }
1570
+
1571
+ .modal-body textarea:focus {
1572
+ border-color: var(--border-strong);
1158
1573
  }
1159
1574
 
1160
1575
  .modal-footer {
@@ -1174,3 +1589,204 @@ body {
1174
1589
  padding: 6px 16px;
1175
1590
  font-size: 12px;
1176
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); }