protocol-proxy 1.0.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,639 @@
1
+ * { box-sizing: border-box; margin: 0; padding: 0; }
2
+
3
+ body {
4
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5
+ background: #0f172a;
6
+ color: #e2e8f0;
7
+ line-height: 1.6;
8
+ }
9
+
10
+ .container {
11
+ max-width: 1200px;
12
+ margin: 0 auto;
13
+ padding: 40px 20px;
14
+ }
15
+
16
+ header {
17
+ text-align: center;
18
+ margin-bottom: 32px;
19
+ }
20
+
21
+ header h1 {
22
+ font-size: 2.5rem;
23
+ font-weight: 700;
24
+ background: linear-gradient(90deg, #60a5fa, #a78bfa);
25
+ -webkit-background-clip: text;
26
+ -webkit-text-fill-color: transparent;
27
+ margin-bottom: 8px;
28
+ }
29
+
30
+ header p {
31
+ color: #94a3b8;
32
+ font-size: 1.1rem;
33
+ }
34
+
35
+ .stats {
36
+ display: flex;
37
+ gap: 24px;
38
+ justify-content: center;
39
+ margin-bottom: 32px;
40
+ }
41
+
42
+ .stat-item {
43
+ background: #1e293b;
44
+ border: 1px solid #334155;
45
+ border-radius: 12px;
46
+ padding: 20px 40px;
47
+ text-align: center;
48
+ min-width: 140px;
49
+ }
50
+
51
+ .stat-value {
52
+ display: block;
53
+ font-size: 2rem;
54
+ font-weight: 700;
55
+ color: #60a5fa;
56
+ }
57
+
58
+ .stat-label {
59
+ color: #94a3b8;
60
+ font-size: 0.9rem;
61
+ }
62
+
63
+ .card {
64
+ background: #1e293b;
65
+ border: 1px solid #334155;
66
+ border-radius: 16px;
67
+ overflow: hidden;
68
+ }
69
+
70
+ .card-header {
71
+ display: flex;
72
+ justify-content: space-between;
73
+ align-items: center;
74
+ padding: 24px;
75
+ border-bottom: 1px solid #334155;
76
+ }
77
+
78
+ .card-header h2 {
79
+ font-size: 1.25rem;
80
+ font-weight: 600;
81
+ }
82
+
83
+ .btn {
84
+ padding: 8px 16px;
85
+ border-radius: 8px;
86
+ border: 1px solid #475569;
87
+ background: #334155;
88
+ color: #e2e8f0;
89
+ cursor: pointer;
90
+ font-size: 0.9rem;
91
+ transition: all 0.2s;
92
+ }
93
+
94
+ .btn:hover {
95
+ background: #475569;
96
+ }
97
+
98
+ .btn-primary {
99
+ background: #3b82f6;
100
+ border-color: #3b82f6;
101
+ color: white;
102
+ }
103
+
104
+ .btn-primary:hover {
105
+ background: #2563eb;
106
+ }
107
+
108
+ .btn-sm {
109
+ padding: 4px 12px;
110
+ font-size: 0.85rem;
111
+ }
112
+
113
+ .btn-danger {
114
+ background: #ef4444;
115
+ border-color: #ef4444;
116
+ color: white;
117
+ }
118
+
119
+ .btn-danger:hover {
120
+ background: #dc2626;
121
+ }
122
+
123
+ .btn-success {
124
+ background: #22c55e;
125
+ border-color: #22c55e;
126
+ color: white;
127
+ }
128
+
129
+ .btn-success:hover {
130
+ background: #16a34a;
131
+ }
132
+
133
+ .proxy-list {
134
+ padding: 16px;
135
+ }
136
+
137
+ .empty {
138
+ text-align: center;
139
+ padding: 60px 20px;
140
+ color: #64748b;
141
+ }
142
+
143
+ .proxy-item {
144
+ background: #0f172a;
145
+ border: 1px solid #334155;
146
+ border-radius: 12px;
147
+ padding: 20px;
148
+ margin-bottom: 12px;
149
+ transition: border-color 0.2s;
150
+ }
151
+
152
+ .proxy-item:hover {
153
+ border-color: #475569;
154
+ }
155
+
156
+ .proxy-header {
157
+ display: flex;
158
+ justify-content: space-between;
159
+ align-items: flex-start;
160
+ margin-bottom: 12px;
161
+ }
162
+
163
+ .proxy-title {
164
+ display: flex;
165
+ align-items: center;
166
+ gap: 12px;
167
+ }
168
+
169
+ .proxy-title h3 {
170
+ font-size: 1.1rem;
171
+ font-weight: 600;
172
+ }
173
+
174
+ .badge {
175
+ padding: 2px 10px;
176
+ border-radius: 20px;
177
+ font-size: 0.75rem;
178
+ font-weight: 500;
179
+ }
180
+
181
+ .badge-running {
182
+ background: #064e3b;
183
+ color: #34d399;
184
+ }
185
+
186
+ .badge-stopped {
187
+ background: #451a03;
188
+ color: #fbbf24;
189
+ }
190
+
191
+ .proxy-meta {
192
+ display: flex;
193
+ gap: 20px;
194
+ color: #94a3b8;
195
+ font-size: 0.9rem;
196
+ margin-bottom: 16px;
197
+ }
198
+
199
+ .proxy-meta span {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 6px;
203
+ }
204
+
205
+ .target-table {
206
+ width: 100%;
207
+ border-collapse: collapse;
208
+ font-size: 0.85rem;
209
+ table-layout: fixed;
210
+ }
211
+
212
+ .target-table th:nth-child(1),
213
+ .target-table td:nth-child(1) { width: 55%; }
214
+
215
+ .target-table th:nth-child(2),
216
+ .target-table td:nth-child(2) { width: 15%; }
217
+
218
+ .target-table th:nth-child(3),
219
+ .target-table td:nth-child(3) { width: 30%; }
220
+
221
+ .target-table th,
222
+ .target-table td {
223
+ text-align: left;
224
+ padding: 8px 12px;
225
+ border-bottom: 1px solid #1e293b;
226
+ }
227
+
228
+ .target-table th {
229
+ color: #64748b;
230
+ font-weight: 500;
231
+ text-transform: uppercase;
232
+ font-size: 0.75rem;
233
+ letter-spacing: 0.05em;
234
+ }
235
+
236
+ .target-table td {
237
+ color: #cbd5e1;
238
+ word-break: break-all;
239
+ }
240
+
241
+ .proxy-actions {
242
+ display: flex;
243
+ gap: 8px;
244
+ margin-top: 16px;
245
+ padding-top: 16px;
246
+ border-top: 1px solid #1e293b;
247
+ }
248
+
249
+ /* Modal */
250
+ .modal {
251
+ display: none;
252
+ position: fixed;
253
+ top: 0;
254
+ left: 0;
255
+ width: 100%;
256
+ height: 100%;
257
+ background: rgba(0,0,0,0.7);
258
+ z-index: 1000;
259
+ justify-content: center;
260
+ align-items: center;
261
+ padding: 20px;
262
+ overflow-y: auto;
263
+ }
264
+
265
+ .modal.active {
266
+ display: flex;
267
+ }
268
+
269
+ .modal-content {
270
+ background: #1e293b;
271
+ border: 1px solid #334155;
272
+ border-radius: 16px;
273
+ width: 100%;
274
+ max-width: 700px;
275
+ }
276
+
277
+ .modal-header {
278
+ display: flex;
279
+ justify-content: space-between;
280
+ align-items: center;
281
+ padding: 20px 24px;
282
+ border-bottom: 1px solid #334155;
283
+ }
284
+
285
+ .modal-header h3 {
286
+ font-size: 1.2rem;
287
+ }
288
+
289
+ .btn-close {
290
+ background: none;
291
+ border: none;
292
+ color: #94a3b8;
293
+ font-size: 1.5rem;
294
+ cursor: pointer;
295
+ line-height: 1;
296
+ }
297
+
298
+ .btn-close:hover {
299
+ color: #e2e8f0;
300
+ }
301
+
302
+ form {
303
+ padding: 24px;
304
+ }
305
+
306
+ .form-group {
307
+ margin-bottom: 16px;
308
+ }
309
+
310
+ .form-group label {
311
+ display: block;
312
+ margin-bottom: 6px;
313
+ color: #94a3b8;
314
+ font-size: 0.9rem;
315
+ }
316
+
317
+ .form-group input,
318
+ .form-group select,
319
+ .form-group textarea {
320
+ width: 100%;
321
+ padding: 10px 14px;
322
+ background: #0f172a;
323
+ border: 1px solid #334155;
324
+ border-radius: 8px;
325
+ color: #e2e8f0;
326
+ font-size: 0.95rem;
327
+ }
328
+
329
+ .form-group input:focus,
330
+ .form-group select:focus {
331
+ outline: none;
332
+ border-color: #3b82f6;
333
+ }
334
+
335
+ .form-row {
336
+ display: grid;
337
+ grid-template-columns: 1fr 1fr;
338
+ gap: 16px;
339
+ }
340
+
341
+ .target-section {
342
+ margin-top: 20px;
343
+ padding-top: 20px;
344
+ border-top: 1px solid #334155;
345
+ }
346
+
347
+ .target-header {
348
+ display: flex;
349
+ justify-content: space-between;
350
+ align-items: center;
351
+ margin-bottom: 16px;
352
+ }
353
+
354
+ .target-header h4 {
355
+ font-size: 1rem;
356
+ }
357
+
358
+ .target-item {
359
+ background: #0f172a;
360
+ border: 1px solid #334155;
361
+ border-radius: 10px;
362
+ padding: 16px;
363
+ margin-bottom: 12px;
364
+ }
365
+
366
+ .target-item .form-row {
367
+ margin-bottom: 12px;
368
+ }
369
+
370
+ .target-item .form-row:last-child {
371
+ margin-bottom: 0;
372
+ }
373
+
374
+ .target-remove {
375
+ text-align: right;
376
+ margin-top: 8px;
377
+ }
378
+
379
+ .modal-footer {
380
+ display: flex;
381
+ justify-content: flex-end;
382
+ gap: 12px;
383
+ padding-top: 20px;
384
+ margin-top: 20px;
385
+ border-top: 1px solid #334155;
386
+ }
387
+
388
+ /* Proxy address */
389
+ .proxy-address {
390
+ display: flex;
391
+ align-items: center;
392
+ gap: 8px;
393
+ margin-top: 12px;
394
+ padding: 10px 14px;
395
+ background: #1e293b;
396
+ border: 1px solid #334155;
397
+ border-radius: 8px;
398
+ }
399
+
400
+ .proxy-address code {
401
+ flex: 1;
402
+ font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
403
+ font-size: 0.85rem;
404
+ color: #7dd3fc;
405
+ word-break: break-all;
406
+ }
407
+
408
+ .copy-btn {
409
+ flex-shrink: 0;
410
+ display: flex;
411
+ align-items: center;
412
+ gap: 4px;
413
+ padding: 4px 10px;
414
+ background: #334155;
415
+ border: 1px solid #475569;
416
+ border-radius: 6px;
417
+ color: #94a3b8;
418
+ font-size: 0.8rem;
419
+ cursor: pointer;
420
+ transition: all 0.2s;
421
+ }
422
+
423
+ .copy-btn:hover {
424
+ background: #475569;
425
+ color: #e2e8f0;
426
+ }
427
+
428
+ .copy-btn svg {
429
+ width: 14px;
430
+ height: 14px;
431
+ }
432
+
433
+ /* Toast */
434
+ .toast {
435
+ position: fixed;
436
+ bottom: 24px;
437
+ right: 24px;
438
+ padding: 10px 20px;
439
+ background: #22c55e;
440
+ color: white;
441
+ border-radius: 8px;
442
+ font-size: 0.9rem;
443
+ z-index: 9999;
444
+ animation: toast-in 0.3s ease, toast-out 0.3s ease 1.7s forwards;
445
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
446
+ }
447
+
448
+ @keyframes toast-in {
449
+ from { opacity: 0; transform: translateY(10px); }
450
+ to { opacity: 1; transform: translateY(0); }
451
+ }
452
+
453
+ @keyframes toast-out {
454
+ from { opacity: 1; }
455
+ to { opacity: 0; }
456
+ }
457
+
458
+ /* Custom model dropdown */
459
+ .model-dropdown {
460
+ position: relative;
461
+ width: 100%;
462
+ }
463
+
464
+ .model-dropdown-trigger {
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: space-between;
468
+ width: 100%;
469
+ padding: 10px 14px;
470
+ background: #0f172a;
471
+ border: 1px solid #334155;
472
+ border-radius: 8px;
473
+ color: #e2e8f0;
474
+ font-size: 0.95rem;
475
+ cursor: pointer;
476
+ transition: border-color 0.2s;
477
+ user-select: none;
478
+ }
479
+
480
+ .model-dropdown-trigger:hover {
481
+ border-color: #475569;
482
+ }
483
+
484
+ .model-dropdown.open .model-dropdown-trigger {
485
+ border-color: #3b82f6;
486
+ }
487
+
488
+ .model-dropdown-arrow {
489
+ font-size: 0.7rem;
490
+ color: #64748b;
491
+ transition: transform 0.2s;
492
+ }
493
+
494
+ .model-dropdown.open .model-dropdown-arrow {
495
+ transform: rotate(180deg);
496
+ }
497
+
498
+ .model-dropdown-menu {
499
+ display: none;
500
+ position: absolute;
501
+ top: calc(100% + 4px);
502
+ left: 0;
503
+ right: 0;
504
+ background: #1e293b;
505
+ border: 1px solid #475569;
506
+ border-radius: 10px;
507
+ z-index: 100;
508
+ overflow: hidden;
509
+ box-shadow: 0 8px 24px rgba(0,0,0,0.4);
510
+ }
511
+
512
+ .model-dropdown.open .model-dropdown-menu {
513
+ display: block;
514
+ }
515
+
516
+ .model-dropdown-options {
517
+ max-height: 200px;
518
+ overflow-y: auto;
519
+ }
520
+
521
+ .model-option {
522
+ display: flex;
523
+ align-items: center;
524
+ justify-content: space-between;
525
+ padding: 8px 14px;
526
+ cursor: pointer;
527
+ transition: background 0.15s;
528
+ }
529
+
530
+ .model-option:hover {
531
+ background: #334155;
532
+ }
533
+
534
+ .model-option.selected {
535
+ background: #1e3a5f;
536
+ color: #7dd3fc;
537
+ }
538
+
539
+ .model-option-name {
540
+ flex: 1;
541
+ font-size: 0.9rem;
542
+ }
543
+
544
+ .model-option-delete {
545
+ display: flex;
546
+ align-items: center;
547
+ justify-content: center;
548
+ width: 22px;
549
+ height: 22px;
550
+ border-radius: 50%;
551
+ border: none;
552
+ background: transparent;
553
+ color: #64748b;
554
+ font-size: 1rem;
555
+ cursor: pointer;
556
+ transition: all 0.15s;
557
+ line-height: 1;
558
+ padding: 0;
559
+ }
560
+
561
+ .model-option-delete:hover {
562
+ background: #ef4444;
563
+ color: white;
564
+ }
565
+
566
+ .model-add-section {
567
+ display: flex;
568
+ gap: 6px;
569
+ padding: 8px 14px;
570
+ border-top: 1px solid #334155;
571
+ }
572
+
573
+ .model-add-input {
574
+ flex: 1;
575
+ padding: 6px 10px;
576
+ background: #0f172a;
577
+ border: 1px solid #334155;
578
+ border-radius: 6px;
579
+ color: #e2e8f0;
580
+ font-size: 0.85rem;
581
+ }
582
+
583
+ .model-add-input:focus {
584
+ outline: none;
585
+ border-color: #3b82f6;
586
+ }
587
+
588
+ /* Confirm modal */
589
+ .confirm-modal .confirm-box {
590
+ background: #1e293b;
591
+ border: 1px solid #334155;
592
+ border-radius: 14px;
593
+ padding: 28px 32px;
594
+ max-width: 360px;
595
+ width: 90%;
596
+ text-align: center;
597
+ box-shadow: 0 12px 40px rgba(0,0,0,0.5);
598
+ animation: confirm-pop 0.2s ease;
599
+ }
600
+
601
+ @keyframes confirm-pop {
602
+ from { opacity: 0; transform: scale(0.92); }
603
+ to { opacity: 1; transform: scale(1); }
604
+ }
605
+
606
+ .confirm-icon {
607
+ display: inline-flex;
608
+ align-items: center;
609
+ justify-content: center;
610
+ width: 48px;
611
+ height: 48px;
612
+ border-radius: 50%;
613
+ background: #451a03;
614
+ color: #fbbf24;
615
+ font-size: 1.4rem;
616
+ font-weight: 700;
617
+ margin-bottom: 16px;
618
+ }
619
+
620
+ .confirm-text {
621
+ color: #cbd5e1;
622
+ font-size: 0.95rem;
623
+ line-height: 1.5;
624
+ margin-bottom: 24px;
625
+ }
626
+
627
+ .confirm-text strong {
628
+ color: #f1f5f9;
629
+ }
630
+
631
+ .confirm-actions {
632
+ display: flex;
633
+ gap: 12px;
634
+ justify-content: center;
635
+ }
636
+
637
+ .confirm-actions .btn {
638
+ min-width: 80px;
639
+ }