@jacobbd/relay-ai 0.3.4 → 0.4.0

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.
@@ -0,0 +1,1630 @@
1
+ /* ─── Tokens ─────────────────────────────────────────────────────────────── */
2
+ :root {
3
+ /* Deep navy background — NOT flat black */
4
+ --bg: oklch(12% 0.038 265);
5
+ --sidebar-bg: oklch(14.5% 0.032 268);
6
+ --surface: oklch(17% 0.028 265);
7
+ --surface-2: oklch(20% 0.026 265);
8
+ --surface-hover: oklch(22% 0.028 265);
9
+ --border: oklch(24% 0.024 265);
10
+ --border-bright: oklch(36% 0.03 265);
11
+ --border-glow: oklch(68% 0.24 255 / 0.3);
12
+
13
+ /* Accent — electric indigo-blue, committed */
14
+ --accent: oklch(68% 0.26 255);
15
+ --accent-dim: oklch(55% 0.2 255);
16
+ --accent-muted: oklch(68% 0.26 255 / 0.12);
17
+ --accent-glow: oklch(68% 0.26 255 / 0.2);
18
+ --accent-2: oklch(65% 0.24 285); /* purple variant */
19
+
20
+ /* Text */
21
+ --text-1: oklch(96% 0.005 265);
22
+ --text-2: oklch(68% 0.012 265);
23
+ --text-3: oklch(44% 0.01 265);
24
+
25
+ /* Semantic */
26
+ --success: oklch(74% 0.2 155);
27
+ --success-bg: oklch(74% 0.2 155 / 0.1);
28
+ --error: oklch(68% 0.22 25);
29
+ --error-bg: oklch(68% 0.22 25 / 0.1);
30
+
31
+ /* Motion */
32
+ --ease: cubic-bezier(0.16, 1, 0.3, 1);
33
+ --dur-xs: 100ms;
34
+ --dur-sm: 160ms;
35
+ --dur-md: 240ms;
36
+ --dur-lg: 380ms;
37
+
38
+ /* Layout */
39
+ --sidebar-w: 240px;
40
+ --radius: 10px;
41
+ --radius-sm: 7px;
42
+ --radius-xs: 5px;
43
+ }
44
+
45
+ /* ─── Light mode overrides ───────────────────────────────────────────────── */
46
+ html[data-theme="light"] {
47
+ --bg: oklch(97% 0.008 265);
48
+ --sidebar-bg: oklch(94% 0.01 265);
49
+ --surface: oklch(100% 0 0);
50
+ --surface-2: oklch(96% 0.008 265);
51
+ --surface-hover: oklch(93% 0.01 265);
52
+ --border: oklch(85% 0.012 265);
53
+ --border-bright: oklch(70% 0.015 265);
54
+ --text-1: oklch(18% 0.02 265);
55
+ --text-2: oklch(38% 0.015 265);
56
+ --text-3: oklch(58% 0.012 265);
57
+ }
58
+
59
+ html[data-theme="light"] body {
60
+ background:
61
+ radial-gradient(ellipse 80% 50% at 70% -10%, oklch(68% 0.26 255 / 0.04) 0%, transparent 60%),
62
+ radial-gradient(ellipse 60% 40% at 100% 80%, oklch(65% 0.24 285 / 0.03) 0%, transparent 55%),
63
+ var(--bg);
64
+ }
65
+
66
+ /* ─── Reset ─────────────────────────────────────────────────────────────── */
67
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
68
+ html { scroll-behavior: smooth; scroll-padding-top: 32px; }
69
+
70
+ body {
71
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
72
+ font-size: 16px;
73
+ line-height: 1.6;
74
+ color: var(--text-1);
75
+ background:
76
+ radial-gradient(ellipse 80% 50% at 70% -10%, oklch(68% 0.26 255 / 0.08) 0%, transparent 60%),
77
+ radial-gradient(ellipse 60% 40% at 100% 80%, oklch(65% 0.24 285 / 0.06) 0%, transparent 55%),
78
+ radial-gradient(ellipse 50% 60% at -10% 50%, oklch(68% 0.22 175 / 0.05) 0%, transparent 50%),
79
+ var(--bg);
80
+ -webkit-font-smoothing: antialiased;
81
+ min-height: 100dvh;
82
+ overflow: hidden;
83
+ }
84
+
85
+ a { color: inherit; text-decoration: none; }
86
+ button { font-family: inherit; cursor: pointer; border: none; background: none; }
87
+ input { font-family: inherit; }
88
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-xs); }
89
+ ::-webkit-scrollbar { width: 5px; }
90
+ ::-webkit-scrollbar-track { background: transparent; }
91
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
92
+
93
+ /* ─── App layout ─────────────────────────────────────────────────────────── */
94
+ .layout {
95
+ display: grid;
96
+ grid-template-columns: var(--sidebar-w) 1fr;
97
+ height: 100dvh;
98
+ }
99
+
100
+ /* ─── Sidebar ────────────────────────────────────────────────────────────── */
101
+ .sidebar {
102
+ background: var(--sidebar-bg);
103
+ border-right: 1px solid var(--border);
104
+ display: flex;
105
+ flex-direction: column;
106
+ padding: 0;
107
+ overflow: hidden;
108
+ position: relative;
109
+ }
110
+
111
+ .sidebar::after {
112
+ content: '';
113
+ position: absolute;
114
+ top: 0; right: 0;
115
+ width: 1px;
116
+ height: 100%;
117
+ background: linear-gradient(to bottom, var(--accent-dim), transparent 60%);
118
+ opacity: 0.4;
119
+ pointer-events: none;
120
+ }
121
+
122
+ /* Brand */
123
+ .sidebar-brand {
124
+ display: flex;
125
+ align-items: center;
126
+ gap: 12px;
127
+ padding: 28px 24px 20px;
128
+ }
129
+
130
+ .brand-logo {
131
+ width: 46px;
132
+ height: 46px;
133
+ border-radius: 10px;
134
+ overflow: hidden;
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ flex-shrink: 0;
139
+ box-shadow: 0 4px 14px rgba(0,0,0,0.5);
140
+ }
141
+
142
+ .brand-logo-mark {
143
+ font-size: 24px;
144
+ font-weight: 700;
145
+ color: oklch(98% 0.003 265);
146
+ line-height: 1;
147
+ }
148
+
149
+ .brand-meta {
150
+ min-width: 0;
151
+ }
152
+
153
+ .brand-name {
154
+ font-size: 22px;
155
+ font-weight: 700;
156
+ letter-spacing: -0.02em;
157
+ color: var(--text-1);
158
+ line-height: 1.1;
159
+ }
160
+
161
+ .brand-accent {
162
+ color: var(--accent);
163
+ }
164
+
165
+ .brand-byline {
166
+ font-size: 15px;
167
+ color: var(--text-3);
168
+ margin-top: 2px;
169
+ letter-spacing: 0.01em;
170
+ }
171
+
172
+ /* Version badge */
173
+ .sidebar-version {
174
+ margin: 0 24px 24px;
175
+ display: inline-flex;
176
+ align-items: center;
177
+ padding: 3px 10px;
178
+ border-radius: 20px;
179
+ background: var(--accent-muted);
180
+ border: 1px solid oklch(68% 0.26 255 / 0.2);
181
+ font-size: 15px;
182
+ font-weight: 600;
183
+ color: var(--accent);
184
+ letter-spacing: 0.03em;
185
+ width: fit-content;
186
+ }
187
+
188
+ /* Nav */
189
+ .sidebar-nav {
190
+ flex: 1;
191
+ padding: 4px 12px;
192
+ display: flex;
193
+ flex-direction: column;
194
+ gap: 2px;
195
+ }
196
+
197
+ .nav-item {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 10px;
201
+ padding: 10px 12px;
202
+ border-radius: var(--radius-sm);
203
+ font-size: 15px;
204
+ font-weight: 500;
205
+ color: var(--text-2);
206
+ transition: background var(--dur-sm) var(--ease), color var(--dur-sm) var(--ease), transform var(--dur-sm) var(--ease);
207
+ position: relative;
208
+ }
209
+
210
+ .nav-item:hover {
211
+ background: var(--surface);
212
+ color: var(--text-1);
213
+ transform: translateX(2px);
214
+ }
215
+
216
+ .nav-item.active {
217
+ background: var(--accent-muted);
218
+ color: var(--accent);
219
+ border: 1px solid oklch(68% 0.26 255 / 0.15);
220
+ }
221
+
222
+ .nav-item.active .nav-icon { color: var(--accent); }
223
+
224
+ .nav-icon {
225
+ display: flex;
226
+ align-items: center;
227
+ color: var(--text-3);
228
+ flex-shrink: 0;
229
+ transition: color var(--dur-sm) var(--ease);
230
+ }
231
+
232
+ .nav-item:hover .nav-icon { color: var(--text-2); }
233
+
234
+ .nav-badge {
235
+ margin-left: auto;
236
+ font-size: 10px;
237
+ font-weight: 600;
238
+ font-variant-numeric: tabular-nums;
239
+ padding: 1px 7px;
240
+ border-radius: 10px;
241
+ background: var(--surface-2);
242
+ color: var(--text-3);
243
+ border: 1px solid var(--border);
244
+ transition: color var(--dur-sm) var(--ease), border-color var(--dur-sm) var(--ease), background var(--dur-sm) var(--ease);
245
+ }
246
+
247
+ .nav-badge.full {
248
+ color: var(--accent);
249
+ background: var(--accent-muted);
250
+ border-color: oklch(68% 0.26 255 / 0.25);
251
+ }
252
+
253
+ /* Sidebar footer */
254
+ .sidebar-footer {
255
+ padding: 12px 12px 20px;
256
+ border-top: 1px solid var(--border);
257
+ display: flex;
258
+ flex-direction: column;
259
+ gap: 12px;
260
+ }
261
+
262
+ .btn-theme-full {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 10px;
266
+ width: 100%;
267
+ padding: 9px 12px;
268
+ border-radius: var(--radius-sm);
269
+ border: 1px solid var(--border);
270
+ background: transparent;
271
+ color: var(--text-2);
272
+ font-size: 14px;
273
+ font-weight: 500;
274
+ cursor: pointer;
275
+ transition: background var(--dur-sm) var(--ease), color var(--dur-sm) var(--ease), border-color var(--dur-sm) var(--ease);
276
+ text-align: left;
277
+ }
278
+
279
+ .btn-theme-full:hover {
280
+ background: var(--surface-hover);
281
+ color: var(--text-1);
282
+ border-color: var(--border-bright);
283
+ }
284
+
285
+ .theme-icon {
286
+ display: flex;
287
+ align-items: center;
288
+ flex-shrink: 0;
289
+ }
290
+
291
+ .sidebar-footer-text {
292
+ font-size: 13px;
293
+ color: var(--text-3);
294
+ line-height: 1.7;
295
+ padding: 0 4px;
296
+ }
297
+
298
+ .sidebar-footer-text code {
299
+ font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace;
300
+ font-size: 11px;
301
+ color: var(--text-2);
302
+ }
303
+
304
+ /* ─── Content ────────────────────────────────────────────────────────────── */
305
+ .content {
306
+ overflow-y: auto;
307
+ height: 100dvh;
308
+ padding: 0 48px 80px;
309
+ }
310
+
311
+ /* ─── Section ────────────────────────────────────────────────────────────── */
312
+ .section {
313
+ padding-top: 52px;
314
+ max-width: 680px;
315
+ }
316
+
317
+ .section + .section {
318
+ padding-top: 64px;
319
+ margin-top: 12px;
320
+ border-top: 1px solid var(--border);
321
+ }
322
+
323
+ /* Section hero */
324
+ .section-hero {
325
+ margin-bottom: 32px;
326
+ }
327
+
328
+ .section-eyebrow {
329
+ font-size: 15px;
330
+ font-weight: 600;
331
+ text-transform: uppercase;
332
+ letter-spacing: 0.12em;
333
+ color: var(--accent);
334
+ margin-bottom: 8px;
335
+ }
336
+
337
+ .section-heading {
338
+ font-size: 34px;
339
+ font-weight: 700;
340
+ letter-spacing: -0.025em;
341
+ color: var(--text-1);
342
+ line-height: 1.15;
343
+ margin-bottom: 10px;
344
+ }
345
+
346
+ .heading-accent {
347
+ color: var(--accent);
348
+ }
349
+
350
+ .section-sub {
351
+ font-size: 16px;
352
+ color: var(--text-2);
353
+ line-height: 1.65;
354
+ max-width: 560px;
355
+ }
356
+
357
+ .provider-stats {
358
+ display: flex;
359
+ gap: 20px;
360
+ margin-top: 16px;
361
+ }
362
+
363
+ .provider-stat {
364
+ display: flex;
365
+ flex-direction: column;
366
+ gap: 2px;
367
+ }
368
+
369
+ .provider-stat-value {
370
+ font-size: 26px;
371
+ font-weight: 700;
372
+ color: var(--text-1);
373
+ letter-spacing: -0.02em;
374
+ line-height: 1;
375
+ }
376
+
377
+ .provider-stat-value span {
378
+ color: var(--accent);
379
+ }
380
+
381
+ .provider-stat-label {
382
+ font-size: 13px;
383
+ color: var(--text-3);
384
+ font-weight: 500;
385
+ }
386
+
387
+ /* ─── Search ─────────────────────────────────────────────────────────────── */
388
+ .search-row {
389
+ margin-bottom: 12px;
390
+ display: flex;
391
+ gap: 10px;
392
+ align-items: center;
393
+ flex-wrap: wrap;
394
+ }
395
+
396
+ .search-row .search-field {
397
+ flex: 1;
398
+ }
399
+
400
+ .btn-refresh-all {
401
+ display: flex;
402
+ align-items: center;
403
+ gap: 7px;
404
+ white-space: nowrap;
405
+ flex-shrink: 0;
406
+ }
407
+
408
+ .btn-refresh-all svg {
409
+ flex-shrink: 0;
410
+ }
411
+
412
+ .free-only-toggle {
413
+ min-height: 42px;
414
+ display: inline-flex;
415
+ align-items: center;
416
+ gap: 8px;
417
+ padding: 0 12px;
418
+ border: 1px solid var(--border);
419
+ border-radius: var(--radius);
420
+ background: var(--surface);
421
+ color: var(--text-2);
422
+ font-size: 13px;
423
+ font-weight: 600;
424
+ white-space: nowrap;
425
+ }
426
+
427
+ .free-only-toggle input {
428
+ width: 15px;
429
+ height: 15px;
430
+ accent-color: var(--accent);
431
+ }
432
+
433
+ .free-badge {
434
+ display: inline-flex;
435
+ align-items: center;
436
+ min-height: 22px;
437
+ padding: 0 7px;
438
+ border: 1px solid oklch(73% 0.14 156 / 0.45);
439
+ border-radius: 999px;
440
+ background: oklch(93% 0.07 156 / 0.16);
441
+ color: oklch(74% 0.14 156);
442
+ font-size: 11px;
443
+ font-weight: 700;
444
+ white-space: nowrap;
445
+ }
446
+
447
+ .free-badge.dev-access {
448
+ border-color: oklch(72% 0.13 232 / 0.45);
449
+ background: oklch(91% 0.06 232 / 0.16);
450
+ color: oklch(73% 0.13 232);
451
+ }
452
+
453
+ .btn-refresh-all.loading svg {
454
+ animation: spin 1s linear infinite;
455
+ }
456
+
457
+ @keyframes spin {
458
+ from { transform: rotate(0deg); }
459
+ to { transform: rotate(360deg); }
460
+ }
461
+
462
+ .refresh-all-status {
463
+ font-size: 15px;
464
+ color: var(--text-2);
465
+ padding: 10px 14px;
466
+ background: var(--surface);
467
+ border: 1px solid var(--border);
468
+ border-radius: var(--radius);
469
+ margin-bottom: 14px;
470
+ line-height: 1.7;
471
+ }
472
+
473
+ .search-field {
474
+ position: relative;
475
+ }
476
+
477
+ .search-icon {
478
+ position: absolute;
479
+ left: 14px;
480
+ top: 50%;
481
+ transform: translateY(-50%);
482
+ color: var(--text-3);
483
+ pointer-events: none;
484
+ }
485
+
486
+ .search-input {
487
+ width: 100%;
488
+ padding: 10px 16px 10px 40px;
489
+ border-radius: var(--radius);
490
+ border: 1px solid var(--border);
491
+ background: var(--surface);
492
+ color: var(--text-1);
493
+ font-size: 15px;
494
+ transition: border-color var(--dur-md) var(--ease), box-shadow var(--dur-md) var(--ease), background var(--dur-md) var(--ease);
495
+ }
496
+
497
+ .search-input::placeholder { color: var(--text-3); }
498
+
499
+ .search-input:focus {
500
+ border-color: var(--border-bright);
501
+ background: var(--surface-2);
502
+ box-shadow: 0 0 0 3px var(--accent-glow), inset 0 1px 2px oklch(0% 0 0 / 0.2);
503
+ outline: none;
504
+ }
505
+
506
+ /* ─── Provider grid ──────────────────────────────────────────────────────── */
507
+ .provider-grid {
508
+ display: flex;
509
+ flex-direction: column;
510
+ gap: 8px;
511
+ }
512
+
513
+ .apps-group-heading {
514
+ font-size: 13px;
515
+ font-weight: 700;
516
+ color: var(--text-3);
517
+ text-transform: uppercase;
518
+ letter-spacing: 0.05em;
519
+ margin-top: 12px;
520
+ }
521
+
522
+ .apps-group-heading:first-child { margin-top: 0; }
523
+
524
+ .apps-empty {
525
+ font-size: 13px;
526
+ color: var(--text-3);
527
+ padding: 12px 0 4px;
528
+ }
529
+
530
+ /* Apps & Launch: CLI column on the left, desktop apps on the right */
531
+ #apps.section {
532
+ max-width: 1080px;
533
+ }
534
+
535
+ .apps-columns {
536
+ display: grid;
537
+ grid-template-columns: 1fr 1px 1fr;
538
+ gap: 28px;
539
+ align-items: start;
540
+ }
541
+
542
+ .apps-column {
543
+ min-width: 0;
544
+ }
545
+
546
+ .apps-column-divider {
547
+ align-self: stretch;
548
+ background: var(--border);
549
+ }
550
+
551
+ @media (max-width: 860px) {
552
+ .apps-columns {
553
+ grid-template-columns: 1fr;
554
+ }
555
+
556
+ .apps-column-divider {
557
+ display: none;
558
+ }
559
+ }
560
+
561
+ /* Available providers section */
562
+ .available-heading {
563
+ display: flex;
564
+ align-items: baseline;
565
+ gap: 12px;
566
+ margin: 28px 0 12px;
567
+ padding-top: 20px;
568
+ border-top: 1px solid var(--border);
569
+ }
570
+
571
+ .available-heading-label {
572
+ font-size: 15px;
573
+ font-weight: 600;
574
+ color: var(--text-2);
575
+ }
576
+
577
+ .available-heading-hint {
578
+ font-size: 14px;
579
+ color: var(--text-3);
580
+ }
581
+
582
+ .provider-grid-available .provider-card {
583
+ opacity: 0.72;
584
+ transition: opacity var(--dur-sm) var(--ease), border-color var(--dur-sm) var(--ease), box-shadow var(--dur-sm) var(--ease);
585
+ }
586
+
587
+ .provider-grid-available .provider-card:hover {
588
+ opacity: 1;
589
+ }
590
+
591
+ /* Provider card */
592
+ .provider-card {
593
+ border-radius: var(--radius);
594
+ background: var(--surface);
595
+ border: 1px solid var(--border);
596
+ transition: border-color var(--dur-sm) var(--ease), box-shadow var(--dur-sm) var(--ease);
597
+ }
598
+
599
+ .provider-card:hover {
600
+ border-color: var(--border-bright);
601
+ box-shadow: 0 2px 12px oklch(0% 0 0 / 0.25);
602
+ }
603
+
604
+ .provider-card.open {
605
+ border-color: var(--border-bright);
606
+ box-shadow: 0 4px 20px oklch(0% 0 0 / 0.3);
607
+ }
608
+
609
+ .provider-card.launch-model-open {
610
+ position: relative;
611
+ z-index: 50;
612
+ }
613
+
614
+ .advanced-app-paths {
615
+ margin-top: 18px;
616
+ border: 1px solid var(--border);
617
+ border-radius: var(--radius);
618
+ background: var(--surface);
619
+ overflow: hidden;
620
+ }
621
+
622
+ .advanced-app-paths summary {
623
+ padding: 13px 16px;
624
+ color: var(--text-2);
625
+ font-size: 14px;
626
+ font-weight: 600;
627
+ cursor: pointer;
628
+ user-select: none;
629
+ }
630
+
631
+ .advanced-app-paths[open] summary {
632
+ border-bottom: 1px solid var(--border);
633
+ background: var(--surface-2);
634
+ }
635
+
636
+ .app-paths-list {
637
+ display: flex;
638
+ flex-direction: column;
639
+ gap: 1px;
640
+ }
641
+
642
+ .app-path-row {
643
+ display: grid;
644
+ grid-template-columns: minmax(150px, 220px) minmax(240px, 1fr) auto;
645
+ gap: 10px;
646
+ align-items: center;
647
+ padding: 12px 16px;
648
+ background: var(--surface);
649
+ }
650
+
651
+ .app-path-meta {
652
+ min-width: 0;
653
+ }
654
+
655
+ .app-path-name {
656
+ color: var(--text-1);
657
+ font-size: 14px;
658
+ font-weight: 600;
659
+ margin-bottom: 4px;
660
+ }
661
+
662
+ .app-path-input {
663
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
664
+ font-size: 13px;
665
+ }
666
+
667
+ .app-path-actions {
668
+ display: flex;
669
+ gap: 8px;
670
+ }
671
+
672
+ .app-path-actions .btn {
673
+ height: 38px;
674
+ padding-inline: 14px;
675
+ }
676
+
677
+ .advanced-empty {
678
+ padding: 16px;
679
+ color: var(--text-3);
680
+ font-size: 14px;
681
+ }
682
+
683
+ .launch-model-picker,
684
+ .launch-folder-control {
685
+ display: flex;
686
+ flex-direction: column;
687
+ gap: 4px;
688
+ }
689
+
690
+ .launch-model-input-wrap {
691
+ position: relative;
692
+ }
693
+
694
+ .launch-model-input,
695
+ .launch-folder-input {
696
+ height: 42px;
697
+ padding-left: 14px;
698
+ }
699
+
700
+ .launch-model-menu {
701
+ position: absolute;
702
+ z-index: 60;
703
+ top: calc(100% + 8px);
704
+ left: 0;
705
+ right: 0;
706
+ max-height: 380px;
707
+ overflow: auto;
708
+ border: 1px solid var(--border-bright);
709
+ border-radius: var(--radius);
710
+ background: var(--surface);
711
+ box-shadow: 0 18px 42px oklch(0% 0 0 / 0.25);
712
+ padding: 8px;
713
+ }
714
+
715
+ .launch-model-quick {
716
+ display: flex;
717
+ gap: 8px;
718
+ padding: 4px 4px 8px;
719
+ border-bottom: 1px solid var(--border);
720
+ margin-bottom: 8px;
721
+ }
722
+
723
+ .launch-model-quick button,
724
+ .launch-model-row {
725
+ border-radius: var(--radius-sm);
726
+ color: var(--text-1);
727
+ background: transparent;
728
+ text-align: left;
729
+ transition: background var(--dur-sm) var(--ease), color var(--dur-sm) var(--ease);
730
+ }
731
+
732
+ .launch-model-quick button {
733
+ padding: 7px 10px;
734
+ font-size: 13px;
735
+ background: var(--surface-2);
736
+ border: 1px solid var(--border);
737
+ }
738
+
739
+ .launch-model-quick button:hover,
740
+ .launch-model-row:hover {
741
+ background: var(--accent-muted);
742
+ color: var(--text-1);
743
+ }
744
+
745
+ .launch-model-group {
746
+ padding: 4px 0 8px;
747
+ }
748
+
749
+ .launch-model-group-heading {
750
+ padding: 8px 10px 5px;
751
+ color: var(--text-3);
752
+ font-size: 12px;
753
+ font-weight: 700;
754
+ text-transform: uppercase;
755
+ letter-spacing: 0.04em;
756
+ }
757
+
758
+ .launch-model-row {
759
+ width: 100%;
760
+ display: grid;
761
+ grid-template-columns: minmax(0, 1fr) auto minmax(130px, 0.55fr);
762
+ gap: 8px;
763
+ align-items: center;
764
+ padding: 9px 10px;
765
+ font-size: 14px;
766
+ }
767
+
768
+ .launch-model-name,
769
+ .launch-model-id {
770
+ overflow: hidden;
771
+ text-overflow: ellipsis;
772
+ white-space: nowrap;
773
+ }
774
+
775
+ .launch-model-id {
776
+ grid-column: 3;
777
+ color: var(--text-3);
778
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
779
+ font-size: 12px;
780
+ }
781
+
782
+ .launch-model-empty {
783
+ padding: 16px 10px;
784
+ color: var(--text-3);
785
+ font-size: 14px;
786
+ }
787
+
788
+ .launch-folder-recents {
789
+ display: flex;
790
+ flex-wrap: wrap;
791
+ gap: 6px;
792
+ margin-top: 6px;
793
+ }
794
+
795
+ .launch-folder-chip {
796
+ max-width: 100%;
797
+ padding: 5px 8px;
798
+ border-radius: var(--radius-xs);
799
+ background: var(--surface-2);
800
+ border: 1px solid var(--border);
801
+ color: var(--text-2);
802
+ font-size: 12px;
803
+ overflow: hidden;
804
+ text-overflow: ellipsis;
805
+ white-space: nowrap;
806
+ }
807
+
808
+ .launch-folder-chip:hover {
809
+ border-color: var(--border-bright);
810
+ color: var(--text-1);
811
+ }
812
+
813
+ @media (max-width: 760px) {
814
+ .app-path-row {
815
+ grid-template-columns: 1fr;
816
+ }
817
+
818
+ .launch-model-row {
819
+ grid-template-columns: 1fr;
820
+ gap: 2px;
821
+ }
822
+
823
+ .launch-model-id {
824
+ grid-column: auto;
825
+ }
826
+
827
+ .app-path-actions {
828
+ justify-content: stretch;
829
+ }
830
+
831
+ .app-path-actions .btn {
832
+ flex: 1;
833
+ }
834
+ }
835
+
836
+ .provider-card-header {
837
+ display: flex;
838
+ align-items: center;
839
+ gap: 14px;
840
+ padding: 14px 18px;
841
+ cursor: pointer;
842
+ user-select: none;
843
+ transition: background var(--dur-xs) var(--ease);
844
+ border-top-left-radius: calc(var(--radius) - 1px);
845
+ border-top-right-radius: calc(var(--radius) - 1px);
846
+ border-bottom-left-radius: calc(var(--radius) - 1px);
847
+ border-bottom-right-radius: calc(var(--radius) - 1px);
848
+ }
849
+
850
+ .provider-card-header:hover { background: var(--surface-hover); }
851
+ .provider-card.open .provider-card-header {
852
+ background: var(--surface-2);
853
+ border-bottom-left-radius: 0;
854
+ border-bottom-right-radius: 0;
855
+ }
856
+
857
+ /* Provider icon */
858
+ .provider-logo-img {
859
+ width: 22px;
860
+ height: 22px;
861
+ object-fit: contain;
862
+ display: block;
863
+ }
864
+
865
+ /* Only apply white filter to Simple Icons SVGs (not ICO/PNG brand logos) */
866
+ .provider-logo-img[src*="simpleicons.org"] {
867
+ filter: brightness(0) invert(1);
868
+ }
869
+
870
+ .provider-logo-fallback {
871
+ font-size: 19px;
872
+ font-weight: 700;
873
+ color: oklch(98% 0.003 265);
874
+ line-height: 1;
875
+ }
876
+
877
+ .provider-icon {
878
+ width: 44px;
879
+ height: 44px;
880
+ border-radius: 10px;
881
+ display: flex;
882
+ align-items: center;
883
+ justify-content: center;
884
+ font-size: 19px;
885
+ font-weight: 700;
886
+ color: oklch(98% 0.003 265);
887
+ flex-shrink: 0;
888
+ box-shadow: 0 2px 8px oklch(0% 0 0 / 0.3);
889
+ }
890
+
891
+ .provider-info {
892
+ flex: 1;
893
+ min-width: 0;
894
+ }
895
+
896
+ .provider-name {
897
+ font-size: 16px;
898
+ font-weight: 600;
899
+ color: var(--text-1);
900
+ }
901
+
902
+ .provider-models-count {
903
+ font-size: 15px;
904
+ color: var(--text-3);
905
+ margin-top: 1px;
906
+ }
907
+
908
+ .template-signup-link {
909
+ color: var(--accent-dim);
910
+ font-size: 13px;
911
+ margin-left: 6px;
912
+ transition: color var(--dur-sm) var(--ease);
913
+ }
914
+
915
+ .template-signup-link:hover { color: var(--accent); }
916
+
917
+ .provider-status {
918
+ display: flex;
919
+ align-items: center;
920
+ gap: 10px;
921
+ flex-shrink: 0;
922
+ }
923
+
924
+ .status-chip {
925
+ font-size: 15px;
926
+ font-weight: 500;
927
+ padding: 3px 9px;
928
+ border-radius: 20px;
929
+ border: 1px solid transparent;
930
+ }
931
+
932
+ .status-chip.has-key {
933
+ color: var(--success);
934
+ background: var(--success-bg);
935
+ border-color: oklch(74% 0.2 155 / 0.2);
936
+ }
937
+
938
+ .status-chip.free-access {
939
+ color: oklch(75% 0.15 190);
940
+ background: oklch(75% 0.15 190 / 0.12);
941
+ border-color: oklch(75% 0.15 190 / 0.2);
942
+ }
943
+
944
+ .status-chip.no-key {
945
+ color: var(--text-3);
946
+ background: var(--surface-2);
947
+ border-color: var(--border);
948
+ }
949
+
950
+ .provider-chevron {
951
+ color: var(--text-3);
952
+ transition: transform var(--dur-md) var(--ease), color var(--dur-sm) var(--ease);
953
+ flex-shrink: 0;
954
+ }
955
+
956
+ .provider-card.open .provider-chevron {
957
+ transform: rotate(180deg);
958
+ color: var(--accent);
959
+ }
960
+
961
+ /* Provider body expand */
962
+ .provider-body {
963
+ display: grid;
964
+ grid-template-rows: 0fr;
965
+ transition: grid-template-rows var(--dur-md) var(--ease);
966
+ border-top: 1px solid transparent;
967
+ }
968
+
969
+ .provider-card.open .provider-body {
970
+ grid-template-rows: 1fr;
971
+ border-top-color: var(--border);
972
+ }
973
+
974
+ .provider-body-inner { overflow: hidden; }
975
+ .provider-card.open .provider-body-inner { overflow: visible; }
976
+
977
+ .provider-body-content {
978
+ padding: 18px 18px 18px 70px;
979
+ display: flex;
980
+ flex-direction: column;
981
+ gap: 10px;
982
+ }
983
+
984
+ /* Key input row */
985
+ .key-row {
986
+ display: flex;
987
+ gap: 8px;
988
+ align-items: center;
989
+ }
990
+
991
+ .key-input-wrap { flex: 1; }
992
+
993
+ .key-input {
994
+ width: 100%;
995
+ padding: 9px 13px;
996
+ border-radius: var(--radius-sm);
997
+ border: 1px solid var(--border);
998
+ background: var(--bg);
999
+ color: var(--text-1);
1000
+ font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace;
1001
+ font-size: 16px;
1002
+ transition: border-color var(--dur-md) var(--ease), box-shadow var(--dur-md) var(--ease);
1003
+ }
1004
+
1005
+ .key-input::placeholder { color: var(--text-3); font-family: 'Inter', system-ui, sans-serif; }
1006
+
1007
+ .key-input:focus {
1008
+ outline: none;
1009
+ border-color: var(--border-bright);
1010
+ box-shadow: 0 0 0 3px var(--accent-glow);
1011
+ }
1012
+
1013
+ /* Buttons */
1014
+ .btn {
1015
+ padding: 8px 16px;
1016
+ border-radius: var(--radius-sm);
1017
+ font-size: 15px;
1018
+ font-weight: 500;
1019
+ transition: all var(--dur-xs) var(--ease);
1020
+ white-space: nowrap;
1021
+ flex-shrink: 0;
1022
+ }
1023
+
1024
+ .btn-primary {
1025
+ background: linear-gradient(135deg, var(--accent), var(--accent-2));
1026
+ color: oklch(98% 0.003 265);
1027
+ box-shadow: 0 2px 8px oklch(68% 0.26 255 / 0.3);
1028
+ }
1029
+
1030
+ .btn-primary:hover { filter: brightness(1.1); transform: translateY(-1px); box-shadow: 0 4px 14px oklch(68% 0.26 255 / 0.4); }
1031
+ .btn-primary:active { transform: translateY(0); }
1032
+ .btn-primary:disabled { opacity: 0.4; cursor: not-allowed; transform: none; filter: none; box-shadow: none; }
1033
+
1034
+ .btn-ghost {
1035
+ background: var(--surface-2);
1036
+ color: var(--text-2);
1037
+ border: 1px solid var(--border);
1038
+ }
1039
+
1040
+ .btn-ghost:hover { background: var(--surface-hover); color: var(--text-1); border-color: var(--border-bright); }
1041
+
1042
+ .key-feedback {
1043
+ font-size: 16px;
1044
+ min-height: 16px;
1045
+ transition: opacity var(--dur-md) var(--ease);
1046
+ }
1047
+
1048
+ .key-feedback.success { color: var(--success); }
1049
+ .key-feedback.error { color: var(--error); }
1050
+ .key-feedback.muted { color: var(--text-3); }
1051
+
1052
+ /* ─── Skeleton ───────────────────────────────────────────────────────────── */
1053
+ .skeleton {
1054
+ background: linear-gradient(90deg, var(--surface) 25%, var(--surface-2) 50%, var(--surface) 75%);
1055
+ background-size: 200% 100%;
1056
+ animation: shimmer 1.5s infinite linear;
1057
+ border-radius: var(--radius);
1058
+ }
1059
+
1060
+ @keyframes shimmer {
1061
+ from { background-position: 200% 0; }
1062
+ to { background-position: -200% 0; }
1063
+ }
1064
+
1065
+ .skeleton-card { height: 66px; margin-bottom: 8px; }
1066
+
1067
+ /* ─── Model results ──────────────────────────────────────────────────────── */
1068
+ .model-results {
1069
+ background: var(--surface);
1070
+ border: 1px solid var(--border);
1071
+ border-radius: var(--radius);
1072
+ margin-bottom: 12px;
1073
+ overflow: hidden;
1074
+ }
1075
+
1076
+ .model-results-empty, .model-results-error {
1077
+ padding: 20px;
1078
+ color: var(--text-3);
1079
+ font-size: 15px;
1080
+ text-align: center;
1081
+ }
1082
+
1083
+ .model-results-error { color: var(--error); text-align: left; display: flex; align-items: center; justify-content: space-between; gap: 12px; }
1084
+
1085
+ .model-group-header {
1086
+ display: flex;
1087
+ align-items: center;
1088
+ gap: 8px;
1089
+ padding: 10px 16px 6px;
1090
+ font-size: 10px;
1091
+ font-weight: 600;
1092
+ text-transform: uppercase;
1093
+ letter-spacing: 0.1em;
1094
+ color: var(--text-3);
1095
+ border-top: 1px solid var(--border);
1096
+ }
1097
+
1098
+ .model-group-header:first-child { border-top: none; }
1099
+
1100
+ .model-group-icon {
1101
+ width: 16px;
1102
+ height: 16px;
1103
+ border-radius: 4px;
1104
+ display: flex;
1105
+ align-items: center;
1106
+ justify-content: center;
1107
+ font-size: 8px;
1108
+ font-weight: 700;
1109
+ color: oklch(98% 0.003 265);
1110
+ }
1111
+
1112
+ .model-result-row {
1113
+ display: flex;
1114
+ align-items: center;
1115
+ gap: 10px;
1116
+ padding: 9px 16px;
1117
+ transition: background var(--dur-xs) var(--ease);
1118
+ cursor: default;
1119
+ }
1120
+
1121
+ .model-result-row:hover { background: var(--surface-hover); }
1122
+
1123
+ .model-result-id {
1124
+ flex: 1;
1125
+ font-size: 16px;
1126
+ font-weight: 500;
1127
+ color: var(--text-1);
1128
+ overflow: hidden;
1129
+ text-overflow: ellipsis;
1130
+ white-space: nowrap;
1131
+ }
1132
+
1133
+ .model-result-ctx { font-size: 15px; color: var(--text-3); white-space: nowrap; flex-shrink: 0; }
1134
+
1135
+ .btn-add {
1136
+ width: 26px;
1137
+ height: 26px;
1138
+ border-radius: 50%;
1139
+ display: flex;
1140
+ align-items: center;
1141
+ justify-content: center;
1142
+ font-size: 17px;
1143
+ line-height: 1;
1144
+ color: var(--accent);
1145
+ border: 1px solid oklch(68% 0.26 255 / 0.3);
1146
+ background: var(--accent-muted);
1147
+ flex-shrink: 0;
1148
+ transition: all var(--dur-sm) var(--ease);
1149
+ }
1150
+
1151
+ .btn-add:hover { background: var(--accent); color: oklch(98% 0.003 265); transform: scale(1.12); box-shadow: 0 2px 8px var(--accent-glow); }
1152
+ .btn-add:disabled { color: var(--text-3); border-color: var(--border); background: transparent; cursor: not-allowed; transform: none; }
1153
+ .btn-add.already-added { color: var(--success); border-color: oklch(74% 0.2 155 / 0.3); background: var(--success-bg); font-size: 15px; }
1154
+ .btn-add.already-added:hover { background: var(--success-bg); color: var(--success); transform: none; box-shadow: none; }
1155
+
1156
+ /* ─── Antigravity slot bar ───────────────────────────────────────────────── */
1157
+ .agy-slot-bar {
1158
+ display: flex;
1159
+ align-items: center;
1160
+ gap: 14px;
1161
+ padding: 14px 18px;
1162
+ background: var(--surface);
1163
+ border: 1px solid var(--border);
1164
+ border-radius: var(--radius);
1165
+ margin-bottom: 16px;
1166
+ }
1167
+
1168
+ .agy-slot-label {
1169
+ font-size: 16px;
1170
+ font-weight: 500;
1171
+ color: var(--text-2);
1172
+ flex-shrink: 0;
1173
+ }
1174
+
1175
+ .agy-slot-pips {
1176
+ display: flex;
1177
+ gap: 5px;
1178
+ flex: 1;
1179
+ }
1180
+
1181
+ .agy-pip {
1182
+ flex: 1;
1183
+ height: 5px;
1184
+ border-radius: 3px;
1185
+ background: var(--border);
1186
+ transition: background var(--dur-md) var(--ease), box-shadow var(--dur-md) var(--ease);
1187
+ }
1188
+
1189
+ .agy-pip.filled {
1190
+ background: linear-gradient(90deg, var(--accent), var(--accent-2));
1191
+ box-shadow: 0 0 6px var(--accent-glow);
1192
+ }
1193
+
1194
+ .agy-slot-count {
1195
+ font-size: 15px;
1196
+ font-weight: 700;
1197
+ color: var(--text-1);
1198
+ font-variant-numeric: tabular-nums;
1199
+ flex-shrink: 0;
1200
+ }
1201
+
1202
+ .agy-slot-max { font-size: 15px; font-weight: 400; color: var(--text-3); }
1203
+
1204
+ /* ─── Favorites list ─────────────────────────────────────────────────────── */
1205
+ .fav-list {
1206
+ display: flex;
1207
+ flex-direction: column;
1208
+ gap: 6px;
1209
+ min-height: 60px;
1210
+ }
1211
+
1212
+ .fav-empty {
1213
+ padding: 32px 20px;
1214
+ text-align: center;
1215
+ color: var(--text-3);
1216
+ font-size: 15px;
1217
+ background: var(--surface);
1218
+ border: 1px dashed var(--border);
1219
+ border-radius: var(--radius);
1220
+ }
1221
+
1222
+ .fav-item {
1223
+ display: flex;
1224
+ align-items: center;
1225
+ gap: 12px;
1226
+ padding: 12px 16px;
1227
+ border-radius: var(--radius);
1228
+ background: var(--surface);
1229
+ border: 1px solid var(--border);
1230
+ transition: background var(--dur-xs) var(--ease), border-color var(--dur-sm) var(--ease),
1231
+ transform var(--dur-md) var(--ease), box-shadow var(--dur-md) var(--ease);
1232
+ cursor: default;
1233
+ user-select: none;
1234
+ }
1235
+
1236
+ .fav-item:hover { background: var(--surface-2); border-color: var(--border-bright); }
1237
+
1238
+ .fav-item.keyboard-focus { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-glow); }
1239
+
1240
+ .fav-item.dragging {
1241
+ transform: scale(1.025) rotate(0.5deg);
1242
+ box-shadow: 0 12px 32px oklch(0% 0 0 / 0.5), 0 0 0 1px var(--accent-dim);
1243
+ border-color: var(--accent-dim);
1244
+ background: var(--surface-2);
1245
+ z-index: 10;
1246
+ position: relative;
1247
+ }
1248
+
1249
+ .fav-item.drag-over {
1250
+ border-color: var(--accent);
1251
+ background: var(--accent-muted);
1252
+ box-shadow: 0 0 0 2px var(--accent-glow);
1253
+ }
1254
+
1255
+ .fav-item.slide-in {
1256
+ animation: fav-enter var(--dur-lg) var(--ease);
1257
+ }
1258
+
1259
+ @keyframes fav-enter {
1260
+ from { opacity: 0; transform: translateY(-10px) scale(0.97); }
1261
+ to { opacity: 1; transform: translateY(0) scale(1); }
1262
+ }
1263
+
1264
+ .drag-handle {
1265
+ color: var(--text-3);
1266
+ cursor: grab;
1267
+ font-size: 15px;
1268
+ flex-shrink: 0;
1269
+ padding: 2px;
1270
+ border-radius: 4px;
1271
+ transition: color var(--dur-sm) var(--ease), background var(--dur-sm) var(--ease);
1272
+ display: flex;
1273
+ align-items: center;
1274
+ }
1275
+
1276
+ .drag-handle:hover { color: var(--accent); background: var(--accent-muted); }
1277
+ .drag-handle:active { cursor: grabbing; }
1278
+
1279
+ /* Fav item number badge */
1280
+ .fav-rank {
1281
+ width: 26px;
1282
+ height: 26px;
1283
+ border-radius: 7px;
1284
+ border: 1px solid;
1285
+ display: flex;
1286
+ align-items: center;
1287
+ justify-content: center;
1288
+ font-size: 12px;
1289
+ font-weight: 700;
1290
+ flex-shrink: 0;
1291
+ font-variant-numeric: tabular-nums;
1292
+ letter-spacing: -0.01em;
1293
+ }
1294
+
1295
+ .fav-model-id {
1296
+ flex: 1;
1297
+ font-size: 15px;
1298
+ font-weight: 500;
1299
+ color: var(--text-1);
1300
+ overflow: hidden;
1301
+ text-overflow: ellipsis;
1302
+ white-space: nowrap;
1303
+ }
1304
+
1305
+ .fav-provider-badge {
1306
+ font-size: 15px;
1307
+ font-weight: 600;
1308
+ padding: 3px 10px;
1309
+ border-radius: 20px;
1310
+ border: 1px solid;
1311
+ flex-shrink: 0;
1312
+ letter-spacing: 0.01em;
1313
+ white-space: nowrap;
1314
+ }
1315
+
1316
+ .btn-remove {
1317
+ width: 24px;
1318
+ height: 24px;
1319
+ border-radius: 50%;
1320
+ display: flex;
1321
+ align-items: center;
1322
+ justify-content: center;
1323
+ font-size: 16px;
1324
+ color: var(--text-3);
1325
+ flex-shrink: 0;
1326
+ transition: color var(--dur-sm) var(--ease), background var(--dur-sm) var(--ease);
1327
+ }
1328
+
1329
+ .btn-remove:hover { color: var(--error); background: var(--error-bg); }
1330
+
1331
+ /* ─── Toast ──────────────────────────────────────────────────────────────── */
1332
+ .toast-container {
1333
+ position: fixed;
1334
+ bottom: 24px;
1335
+ right: 28px;
1336
+ display: flex;
1337
+ flex-direction: column;
1338
+ gap: 8px;
1339
+ z-index: 200;
1340
+ pointer-events: none;
1341
+ }
1342
+
1343
+ .toast {
1344
+ display: flex;
1345
+ align-items: center;
1346
+ gap: 10px;
1347
+ padding: 11px 18px;
1348
+ border-radius: var(--radius);
1349
+ background: oklch(20% 0.028 265);
1350
+ border: 1px solid var(--border-bright);
1351
+ box-shadow: 0 8px 24px oklch(0% 0 0 / 0.5), 0 0 0 1px oklch(68% 0.26 255 / 0.08);
1352
+ font-size: 15px;
1353
+ font-weight: 500;
1354
+ pointer-events: all;
1355
+ animation: toast-in var(--dur-md) var(--ease);
1356
+ }
1357
+
1358
+ .toast.out { animation: toast-out 150ms var(--ease) forwards; }
1359
+
1360
+ @keyframes toast-in {
1361
+ from { opacity: 0; transform: translateY(10px) scale(0.96); }
1362
+ to { opacity: 1; transform: translateY(0) scale(1); }
1363
+ }
1364
+
1365
+ @keyframes toast-out {
1366
+ to { opacity: 0; transform: translateY(-4px) scale(0.97); }
1367
+ }
1368
+
1369
+ .toast-msg { color: var(--text-1); }
1370
+
1371
+ .btn-undo {
1372
+ font-size: 16px;
1373
+ font-weight: 600;
1374
+ color: var(--accent);
1375
+ padding: 2px 6px;
1376
+ border-radius: 4px;
1377
+ transition: opacity var(--dur-sm) var(--ease);
1378
+ }
1379
+
1380
+ .btn-undo:hover { opacity: 0.75; }
1381
+
1382
+ /* ─── Server Gateway ─────────────────────────────────────────────────────── */
1383
+
1384
+ .nav-badge-status {
1385
+ color: var(--success);
1386
+ background: var(--success-bg);
1387
+ border-color: oklch(74% 0.2 155 / 0.25);
1388
+ }
1389
+
1390
+ .btn-sm { padding: 5px 11px; font-size: 13px; }
1391
+
1392
+ .server-field { margin-bottom: 22px; }
1393
+
1394
+ .server-field-label {
1395
+ font-size: 13px;
1396
+ font-weight: 600;
1397
+ color: var(--text-2);
1398
+ text-transform: uppercase;
1399
+ letter-spacing: 0.05em;
1400
+ margin-bottom: 10px;
1401
+ }
1402
+
1403
+ .server-field-hint {
1404
+ font-size: 13px;
1405
+ color: var(--text-3);
1406
+ font-weight: 400;
1407
+ text-transform: none;
1408
+ letter-spacing: normal;
1409
+ }
1410
+
1411
+ .server-toggle-row {
1412
+ display: flex;
1413
+ align-items: center;
1414
+ gap: 10px;
1415
+ font-size: 15px;
1416
+ color: var(--text-1);
1417
+ cursor: pointer;
1418
+ }
1419
+
1420
+ .server-toggle-row input[type="checkbox"],
1421
+ .server-provider-row input[type="checkbox"] {
1422
+ width: 16px;
1423
+ height: 16px;
1424
+ accent-color: var(--accent);
1425
+ cursor: pointer;
1426
+ }
1427
+
1428
+ .toggle-group {
1429
+ display: inline-flex;
1430
+ border: 1px solid var(--border);
1431
+ border-radius: var(--radius-sm);
1432
+ overflow: hidden;
1433
+ }
1434
+
1435
+ .toggle-option {
1436
+ padding: 8px 16px;
1437
+ font-size: 15px;
1438
+ font-weight: 500;
1439
+ color: var(--text-2);
1440
+ background: var(--surface);
1441
+ transition: background var(--dur-sm) var(--ease), color var(--dur-sm) var(--ease);
1442
+ }
1443
+
1444
+ .toggle-option + .toggle-option { border-left: 1px solid var(--border); }
1445
+
1446
+ .toggle-option:hover { background: var(--surface-hover); color: var(--text-1); }
1447
+
1448
+ .toggle-option.active {
1449
+ background: var(--accent-muted);
1450
+ color: var(--accent);
1451
+ }
1452
+
1453
+ .server-providers-picker, .server-network-options {
1454
+ margin-top: 14px;
1455
+ display: flex;
1456
+ flex-direction: column;
1457
+ gap: 10px;
1458
+ }
1459
+
1460
+ .server-provider-chips {
1461
+ display: flex;
1462
+ flex-wrap: wrap;
1463
+ gap: 6px;
1464
+ }
1465
+
1466
+ .server-provider-chip {
1467
+ display: inline-flex;
1468
+ align-items: center;
1469
+ gap: 6px;
1470
+ padding: 4px 6px 4px 10px;
1471
+ border-radius: 20px;
1472
+ background: var(--accent-muted);
1473
+ color: var(--accent);
1474
+ font-size: 13px;
1475
+ font-weight: 500;
1476
+ border: 1px solid oklch(68% 0.26 255 / 0.2);
1477
+ }
1478
+
1479
+ .server-provider-chip button {
1480
+ color: inherit;
1481
+ font-size: 15px;
1482
+ line-height: 1;
1483
+ padding: 2px;
1484
+ opacity: 0.7;
1485
+ }
1486
+
1487
+ .server-provider-chip button:hover { opacity: 1; }
1488
+
1489
+ .server-provider-list {
1490
+ max-height: 260px;
1491
+ overflow-y: auto;
1492
+ border: 1px solid var(--border);
1493
+ border-radius: var(--radius-sm);
1494
+ }
1495
+
1496
+ .server-provider-row {
1497
+ display: flex;
1498
+ align-items: center;
1499
+ gap: 10px;
1500
+ padding: 10px 14px;
1501
+ cursor: pointer;
1502
+ border-bottom: 1px solid var(--border);
1503
+ transition: background var(--dur-sm) var(--ease);
1504
+ }
1505
+
1506
+ .server-provider-row:last-child { border-bottom: none; }
1507
+ .server-provider-row:hover { background: var(--surface-hover); }
1508
+
1509
+ .server-provider-row-name { flex: 1; font-size: 15px; color: var(--text-1); }
1510
+ .server-provider-row-count { font-size: 13px; color: var(--text-3); }
1511
+
1512
+ .server-start-btn { width: 100%; height: 44px; font-size: 15px; font-weight: 600; margin-top: 4px; }
1513
+
1514
+ .server-start-error { margin-bottom: 10px; }
1515
+
1516
+ .server-status-row {
1517
+ display: flex;
1518
+ align-items: center;
1519
+ justify-content: space-between;
1520
+ margin-bottom: 14px;
1521
+ }
1522
+
1523
+ .server-status-badge {
1524
+ display: inline-flex;
1525
+ align-items: center;
1526
+ gap: 8px;
1527
+ font-size: 15px;
1528
+ font-weight: 600;
1529
+ color: var(--success);
1530
+ }
1531
+
1532
+ .server-status-dot {
1533
+ width: 9px;
1534
+ height: 9px;
1535
+ border-radius: 50%;
1536
+ background: var(--success);
1537
+ box-shadow: 0 0 8px var(--success);
1538
+ animation: server-pulse 2s infinite;
1539
+ }
1540
+
1541
+ @keyframes server-pulse {
1542
+ 0%, 100% { opacity: 1; }
1543
+ 50% { opacity: 0.4; }
1544
+ }
1545
+
1546
+ .server-stop-btn {
1547
+ color: var(--error);
1548
+ border-color: oklch(68% 0.22 25 / 0.4);
1549
+ }
1550
+
1551
+ .server-config-summary {
1552
+ font-size: 14px;
1553
+ color: var(--text-3);
1554
+ margin-bottom: 20px;
1555
+ }
1556
+
1557
+ .url-card-grid {
1558
+ display: flex;
1559
+ flex-direction: column;
1560
+ gap: 10px;
1561
+ margin-bottom: 24px;
1562
+ }
1563
+
1564
+ .url-card {
1565
+ display: flex;
1566
+ align-items: center;
1567
+ gap: 10px;
1568
+ padding: 12px 14px;
1569
+ background: var(--surface);
1570
+ border: 1px solid var(--border);
1571
+ border-radius: var(--radius-sm);
1572
+ }
1573
+
1574
+ .url-card-label {
1575
+ font-size: 12px;
1576
+ font-weight: 600;
1577
+ color: var(--text-3);
1578
+ text-transform: uppercase;
1579
+ letter-spacing: 0.04em;
1580
+ flex-shrink: 0;
1581
+ width: 90px;
1582
+ }
1583
+
1584
+ .url-card-value {
1585
+ flex: 1;
1586
+ font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace;
1587
+ font-size: 13px;
1588
+ color: var(--text-1);
1589
+ overflow-wrap: anywhere;
1590
+ }
1591
+
1592
+ .url-card-value.masked { letter-spacing: 0.15em; }
1593
+
1594
+ .server-model-table-wrap {
1595
+ border: 1px solid var(--border);
1596
+ border-radius: var(--radius-sm);
1597
+ overflow: auto;
1598
+ }
1599
+
1600
+ .server-model-table {
1601
+ width: 100%;
1602
+ border-collapse: collapse;
1603
+ font-size: 14px;
1604
+ }
1605
+
1606
+ .server-model-table th {
1607
+ text-align: left;
1608
+ padding: 10px 14px;
1609
+ background: var(--surface-2);
1610
+ color: var(--text-2);
1611
+ font-weight: 600;
1612
+ font-size: 12px;
1613
+ text-transform: uppercase;
1614
+ letter-spacing: 0.04em;
1615
+ border-bottom: 1px solid var(--border);
1616
+ }
1617
+
1618
+ .server-model-table td {
1619
+ padding: 9px 14px;
1620
+ border-bottom: 1px solid var(--border);
1621
+ color: var(--text-1);
1622
+ }
1623
+
1624
+ .server-model-table tr:last-child td { border-bottom: none; }
1625
+
1626
+ .server-model-table code {
1627
+ font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace;
1628
+ font-size: 12px;
1629
+ color: var(--text-2);
1630
+ }