claude-code-router-config 1.0.0 → 1.1.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,575 @@
1
+ /* Modern Dashboard Styles */
2
+ :root {
3
+ --primary-color: #6366f1;
4
+ --success-color: #10b981;
5
+ --warning-color: #f59e0b;
6
+ --error-color: #ef4444;
7
+ --background: #f9fafb;
8
+ --surface: #ffffff;
9
+ --text-primary: #111827;
10
+ --text-secondary: #6b7280;
11
+ --border-color: #e5e7eb;
12
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
13
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
14
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
15
+ --radius: 8px;
16
+ --radius-lg: 12px;
17
+ }
18
+
19
+ * {
20
+ margin: 0;
21
+ padding: 0;
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ body {
26
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
27
+ background: var(--background);
28
+ color: var(--text-primary);
29
+ line-height: 1.6;
30
+ }
31
+
32
+ .app {
33
+ min-height: 100vh;
34
+ display: flex;
35
+ flex-direction: column;
36
+ }
37
+
38
+ /* Header */
39
+ .header {
40
+ background: var(--surface);
41
+ border-bottom: 1px solid var(--border-color);
42
+ padding: 1rem 0;
43
+ box-shadow: var(--shadow-sm);
44
+ }
45
+
46
+ .header-content {
47
+ max-width: 1200px;
48
+ margin: 0 auto;
49
+ padding: 0 1rem;
50
+ display: flex;
51
+ justify-content: space-between;
52
+ align-items: center;
53
+ }
54
+
55
+ .title {
56
+ font-size: 1.5rem;
57
+ font-weight: 600;
58
+ color: var(--text-primary);
59
+ }
60
+
61
+ .header-actions {
62
+ display: flex;
63
+ gap: 0.5rem;
64
+ align-items: center;
65
+ }
66
+
67
+ /* Navigation */
68
+ .nav {
69
+ background: var(--surface);
70
+ border-bottom: 1px solid var(--border-color);
71
+ padding: 0;
72
+ display: flex;
73
+ overflow-x: auto;
74
+ }
75
+
76
+ .nav-item {
77
+ padding: 1rem 1.5rem;
78
+ border: none;
79
+ background: none;
80
+ color: var(--text-secondary);
81
+ font-weight: 500;
82
+ cursor: pointer;
83
+ white-space: nowrap;
84
+ transition: all 0.2s;
85
+ border-bottom: 3px solid transparent;
86
+ }
87
+
88
+ .nav-item:hover {
89
+ color: var(--primary-color);
90
+ background: rgba(99, 102, 241, 0.05);
91
+ }
92
+
93
+ .nav-item.active {
94
+ color: var(--primary-color);
95
+ border-bottom-color: var(--primary-color);
96
+ background: rgba(99, 102, 241, 0.05);
97
+ }
98
+
99
+ /* Main Content */
100
+ .main {
101
+ flex: 1;
102
+ max-width: 1200px;
103
+ margin: 0 auto;
104
+ padding: 1.5rem;
105
+ width: 100%;
106
+ }
107
+
108
+ /* Tab Content */
109
+ .tab-content {
110
+ display: none;
111
+ }
112
+
113
+ .tab-content.active {
114
+ display: block;
115
+ }
116
+
117
+ /* Cards */
118
+ .card {
119
+ background: var(--surface);
120
+ border-radius: var(--radius-lg);
121
+ box-shadow: var(--shadow-sm);
122
+ overflow: hidden;
123
+ transition: box-shadow 0.2s;
124
+ }
125
+
126
+ .card:hover {
127
+ box-shadow: var(--shadow-md);
128
+ }
129
+
130
+ .card-header {
131
+ padding: 1rem 1.5rem;
132
+ border-bottom: 1px solid var(--border-color);
133
+ display: flex;
134
+ justify-content: space-between;
135
+ align-items: center;
136
+ }
137
+
138
+ .card-header h3 {
139
+ font-size: 1.125rem;
140
+ font-weight: 600;
141
+ color: var(--text-primary);
142
+ }
143
+
144
+ .card-body {
145
+ padding: 1.5rem;
146
+ }
147
+
148
+ .card-wide {
149
+ grid-column: span 2;
150
+ }
151
+
152
+ /* Buttons */
153
+ .btn {
154
+ padding: 0.5rem 1rem;
155
+ border-radius: var(--radius);
156
+ font-weight: 500;
157
+ font-size: 0.875rem;
158
+ border: 1px solid transparent;
159
+ cursor: pointer;
160
+ transition: all 0.2s;
161
+ display: inline-flex;
162
+ align-items: center;
163
+ gap: 0.5rem;
164
+ }
165
+
166
+ .btn-primary {
167
+ background: var(--primary-color);
168
+ color: white;
169
+ border-color: var(--primary-color);
170
+ }
171
+
172
+ .btn-primary:hover {
173
+ background: #5558e3;
174
+ border-color: #5558e3;
175
+ }
176
+
177
+ .btn-secondary {
178
+ background: var(--text-secondary);
179
+ color: white;
180
+ border-color: var(--text-secondary);
181
+ }
182
+
183
+ .btn-secondary:hover {
184
+ background: #4b5563;
185
+ border-color: #4b5563;
186
+ }
187
+
188
+ .btn-outline {
189
+ background: transparent;
190
+ color: var(--text-secondary);
191
+ border-color: var(--border-color);
192
+ }
193
+
194
+ .btn-outline:hover {
195
+ background: var(--background);
196
+ border-color: var(--text-secondary);
197
+ }
198
+
199
+ .btn-small {
200
+ padding: 0.25rem 0.5rem;
201
+ font-size: 0.75rem;
202
+ }
203
+
204
+ /* Status Badge */
205
+ .status-badge {
206
+ padding: 0.25rem 0.75rem;
207
+ border-radius: 9999px;
208
+ font-size: 0.75rem;
209
+ font-weight: 600;
210
+ text-transform: uppercase;
211
+ }
212
+
213
+ .status-healthy {
214
+ background: rgba(16, 185, 129, 0.1);
215
+ color: var(--success-color);
216
+ }
217
+
218
+ .status-unhealthy {
219
+ background: rgba(239, 68, 68, 0.1);
220
+ color: var(--error-color);
221
+ }
222
+
223
+ .status-warning {
224
+ background: rgba(245, 158, 11, 0.1);
225
+ color: var(--warning-color);
226
+ }
227
+
228
+ /* Metrics */
229
+ .metric {
230
+ display: flex;
231
+ justify-content: space-between;
232
+ align-items: center;
233
+ padding: 0.75rem 0;
234
+ border-bottom: 1px solid var(--border-color);
235
+ }
236
+
237
+ .metric:last-child {
238
+ border-bottom: none;
239
+ }
240
+
241
+ .metric .label {
242
+ font-size: 0.875rem;
243
+ color: var(--text-secondary);
244
+ }
245
+
246
+ .metric .value {
247
+ font-size: 1rem;
248
+ font-weight: 600;
249
+ color: var(--text-primary);
250
+ }
251
+
252
+ /* Grid Layouts */
253
+ .overview-grid {
254
+ display: grid;
255
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
256
+ gap: 1.5rem;
257
+ }
258
+
259
+ .analytics-grid {
260
+ display: grid;
261
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
262
+ gap: 1.5rem;
263
+ }
264
+
265
+ .health-grid,
266
+ .config-grid {
267
+ display: grid;
268
+ grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
269
+ gap: 1.5rem;
270
+ }
271
+
272
+ /* Provider Grid */
273
+ .provider-grid {
274
+ display: grid;
275
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
276
+ gap: 1rem;
277
+ }
278
+
279
+ .provider-status {
280
+ padding: 1rem;
281
+ border-radius: var(--radius);
282
+ border: 1px solid var(--border-color);
283
+ text-align: center;
284
+ }
285
+
286
+ .provider-status.healthy {
287
+ border-color: var(--success-color);
288
+ background: rgba(16, 185, 129, 0.05);
289
+ }
290
+
291
+ .provider-status.unhealthy {
292
+ border-color: var(--error-color);
293
+ background: rgba(239, 68, 68, 0.05);
294
+ }
295
+
296
+ /* Charts */
297
+ .chart {
298
+ height: 300px;
299
+ display: flex;
300
+ align-items: center;
301
+ justify-content: center;
302
+ background: var(--background);
303
+ border-radius: var(--radius);
304
+ border: 1px solid var(--border-color);
305
+ color: var(--text-secondary);
306
+ }
307
+
308
+ .chart-controls {
309
+ display: flex;
310
+ gap: 0.25rem;
311
+ }
312
+
313
+ /* Controls */
314
+ .analytics-controls,
315
+ .config-controls,
316
+ .health-controls {
317
+ display: flex;
318
+ gap: 1rem;
319
+ align-items: center;
320
+ margin-bottom: 1.5rem;
321
+ flex-wrap: wrap;
322
+ }
323
+
324
+ .select {
325
+ padding: 0.5rem 1rem;
326
+ border-radius: var(--radius);
327
+ border: 1px solid var(--border-color);
328
+ background: var(--surface);
329
+ color: var(--text-primary);
330
+ font-size: 0.875rem;
331
+ }
332
+
333
+ .checkbox-group {
334
+ display: flex;
335
+ align-items: center;
336
+ gap: 0.5rem;
337
+ }
338
+
339
+ .checkbox-group label {
340
+ display: flex;
341
+ align-items: center;
342
+ gap: 0.5rem;
343
+ font-size: 0.875rem;
344
+ cursor: pointer;
345
+ }
346
+
347
+ /* Template Selector */
348
+ .template-selector {
349
+ display: flex;
350
+ align-items: center;
351
+ gap: 0.5rem;
352
+ }
353
+
354
+ /* Action Buttons */
355
+ .action-btn {
356
+ width: 100%;
357
+ padding: 1rem;
358
+ margin-bottom: 0.5rem;
359
+ background: var(--surface);
360
+ border: 1px solid var(--border-color);
361
+ border-radius: var(--radius);
362
+ color: var(--text-primary);
363
+ font-weight: 500;
364
+ cursor: pointer;
365
+ transition: all 0.2s;
366
+ text-align: left;
367
+ }
368
+
369
+ .action-btn:hover {
370
+ background: var(--primary-color);
371
+ color: white;
372
+ border-color: var(--primary-color);
373
+ }
374
+
375
+ /* Status Bar */
376
+ .status-bar {
377
+ background: var(--surface);
378
+ border-top: 1px solid var(--border-color);
379
+ padding: 0.75rem 1.5rem;
380
+ display: flex;
381
+ justify-content: space-between;
382
+ align-items: center;
383
+ font-size: 0.875rem;
384
+ color: var(--text-secondary);
385
+ }
386
+
387
+ .status-left,
388
+ .status-right {
389
+ display: flex;
390
+ align-items: center;
391
+ gap: 1rem;
392
+ }
393
+
394
+ /* Modal */
395
+ .modal {
396
+ position: fixed;
397
+ top: 0;
398
+ left: 0;
399
+ right: 0;
400
+ bottom: 0;
401
+ background: rgba(0, 0, 0, 0.5);
402
+ display: flex;
403
+ align-items: center;
404
+ justify-content: center;
405
+ z-index: 1000;
406
+ }
407
+
408
+ .modal.hidden {
409
+ display: none;
410
+ }
411
+
412
+ .modal-content {
413
+ background: var(--surface);
414
+ border-radius: var(--radius-lg);
415
+ max-width: 500px;
416
+ width: 90%;
417
+ max-height: 80vh;
418
+ overflow-y: auto;
419
+ }
420
+
421
+ .modal-header {
422
+ padding: 1.5rem;
423
+ border-bottom: 1px solid var(--border-color);
424
+ display: flex;
425
+ justify-content: space-between;
426
+ align-items: center;
427
+ }
428
+
429
+ .modal-header h3 {
430
+ font-size: 1.25rem;
431
+ font-weight: 600;
432
+ }
433
+
434
+ .modal-close {
435
+ background: none;
436
+ border: none;
437
+ font-size: 1.5rem;
438
+ cursor: pointer;
439
+ color: var(--text-secondary);
440
+ width: 2rem;
441
+ height: 2rem;
442
+ display: flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ border-radius: var(--radius);
446
+ transition: background 0.2s;
447
+ }
448
+
449
+ .modal-close:hover {
450
+ background: var(--background);
451
+ }
452
+
453
+ .modal-body {
454
+ padding: 1.5rem;
455
+ }
456
+
457
+ .modal-footer {
458
+ padding: 1rem 1.5rem;
459
+ border-top: 1px solid var(--border-color);
460
+ display: flex;
461
+ justify-content: flex-end;
462
+ gap: 0.5rem;
463
+ }
464
+
465
+ /* Stats Display */
466
+ .provider-stats,
467
+ .model-stats {
468
+ display: flex;
469
+ flex-direction: column;
470
+ gap: 1rem;
471
+ }
472
+
473
+ .stat-item {
474
+ display: flex;
475
+ justify-content: space-between;
476
+ align-items: center;
477
+ padding: 0.5rem;
478
+ border-radius: var(--radius);
479
+ background: var(--background);
480
+ }
481
+
482
+ .stat-name {
483
+ font-weight: 500;
484
+ }
485
+
486
+ .stat-value {
487
+ font-weight: 600;
488
+ color: var(--primary-color);
489
+ }
490
+
491
+ /* Text Small */
492
+ .text-small {
493
+ font-size: 0.75rem;
494
+ color: var(--text-secondary);
495
+ }
496
+
497
+ /* Loading State */
498
+ .loading {
499
+ display: flex;
500
+ align-items: center;
501
+ justify-content: center;
502
+ padding: 2rem;
503
+ color: var(--text-secondary);
504
+ }
505
+
506
+ .loading::after {
507
+ content: '';
508
+ width: 1rem;
509
+ height: 1rem;
510
+ margin-left: 0.5rem;
511
+ border: 2px solid var(--border-color);
512
+ border-top-color: var(--primary-color);
513
+ border-radius: 50%;
514
+ animation: spin 1s linear infinite;
515
+ }
516
+
517
+ @keyframes spin {
518
+ to { transform: rotate(360deg); }
519
+ }
520
+
521
+ /* Responsive Design */
522
+ @media (max-width: 768px) {
523
+ .header-content {
524
+ flex-direction: column;
525
+ gap: 1rem;
526
+ text-align: center;
527
+ }
528
+
529
+ .nav {
530
+ overflow-x: auto;
531
+ -webkit-overflow-scrolling: touch;
532
+ }
533
+
534
+ .main {
535
+ padding: 1rem;
536
+ }
537
+
538
+ .overview-grid,
539
+ .analytics-grid {
540
+ grid-template-columns: 1fr;
541
+ }
542
+
543
+ .card-wide {
544
+ grid-column: span 1;
545
+ }
546
+
547
+ .analytics-controls,
548
+ .config-controls,
549
+ .health-controls {
550
+ flex-direction: column;
551
+ align-items: stretch;
552
+ }
553
+
554
+ .template-selector {
555
+ flex-direction: column;
556
+ align-items: stretch;
557
+ }
558
+ }
559
+
560
+ @media (max-width: 480px) {
561
+ .nav-item {
562
+ padding: 0.75rem 1rem;
563
+ font-size: 0.875rem;
564
+ }
565
+
566
+ .metric {
567
+ flex-direction: column;
568
+ align-items: flex-start;
569
+ gap: 0.25rem;
570
+ }
571
+
572
+ .provider-grid {
573
+ grid-template-columns: 1fr;
574
+ }
575
+ }