@hanzo/browser-extension 1.9.33 → 1.9.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/browser-extension/README.md +43 -0
  2. package/dist/browser-extension/background-firefox.js +5983 -0
  3. package/dist/browser-extension/background.js +8670 -0
  4. package/dist/browser-extension/browser-control.js +1317 -0
  5. package/dist/browser-extension/chrome/ai-worker.js +571 -0
  6. package/dist/browser-extension/chrome/background.js +8670 -0
  7. package/dist/browser-extension/chrome/callback.html +17 -0
  8. package/dist/browser-extension/chrome/content-script.js +2789 -0
  9. package/dist/browser-extension/chrome/icon128.png +0 -0
  10. package/dist/browser-extension/chrome/icon16.png +0 -0
  11. package/dist/browser-extension/chrome/icon48.png +0 -0
  12. package/dist/browser-extension/chrome/manifest.json +81 -0
  13. package/dist/browser-extension/chrome/newtab.css +277 -0
  14. package/dist/browser-extension/chrome/newtab.html +13 -0
  15. package/dist/browser-extension/chrome/newtab.js +64 -0
  16. package/dist/browser-extension/chrome/popup.css +761 -0
  17. package/dist/browser-extension/chrome/popup.html +381 -0
  18. package/dist/browser-extension/chrome/popup.js +1716 -0
  19. package/dist/browser-extension/chrome/sidebar.css +1792 -0
  20. package/dist/browser-extension/chrome/sidebar.html +463 -0
  21. package/dist/browser-extension/chrome/sidebar.js +26541 -0
  22. package/dist/browser-extension/cli.js +233 -0
  23. package/dist/browser-extension/firefox/ai-worker.js +571 -0
  24. package/dist/browser-extension/firefox/background.js +5983 -0
  25. package/dist/browser-extension/firefox/callback.html +17 -0
  26. package/dist/browser-extension/firefox/content-script.js +2789 -0
  27. package/dist/browser-extension/firefox/icon128.png +0 -0
  28. package/dist/browser-extension/firefox/icon16.png +0 -0
  29. package/dist/browser-extension/firefox/icon48.png +0 -0
  30. package/dist/browser-extension/firefox/manifest.json +85 -0
  31. package/dist/browser-extension/firefox/newtab.css +277 -0
  32. package/dist/browser-extension/firefox/newtab.html +13 -0
  33. package/dist/browser-extension/firefox/newtab.js +64 -0
  34. package/dist/browser-extension/firefox/popup.css +761 -0
  35. package/dist/browser-extension/firefox/popup.html +381 -0
  36. package/dist/browser-extension/firefox/popup.js +1716 -0
  37. package/dist/browser-extension/firefox/sidebar.css +1792 -0
  38. package/dist/browser-extension/firefox/sidebar.html +463 -0
  39. package/dist/browser-extension/firefox/sidebar.js +26541 -0
  40. package/dist/browser-extension/icon128.png +0 -0
  41. package/dist/browser-extension/icon16.png +0 -0
  42. package/dist/browser-extension/icon48.png +0 -0
  43. package/dist/browser-extension/manifest.json +81 -0
  44. package/dist/browser-extension/newtab.js +64 -0
  45. package/dist/browser-extension/package.json +41 -0
  46. package/dist/browser-extension/popup.js +1716 -0
  47. package/dist/browser-extension/safari/Info.plist +21 -0
  48. package/dist/browser-extension/safari/ai-worker.js +571 -0
  49. package/dist/browser-extension/safari/background.js +8670 -0
  50. package/dist/browser-extension/safari/callback.html +17 -0
  51. package/dist/browser-extension/safari/content-script.js +2789 -0
  52. package/dist/browser-extension/safari/icon128.png +0 -0
  53. package/dist/browser-extension/safari/icon16.png +0 -0
  54. package/dist/browser-extension/safari/icon48.png +0 -0
  55. package/dist/browser-extension/safari/newtab.css +277 -0
  56. package/dist/browser-extension/safari/newtab.html +13 -0
  57. package/dist/browser-extension/safari/newtab.js +64 -0
  58. package/dist/browser-extension/safari/popup.css +761 -0
  59. package/dist/browser-extension/safari/popup.html +381 -0
  60. package/dist/browser-extension/safari/popup.js +1716 -0
  61. package/dist/browser-extension/safari/sidebar.css +1792 -0
  62. package/dist/browser-extension/safari/sidebar.html +463 -0
  63. package/dist/browser-extension/safari/sidebar.js +26541 -0
  64. package/dist/browser-extension/sidebar.js +26541 -0
  65. package/dist/browser-extension/webgpu-ai.js +568 -0
  66. package/package.json +2 -1
  67. package/src/manifest-firefox.json +1 -1
  68. package/src/manifest.json +1 -1
