protocol-proxy 2.4.0 → 2.5.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.
package/public/style.css CHANGED
@@ -1,1344 +1,1448 @@
1
- * { box-sizing: border-box; margin: 0; padding: 0; }
2
-
3
- body {
4
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
5
- background: #030712;
6
- color: #e2e8f0;
7
- line-height: 1.6;
8
- min-height: 100vh;
9
- }
10
-
11
- /* 科技网格背景 */
12
- body::before {
13
- content: '';
14
- position: fixed;
15
- top: 0; left: 0; right: 0; bottom: 0;
16
- background-image:
17
- linear-gradient(rgba(59, 130, 246, 0.03) 1px, transparent 1px),
18
- linear-gradient(90deg, rgba(59, 130, 246, 0.03) 1px, transparent 1px);
19
- background-size: 60px 60px;
20
- pointer-events: none;
21
- z-index: 0;
22
- }
23
-
24
- .container {
25
- position: relative;
26
- z-index: 1;
27
- max-width: 1200px;
28
- margin: 0 auto;
29
- padding: 40px 20px;
30
- }
31
-
32
- /* Header */
33
- header {
34
- text-align: center;
35
- margin-bottom: 40px;
36
- }
37
-
38
- header h1 {
39
- font-size: 2.8rem;
40
- font-weight: 800;
41
- letter-spacing: -0.02em;
42
- background: linear-gradient(135deg, #60a5fa 0%, #a78bfa 50%, #22d3ee 100%);
43
- -webkit-background-clip: text;
44
- -webkit-text-fill-color: transparent;
45
- background-clip: text;
46
- margin-bottom: 10px;
47
- text-shadow: 0 0 40px rgba(96, 165, 250, 0.15);
48
- }
49
-
50
- header p {
51
- color: #64748b;
52
- font-size: 1.05rem;
53
- letter-spacing: 0.02em;
54
- }
55
-
56
- /* Stats */
57
- .stats {
58
- display: flex;
59
- gap: 20px;
60
- justify-content: center;
61
- margin-bottom: 40px;
62
- }
63
-
64
- .stat-item {
65
- background: rgba(15, 23, 42, 0.6);
66
- backdrop-filter: blur(12px);
67
- border: 1px solid rgba(51, 65, 85, 0.5);
68
- border-radius: 16px;
69
- padding: 24px 48px;
70
- text-align: center;
71
- min-width: 160px;
72
- position: relative;
73
- overflow: hidden;
74
- transition: all 0.3s ease;
75
- }
76
-
77
- .stat-item::before {
78
- content: '';
79
- position: absolute;
80
- top: 0; left: 0; right: 0;
81
- height: 2px;
82
- background: linear-gradient(90deg, transparent, #3b82f6, transparent);
83
- opacity: 0.5;
84
- }
85
-
86
- .stat-item:hover {
87
- border-color: rgba(59, 130, 246, 0.3);
88
- box-shadow: 0 0 30px rgba(59, 130, 246, 0.08);
89
- transform: translateY(-2px);
90
- }
91
-
92
- .stat-value {
93
- display: block;
94
- font-size: 2.2rem;
95
- font-weight: 700;
96
- color: #60a5fa;
97
- font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
98
- }
99
-
100
- .stat-label {
101
- color: #64748b;
102
- font-size: 0.85rem;
103
- text-transform: uppercase;
104
- letter-spacing: 0.08em;
105
- margin-top: 4px;
106
- }
107
-
108
- /* Card */
109
- .card {
110
- background: rgba(15, 23, 42, 0.5);
111
- backdrop-filter: blur(16px);
112
- border: 1px solid rgba(51, 65, 85, 0.4);
113
- border-radius: 20px;
114
- overflow: hidden;
115
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
116
- }
117
-
118
- .card-header {
119
- display: flex;
120
- justify-content: space-between;
121
- align-items: center;
122
- padding: 24px 28px;
123
- border-bottom: 1px solid rgba(51, 65, 85, 0.4);
124
- }
125
-
126
- .card-header h2 {
127
- font-size: 1.15rem;
128
- font-weight: 600;
129
- color: #f1f5f9;
130
- letter-spacing: -0.01em;
131
- }
132
-
133
- /* Buttons */
134
- .btn {
135
- padding: 9px 18px;
136
- border-radius: 10px;
137
- border: 1px solid rgba(71, 85, 105, 0.6);
138
- background: rgba(51, 65, 85, 0.4);
139
- color: #cbd5e1;
140
- cursor: pointer;
141
- font-size: 0.9rem;
142
- font-weight: 500;
143
- transition: all 0.25s ease;
144
- backdrop-filter: blur(8px);
145
- }
146
-
147
- .btn:hover {
148
- background: rgba(71, 85, 105, 0.5);
149
- border-color: rgba(100, 116, 139, 0.8);
150
- transform: translateY(-1px);
151
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
152
- }
153
-
154
- .btn-primary {
155
- background: linear-gradient(135deg, #3b82f6, #2563eb);
156
- border-color: transparent;
157
- color: white;
158
- box-shadow: 0 2px 8px rgba(59, 130, 246, 0.25);
159
- }
160
-
161
- .btn-primary:hover {
162
- background: linear-gradient(135deg, #4b92ff, #3573fb);
163
- box-shadow: 0 4px 16px rgba(59, 130, 246, 0.4);
164
- transform: translateY(-1px);
165
- }
166
-
167
- .btn-sm {
168
- padding: 5px 14px;
169
- font-size: 0.85rem;
170
- }
171
-
172
- .btn-danger {
173
- background: linear-gradient(135deg, #ef4444, #dc2626);
174
- border-color: transparent;
175
- color: white;
176
- box-shadow: 0 2px 8px rgba(239, 68, 68, 0.2);
177
- }
178
-
179
- .btn-danger:hover {
180
- background: linear-gradient(135deg, #ff5555, #ec3636);
181
- box-shadow: 0 4px 16px rgba(239, 68, 68, 0.35);
182
- }
183
-
184
- .btn-success {
185
- background: linear-gradient(135deg, #22c55e, #16a34a);
186
- border-color: transparent;
187
- color: white;
188
- box-shadow: 0 2px 8px rgba(34, 197, 94, 0.2);
189
- }
190
-
191
- .btn-success:hover {
192
- background: linear-gradient(135deg, #32d56e, #26b34a);
193
- box-shadow: 0 4px 16px rgba(34, 197, 94, 0.35);
194
- }
195
-
196
- /* Proxy list */
197
- .proxy-list {
198
- padding: 20px;
199
- }
200
-
201
- .empty {
202
- text-align: center;
203
- padding: 80px 20px;
204
- color: #475569;
205
- font-size: 0.95rem;
206
- }
207
-
208
- .empty::before {
209
- content: '◈';
210
- display: block;
211
- font-size: 3rem;
212
- color: #334155;
213
- margin-bottom: 16px;
214
- }
215
-
216
- /* Proxy Item */
217
- .proxy-item {
218
- background: rgba(6, 8, 15, 0.6);
219
- backdrop-filter: blur(12px);
220
- border: 1px solid rgba(51, 65, 85, 0.35);
221
- border-radius: 16px;
222
- padding: 24px;
223
- margin-bottom: 16px;
224
- position: relative;
225
- overflow: hidden;
226
- transition: all 0.3s ease;
227
- }
228
-
229
- .proxy-item::before {
230
- content: '';
231
- position: absolute;
232
- left: 0; top: 0; bottom: 0;
233
- width: 3px;
234
- background: #475569;
235
- transition: background 0.3s ease;
236
- }
237
-
238
- .proxy-item:hover {
239
- border-color: rgba(71, 85, 105, 0.6);
240
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
241
- transform: translateY(-2px);
242
- }
243
-
244
- .proxy-item:hover::before {
245
- background: #3b82f6;
246
- box-shadow: 0 0 12px rgba(59, 130, 246, 0.5);
247
- }
248
-
249
- .proxy-header {
250
- display: flex;
251
- justify-content: space-between;
252
- align-items: center;
253
- margin-bottom: 14px;
254
- }
255
-
256
- .proxy-title {
257
- display: flex;
258
- align-items: center;
259
- gap: 12px;
260
- }
261
-
262
- .proxy-title h3 {
263
- font-size: 1.15rem;
264
- font-weight: 600;
265
- color: #f8fafc;
266
- }
267
-
268
- /* Badge */
269
- .badge {
270
- padding: 3px 12px;
271
- border-radius: 20px;
272
- font-size: 0.75rem;
273
- font-weight: 600;
274
- letter-spacing: 0.03em;
275
- backdrop-filter: blur(8px);
276
- }
277
-
278
- .badge-running {
279
- background: rgba(6, 78, 59, 0.4);
280
- color: #34d399;
281
- border: 1px solid rgba(52, 211, 153, 0.2);
282
- box-shadow: 0 0 8px rgba(52, 211, 153, 0.1);
283
- }
284
-
285
- .badge-stopped {
286
- background: rgba(69, 26, 3, 0.4);
287
- color: #fbbf24;
288
- border: 1px solid rgba(251, 191, 36, 0.2);
289
- }
290
-
291
- .proxy-meta {
292
- display: flex;
293
- gap: 24px;
294
- color: #64748b;
295
- font-size: 0.9rem;
296
- margin-bottom: 16px;
297
- }
298
-
299
- .proxy-meta span {
300
- display: flex;
301
- align-items: center;
302
- gap: 6px;
303
- }
304
-
305
- /* Target Table */
306
- .target-table {
307
- width: 100%;
308
- border-collapse: separate;
309
- border-spacing: 0;
310
- font-size: 0.85rem;
311
- table-layout: fixed;
312
- border-radius: 10px;
313
- overflow: hidden;
314
- }
315
-
316
- .target-table th:nth-child(1),
317
- .target-table td:nth-child(1) { width: 25%; }
318
-
319
- .target-table th:nth-child(2),
320
- .target-table td:nth-child(2) { width: 25%; }
321
-
322
- .target-table th:nth-child(3),
323
- .target-table td:nth-child(3) { width: 25%; }
324
-
325
- .target-table th:nth-child(4),
326
- .target-table td:nth-child(4) { width: 25%; text-align: center; }
327
-
328
- .target-table th,
329
- .target-table td {
330
- text-align: left;
331
- padding: 10px 14px;
332
- border-bottom: 1px solid rgba(30, 41, 59, 0.6);
333
- }
334
-
335
- .target-table th {
336
- color: #475569;
337
- font-weight: 600;
338
- text-transform: uppercase;
339
- font-size: 0.7rem;
340
- letter-spacing: 0.08em;
341
- background: rgba(15, 23, 42, 0.4);
342
- }
343
-
344
- .target-table td {
345
- color: #94a3b8;
346
- word-break: break-all;
347
- }
348
-
349
- .target-table tbody tr:last-child td {
350
- border-bottom: none;
351
- }
352
-
353
- .proxy-actions {
354
- display: flex;
355
- gap: 10px;
356
- margin-top: 18px;
357
- padding-top: 18px;
358
- border-top: 1px solid rgba(30, 41, 59, 0.5);
359
- }
360
-
361
- /* Modal */
362
- .modal {
363
- display: none;
364
- position: fixed;
365
- top: 0;
366
- left: 0;
367
- width: 100%;
368
- height: 100%;
369
- background: rgba(3, 7, 18, 0.85);
370
- backdrop-filter: blur(8px);
371
- z-index: 1000;
372
- justify-content: center;
373
- align-items: center;
374
- padding: 20px;
375
- overflow-y: auto;
376
- }
377
-
378
- .modal.active {
379
- display: flex;
380
- }
381
-
382
- .modal-content {
383
- background: rgba(15, 23, 42, 0.7);
384
- backdrop-filter: blur(24px);
385
- border: 1px solid rgba(71, 85, 105, 0.4);
386
- border-radius: 20px;
387
- width: 100%;
388
- max-width: 700px;
389
- box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(59, 130, 246, 0.05);
390
- animation: modal-in 0.3s ease;
391
- }
392
-
393
- @keyframes modal-in {
394
- from { opacity: 0; transform: translateY(20px) scale(0.97); }
395
- to { opacity: 1; transform: translateY(0) scale(1); }
396
- }
397
-
398
- .modal-header {
399
- display: flex;
400
- justify-content: space-between;
401
- align-items: center;
402
- padding: 22px 28px;
403
- border-bottom: 1px solid rgba(51, 65, 85, 0.4);
404
- }
405
-
406
- .modal-header h3 {
407
- font-size: 1.2rem;
408
- font-weight: 600;
409
- color: #f8fafc;
410
- }
411
-
412
- .btn-close {
413
- background: none;
414
- border: none;
415
- color: #64748b;
416
- font-size: 1.5rem;
417
- cursor: pointer;
418
- line-height: 1;
419
- width: 36px;
420
- height: 36px;
421
- border-radius: 10px;
422
- display: flex;
423
- align-items: center;
424
- justify-content: center;
425
- transition: all 0.2s;
426
- }
427
-
428
- .btn-close:hover {
429
- color: #e2e8f0;
430
- background: rgba(71, 85, 105, 0.3);
431
- }
432
-
433
- /* Form */
434
- form {
435
- padding: 24px 28px;
436
- }
437
-
438
- .form-group {
439
- margin-bottom: 18px;
440
- }
441
-
442
- .form-group label {
443
- display: block;
444
- margin-bottom: 8px;
445
- color: #94a3b8;
446
- font-size: 0.85rem;
447
- font-weight: 500;
448
- letter-spacing: 0.02em;
449
- }
450
-
451
- .form-group input,
452
- .form-group select,
453
- .form-group textarea {
454
- width: 100%;
455
- padding: 11px 16px;
456
- background: rgba(6, 8, 15, 0.6);
457
- border: 1px solid rgba(51, 65, 85, 0.5);
458
- border-radius: 10px;
459
- color: #f1f5f9;
460
- font-size: 0.95rem;
461
- transition: all 0.25s ease;
462
- appearance: none;
463
- -webkit-appearance: none;
464
- }
465
-
466
- .form-group input::placeholder,
467
- .form-group select::placeholder {
468
- color: #475569;
469
- }
470
-
471
- .form-group input:focus,
472
- .form-group select:focus {
473
- outline: none;
474
- border-color: rgba(59, 130, 246, 0.5);
475
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1), 0 0 20px rgba(59, 130, 246, 0.08);
476
- background: rgba(6, 8, 15, 0.8);
477
- }
478
-
479
- /* Select 下拉框 - 科技感 */
480
- .form-group select {
481
- cursor: pointer;
482
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
483
- background-repeat: no-repeat;
484
- background-position: right 14px center;
485
- padding-right: 42px;
486
- }
487
-
488
- .form-group select:hover {
489
- border-color: rgba(100, 116, 139, 0.7);
490
- }
491
-
492
- .form-group select option {
493
- background: #0f172a;
494
- color: #e2e8f0;
495
- padding: 10px;
496
- }
497
-
498
- /* Form row */
499
- .form-row {
500
- display: grid;
501
- grid-template-columns: 1fr 1fr;
502
- gap: 18px;
503
- }
504
-
505
- /* Target section */
506
- .target-section {
507
- margin-top: 24px;
508
- padding-top: 24px;
509
- border-top: 1px solid rgba(51, 65, 85, 0.4);
510
- }
511
-
512
- .target-section h4 {
513
- font-size: 0.9rem;
514
- font-weight: 600;
515
- color: #64748b;
516
- text-transform: uppercase;
517
- letter-spacing: 0.08em;
518
- margin-bottom: 16px;
519
- }
520
-
521
- .target-item {
522
- background: rgba(6, 8, 15, 0.5);
523
- border: 1px solid rgba(51, 65, 85, 0.35);
524
- border-radius: 14px;
525
- padding: 20px;
526
- margin-bottom: 12px;
527
- transition: border-color 0.25s;
528
- }
529
-
530
- .target-item:hover {
531
- border-color: rgba(71, 85, 105, 0.5);
532
- }
533
-
534
- .target-item .form-row {
535
- margin-bottom: 14px;
536
- }
537
-
538
- .target-item .form-row:last-child {
539
- margin-bottom: 0;
540
- }
541
-
542
- .target-remove {
543
- text-align: right;
544
- margin-top: 8px;
545
- }
546
-
547
- .modal-footer {
548
- display: flex;
549
- justify-content: flex-end;
550
- gap: 12px;
551
- padding-top: 20px;
552
- margin-top: 20px;
553
- border-top: 1px solid rgba(51, 65, 85, 0.4);
554
- }
555
-
556
- /* Proxy address */
557
- .proxy-address {
558
- display: flex;
559
- align-items: center;
560
- gap: 10px;
561
- margin-top: 14px;
562
- padding: 12px 16px;
563
- background: rgba(15, 23, 42, 0.5);
564
- border: 1px solid rgba(51, 65, 85, 0.35);
565
- border-radius: 12px;
566
- font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
567
- transition: all 0.25s;
568
- }
569
-
570
- .proxy-address:hover {
571
- border-color: rgba(59, 130, 246, 0.3);
572
- box-shadow: 0 0 16px rgba(59, 130, 246, 0.06);
573
- }
574
-
575
- .proxy-address code {
576
- flex: 1;
577
- font-size: 0.85rem;
578
- color: #7dd3fc;
579
- word-break: break-all;
580
- }
581
-
582
- .copy-btn {
583
- flex-shrink: 0;
584
- display: flex;
585
- align-items: center;
586
- gap: 6px;
587
- padding: 6px 12px;
588
- background: rgba(51, 65, 85, 0.4);
589
- border: 1px solid rgba(71, 85, 105, 0.5);
590
- border-radius: 8px;
591
- color: #94a3b8;
592
- font-size: 0.8rem;
593
- cursor: pointer;
594
- transition: all 0.25s;
595
- backdrop-filter: blur(8px);
596
- }
597
-
598
- .copy-btn:hover {
599
- background: rgba(59, 130, 246, 0.15);
600
- border-color: rgba(59, 130, 246, 0.4);
601
- color: #60a5fa;
602
- box-shadow: 0 0 12px rgba(59, 130, 246, 0.15);
603
- }
604
-
605
- .copy-btn svg {
606
- width: 14px;
607
- height: 14px;
608
- }
609
-
610
- /* Toast */
611
- .toast {
612
- position: fixed;
613
- bottom: 28px;
614
- right: 28px;
615
- padding: 12px 24px;
616
- background: linear-gradient(135deg, #22c55e, #16a34a);
617
- color: white;
618
- border-radius: 12px;
619
- font-size: 0.9rem;
620
- font-weight: 500;
621
- z-index: 9999;
622
- animation: toast-in 0.35s ease, toast-out 0.35s ease 2.3s forwards;
623
- box-shadow: 0 8px 24px rgba(34, 197, 94, 0.3);
624
- backdrop-filter: blur(12px);
625
- }
626
-
627
- @keyframes toast-in {
628
- from { opacity: 0; transform: translateY(16px) scale(0.95); }
629
- to { opacity: 1; transform: translateY(0) scale(1); }
630
- }
631
-
632
- @keyframes toast-out {
633
- from { opacity: 1; }
634
- to { opacity: 0; }
635
- }
636
-
637
- /* Custom model dropdown */
638
- .model-dropdown {
639
- position: relative;
640
- width: 100%;
641
- }
642
-
643
- .model-dropdown-trigger {
644
- display: flex;
645
- align-items: center;
646
- justify-content: space-between;
647
- width: 100%;
648
- padding: 11px 16px;
649
- background: rgba(6, 8, 15, 0.6);
650
- border: 1px solid rgba(51, 65, 85, 0.5);
651
- border-radius: 10px;
652
- color: #f1f5f9;
653
- font-size: 0.95rem;
654
- cursor: pointer;
655
- transition: all 0.25s ease;
656
- user-select: none;
657
- }
658
-
659
- .model-dropdown-trigger:hover {
660
- border-color: rgba(100, 116, 139, 0.6);
661
- }
662
-
663
- .model-dropdown.open .model-dropdown-trigger {
664
- border-color: rgba(59, 130, 246, 0.5);
665
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1), 0 0 20px rgba(59, 130, 246, 0.08);
666
- }
667
-
668
- .model-dropdown-arrow {
669
- font-size: 0.7rem;
670
- color: #64748b;
671
- transition: transform 0.25s ease;
672
- }
673
-
674
- .model-dropdown.open .model-dropdown-arrow {
675
- transform: rotate(180deg);
676
- }
677
-
678
- .model-dropdown-menu {
679
- display: none;
680
- position: absolute;
681
- top: calc(100% + 6px);
682
- left: 0;
683
- right: 0;
684
- background: rgba(15, 23, 42, 0.95);
685
- backdrop-filter: blur(24px);
686
- border: 1px solid rgba(71, 85, 105, 0.5);
687
- border-radius: 12px;
688
- z-index: 100;
689
- overflow: hidden;
690
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(59, 130, 246, 0.05);
691
- animation: dropdown-in 0.2s ease;
692
- }
693
-
694
- @keyframes dropdown-in {
695
- from { opacity: 0; transform: translateY(-6px); }
696
- to { opacity: 1; transform: translateY(0); }
697
- }
698
-
699
- .model-dropdown.open .model-dropdown-menu {
700
- display: block;
701
- }
702
-
703
- .model-dropdown-options {
704
- max-height: 220px;
705
- overflow-y: auto;
706
- }
707
-
708
- .model-dropdown-options::-webkit-scrollbar {
709
- width: 6px;
710
- }
711
-
712
- .model-dropdown-options::-webkit-scrollbar-track {
713
- background: transparent;
714
- }
715
-
716
- .model-dropdown-options::-webkit-scrollbar-thumb {
717
- background: rgba(71, 85, 105, 0.5);
718
- border-radius: 3px;
719
- }
720
-
721
- .model-option {
722
- display: flex;
723
- align-items: center;
724
- justify-content: space-between;
725
- padding: 10px 16px;
726
- cursor: pointer;
727
- transition: all 0.15s ease;
728
- border-left: 2px solid transparent;
729
- }
730
-
731
- .model-option:hover {
732
- background: rgba(59, 130, 246, 0.08);
733
- border-left-color: rgba(59, 130, 246, 0.4);
734
- }
735
-
736
- .model-option.selected {
737
- background: rgba(59, 130, 246, 0.12);
738
- color: #7dd3fc;
739
- border-left-color: #3b82f6;
740
- }
741
-
742
- .model-option-name {
743
- flex: 1;
744
- font-size: 0.9rem;
745
- }
746
-
747
- .model-option-delete {
748
- display: flex;
749
- align-items: center;
750
- justify-content: center;
751
- width: 24px;
752
- height: 24px;
753
- border-radius: 6px;
754
- border: none;
755
- background: transparent;
756
- color: #64748b;
757
- font-size: 1rem;
758
- cursor: pointer;
759
- transition: all 0.15s;
760
- line-height: 1;
761
- padding: 0;
762
- }
763
-
764
- .model-option-delete:hover {
765
- background: rgba(239, 68, 68, 0.15);
766
- color: #ef4444;
767
- }
768
-
769
- .model-add-section {
770
- display: flex;
771
- gap: 8px;
772
- padding: 10px 16px;
773
- border-top: 1px solid rgba(51, 65, 85, 0.4);
774
- background: rgba(6, 8, 15, 0.3);
775
- }
776
-
777
- .model-add-input {
778
- flex: 1;
779
- padding: 7px 12px;
780
- background: rgba(6, 8, 15, 0.5);
781
- border: 1px solid rgba(51, 65, 85, 0.5);
782
- border-radius: 8px;
783
- color: #e2e8f0;
784
- font-size: 0.85rem;
785
- transition: all 0.2s;
786
- }
787
-
788
- .model-add-input:focus {
789
- outline: none;
790
- border-color: rgba(59, 130, 246, 0.4);
791
- box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.08);
792
- }
793
-
794
- /* Confirm modal */
795
- .confirm-modal .confirm-box {
796
- background: rgba(15, 23, 42, 0.8);
797
- backdrop-filter: blur(24px);
798
- border: 1px solid rgba(71, 85, 105, 0.4);
799
- border-radius: 20px;
800
- padding: 32px 36px;
801
- max-width: 380px;
802
- width: 90%;
803
- text-align: center;
804
- box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(239, 68, 68, 0.05);
805
- animation: confirm-pop 0.25s ease;
806
- }
807
-
808
- @keyframes confirm-pop {
809
- from { opacity: 0; transform: scale(0.92) translateY(10px); }
810
- to { opacity: 1; transform: scale(1) translateY(0); }
811
- }
812
-
813
- .confirm-icon {
814
- display: inline-flex;
815
- align-items: center;
816
- justify-content: center;
817
- width: 56px;
818
- height: 56px;
819
- border-radius: 16px;
820
- background: rgba(69, 26, 3, 0.4);
821
- color: #fbbf24;
822
- font-size: 1.6rem;
823
- font-weight: 700;
824
- margin-bottom: 20px;
825
- border: 1px solid rgba(251, 191, 36, 0.15);
826
- }
827
-
828
- .confirm-text {
829
- color: #94a3b8;
830
- font-size: 0.95rem;
831
- line-height: 1.6;
832
- margin-bottom: 28px;
833
- }
834
-
835
- .confirm-text strong {
836
- color: #f1f5f9;
837
- }
838
-
839
- .confirm-actions {
840
- display: flex;
841
- gap: 12px;
842
- justify-content: center;
843
- }
844
-
845
- .confirm-actions .btn {
846
- min-width: 90px;
847
- }
848
-
849
- /* Card header actions */
850
- .card-header-actions {
851
- display: flex;
852
- gap: 8px;
853
- align-items: center;
854
- }
855
-
856
- /* Import modal */
857
- .import-preview {
858
- padding: 24px 28px;
859
- }
860
-
861
- .import-stats {
862
- display: flex;
863
- gap: 16px;
864
- margin-bottom: 24px;
865
- }
866
-
867
- .import-stat {
868
- flex: 1;
869
- background: rgba(6, 8, 15, 0.4);
870
- border: 1px solid rgba(51, 65, 85, 0.3);
871
- border-radius: 12px;
872
- padding: 16px;
873
- text-align: center;
874
- }
875
-
876
- .import-stat-value {
877
- display: block;
878
- font-size: 1.8rem;
879
- font-weight: 700;
880
- color: #60a5fa;
881
- font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
882
- }
883
-
884
- .import-stat-label {
885
- color: #64748b;
886
- font-size: 0.8rem;
887
- text-transform: uppercase;
888
- letter-spacing: 0.06em;
889
- }
890
-
891
- .import-mode label {
892
- display: block;
893
- margin-bottom: 10px;
894
- color: #94a3b8;
895
- font-size: 0.85rem;
896
- font-weight: 500;
897
- }
898
-
899
- .import-mode-options {
900
- display: flex;
901
- flex-direction: column;
902
- gap: 10px;
903
- }
904
-
905
- .import-mode-option {
906
- display: flex;
907
- align-items: flex-start;
908
- gap: 12px;
909
- padding: 14px 16px;
910
- background: rgba(6, 8, 15, 0.4);
911
- border: 1px solid rgba(51, 65, 85, 0.3);
912
- border-radius: 10px;
913
- cursor: pointer;
914
- transition: all 0.2s;
915
- }
916
-
917
- .import-mode-option:hover {
918
- border-color: rgba(59, 130, 246, 0.3);
919
- }
920
-
921
- .import-mode-option input[type="radio"] {
922
- margin-top: 3px;
923
- accent-color: #3b82f6;
924
- }
925
-
926
- .import-mode-option strong {
927
- display: block;
928
- color: #e2e8f0;
929
- font-size: 0.9rem;
930
- margin-bottom: 2px;
931
- }
932
-
933
- .import-mode-option small {
934
- color: #64748b;
935
- font-size: 0.8rem;
936
- }
937
-
938
- /* Stats Panel */
939
- .stats-panel .card-header {
940
- flex-wrap: wrap;
941
- gap: 12px;
942
- }
943
-
944
- .stats-estimated-badge {
945
- display: inline-block;
946
- padding: 2px 10px;
947
- border-radius: 12px;
948
- font-size: 0.7rem;
949
- font-weight: 500;
950
- background: rgba(251, 191, 36, 0.15);
951
- color: #fbbf24;
952
- border: 1px solid rgba(251, 191, 36, 0.2);
953
- vertical-align: middle;
954
- letter-spacing: 0.02em;
955
- }
956
-
957
- .stats-controls {
958
- display: flex;
959
- gap: 12px;
960
- flex-wrap: wrap;
961
- justify-content: flex-end; align-items: center;
962
- }
963
-
964
- .stats-controls .model-dropdown {
965
- width: 180px;
966
- }
967
-
968
- .stats-filter-trigger {
969
- padding: 7px 14px !important;
970
- font-size: 0.85rem !important;
971
- background: rgba(51, 65, 85, 0.3) !important;
972
- }
973
-
974
- .stats-range-btns {
975
- display: flex;
976
- gap: 4px;
977
- align-items: center;
978
- background: rgba(6, 8, 15, 0.4);
979
- border-radius: 10px;
980
- padding: 3px;
981
- border: 1px solid rgba(51, 65, 85, 0.3);
982
- }
983
-
984
- .stats-range-btn {
985
- border: none !important;
986
- background: transparent !important;
987
- box-shadow: none !important;
988
- padding: 6px 16px !important;
989
- border-radius: 8px !important;
990
- color: #64748b !important;
991
- font-size: 0.82rem !important;
992
- transition: all 0.2s !important;
993
- }
994
-
995
- .stats-range-btn:hover {
996
- color: #94a3b8 !important;
997
- background: rgba(51, 65, 85, 0.3) !important;
998
- }
999
-
1000
- .stats-range-btn.active {
1001
- background: rgba(59, 130, 246, 0.2) !important;
1002
- color: #60a5fa !important;
1003
- }
1004
-
1005
- .stats-date-range {
1006
- display: flex;
1007
- align-items: center;
1008
- gap: 4px;
1009
- }
1010
-
1011
- .stats-date-input {
1012
- background: rgba(15, 23, 42, 0.6);
1013
- border: 1px solid rgba(51, 65, 85, 0.5);
1014
- border-radius: 6px;
1015
- color: #e2e8f0;
1016
- padding: 6px 8px;
1017
- font-size: 0.78rem;
1018
- outline: none;
1019
- transition: border-color 0.2s;
1020
- width: 125px;
1021
- }
1022
-
1023
- .stats-date-input:focus {
1024
- border-color: #3b82f6;
1025
- }
1026
-
1027
- .stats-date-input::-webkit-calendar-picker-indicator {
1028
- filter: invert(0.7);
1029
- cursor: pointer;
1030
- }
1031
-
1032
- .stats-date-sep {
1033
- color: #475569;
1034
- font-size: 0.85rem;
1035
- }
1036
-
1037
- .stats-summary {
1038
- display: grid;
1039
- grid-template-columns: repeat(4, 1fr);
1040
- gap: 16px;
1041
- padding: 0 28px;
1042
- margin-top: 8px;
1043
- }
1044
-
1045
- .stats-summary-item {
1046
- background: rgba(6, 8, 15, 0.4);
1047
- border: 1px solid rgba(51, 65, 85, 0.3);
1048
- border-radius: 12px;
1049
- padding: 18px 16px;
1050
- text-align: center;
1051
- transition: all 0.25s;
1052
- }
1053
-
1054
- .stats-summary-item:hover {
1055
- border-color: rgba(59, 130, 246, 0.25);
1056
- box-shadow: 0 0 16px rgba(59, 130, 246, 0.06);
1057
- }
1058
-
1059
- .stats-summary-value {
1060
- display: block;
1061
- font-size: 1.5rem;
1062
- font-weight: 700;
1063
- color: #60a5fa;
1064
- font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
1065
- margin-bottom: 4px;
1066
- }
1067
-
1068
- .stats-summary-label {
1069
- color: #64748b;
1070
- font-size: 0.78rem;
1071
- text-transform: uppercase;
1072
- letter-spacing: 0.06em;
1073
- }
1074
-
1075
- .stats-breakdown {
1076
- padding: 20px 28px 28px;
1077
- }
1078
-
1079
- .stats-table {
1080
- width: 100%;
1081
- border-collapse: separate;
1082
- border-spacing: 0;
1083
- font-size: 0.85rem;
1084
- border-radius: 10px;
1085
- overflow: hidden;
1086
- }
1087
-
1088
- .stats-table th,
1089
- .stats-table td {
1090
- text-align: left;
1091
- padding: 10px 14px;
1092
- border-bottom: 1px solid rgba(30, 41, 59, 0.6);
1093
- }
1094
-
1095
- .stats-table th {
1096
- color: #475569;
1097
- font-weight: 600;
1098
- text-transform: uppercase;
1099
- font-size: 0.7rem;
1100
- letter-spacing: 0.08em;
1101
- background: rgba(15, 23, 42, 0.4);
1102
- }
1103
-
1104
- .stats-table td {
1105
- color: #94a3b8;
1106
- word-break: break-all;
1107
- }
1108
-
1109
- .stats-table tbody tr {
1110
- transition: background 0.15s;
1111
- }
1112
-
1113
- .stats-table tbody tr:hover {
1114
- background: rgba(59, 130, 246, 0.04);
1115
- }
1116
-
1117
- .stats-table tbody tr:last-child td {
1118
- border-bottom: none;
1119
- }
1120
-
1121
- .stats-table td.num {
1122
- text-align: right;
1123
- font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
1124
- font-size: 0.82rem;
1125
- color: #7dd3fc;
1126
- }
1127
-
1128
- .stats-table tfoot td {
1129
- font-weight: 600;
1130
- color: #e2e8f0;
1131
- background: rgba(15, 23, 42, 0.3);
1132
- }
1133
-
1134
- .stats-table .provider-cell {
1135
- color: #a78bfa;
1136
- }
1137
-
1138
- .stats-table .model-cell {
1139
- color: #94a3b8;
1140
- }
1141
-
1142
- .num-estimated {
1143
- color: #fbbf24;
1144
- font-size: 0.75rem;
1145
- margin-right: 2px;
1146
- cursor: help;
1147
- }
1148
-
1149
- @media (max-width: 640px) {
1150
- .stats-summary {
1151
- grid-template-columns: repeat(2, 1fr);
1152
- }
1153
-
1154
- .stats-controls {
1155
- flex-direction: column;
1156
- align-items: stretch;
1157
- }
1158
-
1159
- .stats-controls .model-dropdown {
1160
- width: 100%;
1161
- }
1162
-
1163
- .stats-date-range {
1164
- width: 100%;
1165
- }
1166
-
1167
- .stats-date-input {
1168
- flex: 1;
1169
- min-width: 0;
1170
- }
1171
- }
1172
-
1173
- /* Responsive */
1174
- @media (max-width: 640px) {
1175
- .form-row {
1176
- grid-template-columns: 1fr;
1177
- }
1178
-
1179
- .stats {
1180
- flex-direction: column;
1181
- align-items: center;
1182
- }
1183
-
1184
- .proxy-meta {
1185
- flex-direction: column;
1186
- gap: 8px;
1187
- }
1188
-
1189
- header h1 {
1190
- font-size: 2rem;
1191
- }
1192
- }
1193
-
1194
- .proxy-routing-badge {
1195
- font-size: 0.75rem;
1196
- padding: 3px 10px;
1197
- border-radius: 6px;
1198
- background: rgba(51, 65, 85, 0.5);
1199
- color: #94a3b8;
1200
- font-weight: 500;
1201
- white-space: nowrap;
1202
- }
1203
-
1204
- .provider-tag {
1205
- font-size: 0.7rem;
1206
- padding: 1px 6px;
1207
- border-radius: 4px;
1208
- background: rgba(148, 163, 184, 0.15);
1209
- color: #94a3b8;
1210
- margin-left: 6px;
1211
- vertical-align: middle;
1212
- }
1213
-
1214
- .provider-pool-group {
1215
- grid-column: 1 / -1;
1216
- }
1217
-
1218
- .provider-pool-picker {
1219
- margin-bottom: 12px;
1220
- }
1221
-
1222
- .provider-pool-list {
1223
- display: flex;
1224
- flex-direction: column;
1225
- gap: 10px;
1226
- }
1227
-
1228
- .provider-pool-empty {
1229
- padding: 12px 14px;
1230
- border: 1px dashed rgba(71, 85, 105, 0.6);
1231
- border-radius: 10px;
1232
- color: #64748b;
1233
- font-size: 0.9rem;
1234
- background: rgba(6, 8, 15, 0.35);
1235
- }
1236
-
1237
- .provider-pool-item {
1238
- display: grid;
1239
- grid-template-columns: minmax(0, 1fr) 140px 120px auto;
1240
- gap: 12px;
1241
- align-items: center;
1242
- padding: 12px 14px;
1243
- border: 1px solid rgba(51, 65, 85, 0.5);
1244
- border-radius: 12px;
1245
- background: rgba(6, 8, 15, 0.45);
1246
- }
1247
-
1248
- .provider-pool-main {
1249
- min-width: 0;
1250
- }
1251
-
1252
- .provider-pool-name {
1253
- color: #e2e8f0;
1254
- font-weight: 600;
1255
- overflow: hidden;
1256
- text-overflow: ellipsis;
1257
- white-space: nowrap;
1258
- }
1259
-
1260
- .provider-pool-meta {
1261
- color: #64748b;
1262
- font-size: 0.82rem;
1263
- overflow: hidden;
1264
- text-overflow: ellipsis;
1265
- white-space: nowrap;
1266
- }
1267
-
1268
- .provider-pool-model label {
1269
- display: block;
1270
- margin-bottom: 4px;
1271
- font-size: 0.75rem;
1272
- color: #94a3b8;
1273
- }
1274
-
1275
- .provider-pool-model-value {
1276
- color: #e2e8f0;
1277
- font-size: 0.85rem;
1278
- overflow: hidden;
1279
- text-overflow: ellipsis;
1280
- white-space: nowrap;
1281
- display: block;
1282
- }
1283
-
1284
- .pool-provider-group {
1285
- position: relative;
1286
- }
1287
-
1288
- .pool-provider-trigger {
1289
- display: flex;
1290
- align-items: center;
1291
- gap: 4px;
1292
- }
1293
-
1294
- .pool-provider-arrow {
1295
- margin-left: auto;
1296
- font-size: 12px;
1297
- color: #64748b;
1298
- transition: transform 0.15s;
1299
- }
1300
-
1301
- .pool-provider-group.open > .pool-provider-trigger .pool-provider-arrow {
1302
- transform: rotate(90deg);
1303
- }
1304
-
1305
- .pool-model-sublist {
1306
- display: none;
1307
- padding-left: 16px;
1308
- border-left: 2px solid rgba(71, 85, 105, 0.3);
1309
- margin-left: 8px;
1310
- }
1311
-
1312
- .pool-provider-group.open > .pool-model-sublist {
1313
- display: block;
1314
- }
1315
-
1316
- .pool-model-sublist .model-option {
1317
- font-size: 13px;
1318
- padding: 6px 12px;
1319
- }
1320
-
1321
- .provider-pool-weight label {
1322
- display: block;
1323
- margin-bottom: 4px;
1324
- font-size: 0.75rem;
1325
- color: #94a3b8;
1326
- }
1327
-
1328
- .provider-pool-weight input {
1329
- width: 100%;
1330
- }
1331
-
1332
- .provider-pool-remove {
1333
- padding: 8px 12px;
1334
- border-radius: 10px;
1335
- border: 1px solid rgba(127, 29, 29, 0.6);
1336
- background: rgba(127, 29, 29, 0.2);
1337
- color: #fca5a5;
1338
- cursor: pointer;
1339
- }
1340
-
1341
- .provider-pool-remove:hover {
1342
- background: rgba(127, 29, 29, 0.35);
1343
- border-color: rgba(248, 113, 113, 0.8);
1344
- }
1
+ * { box-sizing: border-box; margin: 0; padding: 0; }
2
+
3
+ body {
4
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;
5
+ background: #030712;
6
+ color: #e2e8f0;
7
+ line-height: 1.6;
8
+ min-height: 100vh;
9
+ }
10
+
11
+ /* 科技网格背景 */
12
+ body::before {
13
+ content: '';
14
+ position: fixed;
15
+ top: 0; left: 0; right: 0; bottom: 0;
16
+ background-image:
17
+ linear-gradient(rgba(59, 130, 246, 0.03) 1px, transparent 1px),
18
+ linear-gradient(90deg, rgba(59, 130, 246, 0.03) 1px, transparent 1px);
19
+ background-size: 60px 60px;
20
+ pointer-events: none;
21
+ z-index: 0;
22
+ }
23
+
24
+ .container {
25
+ position: relative;
26
+ z-index: 1;
27
+ max-width: 1200px;
28
+ margin: 0 auto;
29
+ padding: 40px 20px;
30
+ }
31
+
32
+ /* Header */
33
+ header {
34
+ text-align: center;
35
+ margin-bottom: 40px;
36
+ }
37
+
38
+ header h1 {
39
+ font-size: 2.8rem;
40
+ font-weight: 800;
41
+ letter-spacing: -0.02em;
42
+ background: linear-gradient(135deg, #60a5fa 0%, #a78bfa 50%, #22d3ee 100%);
43
+ -webkit-background-clip: text;
44
+ -webkit-text-fill-color: transparent;
45
+ background-clip: text;
46
+ margin-bottom: 10px;
47
+ text-shadow: 0 0 40px rgba(96, 165, 250, 0.15);
48
+ }
49
+
50
+ header p {
51
+ color: #64748b;
52
+ font-size: 1.05rem;
53
+ letter-spacing: 0.02em;
54
+ }
55
+
56
+ /* Stats */
57
+ .stats {
58
+ display: flex;
59
+ gap: 20px;
60
+ justify-content: center;
61
+ margin-bottom: 40px;
62
+ }
63
+
64
+ .stat-item {
65
+ background: rgba(15, 23, 42, 0.6);
66
+ backdrop-filter: blur(12px);
67
+ border: 1px solid rgba(51, 65, 85, 0.5);
68
+ border-radius: 16px;
69
+ padding: 24px 48px;
70
+ text-align: center;
71
+ min-width: 160px;
72
+ position: relative;
73
+ overflow: hidden;
74
+ transition: all 0.3s ease;
75
+ }
76
+
77
+ .stat-item::before {
78
+ content: '';
79
+ position: absolute;
80
+ top: 0; left: 0; right: 0;
81
+ height: 2px;
82
+ background: linear-gradient(90deg, transparent, #3b82f6, transparent);
83
+ opacity: 0.5;
84
+ }
85
+
86
+ .stat-item:hover {
87
+ border-color: rgba(59, 130, 246, 0.3);
88
+ box-shadow: 0 0 30px rgba(59, 130, 246, 0.08);
89
+ transform: translateY(-2px);
90
+ }
91
+
92
+ .stat-value {
93
+ display: block;
94
+ font-size: 2.2rem;
95
+ font-weight: 700;
96
+ color: #60a5fa;
97
+ font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
98
+ }
99
+
100
+ .stat-label {
101
+ color: #64748b;
102
+ font-size: 0.85rem;
103
+ text-transform: uppercase;
104
+ letter-spacing: 0.08em;
105
+ margin-top: 4px;
106
+ }
107
+
108
+ /* Card */
109
+ .card {
110
+ background: rgba(15, 23, 42, 0.5);
111
+ backdrop-filter: blur(16px);
112
+ border: 1px solid rgba(51, 65, 85, 0.4);
113
+ border-radius: 20px;
114
+ overflow: hidden;
115
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
116
+ }
117
+
118
+ .card-header {
119
+ display: flex;
120
+ justify-content: space-between;
121
+ align-items: center;
122
+ padding: 24px 28px;
123
+ border-bottom: 1px solid rgba(51, 65, 85, 0.4);
124
+ }
125
+
126
+ .card-header h2 {
127
+ font-size: 1.15rem;
128
+ font-weight: 600;
129
+ color: #f1f5f9;
130
+ letter-spacing: -0.01em;
131
+ }
132
+
133
+ /* Buttons */
134
+ .btn {
135
+ padding: 9px 18px;
136
+ border-radius: 10px;
137
+ border: 1px solid rgba(71, 85, 105, 0.6);
138
+ background: rgba(51, 65, 85, 0.4);
139
+ color: #cbd5e1;
140
+ cursor: pointer;
141
+ font-size: 0.9rem;
142
+ font-weight: 500;
143
+ transition: all 0.25s ease;
144
+ backdrop-filter: blur(8px);
145
+ }
146
+
147
+ .btn:hover {
148
+ background: rgba(71, 85, 105, 0.5);
149
+ border-color: rgba(100, 116, 139, 0.8);
150
+ transform: translateY(-1px);
151
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
152
+ }
153
+
154
+ .btn-primary {
155
+ background: linear-gradient(135deg, #3b82f6, #2563eb);
156
+ border-color: transparent;
157
+ color: white;
158
+ box-shadow: 0 2px 8px rgba(59, 130, 246, 0.25);
159
+ }
160
+
161
+ .btn-primary:hover {
162
+ background: linear-gradient(135deg, #4b92ff, #3573fb);
163
+ box-shadow: 0 4px 16px rgba(59, 130, 246, 0.4);
164
+ transform: translateY(-1px);
165
+ }
166
+
167
+ .btn-sm {
168
+ padding: 5px 14px;
169
+ font-size: 0.85rem;
170
+ }
171
+
172
+ .btn-danger {
173
+ background: linear-gradient(135deg, #ef4444, #dc2626);
174
+ border-color: transparent;
175
+ color: white;
176
+ box-shadow: 0 2px 8px rgba(239, 68, 68, 0.2);
177
+ }
178
+
179
+ .btn-danger:hover {
180
+ background: linear-gradient(135deg, #ff5555, #ec3636);
181
+ box-shadow: 0 4px 16px rgba(239, 68, 68, 0.35);
182
+ }
183
+
184
+ .btn-success {
185
+ background: linear-gradient(135deg, #22c55e, #16a34a);
186
+ border-color: transparent;
187
+ color: white;
188
+ box-shadow: 0 2px 8px rgba(34, 197, 94, 0.2);
189
+ }
190
+
191
+ .btn-success:hover {
192
+ background: linear-gradient(135deg, #32d56e, #26b34a);
193
+ box-shadow: 0 4px 16px rgba(34, 197, 94, 0.35);
194
+ }
195
+
196
+ /* Proxy list */
197
+ .proxy-list {
198
+ padding: 20px;
199
+ }
200
+
201
+ .empty {
202
+ text-align: center;
203
+ padding: 80px 20px;
204
+ color: #475569;
205
+ font-size: 0.95rem;
206
+ }
207
+
208
+ .empty::before {
209
+ content: '◈';
210
+ display: block;
211
+ font-size: 3rem;
212
+ color: #334155;
213
+ margin-bottom: 16px;
214
+ }
215
+
216
+ /* Proxy Item */
217
+ .proxy-item {
218
+ background: rgba(6, 8, 15, 0.6);
219
+ backdrop-filter: blur(12px);
220
+ border: 1px solid rgba(51, 65, 85, 0.35);
221
+ border-radius: 16px;
222
+ padding: 24px;
223
+ margin-bottom: 16px;
224
+ position: relative;
225
+ overflow: hidden;
226
+ transition: all 0.3s ease;
227
+ }
228
+
229
+ .proxy-item::before {
230
+ content: '';
231
+ position: absolute;
232
+ left: 0; top: 0; bottom: 0;
233
+ width: 3px;
234
+ background: #475569;
235
+ transition: background 0.3s ease;
236
+ }
237
+
238
+ .proxy-item:hover {
239
+ border-color: rgba(71, 85, 105, 0.6);
240
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
241
+ transform: translateY(-2px);
242
+ }
243
+
244
+ .proxy-item:hover::before {
245
+ background: #3b82f6;
246
+ box-shadow: 0 0 12px rgba(59, 130, 246, 0.5);
247
+ }
248
+
249
+ .proxy-header {
250
+ display: flex;
251
+ justify-content: space-between;
252
+ align-items: center;
253
+ margin-bottom: 14px;
254
+ }
255
+
256
+ .proxy-title {
257
+ display: flex;
258
+ align-items: center;
259
+ gap: 12px;
260
+ }
261
+
262
+ .proxy-title h3 {
263
+ font-size: 1.15rem;
264
+ font-weight: 600;
265
+ color: #f8fafc;
266
+ }
267
+
268
+ /* Badge */
269
+ .badge {
270
+ padding: 3px 12px;
271
+ border-radius: 20px;
272
+ font-size: 0.75rem;
273
+ font-weight: 600;
274
+ letter-spacing: 0.03em;
275
+ backdrop-filter: blur(8px);
276
+ }
277
+
278
+ .badge-running {
279
+ background: rgba(6, 78, 59, 0.4);
280
+ color: #34d399;
281
+ border: 1px solid rgba(52, 211, 153, 0.2);
282
+ box-shadow: 0 0 8px rgba(52, 211, 153, 0.1);
283
+ }
284
+
285
+ .badge-stopped {
286
+ background: rgba(69, 26, 3, 0.4);
287
+ color: #fbbf24;
288
+ border: 1px solid rgba(251, 191, 36, 0.2);
289
+ }
290
+
291
+ .proxy-meta {
292
+ display: flex;
293
+ gap: 24px;
294
+ color: #64748b;
295
+ font-size: 0.9rem;
296
+ margin-bottom: 16px;
297
+ }
298
+
299
+ .proxy-meta span {
300
+ display: flex;
301
+ align-items: center;
302
+ gap: 6px;
303
+ }
304
+
305
+ /* Target Table */
306
+ .target-table {
307
+ width: 100%;
308
+ border-collapse: separate;
309
+ border-spacing: 0;
310
+ font-size: 0.85rem;
311
+ table-layout: fixed;
312
+ border-radius: 10px;
313
+ overflow: hidden;
314
+ }
315
+
316
+ .target-table th:nth-child(1),
317
+ .target-table td:nth-child(1) { width: 25%; }
318
+
319
+ .target-table th:nth-child(2),
320
+ .target-table td:nth-child(2) { width: 25%; }
321
+
322
+ .target-table th:nth-child(3),
323
+ .target-table td:nth-child(3) { width: 25%; }
324
+
325
+ .target-table th:nth-child(4),
326
+ .target-table td:nth-child(4) { width: 25%; text-align: center; }
327
+
328
+ .target-table th,
329
+ .target-table td {
330
+ text-align: left;
331
+ padding: 10px 14px;
332
+ border-bottom: 1px solid rgba(30, 41, 59, 0.6);
333
+ }
334
+
335
+ .target-table th {
336
+ color: #475569;
337
+ font-weight: 600;
338
+ text-transform: uppercase;
339
+ font-size: 0.7rem;
340
+ letter-spacing: 0.08em;
341
+ background: rgba(15, 23, 42, 0.4);
342
+ }
343
+
344
+ .target-table td {
345
+ color: #94a3b8;
346
+ word-break: break-all;
347
+ }
348
+
349
+ .target-table tbody tr:last-child td {
350
+ border-bottom: none;
351
+ }
352
+
353
+ .proxy-actions {
354
+ display: flex;
355
+ gap: 10px;
356
+ margin-top: 18px;
357
+ padding-top: 18px;
358
+ border-top: 1px solid rgba(30, 41, 59, 0.5);
359
+ }
360
+
361
+ /* Modal */
362
+ .modal {
363
+ display: none;
364
+ position: fixed;
365
+ top: 0;
366
+ left: 0;
367
+ width: 100%;
368
+ height: 100%;
369
+ background: rgba(3, 7, 18, 0.85);
370
+ backdrop-filter: blur(8px);
371
+ z-index: 1000;
372
+ justify-content: center;
373
+ align-items: flex-start;
374
+ padding: 20px;
375
+ overflow-y: auto;
376
+ }
377
+
378
+ .modal.active {
379
+ display: flex;
380
+ }
381
+
382
+ .modal-content {
383
+ background: rgba(15, 23, 42, 0.7);
384
+ backdrop-filter: blur(24px);
385
+ border: 1px solid rgba(71, 85, 105, 0.4);
386
+ border-radius: 20px;
387
+ width: 100%;
388
+ max-width: 700px;
389
+ margin: auto;
390
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(59, 130, 246, 0.05);
391
+ animation: modal-in 0.3s ease;
392
+ }
393
+
394
+ @keyframes modal-in {
395
+ from { opacity: 0; transform: translateY(20px) scale(0.97); }
396
+ to { opacity: 1; transform: translateY(0) scale(1); }
397
+ }
398
+
399
+ .modal-header {
400
+ display: flex;
401
+ justify-content: space-between;
402
+ align-items: center;
403
+ padding: 22px 28px;
404
+ border-bottom: 1px solid rgba(51, 65, 85, 0.4);
405
+ }
406
+
407
+ .modal-header h3 {
408
+ font-size: 1.2rem;
409
+ font-weight: 600;
410
+ color: #f8fafc;
411
+ }
412
+
413
+ .btn-close {
414
+ background: none;
415
+ border: none;
416
+ color: #64748b;
417
+ font-size: 1.5rem;
418
+ cursor: pointer;
419
+ line-height: 1;
420
+ width: 36px;
421
+ height: 36px;
422
+ border-radius: 10px;
423
+ display: flex;
424
+ align-items: center;
425
+ justify-content: center;
426
+ transition: all 0.2s;
427
+ }
428
+
429
+ .btn-close:hover {
430
+ color: #e2e8f0;
431
+ background: rgba(71, 85, 105, 0.3);
432
+ }
433
+
434
+ /* Form */
435
+ form {
436
+ padding: 24px 28px;
437
+ }
438
+
439
+ .form-group {
440
+ margin-bottom: 18px;
441
+ }
442
+
443
+ .form-group label {
444
+ display: block;
445
+ margin-bottom: 8px;
446
+ color: #94a3b8;
447
+ font-size: 0.85rem;
448
+ font-weight: 500;
449
+ letter-spacing: 0.02em;
450
+ }
451
+
452
+ .form-group input,
453
+ .form-group select,
454
+ .form-group textarea {
455
+ width: 100%;
456
+ padding: 11px 16px;
457
+ background: rgba(6, 8, 15, 0.6);
458
+ border: 1px solid rgba(51, 65, 85, 0.5);
459
+ border-radius: 10px;
460
+ color: #f1f5f9;
461
+ font-size: 0.95rem;
462
+ transition: all 0.25s ease;
463
+ appearance: none;
464
+ -webkit-appearance: none;
465
+ }
466
+
467
+ .form-group input::placeholder,
468
+ .form-group select::placeholder {
469
+ color: #475569;
470
+ }
471
+
472
+ .form-group input:focus,
473
+ .form-group select:focus {
474
+ outline: none;
475
+ border-color: rgba(59, 130, 246, 0.5);
476
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1), 0 0 20px rgba(59, 130, 246, 0.08);
477
+ background: rgba(6, 8, 15, 0.8);
478
+ }
479
+
480
+ /* Select 下拉框 - 科技感 */
481
+ .form-group select {
482
+ cursor: pointer;
483
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
484
+ background-repeat: no-repeat;
485
+ background-position: right 14px center;
486
+ padding-right: 42px;
487
+ }
488
+
489
+ .form-group select:hover {
490
+ border-color: rgba(100, 116, 139, 0.7);
491
+ }
492
+
493
+ .form-group select option {
494
+ background: #0f172a;
495
+ color: #e2e8f0;
496
+ padding: 10px;
497
+ }
498
+
499
+ /* Form row */
500
+ .form-row {
501
+ display: grid;
502
+ grid-template-columns: 1fr 1fr;
503
+ gap: 18px;
504
+ }
505
+
506
+ /* Target section */
507
+ .target-section {
508
+ margin-top: 24px;
509
+ padding-top: 24px;
510
+ border-top: 1px solid rgba(51, 65, 85, 0.4);
511
+ }
512
+
513
+ .target-section h4 {
514
+ font-size: 0.9rem;
515
+ font-weight: 600;
516
+ color: #64748b;
517
+ text-transform: uppercase;
518
+ letter-spacing: 0.08em;
519
+ margin-bottom: 16px;
520
+ }
521
+
522
+ .target-item {
523
+ background: rgba(6, 8, 15, 0.5);
524
+ border: 1px solid rgba(51, 65, 85, 0.35);
525
+ border-radius: 14px;
526
+ padding: 20px;
527
+ margin-bottom: 12px;
528
+ transition: border-color 0.25s;
529
+ }
530
+
531
+ .target-item:hover {
532
+ border-color: rgba(71, 85, 105, 0.5);
533
+ }
534
+
535
+ .target-item .form-row {
536
+ margin-bottom: 14px;
537
+ }
538
+
539
+ .target-item .form-row:last-child {
540
+ margin-bottom: 0;
541
+ }
542
+
543
+ .target-remove {
544
+ text-align: right;
545
+ margin-top: 8px;
546
+ }
547
+
548
+ .modal-footer {
549
+ display: flex;
550
+ justify-content: flex-end;
551
+ gap: 12px;
552
+ padding-top: 20px;
553
+ margin-top: 20px;
554
+ border-top: 1px solid rgba(51, 65, 85, 0.4);
555
+ }
556
+
557
+ /* Proxy address */
558
+ .proxy-address {
559
+ display: flex;
560
+ align-items: center;
561
+ gap: 10px;
562
+ margin-top: 14px;
563
+ padding: 12px 16px;
564
+ background: rgba(15, 23, 42, 0.5);
565
+ border: 1px solid rgba(51, 65, 85, 0.35);
566
+ border-radius: 12px;
567
+ font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
568
+ transition: all 0.25s;
569
+ }
570
+
571
+ .proxy-address:hover {
572
+ border-color: rgba(59, 130, 246, 0.3);
573
+ box-shadow: 0 0 16px rgba(59, 130, 246, 0.06);
574
+ }
575
+
576
+ .proxy-address code {
577
+ flex: 1;
578
+ font-size: 0.85rem;
579
+ color: #7dd3fc;
580
+ word-break: break-all;
581
+ }
582
+
583
+ .copy-btn {
584
+ flex-shrink: 0;
585
+ display: flex;
586
+ align-items: center;
587
+ gap: 6px;
588
+ padding: 6px 12px;
589
+ background: rgba(51, 65, 85, 0.4);
590
+ border: 1px solid rgba(71, 85, 105, 0.5);
591
+ border-radius: 8px;
592
+ color: #94a3b8;
593
+ font-size: 0.8rem;
594
+ cursor: pointer;
595
+ transition: all 0.25s;
596
+ backdrop-filter: blur(8px);
597
+ }
598
+
599
+ .copy-btn:hover {
600
+ background: rgba(59, 130, 246, 0.15);
601
+ border-color: rgba(59, 130, 246, 0.4);
602
+ color: #60a5fa;
603
+ box-shadow: 0 0 12px rgba(59, 130, 246, 0.15);
604
+ }
605
+
606
+ .copy-btn svg {
607
+ width: 14px;
608
+ height: 14px;
609
+ }
610
+
611
+ /* Toast */
612
+ .toast {
613
+ position: fixed;
614
+ bottom: 28px;
615
+ right: 28px;
616
+ padding: 12px 24px;
617
+ background: linear-gradient(135deg, #22c55e, #16a34a);
618
+ color: white;
619
+ border-radius: 12px;
620
+ font-size: 0.9rem;
621
+ font-weight: 500;
622
+ z-index: 9999;
623
+ animation: toast-in 0.35s ease, toast-out 0.35s ease 2.3s forwards;
624
+ box-shadow: 0 8px 24px rgba(34, 197, 94, 0.3);
625
+ backdrop-filter: blur(12px);
626
+ }
627
+
628
+ @keyframes toast-in {
629
+ from { opacity: 0; transform: translateY(16px) scale(0.95); }
630
+ to { opacity: 1; transform: translateY(0) scale(1); }
631
+ }
632
+
633
+ @keyframes toast-out {
634
+ from { opacity: 1; }
635
+ to { opacity: 0; }
636
+ }
637
+
638
+ /* Custom model dropdown */
639
+ .model-dropdown {
640
+ position: relative;
641
+ width: 100%;
642
+ }
643
+
644
+ .model-dropdown-trigger {
645
+ display: flex;
646
+ align-items: center;
647
+ justify-content: space-between;
648
+ width: 100%;
649
+ padding: 11px 16px;
650
+ background: rgba(6, 8, 15, 0.6);
651
+ border: 1px solid rgba(51, 65, 85, 0.5);
652
+ border-radius: 10px;
653
+ color: #f1f5f9;
654
+ font-size: 0.95rem;
655
+ cursor: pointer;
656
+ transition: all 0.25s ease;
657
+ user-select: none;
658
+ }
659
+
660
+ .model-dropdown-trigger:hover {
661
+ border-color: rgba(100, 116, 139, 0.6);
662
+ }
663
+
664
+ .model-dropdown.open .model-dropdown-trigger {
665
+ border-color: rgba(59, 130, 246, 0.5);
666
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1), 0 0 20px rgba(59, 130, 246, 0.08);
667
+ }
668
+
669
+ .model-dropdown-arrow {
670
+ font-size: 0.7rem;
671
+ color: #64748b;
672
+ transition: transform 0.25s ease;
673
+ }
674
+
675
+ .model-dropdown.open .model-dropdown-arrow {
676
+ transform: rotate(180deg);
677
+ }
678
+
679
+ .model-dropdown-menu {
680
+ display: none;
681
+ position: absolute;
682
+ top: calc(100% + 6px);
683
+ left: 0;
684
+ right: 0;
685
+ background: rgba(15, 23, 42, 0.95);
686
+ backdrop-filter: blur(24px);
687
+ border: 1px solid rgba(71, 85, 105, 0.5);
688
+ border-radius: 12px;
689
+ z-index: 100;
690
+ overflow: hidden;
691
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(59, 130, 246, 0.05);
692
+ animation: dropdown-in 0.2s ease;
693
+ }
694
+
695
+ @keyframes dropdown-in {
696
+ from { opacity: 0; transform: translateY(-6px); }
697
+ to { opacity: 1; transform: translateY(0); }
698
+ }
699
+
700
+ .model-dropdown.open .model-dropdown-menu {
701
+ display: block;
702
+ }
703
+
704
+ .model-dropdown-options {
705
+ max-height: 220px;
706
+ overflow-y: auto;
707
+ }
708
+
709
+ .model-dropdown-options::-webkit-scrollbar {
710
+ width: 6px;
711
+ }
712
+
713
+ .model-dropdown-options::-webkit-scrollbar-track {
714
+ background: transparent;
715
+ }
716
+
717
+ .model-dropdown-options::-webkit-scrollbar-thumb {
718
+ background: rgba(71, 85, 105, 0.5);
719
+ border-radius: 3px;
720
+ }
721
+
722
+ .model-option {
723
+ display: flex;
724
+ align-items: center;
725
+ justify-content: space-between;
726
+ padding: 10px 16px;
727
+ cursor: pointer;
728
+ transition: all 0.15s ease;
729
+ border-left: 2px solid transparent;
730
+ }
731
+
732
+ .model-option:hover {
733
+ background: rgba(59, 130, 246, 0.08);
734
+ border-left-color: rgba(59, 130, 246, 0.4);
735
+ }
736
+
737
+ .model-option.selected {
738
+ background: rgba(59, 130, 246, 0.12);
739
+ color: #7dd3fc;
740
+ border-left-color: #3b82f6;
741
+ }
742
+
743
+ .model-option-name {
744
+ flex: 1;
745
+ font-size: 0.9rem;
746
+ }
747
+
748
+ .model-option-delete {
749
+ display: flex;
750
+ align-items: center;
751
+ justify-content: center;
752
+ width: 24px;
753
+ height: 24px;
754
+ border-radius: 6px;
755
+ border: none;
756
+ background: transparent;
757
+ color: #64748b;
758
+ font-size: 1rem;
759
+ cursor: pointer;
760
+ transition: all 0.15s;
761
+ line-height: 1;
762
+ padding: 0;
763
+ }
764
+
765
+ .model-option-delete:hover {
766
+ background: rgba(239, 68, 68, 0.15);
767
+ color: #ef4444;
768
+ }
769
+
770
+ .model-add-section {
771
+ display: flex;
772
+ gap: 8px;
773
+ padding: 10px 16px;
774
+ border-top: 1px solid rgba(51, 65, 85, 0.4);
775
+ background: rgba(6, 8, 15, 0.3);
776
+ }
777
+
778
+ .model-add-input {
779
+ flex: 1;
780
+ padding: 7px 12px;
781
+ background: rgba(6, 8, 15, 0.5);
782
+ border: 1px solid rgba(51, 65, 85, 0.5);
783
+ border-radius: 8px;
784
+ color: #e2e8f0;
785
+ font-size: 0.85rem;
786
+ transition: all 0.2s;
787
+ }
788
+
789
+ .model-add-input:focus {
790
+ outline: none;
791
+ border-color: rgba(59, 130, 246, 0.4);
792
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.08);
793
+ }
794
+
795
+ /* Confirm modal */
796
+ .confirm-modal .confirm-box {
797
+ background: rgba(15, 23, 42, 0.8);
798
+ backdrop-filter: blur(24px);
799
+ border: 1px solid rgba(71, 85, 105, 0.4);
800
+ border-radius: 20px;
801
+ padding: 32px 36px;
802
+ max-width: 380px;
803
+ width: 90%;
804
+ text-align: center;
805
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(239, 68, 68, 0.05);
806
+ animation: confirm-pop 0.25s ease;
807
+ }
808
+
809
+ @keyframes confirm-pop {
810
+ from { opacity: 0; transform: scale(0.92) translateY(10px); }
811
+ to { opacity: 1; transform: scale(1) translateY(0); }
812
+ }
813
+
814
+ .confirm-icon {
815
+ display: inline-flex;
816
+ align-items: center;
817
+ justify-content: center;
818
+ width: 56px;
819
+ height: 56px;
820
+ border-radius: 16px;
821
+ background: rgba(69, 26, 3, 0.4);
822
+ color: #fbbf24;
823
+ font-size: 1.6rem;
824
+ font-weight: 700;
825
+ margin-bottom: 20px;
826
+ border: 1px solid rgba(251, 191, 36, 0.15);
827
+ }
828
+
829
+ .confirm-text {
830
+ color: #94a3b8;
831
+ font-size: 0.95rem;
832
+ line-height: 1.6;
833
+ margin-bottom: 28px;
834
+ }
835
+
836
+ .confirm-text strong {
837
+ color: #f1f5f9;
838
+ }
839
+
840
+ .confirm-actions {
841
+ display: flex;
842
+ gap: 12px;
843
+ justify-content: center;
844
+ }
845
+
846
+ .confirm-actions .btn {
847
+ min-width: 90px;
848
+ }
849
+
850
+ /* Card header actions */
851
+ .card-header-actions {
852
+ display: flex;
853
+ gap: 8px;
854
+ align-items: center;
855
+ }
856
+
857
+ /* Import modal */
858
+ .import-preview {
859
+ padding: 24px 28px;
860
+ }
861
+
862
+ .import-stats {
863
+ display: flex;
864
+ gap: 16px;
865
+ margin-bottom: 24px;
866
+ }
867
+
868
+ .import-stat {
869
+ flex: 1;
870
+ background: rgba(6, 8, 15, 0.4);
871
+ border: 1px solid rgba(51, 65, 85, 0.3);
872
+ border-radius: 12px;
873
+ padding: 16px;
874
+ text-align: center;
875
+ }
876
+
877
+ .import-stat-value {
878
+ display: block;
879
+ font-size: 1.8rem;
880
+ font-weight: 700;
881
+ color: #60a5fa;
882
+ font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
883
+ }
884
+
885
+ .import-stat-label {
886
+ color: #64748b;
887
+ font-size: 0.8rem;
888
+ text-transform: uppercase;
889
+ letter-spacing: 0.06em;
890
+ }
891
+
892
+ .import-mode label {
893
+ display: block;
894
+ margin-bottom: 10px;
895
+ color: #94a3b8;
896
+ font-size: 0.85rem;
897
+ font-weight: 500;
898
+ }
899
+
900
+ .import-mode-options {
901
+ display: flex;
902
+ flex-direction: column;
903
+ gap: 10px;
904
+ }
905
+
906
+ .import-mode-option {
907
+ display: flex;
908
+ align-items: flex-start;
909
+ gap: 12px;
910
+ padding: 14px 16px;
911
+ background: rgba(6, 8, 15, 0.4);
912
+ border: 1px solid rgba(51, 65, 85, 0.3);
913
+ border-radius: 10px;
914
+ cursor: pointer;
915
+ transition: all 0.2s;
916
+ }
917
+
918
+ .import-mode-option:hover {
919
+ border-color: rgba(59, 130, 246, 0.3);
920
+ }
921
+
922
+ .import-mode-option input[type="radio"] {
923
+ margin-top: 3px;
924
+ accent-color: #3b82f6;
925
+ }
926
+
927
+ .import-mode-option strong {
928
+ display: block;
929
+ color: #e2e8f0;
930
+ font-size: 0.9rem;
931
+ margin-bottom: 2px;
932
+ }
933
+
934
+ .import-mode-option small {
935
+ color: #64748b;
936
+ font-size: 0.8rem;
937
+ }
938
+
939
+ /* Stats Panel */
940
+ .stats-panel .card-header {
941
+ flex-wrap: wrap;
942
+ gap: 12px;
943
+ }
944
+
945
+ .stats-estimated-badge {
946
+ display: inline-block;
947
+ padding: 2px 10px;
948
+ border-radius: 12px;
949
+ font-size: 0.7rem;
950
+ font-weight: 500;
951
+ background: rgba(251, 191, 36, 0.15);
952
+ color: #fbbf24;
953
+ border: 1px solid rgba(251, 191, 36, 0.2);
954
+ vertical-align: middle;
955
+ letter-spacing: 0.02em;
956
+ }
957
+
958
+ .stats-controls {
959
+ display: flex;
960
+ gap: 12px;
961
+ flex-wrap: wrap;
962
+ justify-content: flex-end; align-items: center;
963
+ }
964
+
965
+ .stats-controls .model-dropdown {
966
+ width: 180px;
967
+ }
968
+
969
+ .stats-filter-trigger {
970
+ padding: 7px 14px !important;
971
+ font-size: 0.85rem !important;
972
+ background: rgba(51, 65, 85, 0.3) !important;
973
+ }
974
+
975
+ .stats-range-btns {
976
+ display: flex;
977
+ gap: 4px;
978
+ align-items: center;
979
+ background: rgba(6, 8, 15, 0.4);
980
+ border-radius: 10px;
981
+ padding: 3px;
982
+ border: 1px solid rgba(51, 65, 85, 0.3);
983
+ }
984
+
985
+ .stats-range-btn {
986
+ border: none !important;
987
+ background: transparent !important;
988
+ box-shadow: none !important;
989
+ padding: 6px 16px !important;
990
+ border-radius: 8px !important;
991
+ color: #64748b !important;
992
+ font-size: 0.82rem !important;
993
+ transition: all 0.2s !important;
994
+ }
995
+
996
+ .stats-range-btn:hover {
997
+ color: #94a3b8 !important;
998
+ background: rgba(51, 65, 85, 0.3) !important;
999
+ }
1000
+
1001
+ .stats-range-btn.active {
1002
+ background: rgba(59, 130, 246, 0.2) !important;
1003
+ color: #60a5fa !important;
1004
+ }
1005
+
1006
+ .stats-date-range {
1007
+ display: flex;
1008
+ align-items: center;
1009
+ gap: 4px;
1010
+ }
1011
+
1012
+ .stats-date-input {
1013
+ background: rgba(15, 23, 42, 0.6);
1014
+ border: 1px solid rgba(51, 65, 85, 0.5);
1015
+ border-radius: 6px;
1016
+ color: #e2e8f0;
1017
+ padding: 6px 8px;
1018
+ font-size: 0.78rem;
1019
+ outline: none;
1020
+ transition: border-color 0.2s;
1021
+ width: 125px;
1022
+ }
1023
+
1024
+ .stats-date-input:focus {
1025
+ border-color: #3b82f6;
1026
+ }
1027
+
1028
+ .stats-date-input::-webkit-calendar-picker-indicator {
1029
+ filter: invert(0.7);
1030
+ cursor: pointer;
1031
+ }
1032
+
1033
+ .stats-date-sep {
1034
+ color: #475569;
1035
+ font-size: 0.85rem;
1036
+ }
1037
+
1038
+ .stats-summary {
1039
+ display: grid;
1040
+ grid-template-columns: repeat(4, 1fr);
1041
+ gap: 16px;
1042
+ padding: 0 28px;
1043
+ margin-top: 8px;
1044
+ }
1045
+
1046
+ .stats-summary-item {
1047
+ background: rgba(6, 8, 15, 0.4);
1048
+ border: 1px solid rgba(51, 65, 85, 0.3);
1049
+ border-radius: 12px;
1050
+ padding: 18px 16px;
1051
+ text-align: center;
1052
+ transition: all 0.25s;
1053
+ }
1054
+
1055
+ .stats-summary-item:hover {
1056
+ border-color: rgba(59, 130, 246, 0.25);
1057
+ box-shadow: 0 0 16px rgba(59, 130, 246, 0.06);
1058
+ }
1059
+
1060
+ .stats-summary-value {
1061
+ display: block;
1062
+ font-size: 1.5rem;
1063
+ font-weight: 700;
1064
+ color: #60a5fa;
1065
+ font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
1066
+ margin-bottom: 4px;
1067
+ }
1068
+
1069
+ .stats-summary-label {
1070
+ color: #64748b;
1071
+ font-size: 0.78rem;
1072
+ text-transform: uppercase;
1073
+ letter-spacing: 0.06em;
1074
+ }
1075
+
1076
+ .stats-breakdown {
1077
+ padding: 20px 28px 28px;
1078
+ }
1079
+
1080
+ .stats-table {
1081
+ width: 100%;
1082
+ border-collapse: separate;
1083
+ border-spacing: 0;
1084
+ font-size: 0.85rem;
1085
+ border-radius: 10px;
1086
+ overflow: hidden;
1087
+ }
1088
+
1089
+ .stats-table th,
1090
+ .stats-table td {
1091
+ text-align: left;
1092
+ padding: 10px 14px;
1093
+ border-bottom: 1px solid rgba(30, 41, 59, 0.6);
1094
+ }
1095
+
1096
+ .stats-table th {
1097
+ color: #475569;
1098
+ font-weight: 600;
1099
+ text-transform: uppercase;
1100
+ font-size: 0.7rem;
1101
+ letter-spacing: 0.08em;
1102
+ background: rgba(15, 23, 42, 0.4);
1103
+ }
1104
+
1105
+ .stats-table td {
1106
+ color: #94a3b8;
1107
+ word-break: break-all;
1108
+ }
1109
+
1110
+ .stats-table tbody tr {
1111
+ transition: background 0.15s;
1112
+ }
1113
+
1114
+ .stats-table tbody tr:hover {
1115
+ background: rgba(59, 130, 246, 0.04);
1116
+ }
1117
+
1118
+ .stats-table tbody tr:last-child td {
1119
+ border-bottom: none;
1120
+ }
1121
+
1122
+ .stats-table td.num {
1123
+ text-align: right;
1124
+ font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
1125
+ font-size: 0.82rem;
1126
+ color: #7dd3fc;
1127
+ }
1128
+
1129
+ .stats-table tfoot td {
1130
+ font-weight: 600;
1131
+ color: #e2e8f0;
1132
+ background: rgba(15, 23, 42, 0.3);
1133
+ }
1134
+
1135
+ .stats-table .provider-cell {
1136
+ color: #a78bfa;
1137
+ }
1138
+
1139
+ .stats-table .model-cell {
1140
+ color: #94a3b8;
1141
+ }
1142
+
1143
+ .num-estimated {
1144
+ color: #fbbf24;
1145
+ font-size: 0.75rem;
1146
+ margin-right: 2px;
1147
+ cursor: help;
1148
+ }
1149
+
1150
+ @media (max-width: 640px) {
1151
+ .stats-summary {
1152
+ grid-template-columns: repeat(2, 1fr);
1153
+ }
1154
+
1155
+ .stats-controls {
1156
+ flex-direction: column;
1157
+ align-items: stretch;
1158
+ }
1159
+
1160
+ .stats-controls .model-dropdown {
1161
+ width: 100%;
1162
+ }
1163
+
1164
+ .stats-date-range {
1165
+ width: 100%;
1166
+ }
1167
+
1168
+ .stats-date-input {
1169
+ flex: 1;
1170
+ min-width: 0;
1171
+ }
1172
+ }
1173
+
1174
+ /* Responsive */
1175
+ @media (max-width: 640px) {
1176
+ .form-row {
1177
+ grid-template-columns: 1fr;
1178
+ }
1179
+
1180
+ .stats {
1181
+ flex-direction: column;
1182
+ align-items: center;
1183
+ }
1184
+
1185
+ .proxy-meta {
1186
+ flex-direction: column;
1187
+ gap: 8px;
1188
+ }
1189
+
1190
+ header h1 {
1191
+ font-size: 2rem;
1192
+ }
1193
+ }
1194
+
1195
+ .api-keys-header {
1196
+ display: flex;
1197
+ justify-content: space-between;
1198
+ align-items: center;
1199
+ margin-bottom: 10px;
1200
+ }
1201
+
1202
+ .api-keys-header span {
1203
+ font-size: 0.85rem;
1204
+ color: #94a3b8;
1205
+ font-weight: 500;
1206
+ }
1207
+
1208
+ .api-keys-row {
1209
+ grid-template-columns: 1fr;
1210
+ }
1211
+
1212
+ .api-key-entry {
1213
+ display: grid;
1214
+ grid-template-columns: 1fr 1fr auto auto;
1215
+ align-items: start;
1216
+ gap: 18px;
1217
+ margin-bottom: 10px;
1218
+ }
1219
+
1220
+ /* Toggle switch */
1221
+ .toggle-switch {
1222
+ position: relative;
1223
+ display: inline-block;
1224
+ width: 36px;
1225
+ height: 20px;
1226
+ margin-top: 40px;
1227
+ cursor: pointer;
1228
+ }
1229
+
1230
+ .toggle-switch input {
1231
+ opacity: 0;
1232
+ width: 0;
1233
+ height: 0;
1234
+ }
1235
+
1236
+ .toggle-slider {
1237
+ position: absolute;
1238
+ inset: 0;
1239
+ background: rgba(51, 65, 85, 0.6);
1240
+ border-radius: 20px;
1241
+ border: 1px solid rgba(71, 85, 105, 0.5);
1242
+ transition: all 0.25s;
1243
+ }
1244
+
1245
+ .toggle-slider::before {
1246
+ content: '';
1247
+ position: absolute;
1248
+ width: 14px;
1249
+ height: 14px;
1250
+ left: 2px;
1251
+ top: 2px;
1252
+ background: #94a3b8;
1253
+ border-radius: 50%;
1254
+ transition: all 0.25s;
1255
+ }
1256
+
1257
+ .toggle-switch input:checked + .toggle-slider {
1258
+ background: rgba(59, 130, 246, 0.3);
1259
+ border-color: rgba(59, 130, 246, 0.5);
1260
+ }
1261
+
1262
+ .toggle-switch input:checked + .toggle-slider::before {
1263
+ transform: translateX(16px);
1264
+ background: #60a5fa;
1265
+ }
1266
+
1267
+ .api-key-remove {
1268
+ margin-top: 35px;
1269
+ }
1270
+
1271
+ .api-key-display {
1272
+ display: block;
1273
+ padding: 11px 16px;
1274
+ background: rgba(6, 8, 15, 0.6);
1275
+ border: 1px solid rgba(51, 65, 85, 0.5);
1276
+ border-radius: 10px;
1277
+ color: #64748b;
1278
+ font-size: 0.9rem;
1279
+ letter-spacing: 2px;
1280
+ }
1281
+
1282
+ .api-key-remove {
1283
+ padding: 11px 14px;
1284
+ border-radius: 10px;
1285
+ border: 1px solid rgba(127, 29, 29, 0.5);
1286
+ background: rgba(127, 29, 29, 0.15);
1287
+ color: #fca5a5;
1288
+ cursor: pointer;
1289
+ font-size: 14px;
1290
+ line-height: 1;
1291
+ }
1292
+
1293
+ .api-key-remove:hover {
1294
+ background: rgba(127, 29, 29, 0.3);
1295
+ border-color: rgba(248, 113, 113, 0.7);
1296
+ }
1297
+
1298
+ .proxy-routing-badge {
1299
+ font-size: 0.75rem;
1300
+ padding: 3px 10px;
1301
+ border-radius: 6px;
1302
+ background: rgba(51, 65, 85, 0.5);
1303
+ color: #94a3b8;
1304
+ font-weight: 500;
1305
+ white-space: nowrap;
1306
+ }
1307
+
1308
+ .provider-tag {
1309
+ font-size: 0.7rem;
1310
+ padding: 1px 6px;
1311
+ border-radius: 4px;
1312
+ background: rgba(148, 163, 184, 0.15);
1313
+ color: #94a3b8;
1314
+ margin-left: 6px;
1315
+ vertical-align: middle;
1316
+ }
1317
+
1318
+ .provider-pool-group {
1319
+ grid-column: 1 / -1;
1320
+ }
1321
+
1322
+ .provider-pool-picker {
1323
+ margin-bottom: 12px;
1324
+ }
1325
+
1326
+ .provider-pool-list {
1327
+ display: flex;
1328
+ flex-direction: column;
1329
+ gap: 10px;
1330
+ }
1331
+
1332
+ .provider-pool-empty {
1333
+ padding: 12px 14px;
1334
+ border: 1px dashed rgba(71, 85, 105, 0.6);
1335
+ border-radius: 10px;
1336
+ color: #64748b;
1337
+ font-size: 0.9rem;
1338
+ background: rgba(6, 8, 15, 0.35);
1339
+ }
1340
+
1341
+ .provider-pool-item {
1342
+ display: grid;
1343
+ grid-template-columns: minmax(0, 1fr) 140px 120px auto;
1344
+ gap: 12px;
1345
+ align-items: center;
1346
+ padding: 12px 14px;
1347
+ border: 1px solid rgba(51, 65, 85, 0.5);
1348
+ border-radius: 12px;
1349
+ background: rgba(6, 8, 15, 0.45);
1350
+ }
1351
+
1352
+ .provider-pool-main {
1353
+ min-width: 0;
1354
+ }
1355
+
1356
+ .provider-pool-name {
1357
+ color: #e2e8f0;
1358
+ font-weight: 600;
1359
+ overflow: hidden;
1360
+ text-overflow: ellipsis;
1361
+ white-space: nowrap;
1362
+ }
1363
+
1364
+ .provider-pool-meta {
1365
+ color: #64748b;
1366
+ font-size: 0.82rem;
1367
+ overflow: hidden;
1368
+ text-overflow: ellipsis;
1369
+ white-space: nowrap;
1370
+ }
1371
+
1372
+ .provider-pool-model label {
1373
+ display: block;
1374
+ margin-bottom: 4px;
1375
+ font-size: 0.75rem;
1376
+ color: #94a3b8;
1377
+ }
1378
+
1379
+ .provider-pool-model-value {
1380
+ color: #e2e8f0;
1381
+ font-size: 0.85rem;
1382
+ overflow: hidden;
1383
+ text-overflow: ellipsis;
1384
+ white-space: nowrap;
1385
+ display: block;
1386
+ }
1387
+
1388
+ .pool-provider-group {
1389
+ position: relative;
1390
+ }
1391
+
1392
+ .pool-provider-trigger {
1393
+ display: flex;
1394
+ align-items: center;
1395
+ gap: 4px;
1396
+ }
1397
+
1398
+ .pool-provider-arrow {
1399
+ margin-left: auto;
1400
+ font-size: 12px;
1401
+ color: #64748b;
1402
+ transition: transform 0.15s;
1403
+ }
1404
+
1405
+ .pool-provider-group.open > .pool-provider-trigger .pool-provider-arrow {
1406
+ transform: rotate(90deg);
1407
+ }
1408
+
1409
+ .pool-model-sublist {
1410
+ display: none;
1411
+ padding-left: 16px;
1412
+ border-left: 2px solid rgba(71, 85, 105, 0.3);
1413
+ margin-left: 8px;
1414
+ }
1415
+
1416
+ .pool-provider-group.open > .pool-model-sublist {
1417
+ display: block;
1418
+ }
1419
+
1420
+ .pool-model-sublist .model-option {
1421
+ font-size: 13px;
1422
+ padding: 6px 12px;
1423
+ }
1424
+
1425
+ .provider-pool-weight label {
1426
+ display: block;
1427
+ margin-bottom: 4px;
1428
+ font-size: 0.75rem;
1429
+ color: #94a3b8;
1430
+ }
1431
+
1432
+ .provider-pool-weight input {
1433
+ width: 100%;
1434
+ }
1435
+
1436
+ .provider-pool-remove {
1437
+ padding: 8px 12px;
1438
+ border-radius: 10px;
1439
+ border: 1px solid rgba(127, 29, 29, 0.6);
1440
+ background: rgba(127, 29, 29, 0.2);
1441
+ color: #fca5a5;
1442
+ cursor: pointer;
1443
+ }
1444
+
1445
+ .provider-pool-remove:hover {
1446
+ background: rgba(127, 29, 29, 0.35);
1447
+ border-color: rgba(248, 113, 113, 0.8);
1448
+ }