@@ -0,0 +1,761 @@
1
+ /* Hanzo AI Browser Extension Popup — @hanzo/gui dark theme, monochrome */
2
+
3
+ :root {
4
+ --primary: #fafafa;
5
+ --primary-dark: #d4d4d4;
6
+ --bg: #0a0a0a;
7
+ --surface: #0f0f0f;
8
+ --surface-light: #171717;
9
+ --text: #fafafa;
10
+ --text-secondary: #a3a3a3;
11
+ --text-dim: #666666;
12
+ --border: rgba(255,255,255,0.10);
13
+ --border-strong: rgba(255,255,255,0.16);
14
+ --glass: rgba(255,255,255,0.04);
15
+ --glass-strong: rgba(255,255,255,0.07);
16
+ /* Status: monochrome by hue per @hanzo/brand (white luminance scale). */
17
+ --success: #fafafa;
18
+ --warning: #d4d4d4;
19
+ --error: rgba(255,255,255,0.55);
20
+ --link: #a3a3a3;
21
+ --link-hover: #fafafa;
22
+ --radius: 10px;
23
+ --radius-md: 8px;
24
+ --radius-sm: 6px;
25
+ }
26
+
27
+ * {
28
+ margin: 0;
29
+ padding: 0;
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ body {
34
+ width: 360px;
35
+ font-family: 'Geist Sans', -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', sans-serif;
36
+ background: var(--bg);
37
+ color: var(--text);
38
+ font-size: 13px;
39
+ line-height: 1.5;
40
+ -webkit-font-smoothing: antialiased;
41
+ -moz-osx-font-smoothing: grayscale;
42
+ }
43
+
44
+ .container {
45
+ background: var(--surface);
46
+ min-height: 480px;
47
+ position: relative;
48
+ }
49
+
50
+ /* Ambient glow */
51
+ .container::before {
52
+ content: '';
53
+ position: absolute;
54
+ top: 0;
55
+ left: 0;
56
+ right: 0;
57
+ height: 100px;
58
+ background: radial-gradient(ellipse at 50% 0%, rgba(255,255,255,0.03) 0%, transparent 70%);
59
+ pointer-events: none;
60
+ }
61
+
62
+ /* Animations */
63
+ @keyframes fadeIn {
64
+ from { opacity: 0; transform: translateY(4px); }
65
+ to { opacity: 1; transform: translateY(0); }
66
+ }
67
+
68
+ @keyframes shimmer {
69
+ 0% { background-position: -200% 0; }
70
+ 100% { background-position: 200% 0; }
71
+ }
72
+
73
+ @keyframes pulse {
74
+ 0% { opacity: 1; }
75
+ 50% { opacity: 0.5; }
76
+ 100% { opacity: 1; }
77
+ }
78
+
79
+ @keyframes glowPulse {
80
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,255,0); }
81
+ 50% { box-shadow: 0 0 8px 1px rgba(255,255,255,0.05); }
82
+ }
83
+
84
+ /* Header */
85
+ header {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 10px;
89
+ padding: 14px 16px;
90
+ border-bottom: 1px solid var(--border);
91
+ background: rgba(0,0,0,0.6);
92
+ backdrop-filter: blur(20px) saturate(180%);
93
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
94
+ position: relative;
95
+ z-index: 10;
96
+ }
97
+
98
+ .logo {
99
+ width: 22px;
100
+ height: 22px;
101
+ color: var(--text);
102
+ filter: drop-shadow(0 0 4px rgba(255,255,255,0.12));
103
+ }
104
+
105
+ h1 {
106
+ font-size: 16px;
107
+ font-weight: 600;
108
+ letter-spacing: -0.01em;
109
+ }
110
+
111
+ h2 {
112
+ font-size: 15px;
113
+ font-weight: 600;
114
+ margin-bottom: 6px;
115
+ }
116
+
117
+ h3 {
118
+ font-size: 12px;
119
+ font-weight: 600;
120
+ text-transform: uppercase;
121
+ letter-spacing: 0.04em;
122
+ color: var(--text-secondary);
123
+ margin-bottom: 10px;
124
+ }
125
+
126
+ /* Sections */
127
+ .section {
128
+ padding: 16px;
129
+ animation: fadeIn 0.3s ease;
130
+ }
131
+
132
+ .section.hidden,
133
+ .hidden {
134
+ display: none;
135
+ }
136
+
137
+ .subtitle {
138
+ color: var(--text-dim);
139
+ margin-bottom: 16px;
140
+ font-size: 13px;
141
+ }
142
+
143
+ /* Login Card */
144
+ .login-section {
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ min-height: 380px;
149
+ padding: 32px 24px;
150
+ }
151
+
152
+ .login-card {
153
+ text-align: center;
154
+ max-width: 280px;
155
+ width: 100%;
156
+ }
157
+
158
+ .login-logo {
159
+ width: 48px;
160
+ height: 48px;
161
+ color: var(--text);
162
+ margin: 0 auto 20px;
163
+ display: block;
164
+ filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.12));
165
+ }
166
+
167
+ .login-headline {
168
+ font-size: 20px;
169
+ font-weight: 700;
170
+ color: var(--text);
171
+ margin-bottom: 8px;
172
+ letter-spacing: -0.02em;
173
+ }
174
+
175
+ .login-sub {
176
+ font-size: 13px;
177
+ color: var(--text-secondary);
178
+ margin-bottom: 24px;
179
+ line-height: 1.5;
180
+ }
181
+
182
+ .login-signin-btn {
183
+ width: 100%;
184
+ padding: 12px 20px;
185
+ background: #FFFFFF;
186
+ color: #000000;
187
+ border: none;
188
+ border-radius: 10px;
189
+ font-size: 14px;
190
+ font-weight: 600;
191
+ cursor: pointer;
192
+ transition: all 0.2s;
193
+ margin-bottom: 10px;
194
+ position: relative;
195
+ overflow: hidden;
196
+ letter-spacing: -0.01em;
197
+ }
198
+
199
+ .login-signin-btn::after {
200
+ content: '';
201
+ position: absolute;
202
+ top: 0;
203
+ left: -100%;
204
+ width: 100%;
205
+ height: 100%;
206
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.15), transparent);
207
+ transition: left 0.5s ease;
208
+ }
209
+
210
+ .login-signin-btn:hover {
211
+ background: #E0E0E0;
212
+ box-shadow: 0 0 16px rgba(255, 255, 255, 0.1);
213
+ }
214
+
215
+ .login-signin-btn:hover::after {
216
+ left: 100%;
217
+ }
218
+
219
+ .login-signin-btn:disabled {
220
+ opacity: 0.6;
221
+ cursor: not-allowed;
222
+ }
223
+
224
+ .login-create-btn {
225
+ width: 100%;
226
+ padding: 10px 20px;
227
+ background: transparent;
228
+ color: var(--text-secondary);
229
+ border: none;
230
+ border-radius: 10px;
231
+ font-size: 13px;
232
+ font-weight: 500;
233
+ cursor: pointer;
234
+ transition: all 0.2s;
235
+ margin-bottom: 16px;
236
+ }
237
+
238
+ .login-create-btn:hover {
239
+ color: var(--text);
240
+ background: rgba(255, 255, 255, 0.06);
241
+ }
242
+
243
+ .login-note {
244
+ font-size: 11px;
245
+ color: var(--text-dim);
246
+ line-height: 1.5;
247
+ }
248
+
249
+ .login-note a {
250
+ color: var(--text-secondary);
251
+ text-decoration: underline;
252
+ text-underline-offset: 2px;
253
+ }
254
+
255
+ .login-note a:hover {
256
+ color: var(--text);
257
+ }
258
+
259
+ /* Buttons */
260
+ .btn {
261
+ display: flex;
262
+ align-items: center;
263
+ justify-content: center;
264
+ gap: 8px;
265
+ width: 100%;
266
+ padding: 10px 14px;
267
+ border: none;
268
+ border-radius: 8px;
269
+ font-size: 13px;
270
+ font-weight: 500;
271
+ cursor: pointer;
272
+ transition: all 0.2s ease;
273
+ position: relative;
274
+ overflow: hidden;
275
+ }
276
+
277
+ .btn:disabled {
278
+ opacity: 0.5;
279
+ cursor: not-allowed;
280
+ }
281
+
282
+ .btn-primary {
283
+ background: var(--primary);
284
+ color: #000000;
285
+ font-weight: 600;
286
+ }
287
+
288
+ /* Shimmer sweep */
289
+ .btn-primary::after {
290
+ content: '';
291
+ position: absolute;
292
+ top: 0;
293
+ left: -100%;
294
+ width: 100%;
295
+ height: 100%;
296
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.15), transparent);
297
+ transition: left 0.5s ease;
298
+ }
299
+
300
+ .btn-primary:hover {
301
+ background: var(--primary-dark);
302
+ box-shadow: 0 0 12px rgba(255,255,255,0.1);
303
+ }
304
+
305
+ .btn-primary:hover::after {
306
+ left: 100%;
307
+ }
308
+
309
+ .btn-secondary {
310
+ background: var(--glass-strong);
311
+ color: var(--text);
312
+ border: 1px solid var(--border);
313
+ }
314
+
315
+ .btn-secondary:hover {
316
+ background: rgba(255,255,255,0.1);
317
+ border-color: var(--border-strong);
318
+ }
319
+
320
+ .btn-ghost {
321
+ background: transparent;
322
+ color: var(--text-secondary);
323
+ border: 1px solid var(--border);
324
+ }
325
+
326
+ .btn-ghost:hover {
327
+ color: var(--text);
328
+ border-color: var(--border-strong);
329
+ background: var(--glass);
330
+ }
331
+
332
+ .btn-icon {
333
+ width: 28px;
334
+ height: 28px;
335
+ padding: 0;
336
+ display: flex;
337
+ align-items: center;
338
+ justify-content: center;
339
+ background: transparent;
340
+ border: none;
341
+ border-radius: 6px;
342
+ cursor: pointer;
343
+ transition: all 0.2s;
344
+ color: var(--text-dim);
345
+ }
346
+
347
+ .btn-icon:hover {
348
+ background: var(--glass-strong);
349
+ color: var(--text);
350
+ }
351
+
352
+ .btn-icon svg {
353
+ width: 16px;
354
+ height: 16px;
355
+ stroke-width: 1.5;
356
+ }
357
+
358
+ .icon {
359
+ width: 16px;
360
+ height: 16px;
361
+ }
362
+
363
+ /* User Info */
364
+ .user-info {
365
+ display: flex;
366
+ align-items: center;
367
+ gap: 10px;
368
+ padding: 12px;
369
+ background: var(--glass-strong);
370
+ border: 1px solid var(--border);
371
+ border-radius: 8px;
372
+ }
373
+
374
+ .avatar {
375
+ width: 34px;
376
+ height: 34px;
377
+ border-radius: 50%;
378
+ background: var(--border);
379
+ border: 1px solid var(--border);
380
+ }
381
+
382
+ .user-info > div {
383
+ flex: 1;
384
+ }
385
+
386
+ .user-name {
387
+ font-weight: 600;
388
+ font-size: 13px;
389
+ }
390
+
391
+ .user-email {
392
+ font-size: 11px;
393
+ color: var(--text-dim);
394
+ }
395
+
396
+ /* Tools Grid */
397
+ .tools-grid {
398
+ display: grid;
399
+ grid-template-columns: repeat(3, 1fr);
400
+ gap: 6px;
401
+ margin-bottom: 4px;
402
+ }
403
+
404
+ .tool-btn {
405
+ display: flex;
406
+ flex-direction: column;
407
+ align-items: center;
408
+ justify-content: center;
409
+ gap: 4px;
410
+ padding: 10px 4px;
411
+ background: var(--glass);
412
+ border: 1px solid var(--border);
413
+ border-radius: 8px;
414
+ color: var(--text-secondary);
415
+ font-size: 10px;
416
+ cursor: pointer;
417
+ transition: all 0.2s ease;
418
+ position: relative;
419
+ overflow: hidden;
420
+ }
421
+
422
+ .tool-btn svg {
423
+ width: 18px;
424
+ height: 18px;
425
+ flex-shrink: 0;
426
+ }
427
+
428
+ .tool-btn:hover {
429
+ color: var(--text);
430
+ background: var(--glass-strong);
431
+ border-color: var(--border-strong);
432
+ }
433
+
434
+ .tool-btn:active {
435
+ transform: scale(0.96);
436
+ }
437
+
438
+ .tool-btn.active {
439
+ color: var(--text);
440
+ background: rgba(255,255,255,0.1);
441
+ border-color: var(--text);
442
+ box-shadow: 0 0 8px rgba(255,255,255,0.06);
443
+ }
444
+
445
+ .tool-btn:disabled {
446
+ opacity: 0.4;
447
+ cursor: not-allowed;
448
+ }
449
+
450
+ .tool-btn .tool-feedback {
451
+ position: absolute;
452
+ inset: 0;
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ background: rgba(76, 175, 80, 0.9);
457
+ color: #fff;
458
+ font-size: 11px;
459
+ font-weight: 600;
460
+ border-radius: 7px;
461
+ animation: fadeIn 0.15s ease;
462
+ }
463
+
464
+ /* Features — compact toggles */
465
+ .features {
466
+ display: flex;
467
+ flex-direction: column;
468
+ gap: 2px;
469
+ }
470
+
471
+ .feature-toggle label {
472
+ display: flex;
473
+ align-items: center;
474
+ gap: 10px;
475
+ padding: 8px 10px;
476
+ background: transparent;
477
+ border: none;
478
+ border-radius: 6px;
479
+ cursor: pointer;
480
+ transition: all 0.15s;
481
+ }
482
+
483
+ .feature-toggle label:hover {
484
+ background: var(--glass-strong);
485
+ }
486
+
487
+ .feature-toggle input {
488
+ display: none;
489
+ }
490
+
491
+ .toggle {
492
+ position: relative;
493
+ width: 32px;
494
+ height: 18px;
495
+ background: rgba(255,255,255,0.12);
496
+ border-radius: 9px;
497
+ transition: background 0.25s;
498
+ flex-shrink: 0;
499
+ }
500
+
501
+ .toggle::after {
502
+ content: '';
503
+ position: absolute;
504
+ top: 2px;
505
+ left: 2px;
506
+ width: 14px;
507
+ height: 14px;
508
+ background: #888;
509
+ border-radius: 50%;
510
+ transition: all 0.25s;
511
+ box-shadow: 0 1px 3px rgba(0,0,0,0.3);
512
+ }
513
+
514
+ input:checked + .toggle {
515
+ background: var(--text);
516
+ }
517
+
518
+ input:checked + .toggle::after {
519
+ transform: translateX(14px);
520
+ background: #000;
521
+ }
522
+
523
+ .feature-info {
524
+ flex: 1;
525
+ }
526
+
527
+ .feature-info strong {
528
+ font-size: 13px;
529
+ font-weight: 500;
530
+ }
531
+
532
+ .feature-info small {
533
+ display: block;
534
+ color: var(--text-dim);
535
+ font-size: 11px;
536
+ line-height: 1.3;
537
+ }
538
+
539
+ /* Status */
540
+ .status {
541
+ display: flex;
542
+ flex-direction: column;
543
+ gap: 8px;
544
+ }
545
+
546
+ .status-item {
547
+ display: flex;
548
+ align-items: center;
549
+ gap: 8px;
550
+ font-size: 12px;
551
+ }
552
+
553
+ .status-dot {
554
+ width: 6px;
555
+ height: 6px;
556
+ border-radius: 50%;
557
+ background: rgba(255,255,255,0.12);
558
+ transition: all 0.3s;
559
+ flex-shrink: 0;
560
+ }
561
+
562
+ .status-dot.connected {
563
+ background: var(--success);
564
+ box-shadow: 0 0 6px rgba(76, 175, 80, 0.3);
565
+ }
566
+
567
+ .status-dot.warning {
568
+ background: var(--warning);
569
+ box-shadow: 0 0 6px rgba(255, 193, 7, 0.2);
570
+ }
571
+
572
+ .status-dot.error {
573
+ background: var(--error);
574
+ box-shadow: 0 0 6px rgba(244, 67, 54, 0.2);
575
+ }
576
+
577
+ .status-dot.connecting {
578
+ animation: pulse 1.5s infinite;
579
+ }
580
+
581
+ .status-detail {
582
+ margin-left: auto;
583
+ font-size: 11px;
584
+ color: var(--text-dim);
585
+ }
586
+
587
+ /* Actions */
588
+ .actions {
589
+ display: flex;
590
+ gap: 8px;
591
+ }
592
+
593
+ .actions .btn {
594
+ flex: 1;
595
+ font-size: 12px;
596
+ padding: 8px 12px;
597
+ }
598
+
599
+ /* Guide */
600
+ .guide {
601
+ background: var(--glass);
602
+ border: 1px solid var(--border);
603
+ padding: 12px;
604
+ border-radius: 8px;
605
+ }
606
+
607
+ .guide h3 {
608
+ margin-bottom: 6px;
609
+ }
610
+
611
+ .guide p {
612
+ font-size: 11px;
613
+ color: var(--text-dim);
614
+ margin-bottom: 3px;
615
+ }
616
+
617
+ kbd {
618
+ display: inline-block;
619
+ padding: 1px 5px;
620
+ background: rgba(255,255,255,0.06);
621
+ border: 1px solid var(--border);
622
+ border-radius: 3px;
623
+ font-family: 'Geist Mono', 'Menlo', monospace;
624
+ font-size: 10px;
625
+ }
626
+
627
+ /* Settings */
628
+ .settings-header {
629
+ display: flex;
630
+ align-items: center;
631
+ gap: 10px;
632
+ margin-bottom: 16px;
633
+ }
634
+
635
+ .settings-header h2 {
636
+ margin: 0;
637
+ }
638
+
639
+ .setting-group {
640
+ margin-bottom: 20px;
641
+ }
642
+
643
+ .setting-group label {
644
+ display: block;
645
+ margin-bottom: 10px;
646
+ color: var(--text-dim);
647
+ font-size: 12px;
648
+ }
649
+
650
+ .setting-group input[type="text"],
651
+ .setting-group input[type="number"],
652
+ .setting-group select {
653
+ width: 100%;
654
+ padding: 7px 10px;
655
+ background: var(--glass-strong);
656
+ border: 1px solid var(--border);
657
+ border-radius: 6px;
658
+ color: var(--text);
659
+ font-size: 13px;
660
+ margin-top: 4px;
661
+ transition: border-color 0.2s;
662
+ }
663
+
664
+ .setting-group input:focus,
665
+ .setting-group select:focus {
666
+ border-color: var(--border-strong);
667
+ outline: none;
668
+ }
669
+
670
+ .setting-group input[type="checkbox"] {
671
+ margin-right: 8px;
672
+ accent-color: var(--primary);
673
+ }
674
+
675
+ /* Backend Picker */
676
+ .backend-picker {
677
+ margin-bottom: 0;
678
+ }
679
+
680
+ .backend-picker h3 {
681
+ margin-bottom: 8px;
682
+ }
683
+
684
+ .backend-select-wrapper select {
685
+ width: 100%;
686
+ padding: 7px 10px;
687
+ background: var(--glass-strong);
688
+ border: 1px solid var(--border);
689
+ border-radius: 6px;
690
+ color: var(--text);
691
+ font-size: 13px;
692
+ cursor: pointer;
693
+ appearance: none;
694
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
695
+ background-repeat: no-repeat;
696
+ background-position: right 10px center;
697
+ transition: border-color 0.2s;
698
+ }
699
+
700
+ .backend-select-wrapper select:focus {
701
+ outline: none;
702
+ border-color: var(--border-strong);
703
+ }
704
+
705
+ .backend-status {
706
+ display: flex;
707
+ align-items: center;
708
+ gap: 8px;
709
+ margin-top: 6px;
710
+ font-size: 11px;
711
+ color: var(--text-dim);
712
+ }
713
+
714
+ /* Utilities */
715
+ .divider {
716
+ height: 1px;
717
+ background: var(--border);
718
+ margin: 12px 0;
719
+ }
720
+
721
+ /* Links */
722
+ .help-text {
723
+ text-align: center;
724
+ font-size: 12px;
725
+ color: var(--text-dim);
726
+ margin-top: 12px;
727
+ }
728
+
729
+ .help-text a {
730
+ color: var(--link);
731
+ text-decoration: underline;
732
+ text-decoration-color: rgba(160,160,160,0.3);
733
+ text-underline-offset: 2px;
734
+ transition: all 0.2s;
735
+ }
736
+
737
+ .help-text a:hover {
738
+ color: var(--link-hover);
739
+ text-decoration-color: rgba(255,255,255,0.5);
740
+ }
741
+
742
+ /* Footer links */
743
+ .footer-links {
744
+ display: flex;
745
+ justify-content: center;
746
+ gap: 16px;
747
+ padding: 12px 16px;
748
+ border-top: 1px solid var(--border);
749
+ margin-top: 4px;
750
+ }
751
+
752
+ .footer-links a {
753
+ color: var(--text-dim);
754
+ text-decoration: none;
755
+ font-size: 11px;
756
+ transition: color 0.2s;
757
+ }
758
+
759
+ .footer-links a:hover {
760
+ color: var(--text);
761
+ }