genarena 0.0.1__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. genarena/__init__.py +49 -2
  2. genarena/__main__.py +10 -0
  3. genarena/arena.py +1685 -0
  4. genarena/battle.py +337 -0
  5. genarena/bt_elo.py +507 -0
  6. genarena/cli.py +1581 -0
  7. genarena/data.py +476 -0
  8. genarena/deploy/Dockerfile +22 -0
  9. genarena/deploy/README.md +55 -0
  10. genarena/deploy/__init__.py +5 -0
  11. genarena/deploy/app.py +84 -0
  12. genarena/experiments.py +121 -0
  13. genarena/leaderboard.py +270 -0
  14. genarena/logs.py +409 -0
  15. genarena/models.py +412 -0
  16. genarena/prompts/__init__.py +127 -0
  17. genarena/prompts/mmrb2.py +373 -0
  18. genarena/sampling.py +336 -0
  19. genarena/state.py +656 -0
  20. genarena/sync/__init__.py +105 -0
  21. genarena/sync/auto_commit.py +118 -0
  22. genarena/sync/deploy_ops.py +543 -0
  23. genarena/sync/git_ops.py +422 -0
  24. genarena/sync/hf_ops.py +891 -0
  25. genarena/sync/init_ops.py +431 -0
  26. genarena/sync/packer.py +587 -0
  27. genarena/sync/submit.py +837 -0
  28. genarena/utils.py +103 -0
  29. genarena/validation/__init__.py +19 -0
  30. genarena/validation/schema.py +327 -0
  31. genarena/validation/validator.py +329 -0
  32. genarena/visualize/README.md +148 -0
  33. genarena/visualize/__init__.py +14 -0
  34. genarena/visualize/app.py +938 -0
  35. genarena/visualize/data_loader.py +2430 -0
  36. genarena/visualize/static/app.js +3762 -0
  37. genarena/visualize/static/model_aliases.json +86 -0
  38. genarena/visualize/static/style.css +4104 -0
  39. genarena/visualize/templates/index.html +413 -0
  40. genarena/vlm.py +519 -0
  41. genarena-0.1.1.dist-info/METADATA +178 -0
  42. genarena-0.1.1.dist-info/RECORD +44 -0
  43. {genarena-0.0.1.dist-info → genarena-0.1.1.dist-info}/WHEEL +1 -2
  44. genarena-0.1.1.dist-info/entry_points.txt +2 -0
  45. genarena-0.0.1.dist-info/METADATA +0 -26
  46. genarena-0.0.1.dist-info/RECORD +0 -5
  47. genarena-0.0.1.dist-info/top_level.txt +0 -1
@@ -0,0 +1,4104 @@
1
+ /* ========== CSS Variables ========== */
2
+ :root {
3
+ --bg-primary: #0d1117;
4
+ --bg-secondary: #161b22;
5
+ --bg-tertiary: #21262d;
6
+ --bg-hover: #30363d;
7
+ --border-color: #30363d;
8
+ --border-light: #484f58;
9
+
10
+ --text-primary: #e6edf3;
11
+ --text-secondary: #8b949e;
12
+ --text-muted: #6e7681;
13
+
14
+ --accent-blue: #58a6ff;
15
+ --accent-green: #3fb950;
16
+ --accent-red: #f85149;
17
+ --accent-yellow: #d29922;
18
+ --accent-purple: #a371f7;
19
+
20
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
21
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
22
+
23
+ --radius-sm: 4px;
24
+ --radius-md: 8px;
25
+ --radius-lg: 12px;
26
+
27
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
28
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
29
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5);
30
+ }
31
+
32
+ /* ========== Reset & Base ========== */
33
+ * {
34
+ margin: 0;
35
+ padding: 0;
36
+ box-sizing: border-box;
37
+ }
38
+
39
+ body {
40
+ font-family: var(--font-sans);
41
+ background: var(--bg-primary);
42
+ color: var(--text-primary);
43
+ line-height: 1.6;
44
+ min-height: 100vh;
45
+ }
46
+
47
+ /* ========== Header ========== */
48
+ .header {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: space-between;
52
+ padding: 12px 24px;
53
+ background: var(--bg-secondary);
54
+ border-bottom: 1px solid var(--border-color);
55
+ position: sticky;
56
+ top: 0;
57
+ z-index: 100;
58
+ }
59
+
60
+ .header-left {
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 32px;
64
+ flex: 0 0 auto;
65
+ }
66
+
67
+ .logo {
68
+ font-size: 1.25rem;
69
+ font-weight: 700;
70
+ color: var(--accent-blue);
71
+ letter-spacing: -0.02em;
72
+ }
73
+
74
+ .header-right {
75
+ flex: 0 0 auto;
76
+ }
77
+
78
+ .selector-group {
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 8px;
82
+ }
83
+
84
+ .selector-group label {
85
+ font-size: 0.875rem;
86
+ color: var(--text-secondary);
87
+ }
88
+
89
+ .selector {
90
+ padding: 6px 12px;
91
+ background: var(--bg-tertiary);
92
+ border: 1px solid var(--border-color);
93
+ border-radius: var(--radius-sm);
94
+ color: var(--text-primary);
95
+ font-size: 0.875rem;
96
+ cursor: pointer;
97
+ min-width: 160px;
98
+ }
99
+
100
+ .selector:hover:not(:disabled) {
101
+ border-color: var(--border-light);
102
+ }
103
+
104
+ .selector:disabled {
105
+ opacity: 0.5;
106
+ cursor: not-allowed;
107
+ }
108
+
109
+ .stats-badge {
110
+ font-size: 0.75rem;
111
+ padding: 4px 10px;
112
+ background: var(--bg-tertiary);
113
+ border-radius: var(--radius-sm);
114
+ color: var(--text-secondary);
115
+ font-family: var(--font-mono);
116
+ }
117
+
118
+ /* Favorites Button */
119
+ .header-right {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 12px;
123
+ }
124
+
125
+ .btn-favorites {
126
+ display: flex;
127
+ align-items: center;
128
+ gap: 6px;
129
+ padding: 6px 12px;
130
+ background: var(--bg-tertiary);
131
+ border: 1px solid var(--border-color);
132
+ border-radius: var(--radius-sm);
133
+ color: var(--accent-yellow);
134
+ cursor: pointer;
135
+ transition: all 0.15s ease;
136
+ }
137
+
138
+ .btn-favorites:hover {
139
+ background: var(--bg-hover);
140
+ border-color: var(--accent-yellow);
141
+ }
142
+
143
+ .favorites-icon {
144
+ font-size: 1rem;
145
+ }
146
+
147
+ .favorites-count {
148
+ font-size: 0.75rem;
149
+ font-family: var(--font-mono);
150
+ background: var(--bg-primary);
151
+ padding: 2px 6px;
152
+ border-radius: var(--radius-sm);
153
+ color: var(--text-secondary);
154
+ }
155
+
156
+ /* View Toggle */
157
+ .view-toggle {
158
+ display: flex;
159
+ gap: 4px;
160
+ background: var(--bg-tertiary);
161
+ padding: 4px;
162
+ border-radius: var(--radius-sm);
163
+ border: 1px solid var(--border-color);
164
+ }
165
+
166
+ .view-btn {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: 6px;
170
+ padding: 6px 12px;
171
+ background: transparent;
172
+ border: none;
173
+ border-radius: var(--radius-sm);
174
+ color: var(--text-secondary);
175
+ font-size: 0.8125rem;
176
+ cursor: pointer;
177
+ transition: all 0.15s ease;
178
+ }
179
+
180
+ .view-btn:hover {
181
+ color: var(--text-primary);
182
+ background: var(--bg-hover);
183
+ }
184
+
185
+ .view-btn.active {
186
+ background: var(--accent-blue);
187
+ color: #fff;
188
+ }
189
+
190
+ .view-icon {
191
+ font-size: 0.875rem;
192
+ }
193
+
194
+ /* ========== Main Layout ========== */
195
+ .main-container {
196
+ display: flex;
197
+ min-height: calc(100vh - 57px);
198
+ }
199
+
200
+ /* ========== Sidebar ========== */
201
+ .sidebar {
202
+ width: 280px;
203
+ flex-shrink: 0;
204
+ background: var(--bg-secondary);
205
+ border-right: 1px solid var(--border-color);
206
+ padding: 20px;
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: 24px;
210
+ }
211
+
212
+ .filter-section h3,
213
+ .stats-section h3 {
214
+ font-size: 0.75rem;
215
+ text-transform: uppercase;
216
+ letter-spacing: 0.05em;
217
+ color: var(--text-muted);
218
+ margin-bottom: 12px;
219
+ }
220
+
221
+ .filter-group {
222
+ margin-bottom: 12px;
223
+ }
224
+
225
+ .filter-group label {
226
+ display: block;
227
+ font-size: 0.8125rem;
228
+ color: var(--text-secondary);
229
+ margin-bottom: 4px;
230
+ }
231
+
232
+ .filter-select {
233
+ width: 100%;
234
+ padding: 8px 10px;
235
+ background: var(--bg-tertiary);
236
+ border: 1px solid var(--border-color);
237
+ border-radius: var(--radius-sm);
238
+ color: var(--text-primary);
239
+ font-size: 0.875rem;
240
+ }
241
+
242
+ /* Checkbox group for multi-select models */
243
+ .checkbox-group {
244
+ max-height: 200px;
245
+ overflow-y: auto;
246
+ background: var(--bg-tertiary);
247
+ border: 1px solid var(--border-color);
248
+ border-radius: var(--radius-sm);
249
+ padding: 8px;
250
+ margin-bottom: 8px;
251
+ }
252
+
253
+ .checkbox-item {
254
+ display: flex;
255
+ align-items: center;
256
+ padding: 4px 0;
257
+ cursor: pointer;
258
+ }
259
+
260
+ .checkbox-item:hover {
261
+ background: var(--bg-hover);
262
+ margin: 0 -8px;
263
+ padding: 4px 8px;
264
+ }
265
+
266
+ .checkbox-item input[type="checkbox"] {
267
+ margin-right: 8px;
268
+ accent-color: var(--accent-blue);
269
+ cursor: pointer;
270
+ }
271
+
272
+ .checkbox-item label {
273
+ font-size: 0.8125rem;
274
+ color: var(--text-primary);
275
+ cursor: pointer;
276
+ flex: 1;
277
+ white-space: nowrap;
278
+ overflow: hidden;
279
+ text-overflow: ellipsis;
280
+ }
281
+
282
+ .checkbox-actions {
283
+ display: flex;
284
+ gap: 4px;
285
+ }
286
+
287
+ .checkbox-actions .btn-small {
288
+ flex: 1;
289
+ font-size: 0.75rem;
290
+ }
291
+
292
+ #model-count {
293
+ font-size: 0.75rem;
294
+ color: var(--text-muted);
295
+ }
296
+
297
+ #prompts-model-count, #favorites-model-count {
298
+ font-size: 0.75rem;
299
+ color: var(--text-muted);
300
+ }
301
+
302
+ .filter-hint {
303
+ font-size: 0.75rem;
304
+ color: var(--text-muted);
305
+ margin-top: 8px;
306
+ font-style: italic;
307
+ }
308
+
309
+ /* Range Slider for image count filter */
310
+ .range-slider-container {
311
+ position: relative;
312
+ height: 30px;
313
+ margin: 8px 0;
314
+ }
315
+
316
+ .range-slider {
317
+ position: absolute;
318
+ width: 100%;
319
+ height: 4px;
320
+ background: transparent;
321
+ -webkit-appearance: none;
322
+ appearance: none;
323
+ pointer-events: none;
324
+ top: 50%;
325
+ transform: translateY(-50%);
326
+ }
327
+
328
+ .range-slider::-webkit-slider-runnable-track {
329
+ height: 4px;
330
+ background: var(--bg-tertiary);
331
+ border-radius: 2px;
332
+ }
333
+
334
+ .range-slider::-webkit-slider-thumb {
335
+ -webkit-appearance: none;
336
+ appearance: none;
337
+ width: 16px;
338
+ height: 16px;
339
+ background: var(--accent-blue);
340
+ border-radius: 50%;
341
+ cursor: pointer;
342
+ pointer-events: auto;
343
+ margin-top: -6px;
344
+ }
345
+
346
+ .range-slider::-moz-range-track {
347
+ height: 4px;
348
+ background: var(--bg-tertiary);
349
+ border-radius: 2px;
350
+ }
351
+
352
+ .range-slider::-moz-range-thumb {
353
+ width: 16px;
354
+ height: 16px;
355
+ background: var(--accent-blue);
356
+ border: none;
357
+ border-radius: 50%;
358
+ cursor: pointer;
359
+ pointer-events: auto;
360
+ }
361
+
362
+ .range-labels {
363
+ display: flex;
364
+ justify-content: space-between;
365
+ font-size: 0.75rem;
366
+ color: var(--text-muted);
367
+ }
368
+
369
+ #image-range-display {
370
+ font-family: var(--font-mono);
371
+ color: var(--accent-blue);
372
+ }
373
+
374
+ .btn {
375
+ padding: 8px 16px;
376
+ border: none;
377
+ border-radius: var(--radius-sm);
378
+ font-size: 0.875rem;
379
+ font-weight: 500;
380
+ cursor: pointer;
381
+ transition: all 0.15s ease;
382
+ }
383
+
384
+ .btn-primary {
385
+ background: var(--accent-blue);
386
+ color: #fff;
387
+ }
388
+
389
+ .btn-primary:hover {
390
+ background: #4c9aed;
391
+ }
392
+
393
+ .btn-secondary {
394
+ background: var(--bg-tertiary);
395
+ color: var(--text-secondary);
396
+ border: 1px solid var(--border-color);
397
+ }
398
+
399
+ .btn-secondary:hover {
400
+ background: var(--bg-hover);
401
+ color: var(--text-primary);
402
+ }
403
+
404
+ .btn-small {
405
+ padding: 4px 10px;
406
+ font-size: 0.8125rem;
407
+ }
408
+
409
+ .btn:disabled {
410
+ opacity: 0.5;
411
+ cursor: not-allowed;
412
+ }
413
+
414
+ .filter-section .btn {
415
+ width: 100%;
416
+ margin-top: 8px;
417
+ }
418
+
419
+ .filter-section .btn-secondary {
420
+ margin-top: 4px;
421
+ }
422
+
423
+ #stats-panel {
424
+ font-size: 0.875rem;
425
+ color: var(--text-secondary);
426
+ }
427
+
428
+ #stats-panel .stat-item {
429
+ display: flex;
430
+ justify-content: space-between;
431
+ padding: 6px 0;
432
+ border-bottom: 1px solid var(--border-color);
433
+ }
434
+
435
+ #stats-panel .stat-item:last-child {
436
+ border-bottom: none;
437
+ }
438
+
439
+ #stats-panel .stat-label {
440
+ color: var(--text-muted);
441
+ }
442
+
443
+ #stats-panel .stat-value {
444
+ color: var(--text-primary);
445
+ font-family: var(--font-mono);
446
+ }
447
+
448
+ .placeholder {
449
+ color: var(--text-muted);
450
+ font-style: italic;
451
+ }
452
+
453
+ /* Head-to-Head Section */
454
+ .h2h-section {
455
+ margin-top: 16px;
456
+ padding-top: 16px;
457
+ border-top: 1px solid var(--border-color);
458
+ }
459
+
460
+ .h2h-section h3 {
461
+ font-size: 0.75rem;
462
+ text-transform: uppercase;
463
+ letter-spacing: 0.05em;
464
+ color: var(--text-muted);
465
+ margin-bottom: 12px;
466
+ }
467
+
468
+ /* ELO Leaderboard Section */
469
+ .elo-section {
470
+ margin-top: 16px;
471
+ padding-top: 16px;
472
+ border-top: 1px solid var(--border-color);
473
+ }
474
+
475
+ .elo-header {
476
+ display: flex;
477
+ justify-content: space-between;
478
+ align-items: center;
479
+ margin-bottom: 12px;
480
+ }
481
+
482
+ .elo-header h3 {
483
+ font-size: 0.75rem;
484
+ text-transform: uppercase;
485
+ letter-spacing: 0.05em;
486
+ color: var(--text-muted);
487
+ margin: 0;
488
+ }
489
+
490
+ .btn-link {
491
+ background: transparent;
492
+ border: none;
493
+ color: var(--accent-blue);
494
+ font-size: 0.75rem;
495
+ cursor: pointer;
496
+ padding: 2px 4px;
497
+ }
498
+
499
+ .btn-link:hover {
500
+ text-decoration: underline;
501
+ }
502
+
503
+ #elo-panel {
504
+ /* No height limit - show all models */
505
+ }
506
+
507
+ /* ELO Bar Chart Item */
508
+ .elo-item {
509
+ display: flex;
510
+ align-items: center;
511
+ gap: 8px;
512
+ margin-bottom: 8px;
513
+ cursor: pointer;
514
+ padding: 4px;
515
+ border-radius: var(--radius-sm);
516
+ transition: background 0.15s ease;
517
+ }
518
+
519
+ .elo-item:hover {
520
+ background: var(--bg-hover);
521
+ }
522
+
523
+ .elo-rank {
524
+ font-size: 0.75rem;
525
+ font-weight: 600;
526
+ color: var(--text-muted);
527
+ min-width: 24px;
528
+ text-align: center;
529
+ }
530
+
531
+ .elo-rank.rank-1 {
532
+ color: var(--accent-yellow);
533
+ }
534
+
535
+ .elo-rank.rank-2 {
536
+ color: #c0c0c0;
537
+ }
538
+
539
+ .elo-rank.rank-3 {
540
+ color: #cd7f32;
541
+ }
542
+
543
+ .elo-model-name {
544
+ font-size: 0.75rem;
545
+ color: var(--text-secondary);
546
+ flex-shrink: 0;
547
+ width: 80px;
548
+ overflow: hidden;
549
+ text-overflow: ellipsis;
550
+ white-space: nowrap;
551
+ }
552
+
553
+ .elo-bar-container {
554
+ flex: 1;
555
+ height: 16px;
556
+ background: var(--bg-tertiary);
557
+ border-radius: 2px;
558
+ overflow: hidden;
559
+ position: relative;
560
+ }
561
+
562
+ .elo-bar {
563
+ height: 100%;
564
+ background: linear-gradient(90deg, var(--accent-blue), var(--accent-purple));
565
+ border-radius: 2px;
566
+ transition: width 0.3s ease;
567
+ }
568
+
569
+ .elo-value {
570
+ font-size: 0.6875rem;
571
+ font-family: var(--font-mono);
572
+ color: var(--text-primary);
573
+ min-width: 36px;
574
+ text-align: right;
575
+ }
576
+
577
+ /* Leaderboard Modal */
578
+ .leaderboard-modal-header {
579
+ display: flex;
580
+ justify-content: space-between;
581
+ align-items: center;
582
+ padding: 20px;
583
+ border-bottom: 1px solid var(--border-color);
584
+ }
585
+
586
+ .leaderboard-modal-header h2 {
587
+ font-size: 1.25rem;
588
+ color: var(--text-primary);
589
+ margin: 0;
590
+ }
591
+
592
+ .subset-badge {
593
+ font-size: 0.875rem;
594
+ padding: 4px 12px;
595
+ background: var(--bg-tertiary);
596
+ border-radius: var(--radius-sm);
597
+ color: var(--accent-blue);
598
+ }
599
+
600
+ #leaderboard-content {
601
+ padding: 20px;
602
+ max-height: calc(90vh - 80px);
603
+ overflow-y: auto;
604
+ }
605
+
606
+ /* Leaderboard Table */
607
+ .leaderboard-table {
608
+ width: 100%;
609
+ border-collapse: collapse;
610
+ }
611
+
612
+ .leaderboard-table th,
613
+ .leaderboard-table td {
614
+ padding: 12px 16px;
615
+ text-align: left;
616
+ border-bottom: 1px solid var(--border-color);
617
+ }
618
+
619
+ .leaderboard-table th {
620
+ background: var(--bg-tertiary);
621
+ color: var(--text-muted);
622
+ font-size: 0.75rem;
623
+ text-transform: uppercase;
624
+ letter-spacing: 0.05em;
625
+ font-weight: 600;
626
+ position: sticky;
627
+ top: 0;
628
+ }
629
+
630
+ .leaderboard-table td {
631
+ font-size: 0.875rem;
632
+ color: var(--text-primary);
633
+ }
634
+
635
+ .leaderboard-table tbody tr {
636
+ cursor: pointer;
637
+ transition: background 0.15s ease;
638
+ }
639
+
640
+ .leaderboard-table tbody tr:hover {
641
+ background: var(--bg-hover);
642
+ }
643
+
644
+ .leaderboard-table .rank-cell {
645
+ font-weight: 600;
646
+ text-align: center;
647
+ width: 60px;
648
+ }
649
+
650
+ .leaderboard-table .rank-cell.rank-1 {
651
+ color: var(--accent-yellow);
652
+ }
653
+
654
+ .leaderboard-table .rank-cell.rank-2 {
655
+ color: #c0c0c0;
656
+ }
657
+
658
+ .leaderboard-table .rank-cell.rank-3 {
659
+ color: #cd7f32;
660
+ }
661
+
662
+ .leaderboard-table .model-cell {
663
+ font-family: var(--font-mono);
664
+ }
665
+
666
+ .leaderboard-table .elo-cell {
667
+ font-family: var(--font-mono);
668
+ font-weight: 600;
669
+ color: var(--accent-blue);
670
+ }
671
+
672
+ .leaderboard-table .stat-cell {
673
+ font-family: var(--font-mono);
674
+ color: var(--text-secondary);
675
+ }
676
+
677
+ .leaderboard-table .win-rate-cell {
678
+ width: 120px;
679
+ }
680
+
681
+ .win-rate-bar {
682
+ display: flex;
683
+ align-items: center;
684
+ gap: 8px;
685
+ }
686
+
687
+ .win-rate-bar-bg {
688
+ flex: 1;
689
+ height: 6px;
690
+ background: var(--bg-primary);
691
+ border-radius: 3px;
692
+ overflow: hidden;
693
+ }
694
+
695
+ .win-rate-bar-fill {
696
+ height: 100%;
697
+ background: var(--accent-green);
698
+ border-radius: 3px;
699
+ }
700
+
701
+ .win-rate-text {
702
+ font-family: var(--font-mono);
703
+ font-size: 0.75rem;
704
+ color: var(--accent-green);
705
+ min-width: 40px;
706
+ text-align: right;
707
+ }
708
+
709
+ /* Model Stats Modal */
710
+ #model-stats-content {
711
+ padding: 20px;
712
+ }
713
+
714
+ .model-stats-header {
715
+ margin-bottom: 24px;
716
+ padding-bottom: 16px;
717
+ border-bottom: 1px solid var(--border-color);
718
+ }
719
+
720
+ .model-stats-header h2 {
721
+ font-size: 1.25rem;
722
+ margin: 0 0 8px 0;
723
+ font-family: var(--font-mono);
724
+ }
725
+
726
+ .model-stats-summary {
727
+ display: flex;
728
+ flex-wrap: wrap;
729
+ gap: 16px;
730
+ }
731
+
732
+ .model-stat-item {
733
+ background: var(--bg-tertiary);
734
+ padding: 12px 16px;
735
+ border-radius: var(--radius-sm);
736
+ text-align: center;
737
+ min-width: 100px;
738
+ }
739
+
740
+ .model-stat-item .stat-label {
741
+ font-size: 0.6875rem;
742
+ text-transform: uppercase;
743
+ letter-spacing: 0.05em;
744
+ color: var(--text-muted);
745
+ margin-bottom: 4px;
746
+ }
747
+
748
+ .model-stat-item .stat-value {
749
+ font-size: 1.25rem;
750
+ font-weight: 600;
751
+ font-family: var(--font-mono);
752
+ text-align: center;
753
+ }
754
+
755
+ .model-stat-item .stat-value.elo-value {
756
+ color: var(--accent-blue);
757
+ }
758
+
759
+ .model-stat-item .stat-value.wins-value {
760
+ color: var(--accent-green);
761
+ }
762
+
763
+ .model-stat-item .stat-value.losses-value {
764
+ color: var(--accent-red);
765
+ }
766
+
767
+ .model-stat-item .stat-value.ties-value {
768
+ color: var(--accent-yellow);
769
+ }
770
+
771
+ .vs-stats-section h3 {
772
+ font-size: 0.875rem;
773
+ color: var(--text-muted);
774
+ margin-bottom: 16px;
775
+ text-transform: uppercase;
776
+ letter-spacing: 0.05em;
777
+ }
778
+
779
+ .vs-stats-table {
780
+ width: 100%;
781
+ border-collapse: collapse;
782
+ }
783
+
784
+ .vs-stats-table th,
785
+ .vs-stats-table td {
786
+ padding: 10px 12px;
787
+ text-align: left;
788
+ border-bottom: 1px solid var(--border-color);
789
+ }
790
+
791
+ .vs-stats-table th {
792
+ background: var(--bg-tertiary);
793
+ color: var(--text-muted);
794
+ font-size: 0.75rem;
795
+ text-transform: uppercase;
796
+ letter-spacing: 0.05em;
797
+ font-weight: 600;
798
+ }
799
+
800
+ .vs-stats-table td {
801
+ font-size: 0.875rem;
802
+ color: var(--text-primary);
803
+ }
804
+
805
+ .vs-stats-table tbody tr:hover {
806
+ background: var(--bg-hover);
807
+ }
808
+
809
+ .vs-stats-table .opponent-cell {
810
+ font-family: var(--font-mono);
811
+ }
812
+
813
+ .vs-stats-table .opponent-elo {
814
+ font-size: 0.75rem;
815
+ color: var(--text-muted);
816
+ margin-left: 8px;
817
+ }
818
+
819
+ .vs-stats-table .wlt-cell {
820
+ font-family: var(--font-mono);
821
+ }
822
+
823
+ .vs-stats-table .wlt-cell .wins {
824
+ color: var(--accent-green);
825
+ }
826
+
827
+ .vs-stats-table .wlt-cell .losses {
828
+ color: var(--accent-red);
829
+ }
830
+
831
+ .vs-stats-table .wlt-cell .ties {
832
+ color: var(--accent-yellow);
833
+ }
834
+
835
+ .h2h-bar {
836
+ display: flex;
837
+ height: 24px;
838
+ border-radius: var(--radius-sm);
839
+ overflow: hidden;
840
+ margin: 8px 0;
841
+ }
842
+
843
+ .h2h-bar-a {
844
+ background: var(--accent-green);
845
+ display: flex;
846
+ align-items: center;
847
+ justify-content: center;
848
+ font-size: 0.75rem;
849
+ font-weight: 600;
850
+ color: #000;
851
+ min-width: 30px;
852
+ }
853
+
854
+ .h2h-bar-tie {
855
+ background: var(--accent-yellow);
856
+ display: flex;
857
+ align-items: center;
858
+ justify-content: center;
859
+ font-size: 0.75rem;
860
+ font-weight: 600;
861
+ color: #000;
862
+ min-width: 20px;
863
+ }
864
+
865
+ .h2h-bar-b {
866
+ background: var(--accent-red);
867
+ display: flex;
868
+ align-items: center;
869
+ justify-content: center;
870
+ font-size: 0.75rem;
871
+ font-weight: 600;
872
+ color: #fff;
873
+ min-width: 30px;
874
+ }
875
+
876
+ .h2h-labels {
877
+ display: flex;
878
+ justify-content: space-between;
879
+ font-size: 0.75rem;
880
+ color: var(--text-secondary);
881
+ margin-bottom: 4px;
882
+ }
883
+
884
+ .h2h-label {
885
+ max-width: 45%;
886
+ overflow: hidden;
887
+ text-overflow: ellipsis;
888
+ white-space: nowrap;
889
+ }
890
+
891
+ .h2h-stats-row {
892
+ display: flex;
893
+ justify-content: space-between;
894
+ font-size: 0.8125rem;
895
+ padding: 4px 0;
896
+ }
897
+
898
+ .h2h-stats-row .value {
899
+ font-family: var(--font-mono);
900
+ color: var(--text-primary);
901
+ }
902
+
903
+ /* ========== Content Area ========== */
904
+ .content {
905
+ flex: 1;
906
+ padding: 20px;
907
+ overflow-y: auto;
908
+ }
909
+
910
+ .content-header,
911
+ .content-footer {
912
+ display: flex;
913
+ justify-content: space-between;
914
+ align-items: center;
915
+ margin-bottom: 16px;
916
+ }
917
+
918
+ .content-footer {
919
+ margin-top: 16px;
920
+ margin-bottom: 0;
921
+ justify-content: flex-end;
922
+ }
923
+
924
+ .pagination-info {
925
+ font-size: 0.875rem;
926
+ color: var(--text-secondary);
927
+ }
928
+
929
+ .pagination-controls {
930
+ display: flex;
931
+ align-items: center;
932
+ gap: 4px;
933
+ }
934
+
935
+ .page-numbers {
936
+ display: flex;
937
+ align-items: center;
938
+ gap: 2px;
939
+ }
940
+
941
+ .page-number {
942
+ min-width: 32px;
943
+ height: 28px;
944
+ padding: 0 8px;
945
+ border: none;
946
+ border-radius: var(--radius-sm);
947
+ background: var(--bg-tertiary);
948
+ color: var(--text-secondary);
949
+ font-size: 0.8125rem;
950
+ cursor: pointer;
951
+ transition: all 0.15s ease;
952
+ }
953
+
954
+ .page-number:hover {
955
+ background: var(--bg-hover);
956
+ color: var(--text-primary);
957
+ }
958
+
959
+ .page-number.active {
960
+ background: var(--accent-blue);
961
+ color: #fff;
962
+ }
963
+
964
+ .page-number.ellipsis {
965
+ background: transparent;
966
+ cursor: default;
967
+ color: var(--text-muted);
968
+ }
969
+
970
+ .page-number.ellipsis:hover {
971
+ background: transparent;
972
+ color: var(--text-muted);
973
+ }
974
+
975
+ .page-jump {
976
+ display: flex;
977
+ align-items: center;
978
+ gap: 4px;
979
+ margin-left: 8px;
980
+ }
981
+
982
+ .page-input {
983
+ width: 60px;
984
+ height: 28px;
985
+ padding: 0 8px;
986
+ border: 1px solid var(--border-color);
987
+ border-radius: var(--radius-sm);
988
+ background: var(--bg-tertiary);
989
+ color: var(--text-primary);
990
+ font-size: 0.8125rem;
991
+ text-align: center;
992
+ }
993
+
994
+ .page-input:focus {
995
+ outline: none;
996
+ border-color: var(--accent-blue);
997
+ }
998
+
999
+ .page-input::-webkit-outer-spin-button,
1000
+ .page-input::-webkit-inner-spin-button {
1001
+ -webkit-appearance: none;
1002
+ margin: 0;
1003
+ }
1004
+
1005
+ .page-input[type=number] {
1006
+ -moz-appearance: textfield;
1007
+ }
1008
+
1009
+ /* ========== Battle List ========== */
1010
+ .battle-list {
1011
+ display: flex;
1012
+ flex-direction: column;
1013
+ gap: 12px;
1014
+ }
1015
+
1016
+ .empty-state {
1017
+ text-align: center;
1018
+ padding: 60px 20px;
1019
+ color: var(--text-muted);
1020
+ }
1021
+
1022
+ /* ========== Battle Card ========== */
1023
+ .battle-card {
1024
+ background: var(--bg-secondary);
1025
+ border: 1px solid var(--border-color);
1026
+ border-radius: var(--radius-md);
1027
+ padding: 16px;
1028
+ cursor: pointer;
1029
+ transition: all 0.15s ease;
1030
+ }
1031
+
1032
+ .battle-card:hover {
1033
+ border-color: var(--border-light);
1034
+ background: var(--bg-tertiary);
1035
+ }
1036
+
1037
+ .battle-card-header {
1038
+ display: flex;
1039
+ justify-content: space-between;
1040
+ align-items: flex-start;
1041
+ margin-bottom: 12px;
1042
+ }
1043
+
1044
+ .battle-models {
1045
+ display: flex;
1046
+ align-items: center;
1047
+ gap: 8px;
1048
+ flex-wrap: wrap;
1049
+ }
1050
+
1051
+ .model-name {
1052
+ font-family: var(--font-mono);
1053
+ font-size: 0.875rem;
1054
+ padding: 2px 8px;
1055
+ background: var(--bg-tertiary);
1056
+ border-radius: var(--radius-sm);
1057
+ }
1058
+
1059
+ .model-name.winner {
1060
+ background: rgba(63, 185, 80, 0.2);
1061
+ color: var(--accent-green);
1062
+ }
1063
+
1064
+ .model-name.loser {
1065
+ background: rgba(248, 81, 73, 0.15);
1066
+ color: var(--accent-red);
1067
+ }
1068
+
1069
+ .vs-label {
1070
+ color: var(--text-muted);
1071
+ font-size: 0.75rem;
1072
+ }
1073
+
1074
+ .battle-badges {
1075
+ display: flex;
1076
+ gap: 6px;
1077
+ }
1078
+
1079
+ .badge {
1080
+ display: inline-flex;
1081
+ align-items: center;
1082
+ justify-content: center;
1083
+ font-size: 0.6875rem;
1084
+ padding: 2px 6px;
1085
+ border-radius: var(--radius-sm);
1086
+ text-transform: uppercase;
1087
+ font-weight: 600;
1088
+ letter-spacing: 0.02em;
1089
+ line-height: 1;
1090
+ }
1091
+
1092
+ .badge-win {
1093
+ background: rgba(63, 185, 80, 0.2);
1094
+ color: var(--accent-green);
1095
+ }
1096
+
1097
+ .badge-loss {
1098
+ background: rgba(248, 81, 73, 0.15);
1099
+ color: var(--accent-red);
1100
+ }
1101
+
1102
+ .badge-tie {
1103
+ background: rgba(210, 153, 34, 0.2);
1104
+ color: var(--accent-yellow);
1105
+ }
1106
+
1107
+ .badge-consistent {
1108
+ background: rgba(88, 166, 255, 0.15);
1109
+ color: var(--accent-blue);
1110
+ }
1111
+
1112
+ .badge-inconsistent {
1113
+ background: rgba(163, 113, 247, 0.15);
1114
+ color: var(--accent-purple);
1115
+ }
1116
+
1117
+ .battle-instruction {
1118
+ font-size: 0.875rem;
1119
+ color: var(--text-secondary);
1120
+ margin-bottom: 12px;
1121
+ display: -webkit-box;
1122
+ -webkit-line-clamp: 2;
1123
+ -webkit-box-orient: vertical;
1124
+ overflow: hidden;
1125
+ }
1126
+
1127
+ .battle-images {
1128
+ display: grid;
1129
+ grid-template-columns: repeat(3, 1fr);
1130
+ gap: 8px;
1131
+ }
1132
+
1133
+ .battle-image-container {
1134
+ position: relative;
1135
+ aspect-ratio: 1;
1136
+ background: var(--bg-tertiary);
1137
+ border-radius: var(--radius-sm);
1138
+ overflow: hidden;
1139
+ }
1140
+
1141
+ .battle-image-container img {
1142
+ width: 100%;
1143
+ height: 100%;
1144
+ object-fit: cover;
1145
+ }
1146
+
1147
+ /* Multiple input images grid */
1148
+ .battle-image-container.multi-input {
1149
+ display: flex;
1150
+ flex-direction: column;
1151
+ }
1152
+
1153
+ .input-thumbs-grid {
1154
+ flex: 1;
1155
+ display: grid;
1156
+ gap: 2px;
1157
+ padding: 2px;
1158
+ min-height: 0; /* Prevent grid from growing based on content */
1159
+ }
1160
+
1161
+ /* Dynamic grid based on image count */
1162
+ .battle-image-container.multi-input[data-count="2"] .input-thumbs-grid {
1163
+ grid-template-columns: repeat(2, 1fr);
1164
+ }
1165
+
1166
+ .battle-image-container.multi-input[data-count="3"] .input-thumbs-grid,
1167
+ .battle-image-container.multi-input[data-count="4"] .input-thumbs-grid {
1168
+ grid-template-columns: 1fr 1fr;
1169
+ grid-template-rows: 1fr 1fr;
1170
+ }
1171
+
1172
+ .battle-image-container.multi-input[data-count="3"] .input-thumb,
1173
+ .battle-image-container.multi-input[data-count="4"] .input-thumb {
1174
+ aspect-ratio: 1;
1175
+ min-height: 0;
1176
+ min-width: 0;
1177
+ }
1178
+
1179
+ .battle-image-container.multi-input[data-count="5"] .input-thumbs-grid,
1180
+ .battle-image-container.multi-input[data-count="6"] .input-thumbs-grid {
1181
+ grid-template-columns: repeat(3, 1fr);
1182
+ grid-template-rows: repeat(2, 1fr);
1183
+ }
1184
+
1185
+ .battle-image-container.multi-input[data-count="7"] .input-thumbs-grid,
1186
+ .battle-image-container.multi-input[data-count="8"] .input-thumbs-grid,
1187
+ .battle-image-container.multi-input[data-count="9"] .input-thumbs-grid {
1188
+ grid-template-columns: repeat(3, 1fr);
1189
+ grid-template-rows: repeat(3, 1fr);
1190
+ }
1191
+
1192
+ /* Fallback for 10+ images */
1193
+ .battle-image-container.multi-input .input-thumbs-grid {
1194
+ grid-template-columns: repeat(auto-fit, minmax(40px, 1fr));
1195
+ }
1196
+
1197
+ .input-thumb {
1198
+ position: relative;
1199
+ overflow: hidden;
1200
+ border-radius: 2px;
1201
+ background: var(--bg-primary);
1202
+ aspect-ratio: 1;
1203
+ }
1204
+
1205
+ .input-thumb img {
1206
+ width: 100%;
1207
+ height: 100%;
1208
+ object-fit: cover;
1209
+ object-position: center;
1210
+ }
1211
+
1212
+ .image-label {
1213
+ position: absolute;
1214
+ bottom: 4px;
1215
+ left: 4px;
1216
+ font-size: 0.625rem;
1217
+ padding: 2px 4px;
1218
+ background: rgba(0, 0, 0, 0.7);
1219
+ border-radius: 2px;
1220
+ color: #fff;
1221
+ z-index: 1;
1222
+ }
1223
+
1224
+ .battle-meta {
1225
+ display: flex;
1226
+ flex-wrap: wrap;
1227
+ gap: 8px;
1228
+ justify-content: space-between;
1229
+ margin-top: 8px;
1230
+ font-size: 0.75rem;
1231
+ color: var(--text-muted);
1232
+ }
1233
+
1234
+ .battle-meta span {
1235
+ white-space: nowrap;
1236
+ }
1237
+
1238
+ /* ========== Modal ========== */
1239
+ .modal {
1240
+ position: fixed;
1241
+ top: 0;
1242
+ left: 0;
1243
+ right: 0;
1244
+ bottom: 0;
1245
+ z-index: 1000;
1246
+ display: flex;
1247
+ align-items: center;
1248
+ justify-content: center;
1249
+ }
1250
+
1251
+ .modal.hidden {
1252
+ display: none;
1253
+ }
1254
+
1255
+ .modal-backdrop {
1256
+ position: absolute;
1257
+ top: 0;
1258
+ left: 0;
1259
+ right: 0;
1260
+ bottom: 0;
1261
+ background: rgba(0, 0, 0, 0.7);
1262
+ }
1263
+
1264
+ .modal-content {
1265
+ position: relative;
1266
+ background: var(--bg-secondary);
1267
+ border: 1px solid var(--border-color);
1268
+ border-radius: var(--radius-lg);
1269
+ max-width: 1200px;
1270
+ max-height: 90vh;
1271
+ width: 95%;
1272
+ overflow-y: auto;
1273
+ box-shadow: var(--shadow-lg);
1274
+ }
1275
+
1276
+ .modal-content-wide {
1277
+ max-width: 95vw;
1278
+ width: 95vw;
1279
+ }
1280
+
1281
+ .modal-close {
1282
+ position: absolute;
1283
+ top: 12px;
1284
+ right: 12px;
1285
+ width: 32px;
1286
+ height: 32px;
1287
+ border: none;
1288
+ background: var(--bg-tertiary);
1289
+ border-radius: var(--radius-sm);
1290
+ color: var(--text-secondary);
1291
+ font-size: 1.25rem;
1292
+ cursor: pointer;
1293
+ z-index: 10;
1294
+ }
1295
+
1296
+ .modal-close:hover {
1297
+ background: var(--bg-hover);
1298
+ color: var(--text-primary);
1299
+ }
1300
+
1301
+ /* ========== Detail View ========== */
1302
+ .detail-header {
1303
+ padding: 20px;
1304
+ border-bottom: 1px solid var(--border-color);
1305
+ }
1306
+
1307
+ .detail-header h2 {
1308
+ font-size: 1.125rem;
1309
+ margin-bottom: 8px;
1310
+ }
1311
+
1312
+ .detail-meta-info {
1313
+ display: flex;
1314
+ flex-wrap: wrap;
1315
+ gap: 12px;
1316
+ margin-top: 8px;
1317
+ margin-bottom: 8px;
1318
+ }
1319
+
1320
+ .meta-tag {
1321
+ font-size: 0.8125rem;
1322
+ color: var(--text-secondary);
1323
+ background: var(--bg-tertiary);
1324
+ padding: 4px 10px;
1325
+ border-radius: var(--radius-sm);
1326
+ }
1327
+
1328
+ .meta-tag strong {
1329
+ color: var(--text-muted);
1330
+ font-weight: 500;
1331
+ }
1332
+
1333
+ .detail-instruction {
1334
+ font-size: 0.9375rem;
1335
+ color: var(--text-secondary);
1336
+ background: var(--bg-tertiary);
1337
+ padding: 12px;
1338
+ border-radius: var(--radius-sm);
1339
+ margin-top: 12px;
1340
+ }
1341
+
1342
+ .detail-metadata-section {
1343
+ margin-top: 16px;
1344
+ }
1345
+
1346
+ .detail-metadata-section h4 {
1347
+ font-size: 0.75rem;
1348
+ text-transform: uppercase;
1349
+ letter-spacing: 0.05em;
1350
+ color: var(--text-muted);
1351
+ margin-bottom: 8px;
1352
+ }
1353
+
1354
+ .metadata-json {
1355
+ font-family: var(--font-mono);
1356
+ font-size: 0.75rem;
1357
+ line-height: 1.5;
1358
+ white-space: pre-wrap;
1359
+ word-break: break-word;
1360
+ color: var(--text-secondary);
1361
+ background: var(--bg-primary);
1362
+ padding: 12px;
1363
+ border-radius: var(--radius-sm);
1364
+ max-height: 200px;
1365
+ overflow-y: auto;
1366
+ border: 1px solid var(--border-color);
1367
+ }
1368
+
1369
+ .detail-images {
1370
+ display: grid;
1371
+ grid-template-columns: repeat(3, 1fr);
1372
+ gap: 16px;
1373
+ padding: 20px;
1374
+ border-bottom: 1px solid var(--border-color);
1375
+ }
1376
+
1377
+ .detail-image-box {
1378
+ text-align: center;
1379
+ }
1380
+
1381
+ .detail-image-box.input-image {
1382
+ background: var(--bg-tertiary);
1383
+ border-radius: var(--radius-md);
1384
+ padding: 12px;
1385
+ }
1386
+
1387
+ .detail-image-box.output-image {
1388
+ background: var(--bg-tertiary);
1389
+ border: 2px solid var(--border-light);
1390
+ border-radius: var(--radius-md);
1391
+ padding: 12px;
1392
+ position: relative;
1393
+ }
1394
+
1395
+ .detail-image-box.output-image.winner {
1396
+ border-color: var(--accent-green);
1397
+ box-shadow: 0 0 12px rgba(63, 185, 80, 0.2);
1398
+ }
1399
+
1400
+ .detail-image-box.output-image.loser {
1401
+ border-color: var(--accent-red);
1402
+ opacity: 0.85;
1403
+ }
1404
+
1405
+ .detail-image-box h4 {
1406
+ font-size: 0.8125rem;
1407
+ color: var(--text-secondary);
1408
+ margin-bottom: 8px;
1409
+ }
1410
+
1411
+ .detail-image-box.output-image.winner h4 {
1412
+ color: var(--accent-green);
1413
+ }
1414
+
1415
+ .detail-image-box.output-image.loser h4 {
1416
+ color: var(--accent-red);
1417
+ }
1418
+
1419
+ .detail-image-box img {
1420
+ width: 100%;
1421
+ max-height: 400px;
1422
+ object-fit: contain;
1423
+ background: var(--bg-primary);
1424
+ border-radius: var(--radius-sm);
1425
+ cursor: zoom-in;
1426
+ transition: transform 0.2s ease;
1427
+ }
1428
+
1429
+ .detail-image-box img:hover {
1430
+ opacity: 0.9;
1431
+ }
1432
+
1433
+ /* Image Lightbox */
1434
+ .lightbox {
1435
+ position: fixed;
1436
+ top: 0;
1437
+ left: 0;
1438
+ right: 0;
1439
+ bottom: 0;
1440
+ z-index: 2000;
1441
+ background: rgba(0, 0, 0, 0.95);
1442
+ display: flex;
1443
+ align-items: center;
1444
+ justify-content: center;
1445
+ cursor: zoom-out;
1446
+ opacity: 0;
1447
+ visibility: hidden;
1448
+ transition: opacity 0.2s ease, visibility 0.2s ease;
1449
+ }
1450
+
1451
+ .lightbox.active {
1452
+ opacity: 1;
1453
+ visibility: visible;
1454
+ }
1455
+
1456
+ .lightbox img {
1457
+ max-width: 95vw;
1458
+ max-height: 95vh;
1459
+ object-fit: contain;
1460
+ border-radius: var(--radius-md);
1461
+ box-shadow: var(--shadow-lg);
1462
+ }
1463
+
1464
+ .lightbox-close {
1465
+ position: absolute;
1466
+ top: 20px;
1467
+ right: 20px;
1468
+ width: 40px;
1469
+ height: 40px;
1470
+ border: none;
1471
+ background: var(--bg-tertiary);
1472
+ border-radius: 50%;
1473
+ color: var(--text-primary);
1474
+ font-size: 1.5rem;
1475
+ cursor: pointer;
1476
+ display: flex;
1477
+ align-items: center;
1478
+ justify-content: center;
1479
+ }
1480
+
1481
+ .lightbox-close:hover {
1482
+ background: var(--bg-hover);
1483
+ }
1484
+
1485
+ .lightbox-label {
1486
+ position: absolute;
1487
+ bottom: 20px;
1488
+ left: 50%;
1489
+ transform: translateX(-50%);
1490
+ background: var(--bg-tertiary);
1491
+ padding: 8px 16px;
1492
+ border-radius: var(--radius-sm);
1493
+ color: var(--text-primary);
1494
+ font-size: 0.875rem;
1495
+ }
1496
+
1497
+ .detail-vlm-outputs {
1498
+ padding: 20px;
1499
+ }
1500
+
1501
+ .detail-vlm-outputs h3 {
1502
+ font-size: 0.875rem;
1503
+ color: var(--text-muted);
1504
+ margin-bottom: 12px;
1505
+ text-transform: uppercase;
1506
+ letter-spacing: 0.05em;
1507
+ }
1508
+
1509
+ .vlm-call {
1510
+ background: var(--bg-tertiary);
1511
+ border-radius: var(--radius-md);
1512
+ padding: 16px;
1513
+ margin-bottom: 16px;
1514
+ }
1515
+
1516
+ .vlm-call h4 {
1517
+ font-size: 0.8125rem;
1518
+ color: var(--accent-blue);
1519
+ margin-bottom: 8px;
1520
+ }
1521
+
1522
+ .vlm-call-meta {
1523
+ font-size: 0.75rem;
1524
+ color: var(--text-muted);
1525
+ margin-bottom: 12px;
1526
+ }
1527
+
1528
+ .vlm-response {
1529
+ font-family: var(--font-mono);
1530
+ font-size: 0.8125rem;
1531
+ line-height: 1.5;
1532
+ white-space: pre-wrap;
1533
+ word-break: break-word;
1534
+ color: var(--text-secondary);
1535
+ background: var(--bg-primary);
1536
+ padding: 12px;
1537
+ border-radius: var(--radius-sm);
1538
+ max-height: 300px;
1539
+ overflow-y: auto;
1540
+ }
1541
+
1542
+ /* ========== Loading State ========== */
1543
+ .loading {
1544
+ text-align: center;
1545
+ padding: 40px;
1546
+ color: var(--text-muted);
1547
+ }
1548
+
1549
+ .loading::after {
1550
+ content: '';
1551
+ display: inline-block;
1552
+ width: 20px;
1553
+ height: 20px;
1554
+ border: 2px solid var(--border-color);
1555
+ border-top-color: var(--accent-blue);
1556
+ border-radius: 50%;
1557
+ animation: spin 0.8s linear infinite;
1558
+ margin-left: 8px;
1559
+ vertical-align: middle;
1560
+ }
1561
+
1562
+ @keyframes spin {
1563
+ to { transform: rotate(360deg); }
1564
+ }
1565
+
1566
+ /* ========== Favorites Modal ========== */
1567
+ .favorites-modal-header {
1568
+ display: flex;
1569
+ justify-content: space-between;
1570
+ align-items: center;
1571
+ padding: 20px;
1572
+ border-bottom: 1px solid var(--border-color);
1573
+ }
1574
+
1575
+ .favorites-modal-header h2 {
1576
+ font-size: 1.25rem;
1577
+ color: var(--text-primary);
1578
+ }
1579
+
1580
+ /* Favorites Scrollable Container */
1581
+ .favorites-scrollable {
1582
+ max-height: calc(90vh - 80px);
1583
+ overflow-y: auto;
1584
+ padding: 20px;
1585
+ }
1586
+
1587
+ /* Favorites Model Filter - Horizontal Layout */
1588
+ .favorites-model-filter {
1589
+ padding: 16px;
1590
+ background: var(--bg-secondary);
1591
+ border: 1px solid var(--border-color);
1592
+ border-radius: var(--radius-md);
1593
+ margin-bottom: 20px;
1594
+ }
1595
+
1596
+ .favorites-model-filter label {
1597
+ display: block;
1598
+ font-size: 0.875rem;
1599
+ font-weight: 500;
1600
+ margin-bottom: 12px;
1601
+ color: var(--text-primary);
1602
+ }
1603
+
1604
+ /* Horizontal checkbox group for favorites */
1605
+ .checkbox-group-horizontal {
1606
+ display: flex;
1607
+ flex-wrap: wrap;
1608
+ gap: 8px;
1609
+ margin-bottom: 12px;
1610
+ }
1611
+
1612
+ .checkbox-group-horizontal .checkbox-item {
1613
+ display: inline-flex;
1614
+ align-items: center;
1615
+ padding: 6px 12px;
1616
+ background: var(--bg-tertiary);
1617
+ border: 1px solid var(--border-color);
1618
+ border-radius: var(--radius-sm);
1619
+ cursor: pointer;
1620
+ transition: all 0.15s ease;
1621
+ white-space: nowrap;
1622
+ }
1623
+
1624
+ .checkbox-group-horizontal .checkbox-item:hover {
1625
+ background: var(--bg-hover);
1626
+ border-color: var(--accent-blue);
1627
+ }
1628
+
1629
+ .checkbox-group-horizontal .checkbox-item.selected {
1630
+ background: var(--accent-blue);
1631
+ border-color: var(--accent-blue);
1632
+ color: white;
1633
+ }
1634
+
1635
+ .checkbox-group-horizontal .checkbox-item.selected .checkbox-label {
1636
+ color: white;
1637
+ }
1638
+
1639
+ .checkbox-group-horizontal .checkbox-item input[type="checkbox"] {
1640
+ /* Hide the actual checkbox, use styling for selection state */
1641
+ position: absolute;
1642
+ opacity: 0;
1643
+ width: 0;
1644
+ height: 0;
1645
+ }
1646
+
1647
+ .checkbox-group-horizontal .checkbox-item .checkbox-label {
1648
+ font-size: 0.8125rem;
1649
+ color: var(--text-primary);
1650
+ cursor: pointer;
1651
+ margin: 0;
1652
+ }
1653
+
1654
+ /* Inline checkbox actions for favorites */
1655
+ .checkbox-actions-inline {
1656
+ display: flex;
1657
+ gap: 8px;
1658
+ flex-wrap: wrap;
1659
+ }
1660
+
1661
+ .checkbox-actions-inline .btn-small {
1662
+ font-size: 0.75rem;
1663
+ }
1664
+
1665
+ /* Filter controls row - buttons and toggle on same line */
1666
+ .filter-controls-row {
1667
+ display: flex;
1668
+ justify-content: space-between;
1669
+ align-items: center;
1670
+ flex-wrap: wrap;
1671
+ gap: 12px;
1672
+ }
1673
+
1674
+ /* Stats scope toggle */
1675
+ .stats-scope-toggle {
1676
+ display: flex;
1677
+ align-items: center;
1678
+ }
1679
+
1680
+ .stats-scope-toggle .toggle-label {
1681
+ display: flex;
1682
+ align-items: center;
1683
+ cursor: pointer;
1684
+ font-size: 0.8125rem;
1685
+ color: var(--text-secondary);
1686
+ gap: 6px;
1687
+ }
1688
+
1689
+ .stats-scope-toggle .toggle-label input[type="checkbox"] {
1690
+ width: 16px;
1691
+ height: 16px;
1692
+ accent-color: var(--accent-blue);
1693
+ cursor: pointer;
1694
+ }
1695
+
1696
+ .stats-scope-toggle .toggle-text {
1697
+ user-select: none;
1698
+ }
1699
+
1700
+ .stats-scope-toggle .toggle-label:hover .toggle-text {
1701
+ color: var(--text-primary);
1702
+ }
1703
+
1704
+ #favorites-content {
1705
+ /* padding removed as it's in the scrollable container now */
1706
+ }
1707
+
1708
+ .favorites-empty {
1709
+ text-align: center;
1710
+ padding: 60px 20px;
1711
+ color: var(--text-muted);
1712
+ }
1713
+
1714
+ /* Favorite Prompt Card */
1715
+ .favorite-prompt-card {
1716
+ background: var(--bg-tertiary);
1717
+ border: 1px solid var(--border-color);
1718
+ border-radius: var(--radius-md);
1719
+ margin-bottom: 24px;
1720
+ overflow: hidden;
1721
+ }
1722
+
1723
+ .favorite-prompt-header {
1724
+ display: flex;
1725
+ justify-content: space-between;
1726
+ align-items: flex-start;
1727
+ padding: 16px;
1728
+ border-bottom: 1px solid var(--border-color);
1729
+ background: var(--bg-secondary);
1730
+ }
1731
+
1732
+ .favorite-prompt-info {
1733
+ flex: 1;
1734
+ }
1735
+
1736
+ .favorite-prompt-instruction {
1737
+ font-size: 0.9375rem;
1738
+ color: var(--text-primary);
1739
+ margin-bottom: 8px;
1740
+ line-height: 1.5;
1741
+ }
1742
+
1743
+ .favorite-prompt-meta {
1744
+ display: flex;
1745
+ flex-wrap: wrap;
1746
+ gap: 8px;
1747
+ font-size: 0.75rem;
1748
+ color: var(--text-muted);
1749
+ }
1750
+
1751
+ .favorite-prompt-meta span {
1752
+ background: var(--bg-primary);
1753
+ padding: 2px 8px;
1754
+ border-radius: var(--radius-sm);
1755
+ }
1756
+
1757
+ .favorite-prompt-actions {
1758
+ display: flex;
1759
+ gap: 8px;
1760
+ }
1761
+
1762
+ .btn-unfavorite {
1763
+ background: transparent;
1764
+ border: 1px solid var(--accent-red);
1765
+ color: var(--accent-red);
1766
+ padding: 4px 12px;
1767
+ border-radius: var(--radius-sm);
1768
+ font-size: 0.75rem;
1769
+ cursor: pointer;
1770
+ transition: all 0.15s ease;
1771
+ }
1772
+
1773
+ .btn-unfavorite:hover {
1774
+ background: rgba(248, 81, 73, 0.15);
1775
+ }
1776
+
1777
+ /* Favorite Input Images Section */
1778
+ .favorite-input-section {
1779
+ padding: 12px 16px;
1780
+ background: var(--bg-primary);
1781
+ border-bottom: 1px solid var(--border-color);
1782
+ }
1783
+
1784
+ .favorite-input-title {
1785
+ font-size: 0.75rem;
1786
+ text-transform: uppercase;
1787
+ letter-spacing: 0.05em;
1788
+ color: var(--text-muted);
1789
+ margin-bottom: 8px;
1790
+ }
1791
+
1792
+ .favorite-input-images {
1793
+ display: flex;
1794
+ gap: 8px;
1795
+ flex-wrap: wrap;
1796
+ }
1797
+
1798
+ .favorite-input-image {
1799
+ width: 80px;
1800
+ height: 80px;
1801
+ border-radius: var(--radius-sm);
1802
+ overflow: hidden;
1803
+ cursor: zoom-in;
1804
+ border: 1px solid var(--border-color);
1805
+ }
1806
+
1807
+ .favorite-input-image img {
1808
+ width: 100%;
1809
+ height: 100%;
1810
+ object-fit: cover;
1811
+ }
1812
+
1813
+ /* Favorite Models Grid */
1814
+ .favorite-models-section {
1815
+ padding: 16px;
1816
+ }
1817
+
1818
+ .favorite-models-title {
1819
+ font-size: 0.75rem;
1820
+ text-transform: uppercase;
1821
+ letter-spacing: 0.05em;
1822
+ color: var(--text-muted);
1823
+ margin-bottom: 12px;
1824
+ }
1825
+
1826
+ .favorite-models-grid {
1827
+ display: grid;
1828
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1829
+ gap: 12px;
1830
+ }
1831
+
1832
+ .favorite-model-card {
1833
+ background: var(--bg-secondary);
1834
+ border: 1px solid var(--border-color);
1835
+ border-radius: var(--radius-sm);
1836
+ overflow: hidden;
1837
+ transition: all 0.15s ease;
1838
+ }
1839
+
1840
+ .favorite-model-card:hover {
1841
+ border-color: var(--border-light);
1842
+ }
1843
+
1844
+ .favorite-model-card.rank-1 {
1845
+ border-color: var(--accent-yellow);
1846
+ box-shadow: 0 0 8px rgba(210, 153, 34, 0.2);
1847
+ }
1848
+
1849
+ .favorite-model-card.rank-2 {
1850
+ border-color: var(--text-muted);
1851
+ }
1852
+
1853
+ .favorite-model-card.rank-3 {
1854
+ border-color: #cd7f32;
1855
+ }
1856
+
1857
+ .favorite-model-image {
1858
+ aspect-ratio: 1;
1859
+ width: 100%;
1860
+ overflow: hidden;
1861
+ cursor: zoom-in;
1862
+ background: var(--bg-primary);
1863
+ }
1864
+
1865
+ .favorite-model-image img {
1866
+ width: 100%;
1867
+ height: 100%;
1868
+ object-fit: cover;
1869
+ transition: transform 0.2s ease;
1870
+ }
1871
+
1872
+ .favorite-model-image:hover img {
1873
+ transform: scale(1.05);
1874
+ }
1875
+
1876
+ .favorite-model-info {
1877
+ padding: 8px;
1878
+ border-top: 1px solid var(--border-color);
1879
+ }
1880
+
1881
+ .favorite-model-name {
1882
+ font-family: var(--font-mono);
1883
+ font-size: 0.75rem;
1884
+ color: var(--text-primary);
1885
+ margin-bottom: 4px;
1886
+ white-space: nowrap;
1887
+ overflow: hidden;
1888
+ text-overflow: ellipsis;
1889
+ }
1890
+
1891
+ .favorite-model-rank {
1892
+ display: inline-block;
1893
+ margin-right: 4px;
1894
+ font-size: 0.6875rem;
1895
+ }
1896
+
1897
+ .favorite-model-rank.rank-1 {
1898
+ color: var(--accent-yellow);
1899
+ }
1900
+
1901
+ .favorite-model-rank.rank-2 {
1902
+ color: var(--text-muted);
1903
+ }
1904
+
1905
+ .favorite-model-rank.rank-3 {
1906
+ color: #cd7f32;
1907
+ }
1908
+
1909
+ .favorite-model-stats {
1910
+ font-size: 0.6875rem;
1911
+ color: var(--text-muted);
1912
+ }
1913
+
1914
+ .favorite-model-stats .win-rate {
1915
+ color: var(--accent-green);
1916
+ font-weight: 600;
1917
+ }
1918
+
1919
+ .favorite-model-stats .wins {
1920
+ color: var(--accent-green);
1921
+ }
1922
+
1923
+ .favorite-model-stats .losses {
1924
+ color: var(--accent-red);
1925
+ }
1926
+
1927
+ .favorite-model-stats .ties {
1928
+ color: var(--accent-yellow);
1929
+ }
1930
+
1931
+ /* Battle Card Favorite Button */
1932
+ .battle-card-header {
1933
+ display: flex;
1934
+ justify-content: space-between;
1935
+ align-items: flex-start;
1936
+ margin-bottom: 12px;
1937
+ }
1938
+
1939
+ .btn-favorite-toggle {
1940
+ background: transparent;
1941
+ border: none;
1942
+ font-size: 1.25rem;
1943
+ cursor: pointer;
1944
+ color: var(--text-muted);
1945
+ padding: 4px;
1946
+ line-height: 1;
1947
+ transition: all 0.15s ease;
1948
+ }
1949
+
1950
+ .btn-favorite-toggle:hover {
1951
+ color: var(--accent-yellow);
1952
+ transform: scale(1.1);
1953
+ }
1954
+
1955
+ .btn-favorite-toggle.favorited {
1956
+ color: var(--accent-yellow);
1957
+ }
1958
+
1959
+ /* Favorites loading state */
1960
+ .favorite-loading {
1961
+ display: flex;
1962
+ flex-direction: column;
1963
+ align-items: center;
1964
+ justify-content: center;
1965
+ padding: 40px;
1966
+ color: var(--text-muted);
1967
+ }
1968
+
1969
+ .favorite-loading::after {
1970
+ content: '';
1971
+ display: block;
1972
+ width: 30px;
1973
+ height: 30px;
1974
+ border: 3px solid var(--border-color);
1975
+ border-top-color: var(--accent-blue);
1976
+ border-radius: 50%;
1977
+ animation: spin 0.8s linear infinite;
1978
+ margin-top: 12px;
1979
+ }
1980
+
1981
+ /* ========== Prompts View ========== */
1982
+ .prompts-list {
1983
+ display: flex;
1984
+ flex-direction: column;
1985
+ gap: 24px;
1986
+ }
1987
+
1988
+ /* Prompt Card - similar to favorite-prompt-card but standalone */
1989
+ .prompt-card {
1990
+ background: var(--bg-secondary);
1991
+ border: 1px solid var(--border-color);
1992
+ border-radius: var(--radius-md);
1993
+ overflow: hidden;
1994
+ transition: all 0.15s ease;
1995
+ }
1996
+
1997
+ .prompt-card:hover {
1998
+ border-color: var(--border-light);
1999
+ }
2000
+
2001
+ .prompt-card-header {
2002
+ display: flex;
2003
+ justify-content: space-between;
2004
+ align-items: flex-start;
2005
+ padding: 16px;
2006
+ border-bottom: 1px solid var(--border-color);
2007
+ background: var(--bg-tertiary);
2008
+ }
2009
+
2010
+ .prompt-card-info {
2011
+ flex: 1;
2012
+ }
2013
+
2014
+ .prompt-card-instruction {
2015
+ font-size: 0.9375rem;
2016
+ color: var(--text-primary);
2017
+ margin-bottom: 8px;
2018
+ line-height: 1.5;
2019
+ }
2020
+
2021
+ .prompt-card-meta {
2022
+ display: flex;
2023
+ flex-wrap: wrap;
2024
+ gap: 8px;
2025
+ font-size: 0.75rem;
2026
+ color: var(--text-muted);
2027
+ }
2028
+
2029
+ .prompt-card-meta span {
2030
+ background: var(--bg-primary);
2031
+ padding: 2px 8px;
2032
+ border-radius: var(--radius-sm);
2033
+ }
2034
+
2035
+ .prompt-card-actions {
2036
+ display: flex;
2037
+ gap: 8px;
2038
+ }
2039
+
2040
+ /* Prompt Input Images */
2041
+ .prompt-input-section {
2042
+ padding: 12px 16px;
2043
+ background: var(--bg-primary);
2044
+ border-bottom: 1px solid var(--border-color);
2045
+ }
2046
+
2047
+ .prompt-input-title {
2048
+ font-size: 0.75rem;
2049
+ text-transform: uppercase;
2050
+ letter-spacing: 0.05em;
2051
+ color: var(--text-muted);
2052
+ margin-bottom: 8px;
2053
+ }
2054
+
2055
+ .prompt-input-images {
2056
+ display: flex;
2057
+ gap: 8px;
2058
+ flex-wrap: wrap;
2059
+ }
2060
+
2061
+ .prompt-input-image {
2062
+ width: 100px;
2063
+ height: 100px;
2064
+ border-radius: var(--radius-sm);
2065
+ overflow: hidden;
2066
+ cursor: zoom-in;
2067
+ border: 1px solid var(--border-color);
2068
+ background: var(--bg-secondary);
2069
+ }
2070
+
2071
+ .prompt-input-image img {
2072
+ width: 100%;
2073
+ height: 100%;
2074
+ object-fit: cover;
2075
+ }
2076
+
2077
+ /* Prompt Models Grid */
2078
+ .prompt-models-section {
2079
+ padding: 16px;
2080
+ }
2081
+
2082
+ .prompt-models-title {
2083
+ font-size: 0.75rem;
2084
+ text-transform: uppercase;
2085
+ letter-spacing: 0.05em;
2086
+ color: var(--text-muted);
2087
+ margin-bottom: 12px;
2088
+ }
2089
+
2090
+ .prompt-models-grid {
2091
+ display: grid;
2092
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
2093
+ gap: 12px;
2094
+ }
2095
+
2096
+ .prompt-model-card {
2097
+ background: var(--bg-tertiary);
2098
+ border: 1px solid var(--border-color);
2099
+ border-radius: var(--radius-sm);
2100
+ overflow: hidden;
2101
+ transition: all 0.15s ease;
2102
+ }
2103
+
2104
+ .prompt-model-card:hover {
2105
+ border-color: var(--border-light);
2106
+ }
2107
+
2108
+ .prompt-model-card.rank-1 {
2109
+ border-color: var(--accent-yellow);
2110
+ box-shadow: 0 0 8px rgba(210, 153, 34, 0.2);
2111
+ }
2112
+
2113
+ .prompt-model-card.rank-2 {
2114
+ border-color: var(--text-muted);
2115
+ }
2116
+
2117
+ .prompt-model-card.rank-3 {
2118
+ border-color: #cd7f32;
2119
+ }
2120
+
2121
+ .prompt-model-image {
2122
+ aspect-ratio: 1;
2123
+ width: 100%;
2124
+ overflow: hidden;
2125
+ cursor: zoom-in;
2126
+ background: var(--bg-primary);
2127
+ }
2128
+
2129
+ .prompt-model-image img {
2130
+ width: 100%;
2131
+ height: 100%;
2132
+ object-fit: cover;
2133
+ transition: transform 0.2s ease;
2134
+ }
2135
+
2136
+ .prompt-model-image:hover img {
2137
+ transform: scale(1.05);
2138
+ }
2139
+
2140
+ .prompt-model-info {
2141
+ padding: 8px;
2142
+ border-top: 1px solid var(--border-color);
2143
+ }
2144
+
2145
+ .prompt-model-name {
2146
+ font-family: var(--font-mono);
2147
+ font-size: 0.75rem;
2148
+ color: var(--text-primary);
2149
+ margin-bottom: 4px;
2150
+ white-space: nowrap;
2151
+ overflow: hidden;
2152
+ text-overflow: ellipsis;
2153
+ }
2154
+
2155
+ .prompt-model-rank {
2156
+ display: inline-block;
2157
+ margin-right: 4px;
2158
+ font-size: 0.75rem;
2159
+ }
2160
+
2161
+ .prompt-model-rank.rank-1 {
2162
+ color: var(--accent-yellow);
2163
+ }
2164
+
2165
+ .prompt-model-rank.rank-2 {
2166
+ color: var(--text-muted);
2167
+ }
2168
+
2169
+ .prompt-model-rank.rank-3 {
2170
+ color: #cd7f32;
2171
+ }
2172
+
2173
+ .prompt-model-stats {
2174
+ font-size: 0.6875rem;
2175
+ color: var(--text-muted);
2176
+ }
2177
+
2178
+ .prompt-model-stats .win-rate {
2179
+ color: var(--accent-green);
2180
+ font-weight: 600;
2181
+ }
2182
+
2183
+ .prompt-model-stats .wins {
2184
+ color: var(--accent-green);
2185
+ }
2186
+
2187
+ .prompt-model-stats .losses {
2188
+ color: var(--accent-red);
2189
+ }
2190
+
2191
+ .prompt-model-stats .ties {
2192
+ color: var(--accent-yellow);
2193
+ }
2194
+
2195
+ /* ========== Clickable Model Name ========== */
2196
+ .prompt-model-name.clickable {
2197
+ cursor: pointer;
2198
+ transition: color 0.2s ease;
2199
+ }
2200
+
2201
+ .prompt-model-name.clickable:hover {
2202
+ color: var(--accent-blue);
2203
+ text-decoration: underline;
2204
+ }
2205
+
2206
+ /* ========== Model Battles Modal ========== */
2207
+ .model-battles-modal {
2208
+ max-height: 80vh;
2209
+ overflow-y: auto;
2210
+ padding: 20px;
2211
+ }
2212
+
2213
+ .model-battles-header {
2214
+ margin-bottom: 20px;
2215
+ padding-bottom: 12px;
2216
+ border-bottom: 1px solid var(--border-color);
2217
+ }
2218
+
2219
+ .model-battles-header h2 {
2220
+ margin: 0 0 4px 0;
2221
+ font-size: 1.25rem;
2222
+ color: var(--text-primary);
2223
+ }
2224
+
2225
+ .model-battles-subtitle {
2226
+ margin: 0 0 8px 0;
2227
+ font-size: 0.875rem;
2228
+ color: var(--text-muted);
2229
+ }
2230
+
2231
+ .model-battles-stats {
2232
+ display: flex;
2233
+ flex-wrap: wrap;
2234
+ gap: 16px;
2235
+ font-size: 0.875rem;
2236
+ }
2237
+
2238
+ .model-battles-stats .stat-item {
2239
+ color: var(--text-secondary);
2240
+ }
2241
+
2242
+ .model-battles-filter {
2243
+ background: var(--bg-card);
2244
+ border-radius: 8px;
2245
+ padding: 12px;
2246
+ margin-bottom: 16px;
2247
+ }
2248
+
2249
+ .model-battles-filter .filter-header {
2250
+ display: flex;
2251
+ justify-content: space-between;
2252
+ align-items: center;
2253
+ margin-bottom: 12px;
2254
+ }
2255
+
2256
+ .model-battles-filter .filter-header h4 {
2257
+ margin: 0;
2258
+ font-size: 0.875rem;
2259
+ color: var(--text-primary);
2260
+ }
2261
+
2262
+ .model-battles-filter .filter-actions {
2263
+ display: flex;
2264
+ gap: 8px;
2265
+ }
2266
+
2267
+ .opponent-checkboxes {
2268
+ display: flex;
2269
+ flex-wrap: wrap;
2270
+ gap: 8px;
2271
+ max-height: 150px;
2272
+ overflow-y: auto;
2273
+ }
2274
+
2275
+ .opponent-checkbox {
2276
+ display: flex;
2277
+ align-items: center;
2278
+ gap: 4px;
2279
+ background: var(--bg-main);
2280
+ padding: 4px 8px;
2281
+ border-radius: 4px;
2282
+ font-size: 0.75rem;
2283
+ cursor: pointer;
2284
+ white-space: nowrap;
2285
+ }
2286
+
2287
+ .opponent-checkbox input {
2288
+ cursor: pointer;
2289
+ }
2290
+
2291
+ .opponent-checkbox span {
2292
+ color: var(--text-secondary);
2293
+ }
2294
+
2295
+ .opponent-checkbox:hover {
2296
+ background: var(--bg-hover);
2297
+ }
2298
+
2299
+ .model-battles-list {
2300
+ margin-top: 16px;
2301
+ }
2302
+
2303
+ .model-battles-list h4 {
2304
+ margin: 0 0 12px 0;
2305
+ font-size: 0.875rem;
2306
+ color: var(--text-primary);
2307
+ }
2308
+
2309
+ /* Battle Record Cards */
2310
+ .battle-records-container {
2311
+ display: flex;
2312
+ flex-direction: column;
2313
+ gap: 8px;
2314
+ }
2315
+
2316
+ .battle-record-card {
2317
+ background: var(--bg-card);
2318
+ border-radius: 8px;
2319
+ border: 1px solid var(--border-color);
2320
+ overflow: hidden;
2321
+ }
2322
+
2323
+ .battle-record-header {
2324
+ display: flex;
2325
+ justify-content: space-between;
2326
+ align-items: center;
2327
+ padding: 12px 16px;
2328
+ cursor: pointer;
2329
+ transition: background-color 0.2s ease;
2330
+ }
2331
+
2332
+ .battle-record-header:hover {
2333
+ background: var(--bg-hover);
2334
+ }
2335
+
2336
+ .battle-record-info {
2337
+ display: flex;
2338
+ align-items: center;
2339
+ gap: 12px;
2340
+ flex-wrap: wrap;
2341
+ }
2342
+
2343
+ .battle-opponent {
2344
+ font-weight: 500;
2345
+ color: var(--text-primary);
2346
+ font-size: 0.875rem;
2347
+ }
2348
+
2349
+ .expand-icon {
2350
+ color: var(--text-muted);
2351
+ font-size: 0.75rem;
2352
+ transition: transform 0.2s ease;
2353
+ }
2354
+
2355
+ .battle-record-card.expanded .expand-icon {
2356
+ transform: rotate(180deg);
2357
+ }
2358
+
2359
+ /* Judge Outputs Section */
2360
+ .battle-card-judge-outputs {
2361
+ display: none;
2362
+ padding: 12px 16px 16px;
2363
+ border-top: 1px solid var(--border-color);
2364
+ background: var(--bg-main);
2365
+ }
2366
+
2367
+ .battle-record-card.expanded .battle-card-judge-outputs {
2368
+ display: block;
2369
+ }
2370
+
2371
+ .judge-outputs-title {
2372
+ font-size: 0.8125rem;
2373
+ font-weight: 600;
2374
+ color: var(--text-primary);
2375
+ margin-bottom: 12px;
2376
+ }
2377
+
2378
+ .judge-call {
2379
+ background: var(--bg-card);
2380
+ border-radius: 6px;
2381
+ padding: 12px;
2382
+ margin-bottom: 10px;
2383
+ }
2384
+
2385
+ .judge-call:last-child {
2386
+ margin-bottom: 0;
2387
+ }
2388
+
2389
+ .judge-call-header {
2390
+ display: flex;
2391
+ align-items: center;
2392
+ gap: 8px;
2393
+ margin-bottom: 8px;
2394
+ }
2395
+
2396
+ .judge-call-label {
2397
+ font-size: 0.75rem;
2398
+ font-weight: 600;
2399
+ color: var(--accent-blue);
2400
+ text-transform: uppercase;
2401
+ }
2402
+
2403
+ .judge-call-order {
2404
+ font-size: 0.75rem;
2405
+ color: var(--text-muted);
2406
+ }
2407
+
2408
+ .judge-call-meta {
2409
+ font-size: 0.75rem;
2410
+ color: var(--text-secondary);
2411
+ margin-bottom: 8px;
2412
+ }
2413
+
2414
+ .judge-call-response {
2415
+ font-size: 0.75rem;
2416
+ color: var(--text-secondary);
2417
+ background: var(--bg-main);
2418
+ padding: 10px;
2419
+ border-radius: 4px;
2420
+ white-space: pre-wrap;
2421
+ word-break: break-word;
2422
+ max-height: 200px;
2423
+ overflow-y: auto;
2424
+ line-height: 1.5;
2425
+ font-family: var(--font-mono);
2426
+ }
2427
+
2428
+ .battles-table {
2429
+ width: 100%;
2430
+ border-collapse: collapse;
2431
+ font-size: 0.8125rem;
2432
+ }
2433
+
2434
+ .battles-table th,
2435
+ .battles-table td {
2436
+ padding: 8px 12px;
2437
+ text-align: left;
2438
+ border-bottom: 1px solid var(--border-color);
2439
+ }
2440
+
2441
+ .battles-table th {
2442
+ background: var(--bg-card);
2443
+ color: var(--text-primary);
2444
+ font-weight: 600;
2445
+ }
2446
+
2447
+ .battles-table td {
2448
+ color: var(--text-secondary);
2449
+ }
2450
+
2451
+ .battles-table tbody tr:hover {
2452
+ background: var(--bg-hover);
2453
+ }
2454
+
2455
+ .badge.result-win {
2456
+ background: rgba(16, 185, 129, 0.2);
2457
+ color: var(--accent-green);
2458
+ }
2459
+
2460
+ .badge.result-loss {
2461
+ background: rgba(239, 68, 68, 0.2);
2462
+ color: var(--accent-red);
2463
+ }
2464
+
2465
+ .badge.result-tie {
2466
+ background: rgba(245, 158, 11, 0.2);
2467
+ color: var(--accent-yellow);
2468
+ }
2469
+
2470
+ /* ========== Responsive ========== */
2471
+ @media (max-width: 1024px) {
2472
+ .sidebar {
2473
+ width: 240px;
2474
+ }
2475
+
2476
+ .battle-images {
2477
+ grid-template-columns: repeat(2, 1fr);
2478
+ }
2479
+
2480
+ .detail-images {
2481
+ grid-template-columns: repeat(2, 1fr);
2482
+ }
2483
+ }
2484
+
2485
+ @media (max-width: 768px) {
2486
+ .header {
2487
+ flex-direction: column;
2488
+ gap: 12px;
2489
+ padding: 12px 16px;
2490
+ }
2491
+
2492
+ .header-center {
2493
+ flex-direction: column;
2494
+ width: 100%;
2495
+ }
2496
+
2497
+ .selector-group {
2498
+ width: 100%;
2499
+ }
2500
+
2501
+ .selector {
2502
+ flex: 1;
2503
+ }
2504
+
2505
+ .main-container {
2506
+ flex-direction: column;
2507
+ }
2508
+
2509
+ .sidebar {
2510
+ width: 100%;
2511
+ border-right: none;
2512
+ border-bottom: 1px solid var(--border-color);
2513
+ }
2514
+
2515
+ .battle-images,
2516
+ .detail-images {
2517
+ grid-template-columns: 1fr;
2518
+ }
2519
+ }
2520
+
2521
+ /* ========== Opponent Sections (Collapsible) ========== */
2522
+ .model-battles-hint {
2523
+ font-size: 0.75rem;
2524
+ color: var(--text-muted);
2525
+ margin-bottom: 12px;
2526
+ font-style: italic;
2527
+ }
2528
+
2529
+ .opponent-sections-container {
2530
+ display: flex;
2531
+ flex-direction: column;
2532
+ gap: 8px;
2533
+ }
2534
+
2535
+ .opponent-section {
2536
+ background: var(--bg-tertiary);
2537
+ border: 1px solid var(--border-color);
2538
+ border-radius: var(--radius-md);
2539
+ overflow: hidden;
2540
+ }
2541
+
2542
+ .opponent-section.hidden {
2543
+ display: none;
2544
+ }
2545
+
2546
+ .opponent-section-header {
2547
+ display: flex;
2548
+ justify-content: space-between;
2549
+ align-items: center;
2550
+ padding: 12px 16px;
2551
+ cursor: pointer;
2552
+ transition: background-color 0.2s ease;
2553
+ user-select: none;
2554
+ }
2555
+
2556
+ .opponent-section-header:hover {
2557
+ background: var(--bg-hover);
2558
+ }
2559
+
2560
+ .opponent-section-info {
2561
+ display: flex;
2562
+ align-items: center;
2563
+ gap: 16px;
2564
+ flex-wrap: wrap;
2565
+ }
2566
+
2567
+ .opponent-name {
2568
+ font-weight: 600;
2569
+ font-size: 0.9375rem;
2570
+ color: var(--text-primary);
2571
+ }
2572
+
2573
+ .opponent-name.result-win {
2574
+ color: var(--accent-green);
2575
+ }
2576
+
2577
+ .opponent-name.result-loss {
2578
+ color: var(--accent-red);
2579
+ }
2580
+
2581
+ .opponent-name.result-tie {
2582
+ color: var(--accent-yellow);
2583
+ }
2584
+
2585
+ .opponent-stats {
2586
+ font-size: 0.8125rem;
2587
+ color: var(--text-secondary);
2588
+ font-family: var(--font-mono);
2589
+ }
2590
+
2591
+ .opponent-stats .wins {
2592
+ color: var(--accent-green);
2593
+ }
2594
+
2595
+ .opponent-stats .losses {
2596
+ color: var(--accent-red);
2597
+ }
2598
+
2599
+ .opponent-stats .ties {
2600
+ color: var(--accent-yellow);
2601
+ }
2602
+
2603
+ .opponent-section .expand-icon {
2604
+ color: var(--text-muted);
2605
+ font-size: 0.875rem;
2606
+ transition: transform 0.2s ease;
2607
+ }
2608
+
2609
+ .opponent-section.expanded .expand-icon {
2610
+ transform: rotate(180deg);
2611
+ }
2612
+
2613
+ .opponent-section-content {
2614
+ display: none;
2615
+ padding: 0 16px 16px;
2616
+ border-top: 1px solid var(--border-color);
2617
+ background: var(--bg-secondary);
2618
+ }
2619
+
2620
+ .opponent-section.expanded .opponent-section-content {
2621
+ display: block;
2622
+ }
2623
+
2624
+ /* Battle Record Item (inside opponent section) */
2625
+ .battle-record-item {
2626
+ background: var(--bg-tertiary);
2627
+ border-radius: var(--radius-sm);
2628
+ padding: 12px;
2629
+ margin-top: 12px;
2630
+ }
2631
+
2632
+ .battle-record-item:first-child {
2633
+ margin-top: 16px;
2634
+ }
2635
+
2636
+ .battle-record-item-header {
2637
+ display: flex;
2638
+ align-items: center;
2639
+ gap: 8px;
2640
+ flex-wrap: wrap;
2641
+ margin-bottom: 12px;
2642
+ }
2643
+
2644
+ .battle-exp-name {
2645
+ font-size: 0.75rem;
2646
+ color: var(--text-muted);
2647
+ background: var(--bg-primary);
2648
+ padding: 2px 6px;
2649
+ border-radius: var(--radius-sm);
2650
+ }
2651
+
2652
+ /* Battle Judge Outputs (inside battle record item) */
2653
+ .battle-judge-outputs {
2654
+ display: flex;
2655
+ flex-direction: column;
2656
+ gap: 12px;
2657
+ }
2658
+
2659
+ .battle-judge-outputs .judge-call {
2660
+ background: var(--bg-primary);
2661
+ border-radius: var(--radius-sm);
2662
+ padding: 12px;
2663
+ margin-bottom: 0;
2664
+ }
2665
+
2666
+ .battle-judge-outputs .placeholder {
2667
+ font-size: 0.75rem;
2668
+ color: var(--text-muted);
2669
+ font-style: italic;
2670
+ padding: 8px;
2671
+ text-align: center;
2672
+ }
2673
+
2674
+
2675
+ /* ========== Search Box ========== */
2676
+ .search-box {
2677
+ display: flex;
2678
+ align-items: center;
2679
+ gap: 4px;
2680
+ }
2681
+
2682
+ .search-input {
2683
+ width: 200px;
2684
+ padding: 6px 12px;
2685
+ background: var(--bg-tertiary);
2686
+ border: 1px solid var(--border-color);
2687
+ border-radius: var(--radius-sm);
2688
+ color: var(--text-primary);
2689
+ font-size: 0.875rem;
2690
+ }
2691
+
2692
+ .search-input:focus {
2693
+ outline: none;
2694
+ border-color: var(--accent-blue);
2695
+ }
2696
+
2697
+ .search-input::placeholder {
2698
+ color: var(--text-muted);
2699
+ }
2700
+
2701
+ .search-btn, .clear-search-btn {
2702
+ padding: 6px 10px;
2703
+ min-width: auto;
2704
+ }
2705
+
2706
+ .clear-search-btn {
2707
+ color: var(--accent-red);
2708
+ }
2709
+
2710
+ /* Search results highlight */
2711
+ .search-highlight {
2712
+ background: rgba(88, 166, 255, 0.3);
2713
+ padding: 0 2px;
2714
+ border-radius: 2px;
2715
+ }
2716
+
2717
+ /* ========== Compare View ========== */
2718
+ .compare-list {
2719
+ display: flex;
2720
+ flex-direction: column;
2721
+ gap: 16px;
2722
+ }
2723
+
2724
+ .compare-controls {
2725
+ display: flex;
2726
+ justify-content: center;
2727
+ padding: 16px;
2728
+ background: var(--bg-secondary);
2729
+ border-radius: var(--radius-md);
2730
+ border: 1px solid var(--border-color);
2731
+ }
2732
+
2733
+ .compare-input-group {
2734
+ display: flex;
2735
+ align-items: center;
2736
+ gap: 12px;
2737
+ }
2738
+
2739
+ .compare-input-group label {
2740
+ color: var(--text-secondary);
2741
+ font-size: 0.875rem;
2742
+ }
2743
+
2744
+ .compare-sample-input {
2745
+ width: 120px;
2746
+ padding: 8px 12px;
2747
+ background: var(--bg-tertiary);
2748
+ border: 1px solid var(--border-color);
2749
+ border-radius: var(--radius-sm);
2750
+ color: var(--text-primary);
2751
+ font-size: 0.875rem;
2752
+ }
2753
+
2754
+ .compare-content {
2755
+ padding: 16px;
2756
+ }
2757
+
2758
+ .compare-grid {
2759
+ display: grid;
2760
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
2761
+ gap: 16px;
2762
+ }
2763
+
2764
+ .compare-model-card {
2765
+ background: var(--bg-secondary);
2766
+ border: 2px solid var(--border-color);
2767
+ border-radius: var(--radius-md);
2768
+ overflow: hidden;
2769
+ transition: all 0.15s ease;
2770
+ cursor: pointer;
2771
+ }
2772
+
2773
+ .compare-model-card:hover {
2774
+ border-color: var(--accent-blue);
2775
+ }
2776
+
2777
+ .compare-model-card.rank-1 {
2778
+ border-color: var(--accent-yellow);
2779
+ box-shadow: 0 0 12px rgba(210, 153, 34, 0.3);
2780
+ }
2781
+
2782
+ .compare-model-card.rank-2 {
2783
+ border-color: #c0c0c0;
2784
+ }
2785
+
2786
+ .compare-model-card.rank-3 {
2787
+ border-color: #cd7f32;
2788
+ }
2789
+
2790
+ .compare-model-card.selected {
2791
+ border-color: var(--accent-purple);
2792
+ box-shadow: 0 0 12px rgba(163, 113, 247, 0.3);
2793
+ }
2794
+
2795
+ .compare-model-image {
2796
+ aspect-ratio: 1;
2797
+ width: 100%;
2798
+ overflow: hidden;
2799
+ background: var(--bg-primary);
2800
+ }
2801
+
2802
+ .compare-model-image img {
2803
+ width: 100%;
2804
+ height: 100%;
2805
+ object-fit: cover;
2806
+ }
2807
+
2808
+ .compare-model-info {
2809
+ padding: 12px;
2810
+ border-top: 1px solid var(--border-color);
2811
+ }
2812
+
2813
+ .compare-model-name {
2814
+ font-family: var(--font-mono);
2815
+ font-size: 0.875rem;
2816
+ color: var(--text-primary);
2817
+ margin-bottom: 4px;
2818
+ }
2819
+
2820
+ .compare-model-stats {
2821
+ font-size: 0.75rem;
2822
+ color: var(--text-muted);
2823
+ }
2824
+
2825
+ .compare-model-stats .win-rate {
2826
+ color: var(--accent-green);
2827
+ font-weight: 600;
2828
+ }
2829
+
2830
+ /* Compare header info */
2831
+ .compare-header-info {
2832
+ background: var(--bg-tertiary);
2833
+ padding: 16px;
2834
+ border-radius: var(--radius-md);
2835
+ margin-bottom: 16px;
2836
+ }
2837
+
2838
+ .compare-header-info h3 {
2839
+ font-size: 1rem;
2840
+ margin-bottom: 8px;
2841
+ }
2842
+
2843
+ .compare-header-info .instruction {
2844
+ color: var(--text-secondary);
2845
+ font-size: 0.875rem;
2846
+ line-height: 1.5;
2847
+ }
2848
+
2849
+ /* ========== ELO Actions ========== */
2850
+ .elo-actions {
2851
+ display: flex;
2852
+ gap: 4px;
2853
+ margin-top: 12px;
2854
+ flex-wrap: wrap;
2855
+ }
2856
+
2857
+ .elo-actions .btn {
2858
+ flex: 1;
2859
+ min-width: 60px;
2860
+ font-size: 0.6875rem;
2861
+ padding: 4px 6px;
2862
+ }
2863
+
2864
+ /* ========== Multi-Subset Modal ========== */
2865
+ .multi-subset-header {
2866
+ padding: 20px;
2867
+ border-bottom: 1px solid var(--border-color);
2868
+ }
2869
+
2870
+ .multi-subset-header h2 {
2871
+ margin: 0;
2872
+ font-size: 1.25rem;
2873
+ }
2874
+
2875
+ .multi-subset-body {
2876
+ padding: 20px;
2877
+ }
2878
+
2879
+ .multi-subset-selection {
2880
+ margin-bottom: 20px;
2881
+ }
2882
+
2883
+ .multi-subset-selection h4 {
2884
+ font-size: 0.875rem;
2885
+ color: var(--text-secondary);
2886
+ margin-bottom: 12px;
2887
+ }
2888
+
2889
+ .multi-subset-info {
2890
+ background: var(--bg-tertiary);
2891
+ padding: 12px 16px;
2892
+ border-radius: var(--radius-sm);
2893
+ margin-bottom: 16px;
2894
+ }
2895
+
2896
+ .multi-subset-info p {
2897
+ margin: 4px 0;
2898
+ font-size: 0.875rem;
2899
+ color: var(--text-secondary);
2900
+ }
2901
+
2902
+ .multi-subset-info span {
2903
+ font-family: var(--font-mono);
2904
+ color: var(--accent-blue);
2905
+ }
2906
+
2907
+ .multi-subset-options {
2908
+ margin-bottom: 16px;
2909
+ display: flex;
2910
+ align-items: center;
2911
+ gap: 16px;
2912
+ }
2913
+
2914
+ .multi-subset-options label:first-child {
2915
+ color: var(--text-secondary);
2916
+ font-size: 0.875rem;
2917
+ }
2918
+
2919
+ .radio-label {
2920
+ display: flex;
2921
+ align-items: center;
2922
+ gap: 4px;
2923
+ font-size: 0.875rem;
2924
+ color: var(--text-primary);
2925
+ cursor: pointer;
2926
+ }
2927
+
2928
+ .radio-label input[type="radio"] {
2929
+ accent-color: var(--accent-blue);
2930
+ }
2931
+
2932
+ .multi-subset-results {
2933
+ border-top: 1px solid var(--border-color);
2934
+ padding: 20px;
2935
+ margin-top: 20px;
2936
+ }
2937
+
2938
+ .multi-subset-results h3 {
2939
+ font-size: 0.875rem;
2940
+ color: var(--text-muted);
2941
+ text-transform: uppercase;
2942
+ letter-spacing: 0.05em;
2943
+ margin-bottom: 16px;
2944
+ }
2945
+
2946
+ /* Subset tag for showing model presence */
2947
+ .subset-tag {
2948
+ display: inline-block;
2949
+ font-size: 0.5625rem;
2950
+ padding: 2px 4px;
2951
+ background: var(--bg-primary);
2952
+ border-radius: 2px;
2953
+ margin-left: 4px;
2954
+ color: var(--text-muted);
2955
+ }
2956
+
2957
+ /* ========== Win Rate Matrix Modal ========== */
2958
+ .matrix-modal-header {
2959
+ display: flex;
2960
+ justify-content: space-between;
2961
+ align-items: center;
2962
+ padding: 20px;
2963
+ border-bottom: 1px solid var(--border-color);
2964
+ }
2965
+
2966
+ .matrix-modal-header h2 {
2967
+ margin: 0;
2968
+ font-size: 1.25rem;
2969
+ }
2970
+
2971
+ .matrix-content {
2972
+ padding: 20px;
2973
+ overflow-x: auto;
2974
+ }
2975
+
2976
+ .matrix-table-container {
2977
+ overflow-x: auto;
2978
+ max-width: 100%;
2979
+ }
2980
+
2981
+ .matrix-table {
2982
+ border-collapse: collapse;
2983
+ font-size: 0.75rem;
2984
+ }
2985
+
2986
+ .matrix-table th,
2987
+ .matrix-table td {
2988
+ padding: 8px;
2989
+ text-align: center;
2990
+ border: 1px solid var(--border-color);
2991
+ min-width: 60px;
2992
+ }
2993
+
2994
+ .matrix-table th {
2995
+ background: var(--bg-tertiary);
2996
+ color: var(--text-secondary);
2997
+ font-weight: 600;
2998
+ position: sticky;
2999
+ }
3000
+
3001
+ .matrix-table th:first-child {
3002
+ left: 0;
3003
+ z-index: 2;
3004
+ }
3005
+
3006
+ .matrix-table thead th {
3007
+ top: 0;
3008
+ z-index: 1;
3009
+ }
3010
+
3011
+ .matrix-table thead th:first-child {
3012
+ z-index: 3;
3013
+ }
3014
+
3015
+ .matrix-table tbody th {
3016
+ text-align: right;
3017
+ background: var(--bg-tertiary);
3018
+ left: 0;
3019
+ z-index: 1;
3020
+ }
3021
+
3022
+ .matrix-cell {
3023
+ font-family: var(--font-mono);
3024
+ font-size: 0.6875rem;
3025
+ cursor: pointer;
3026
+ transition: all 0.15s ease;
3027
+ }
3028
+
3029
+ .matrix-cell:hover {
3030
+ transform: scale(1.1);
3031
+ z-index: 5;
3032
+ position: relative;
3033
+ }
3034
+
3035
+ .matrix-cell-diagonal {
3036
+ background: var(--bg-primary) !important;
3037
+ color: var(--text-muted);
3038
+ }
3039
+
3040
+ /* Matrix tooltip */
3041
+ .matrix-tooltip {
3042
+ position: absolute;
3043
+ background: var(--bg-secondary);
3044
+ border: 1px solid var(--border-color);
3045
+ border-radius: var(--radius-sm);
3046
+ padding: 8px 12px;
3047
+ font-size: 0.75rem;
3048
+ color: var(--text-primary);
3049
+ z-index: 100;
3050
+ pointer-events: none;
3051
+ box-shadow: var(--shadow-md);
3052
+ white-space: nowrap;
3053
+ }
3054
+
3055
+ /* ========== ELO History Modal ========== */
3056
+ .elo-history-header {
3057
+ display: flex;
3058
+ justify-content: space-between;
3059
+ align-items: center;
3060
+ padding: 20px;
3061
+ border-bottom: 1px solid var(--border-color);
3062
+ }
3063
+
3064
+ .elo-history-header h2 {
3065
+ margin: 0;
3066
+ font-size: 1.25rem;
3067
+ }
3068
+
3069
+ .elo-history-controls {
3070
+ display: flex;
3071
+ align-items: center;
3072
+ gap: 8px;
3073
+ }
3074
+
3075
+ .elo-history-controls label {
3076
+ font-size: 0.875rem;
3077
+ color: var(--text-secondary);
3078
+ }
3079
+
3080
+ .elo-history-content {
3081
+ padding: 20px;
3082
+ min-height: 400px;
3083
+ }
3084
+
3085
+ .elo-history-chart {
3086
+ width: 100%;
3087
+ height: 400px;
3088
+ }
3089
+
3090
+ .elo-history-legend {
3091
+ padding: 0 20px 20px;
3092
+ display: flex;
3093
+ flex-wrap: wrap;
3094
+ gap: 12px;
3095
+ justify-content: center;
3096
+ }
3097
+
3098
+ .legend-item {
3099
+ display: flex;
3100
+ align-items: center;
3101
+ gap: 6px;
3102
+ font-size: 0.75rem;
3103
+ cursor: pointer;
3104
+ padding: 4px 8px;
3105
+ border-radius: var(--radius-sm);
3106
+ background: var(--bg-tertiary);
3107
+ transition: all 0.15s ease;
3108
+ }
3109
+
3110
+ .legend-item:hover {
3111
+ background: var(--bg-hover);
3112
+ }
3113
+
3114
+ .legend-item.hidden {
3115
+ opacity: 0.4;
3116
+ }
3117
+
3118
+ .legend-color {
3119
+ width: 12px;
3120
+ height: 3px;
3121
+ border-radius: 1px;
3122
+ }
3123
+
3124
+ .legend-label {
3125
+ color: var(--text-secondary);
3126
+ }
3127
+
3128
+ /* ========== ELO by Source Modal ========== */
3129
+ .elo-by-source-header {
3130
+ display: flex;
3131
+ justify-content: space-between;
3132
+ align-items: center;
3133
+ padding: 20px;
3134
+ border-bottom: 1px solid var(--border-color);
3135
+ }
3136
+
3137
+ .elo-by-source-header h2 {
3138
+ margin: 0;
3139
+ font-size: 1.25rem;
3140
+ }
3141
+
3142
+ .elo-by-source-content {
3143
+ padding: 20px;
3144
+ max-height: calc(90vh - 100px);
3145
+ overflow-y: auto;
3146
+ }
3147
+
3148
+ .source-section {
3149
+ margin-bottom: 24px;
3150
+ background: var(--bg-tertiary);
3151
+ border-radius: var(--radius-md);
3152
+ overflow: hidden;
3153
+ }
3154
+
3155
+ .source-section-header {
3156
+ display: flex;
3157
+ justify-content: space-between;
3158
+ align-items: center;
3159
+ padding: 12px 16px;
3160
+ background: var(--bg-secondary);
3161
+ cursor: pointer;
3162
+ }
3163
+
3164
+ .source-section-header:hover {
3165
+ background: var(--bg-hover);
3166
+ }
3167
+
3168
+ .source-name {
3169
+ font-weight: 600;
3170
+ color: var(--text-primary);
3171
+ }
3172
+
3173
+ .source-stats {
3174
+ font-size: 0.75rem;
3175
+ color: var(--text-muted);
3176
+ }
3177
+
3178
+ .source-leaderboard {
3179
+ padding: 12px 16px;
3180
+ }
3181
+
3182
+ .source-leaderboard-item {
3183
+ display: flex;
3184
+ align-items: center;
3185
+ gap: 12px;
3186
+ padding: 6px 0;
3187
+ border-bottom: 1px solid var(--border-color);
3188
+ }
3189
+
3190
+ .source-leaderboard-item:last-child {
3191
+ border-bottom: none;
3192
+ }
3193
+
3194
+ .source-rank {
3195
+ font-weight: 600;
3196
+ min-width: 24px;
3197
+ text-align: center;
3198
+ color: var(--text-muted);
3199
+ }
3200
+
3201
+ .source-rank.rank-1 { color: var(--accent-yellow); }
3202
+ .source-rank.rank-2 { color: #c0c0c0; }
3203
+ .source-rank.rank-3 { color: #cd7f32; }
3204
+
3205
+ .source-model-name {
3206
+ flex: 1;
3207
+ font-family: var(--font-mono);
3208
+ font-size: 0.8125rem;
3209
+ }
3210
+
3211
+ .source-elo {
3212
+ font-family: var(--font-mono);
3213
+ font-size: 0.8125rem;
3214
+ color: var(--accent-blue);
3215
+ min-width: 50px;
3216
+ text-align: right;
3217
+ }
3218
+
3219
+ /* ========== Missing CSS Variables Fix ========== */
3220
+ /* These were referenced but not defined - redeclare them properly */
3221
+
3222
+ /* ========== Win Rate Matrix Styles ========== */
3223
+ .matrix-scroll-container {
3224
+ overflow-x: auto;
3225
+ max-width: 100%;
3226
+ padding-bottom: 10px;
3227
+ }
3228
+
3229
+ .win-rate-matrix {
3230
+ border-collapse: collapse;
3231
+ font-size: 0.6875rem;
3232
+ margin: 0 auto;
3233
+ }
3234
+
3235
+ .win-rate-matrix th,
3236
+ .win-rate-matrix td {
3237
+ padding: 4px 6px;
3238
+ text-align: center;
3239
+ border: 1px solid var(--border-color);
3240
+ min-width: 50px;
3241
+ max-width: 80px;
3242
+ }
3243
+
3244
+ .win-rate-matrix .matrix-corner {
3245
+ background: var(--bg-primary);
3246
+ position: sticky;
3247
+ left: 0;
3248
+ top: 0;
3249
+ z-index: 3;
3250
+ }
3251
+
3252
+ .win-rate-matrix .matrix-header-cell {
3253
+ background: var(--bg-tertiary);
3254
+ color: var(--text-secondary);
3255
+ font-weight: 600;
3256
+ font-size: 0.625rem;
3257
+ writing-mode: vertical-rl;
3258
+ text-orientation: mixed;
3259
+ padding: 8px 4px;
3260
+ max-height: 100px;
3261
+ white-space: nowrap;
3262
+ overflow: hidden;
3263
+ text-overflow: ellipsis;
3264
+ }
3265
+
3266
+ .win-rate-matrix .matrix-row-header {
3267
+ background: var(--bg-tertiary);
3268
+ color: var(--text-secondary);
3269
+ font-weight: 600;
3270
+ font-size: 0.625rem;
3271
+ text-align: right;
3272
+ padding-right: 8px;
3273
+ position: sticky;
3274
+ left: 0;
3275
+ z-index: 1;
3276
+ white-space: nowrap;
3277
+ max-width: none;
3278
+ }
3279
+
3280
+ .win-rate-matrix .matrix-cell {
3281
+ font-family: var(--font-mono);
3282
+ font-size: 0.625rem;
3283
+ cursor: default;
3284
+ transition: transform 0.1s ease;
3285
+ }
3286
+
3287
+ .win-rate-matrix .matrix-cell:hover {
3288
+ transform: scale(1.15);
3289
+ position: relative;
3290
+ z-index: 2;
3291
+ box-shadow: 0 0 8px rgba(0,0,0,0.5);
3292
+ }
3293
+
3294
+ .win-rate-matrix .matrix-diagonal {
3295
+ background: var(--bg-primary) !important;
3296
+ color: var(--text-muted);
3297
+ }
3298
+
3299
+ .win-rate-matrix .matrix-no-data {
3300
+ background: var(--bg-primary) !important;
3301
+ color: var(--text-muted);
3302
+ }
3303
+
3304
+ .matrix-legend {
3305
+ display: flex;
3306
+ align-items: center;
3307
+ justify-content: center;
3308
+ gap: 12px;
3309
+ margin-top: 16px;
3310
+ padding: 12px;
3311
+ background: var(--bg-tertiary);
3312
+ border-radius: var(--radius-sm);
3313
+ }
3314
+
3315
+ .matrix-legend-label {
3316
+ font-size: 0.75rem;
3317
+ color: var(--text-secondary);
3318
+ }
3319
+
3320
+ .matrix-legend-gradient {
3321
+ display: flex;
3322
+ align-items: center;
3323
+ gap: 8px;
3324
+ }
3325
+
3326
+ .matrix-legend-gradient .legend-bar {
3327
+ width: 100px;
3328
+ height: 16px;
3329
+ background: linear-gradient(to right, rgb(255, 55, 55), rgb(255, 255, 255), rgb(102, 200, 102));
3330
+ border-radius: 2px;
3331
+ border: 1px solid var(--border-color);
3332
+ }
3333
+
3334
+ .matrix-legend-gradient .legend-low,
3335
+ .matrix-legend-gradient .legend-high {
3336
+ font-size: 0.6875rem;
3337
+ color: var(--text-muted);
3338
+ }
3339
+
3340
+ /* ========== ELO History SVG Styles ========== */
3341
+ .elo-history-chart {
3342
+ font-family: var(--font-sans);
3343
+ }
3344
+
3345
+ .elo-history-chart .axis-line {
3346
+ stroke: var(--border-color);
3347
+ stroke-width: 1;
3348
+ }
3349
+
3350
+ .elo-history-chart .grid-line {
3351
+ stroke: var(--border-color);
3352
+ stroke-width: 0.5;
3353
+ stroke-dasharray: 4 4;
3354
+ opacity: 0.5;
3355
+ }
3356
+
3357
+ .elo-history-chart .axis-label {
3358
+ font-size: 10px;
3359
+ fill: var(--text-muted);
3360
+ }
3361
+
3362
+ .elo-history-chart .axis-title {
3363
+ font-size: 11px;
3364
+ fill: var(--text-secondary);
3365
+ font-weight: 500;
3366
+ }
3367
+
3368
+ .elo-history-chart .elo-line {
3369
+ stroke-linecap: round;
3370
+ stroke-linejoin: round;
3371
+ }
3372
+
3373
+ .elo-history-chart .elo-line:hover {
3374
+ stroke-width: 4;
3375
+ }
3376
+
3377
+ .elo-history-chart .elo-point {
3378
+ cursor: pointer;
3379
+ opacity: 0;
3380
+ transition: opacity 0.15s ease, r 0.15s ease;
3381
+ }
3382
+
3383
+ .elo-history-chart:hover .elo-point {
3384
+ opacity: 1;
3385
+ }
3386
+
3387
+ .elo-history-chart .elo-point:hover {
3388
+ r: 6;
3389
+ stroke: var(--text-primary);
3390
+ stroke-width: 2;
3391
+ }
3392
+
3393
+ .elo-history-chart-container {
3394
+ position: relative;
3395
+ }
3396
+
3397
+ .elo-tooltip {
3398
+ position: absolute;
3399
+ background: var(--bg-primary);
3400
+ border: 1px solid var(--border-color);
3401
+ border-radius: var(--radius-sm);
3402
+ padding: 8px 12px;
3403
+ font-size: 0.75rem;
3404
+ line-height: 1.4;
3405
+ pointer-events: none;
3406
+ opacity: 0;
3407
+ transition: opacity 0.15s ease;
3408
+ z-index: 100;
3409
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
3410
+ white-space: nowrap;
3411
+ }
3412
+
3413
+ .elo-tooltip.visible {
3414
+ opacity: 1;
3415
+ }
3416
+
3417
+ .elo-tooltip strong {
3418
+ color: var(--text-primary);
3419
+ }
3420
+
3421
+ /* Legend hidden state */
3422
+ .legend-item.hidden-model {
3423
+ opacity: 0.4;
3424
+ }
3425
+
3426
+ .legend-item.hidden-model .legend-color {
3427
+ background: var(--text-muted) !important;
3428
+ }
3429
+
3430
+ /* ========== ELO by Source Expanded Styles ========== */
3431
+ .source-sections-container {
3432
+ display: flex;
3433
+ flex-direction: column;
3434
+ gap: 12px;
3435
+ }
3436
+
3437
+ .source-section {
3438
+ background: var(--bg-secondary);
3439
+ border: 1px solid var(--border-color);
3440
+ border-radius: var(--radius-md);
3441
+ overflow: hidden;
3442
+ }
3443
+
3444
+ .source-section-header {
3445
+ display: flex;
3446
+ justify-content: space-between;
3447
+ align-items: center;
3448
+ padding: 12px 16px;
3449
+ cursor: pointer;
3450
+ user-select: none;
3451
+ transition: background 0.15s ease;
3452
+ }
3453
+
3454
+ .source-section-header:hover {
3455
+ background: var(--bg-hover);
3456
+ }
3457
+
3458
+ .source-section-info {
3459
+ display: flex;
3460
+ align-items: center;
3461
+ gap: 12px;
3462
+ }
3463
+
3464
+ .source-name {
3465
+ font-weight: 600;
3466
+ color: var(--text-primary);
3467
+ }
3468
+
3469
+ .source-battles {
3470
+ font-size: 0.75rem;
3471
+ color: var(--text-muted);
3472
+ }
3473
+
3474
+ .source-section .expand-icon {
3475
+ color: var(--text-muted);
3476
+ font-size: 0.75rem;
3477
+ transition: transform 0.2s ease;
3478
+ }
3479
+
3480
+ .source-section.expanded .expand-icon {
3481
+ transform: rotate(180deg);
3482
+ }
3483
+
3484
+ .source-section-content {
3485
+ display: none;
3486
+ padding: 12px 16px;
3487
+ border-top: 1px solid var(--border-color);
3488
+ }
3489
+
3490
+ .source-section.expanded .source-section-content {
3491
+ display: block;
3492
+ }
3493
+
3494
+ .source-leaderboard {
3495
+ width: 100%;
3496
+ border-collapse: collapse;
3497
+ font-size: 0.8125rem;
3498
+ }
3499
+
3500
+ .source-leaderboard th,
3501
+ .source-leaderboard td {
3502
+ padding: 8px 12px;
3503
+ text-align: left;
3504
+ border-bottom: 1px solid var(--border-color);
3505
+ }
3506
+
3507
+ .source-leaderboard th {
3508
+ background: var(--bg-tertiary);
3509
+ color: var(--text-secondary);
3510
+ font-weight: 600;
3511
+ font-size: 0.75rem;
3512
+ }
3513
+
3514
+ .source-leaderboard tbody tr:hover {
3515
+ background: var(--bg-hover);
3516
+ }
3517
+
3518
+ .source-leaderboard .rank-cell {
3519
+ font-weight: 600;
3520
+ color: var(--text-muted);
3521
+ }
3522
+
3523
+ .source-leaderboard .rank-cell.rank-1 { color: var(--accent-yellow); }
3524
+ .source-leaderboard .rank-cell.rank-2 { color: #c0c0c0; }
3525
+ .source-leaderboard .rank-cell.rank-3 { color: #cd7f32; }
3526
+
3527
+ .source-leaderboard .model-cell {
3528
+ font-family: var(--font-mono);
3529
+ font-size: 0.75rem;
3530
+ }
3531
+
3532
+ .source-leaderboard .elo-cell {
3533
+ font-family: var(--font-mono);
3534
+ color: var(--accent-blue);
3535
+ }
3536
+
3537
+ .source-leaderboard .wins {
3538
+ color: var(--accent-green);
3539
+ }
3540
+
3541
+ .source-leaderboard .losses {
3542
+ color: var(--accent-red);
3543
+ }
3544
+
3545
+ .source-leaderboard .ties {
3546
+ color: var(--accent-yellow);
3547
+ }
3548
+
3549
+ .source-leaderboard .win-rate-cell {
3550
+ font-family: var(--font-mono);
3551
+ color: var(--accent-green);
3552
+ }
3553
+
3554
+ /* ========== Merged ELO Results ========== */
3555
+ .merged-elo-info {
3556
+ background: var(--bg-tertiary);
3557
+ padding: 12px 16px;
3558
+ border-radius: var(--radius-sm);
3559
+ margin-bottom: 16px;
3560
+ }
3561
+
3562
+ .merged-elo-info p {
3563
+ margin: 4px 0;
3564
+ font-size: 0.875rem;
3565
+ color: var(--text-secondary);
3566
+ }
3567
+
3568
+ .merged-leaderboard {
3569
+ width: 100%;
3570
+ border-collapse: collapse;
3571
+ font-size: 0.8125rem;
3572
+ }
3573
+
3574
+ .merged-leaderboard th,
3575
+ .merged-leaderboard td {
3576
+ padding: 8px 12px;
3577
+ text-align: left;
3578
+ border-bottom: 1px solid var(--border-color);
3579
+ }
3580
+
3581
+ .merged-leaderboard th {
3582
+ background: var(--bg-tertiary);
3583
+ color: var(--text-secondary);
3584
+ font-weight: 600;
3585
+ font-size: 0.75rem;
3586
+ }
3587
+
3588
+ .merged-leaderboard tbody tr:hover {
3589
+ background: var(--bg-hover);
3590
+ }
3591
+
3592
+ .merged-leaderboard .rank-cell {
3593
+ font-weight: 600;
3594
+ color: var(--text-muted);
3595
+ }
3596
+
3597
+ .merged-leaderboard .rank-cell.rank-1 { color: var(--accent-yellow); }
3598
+ .merged-leaderboard .rank-cell.rank-2 { color: #c0c0c0; }
3599
+ .merged-leaderboard .rank-cell.rank-3 { color: #cd7f32; }
3600
+
3601
+ .merged-leaderboard .model-cell {
3602
+ font-family: var(--font-mono);
3603
+ font-size: 0.75rem;
3604
+ }
3605
+
3606
+ .merged-leaderboard .elo-cell {
3607
+ font-family: var(--font-mono);
3608
+ color: var(--accent-blue);
3609
+ }
3610
+
3611
+ .merged-leaderboard .wins {
3612
+ color: var(--accent-green);
3613
+ }
3614
+
3615
+ .merged-leaderboard .losses {
3616
+ color: var(--accent-red);
3617
+ }
3618
+
3619
+ .merged-leaderboard .stat-cell.ties,
3620
+ .merged-leaderboard .ties {
3621
+ color: var(--accent-yellow);
3622
+ }
3623
+
3624
+ .merged-leaderboard .win-rate-cell {
3625
+ font-family: var(--font-mono);
3626
+ color: var(--accent-green);
3627
+ }
3628
+
3629
+ /* ========== Header Navigation ========== */
3630
+ .header-nav {
3631
+ display: flex;
3632
+ align-items: center;
3633
+ gap: 24px;
3634
+ }
3635
+
3636
+ .nav-link {
3637
+ color: var(--text-secondary);
3638
+ text-decoration: none;
3639
+ font-size: 1rem;
3640
+ cursor: pointer;
3641
+ transition: color 0.15s ease;
3642
+ }
3643
+
3644
+ .nav-link:hover {
3645
+ color: var(--text-primary);
3646
+ }
3647
+
3648
+ .nav-link.active {
3649
+ color: var(--accent-blue);
3650
+ }
3651
+
3652
+ .nav-separator {
3653
+ color: var(--border-light);
3654
+ font-size: 0.875rem;
3655
+ user-select: none;
3656
+ }
3657
+
3658
+ .nav-link.nav-external {
3659
+ font-size: 0.875rem;
3660
+ display: flex;
3661
+ align-items: center;
3662
+ gap: 4px;
3663
+ }
3664
+
3665
+ .nav-link.nav-external .external-icon {
3666
+ font-size: 0.75rem;
3667
+ opacity: 0.7;
3668
+ }
3669
+
3670
+ .nav-link.nav-external:hover .external-icon {
3671
+ opacity: 1;
3672
+ }
3673
+
3674
+ /* Header Action Buttons (unified style) */
3675
+ .btn-header-action {
3676
+ display: flex;
3677
+ align-items: center;
3678
+ gap: 6px;
3679
+ padding: 6px 12px;
3680
+ background: var(--bg-tertiary);
3681
+ border: 1px solid var(--border-color);
3682
+ border-radius: var(--radius-sm);
3683
+ color: var(--accent-yellow);
3684
+ font-size: 0.875rem;
3685
+ cursor: pointer;
3686
+ transition: all 0.15s ease;
3687
+ }
3688
+
3689
+ .btn-header-action:hover {
3690
+ background: var(--bg-hover);
3691
+ border-color: var(--accent-yellow);
3692
+ }
3693
+
3694
+ .header-action-icon {
3695
+ font-size: 1rem;
3696
+ }
3697
+
3698
+ .header-action-count {
3699
+ font-size: 0.75rem;
3700
+ font-family: var(--font-mono);
3701
+ background: var(--bg-primary);
3702
+ padding: 2px 6px;
3703
+ border-radius: var(--radius-sm);
3704
+ color: var(--text-secondary);
3705
+ }
3706
+
3707
+ /* Logo clickable */
3708
+ .logo {
3709
+ cursor: pointer;
3710
+ transition: color 0.15s ease;
3711
+ }
3712
+
3713
+ .logo:hover {
3714
+ color: var(--text-primary);
3715
+ }
3716
+
3717
+ /* ========== Full Page Layout (no sidebar) ========== */
3718
+ .full-page {
3719
+ flex: 1;
3720
+ padding: 32px 48px;
3721
+ overflow-y: auto;
3722
+ max-width: 1600px;
3723
+ margin: 0 auto;
3724
+ width: 100%;
3725
+ }
3726
+
3727
+ .page-header {
3728
+ display: flex;
3729
+ align-items: center;
3730
+ justify-content: space-between;
3731
+ margin-bottom: 12px;
3732
+ }
3733
+
3734
+ .page-header h2 {
3735
+ font-size: 1.5rem;
3736
+ font-weight: 600;
3737
+ color: var(--text-primary);
3738
+ margin: 0;
3739
+ }
3740
+
3741
+ .page-description {
3742
+ font-size: 0.9375rem;
3743
+ color: var(--text-secondary);
3744
+ line-height: 1.5;
3745
+ margin-bottom: 24px;
3746
+ }
3747
+
3748
+ /* Gallery Page Container (with sidebar) */
3749
+ .gallery-page-container {
3750
+ display: flex;
3751
+ width: 100%;
3752
+ }
3753
+
3754
+ /* Gallery Controls (top bar in content area) */
3755
+ .gallery-controls {
3756
+ display: flex;
3757
+ align-items: center;
3758
+ gap: 16px;
3759
+ padding: 12px 16px;
3760
+ background: var(--bg-tertiary);
3761
+ border-bottom: 1px solid var(--border-color);
3762
+ flex-wrap: wrap;
3763
+ margin-bottom: 16px;
3764
+ }
3765
+
3766
+ .gallery-controls .selector-group {
3767
+ display: flex;
3768
+ align-items: center;
3769
+ gap: 8px;
3770
+ }
3771
+
3772
+ .gallery-controls .selector-group label {
3773
+ font-size: 0.8125rem;
3774
+ color: var(--text-secondary);
3775
+ }
3776
+
3777
+ .gallery-controls .selector {
3778
+ min-width: 140px;
3779
+ }
3780
+
3781
+ .gallery-controls .view-toggle {
3782
+ margin-left: auto;
3783
+ }
3784
+
3785
+ .gallery-controls .search-box {
3786
+ display: flex;
3787
+ align-items: center;
3788
+ gap: 4px;
3789
+ }
3790
+
3791
+ /* ========== Overview Page Styles ========== */
3792
+ .overview-content {
3793
+ background: var(--bg-secondary);
3794
+ border: 1px solid var(--border-color);
3795
+ border-radius: var(--radius-md);
3796
+ overflow: hidden;
3797
+ }
3798
+
3799
+ .overview-table-container {
3800
+ overflow-x: auto;
3801
+ max-width: 100%;
3802
+ }
3803
+
3804
+ .overview-table {
3805
+ width: 100%;
3806
+ border-collapse: collapse;
3807
+ font-size: 0.875rem;
3808
+ }
3809
+
3810
+ .overview-table th,
3811
+ .overview-table td {
3812
+ padding: 12px 16px;
3813
+ text-align: left;
3814
+ border-bottom: 1px solid var(--border-color);
3815
+ white-space: nowrap;
3816
+ }
3817
+
3818
+ .overview-table th {
3819
+ background: var(--bg-tertiary);
3820
+ color: var(--text-secondary);
3821
+ font-size: 0.75rem;
3822
+ text-transform: uppercase;
3823
+ letter-spacing: 0.05em;
3824
+ font-weight: 600;
3825
+ position: sticky;
3826
+ top: 0;
3827
+ z-index: 10;
3828
+ }
3829
+
3830
+ .overview-table th.sortable {
3831
+ cursor: pointer;
3832
+ user-select: none;
3833
+ transition: background 0.15s ease;
3834
+ }
3835
+
3836
+ .overview-table th.sortable:hover {
3837
+ background: var(--bg-hover);
3838
+ color: var(--text-primary);
3839
+ }
3840
+
3841
+ .overview-table th.sorted-asc::after {
3842
+ content: ' ▲';
3843
+ font-size: 0.625rem;
3844
+ }
3845
+
3846
+ .overview-table th.sorted-desc::after {
3847
+ content: ' ▼';
3848
+ font-size: 0.625rem;
3849
+ }
3850
+
3851
+ .overview-table th.subset-header {
3852
+ cursor: pointer;
3853
+ transition: all 0.15s ease;
3854
+ }
3855
+
3856
+ .overview-table th.subset-header:hover {
3857
+ background: var(--accent-blue);
3858
+ color: #fff;
3859
+ }
3860
+
3861
+ .overview-table th.model-header {
3862
+ position: sticky;
3863
+ left: 0;
3864
+ z-index: 11;
3865
+ background: var(--bg-tertiary);
3866
+ }
3867
+
3868
+ .overview-table td.model-cell {
3869
+ font-family: var(--font-mono);
3870
+ font-weight: 500;
3871
+ position: sticky;
3872
+ left: 0;
3873
+ background: var(--bg-secondary);
3874
+ z-index: 1;
3875
+ cursor: pointer;
3876
+ transition: background 0.15s ease;
3877
+ }
3878
+
3879
+ .overview-table tr:hover td.model-cell {
3880
+ background: var(--bg-tertiary);
3881
+ }
3882
+
3883
+ .overview-table td.model-cell:hover {
3884
+ color: var(--accent-blue);
3885
+ }
3886
+
3887
+ .overview-table td.elo-cell {
3888
+ font-family: var(--font-mono);
3889
+ text-align: center;
3890
+ }
3891
+
3892
+ .overview-table td.elo-cell.no-data {
3893
+ color: var(--text-muted);
3894
+ }
3895
+
3896
+ .overview-table td.avg-elo-cell {
3897
+ font-family: var(--font-mono);
3898
+ font-weight: 600;
3899
+ color: var(--accent-blue);
3900
+ text-align: center;
3901
+ background: var(--bg-tertiary);
3902
+ }
3903
+
3904
+ .overview-table tbody tr {
3905
+ transition: background 0.15s ease;
3906
+ }
3907
+
3908
+ .overview-table tbody tr:hover {
3909
+ background: var(--bg-hover);
3910
+ }
3911
+
3912
+ /* ELO value coloring */
3913
+ .elo-high {
3914
+ color: var(--accent-green);
3915
+ }
3916
+
3917
+ .elo-mid {
3918
+ color: var(--text-primary);
3919
+ }
3920
+
3921
+ .elo-low {
3922
+ color: var(--accent-red);
3923
+ }
3924
+
3925
+ /* Rank badge in overview */
3926
+ .rank-badge {
3927
+ display: inline-block;
3928
+ width: 24px;
3929
+ height: 24px;
3930
+ line-height: 24px;
3931
+ text-align: center;
3932
+ border-radius: 50%;
3933
+ font-size: 0.6875rem;
3934
+ font-weight: 600;
3935
+ margin-right: 8px;
3936
+ }
3937
+
3938
+ .rank-badge.rank-1 {
3939
+ background: rgba(210, 153, 34, 0.2);
3940
+ color: var(--accent-yellow);
3941
+ }
3942
+
3943
+ .rank-badge.rank-2 {
3944
+ background: rgba(192, 192, 192, 0.2);
3945
+ color: #c0c0c0;
3946
+ }
3947
+
3948
+ .rank-badge.rank-3 {
3949
+ background: rgba(205, 127, 50, 0.2);
3950
+ color: #cd7f32;
3951
+ }
3952
+
3953
+ /* Subset info in header */
3954
+ .subset-header-info {
3955
+ display: block;
3956
+ font-size: 0.625rem;
3957
+ font-weight: 400;
3958
+ color: var(--text-muted);
3959
+ text-transform: none;
3960
+ letter-spacing: normal;
3961
+ margin-top: 2px;
3962
+ }
3963
+
3964
+ /* ========== Cross-Subset Modal Styles ========== */
3965
+ #cross-subset-modal .modal-content {
3966
+ padding: 32px;
3967
+ max-width: 800px;
3968
+ width: 90%;
3969
+ }
3970
+
3971
+ .cross-subset-modal-header {
3972
+ margin-bottom: 8px;
3973
+ }
3974
+
3975
+ .cross-subset-modal-header h2 {
3976
+ font-size: 1.25rem;
3977
+ font-weight: 600;
3978
+ color: var(--text-primary);
3979
+ margin: 0;
3980
+ }
3981
+
3982
+ .modal-description {
3983
+ font-size: 0.875rem;
3984
+ color: var(--text-secondary);
3985
+ margin-bottom: 24px;
3986
+ }
3987
+
3988
+ #cross-subset-modal .cross-subset-content {
3989
+ background: var(--bg-tertiary);
3990
+ border: 1px solid var(--border-color);
3991
+ border-radius: var(--radius-md);
3992
+ padding: 24px;
3993
+ margin-bottom: 24px;
3994
+ }
3995
+
3996
+ #cross-subset-modal .cross-subset-info {
3997
+ background: var(--bg-secondary);
3998
+ }
3999
+
4000
+ #cross-subset-modal .cross-subset-results {
4001
+ margin-top: 24px;
4002
+ }
4003
+
4004
+ #cross-subset-modal .cross-subset-results:empty {
4005
+ display: none;
4006
+ margin-top: 0;
4007
+ }
4008
+
4009
+ .cross-subset-selection {
4010
+ margin-bottom: 20px;
4011
+ }
4012
+
4013
+ .cross-subset-selection h4 {
4014
+ font-size: 0.875rem;
4015
+ color: var(--text-secondary);
4016
+ margin-bottom: 12px;
4017
+ }
4018
+
4019
+ .cross-subset-info {
4020
+ background: var(--bg-tertiary);
4021
+ padding: 12px 16px;
4022
+ border-radius: var(--radius-sm);
4023
+ margin-bottom: 16px;
4024
+ }
4025
+
4026
+ .cross-subset-info p {
4027
+ margin: 4px 0;
4028
+ font-size: 0.875rem;
4029
+ color: var(--text-secondary);
4030
+ }
4031
+
4032
+ .cross-subset-info span {
4033
+ font-family: var(--font-mono);
4034
+ color: var(--accent-blue);
4035
+ }
4036
+
4037
+ .cross-subset-options {
4038
+ margin-bottom: 16px;
4039
+ display: flex;
4040
+ align-items: center;
4041
+ gap: 16px;
4042
+ }
4043
+
4044
+ .cross-subset-options label:first-child {
4045
+ color: var(--text-secondary);
4046
+ font-size: 0.875rem;
4047
+ }
4048
+
4049
+ .cross-subset-results {
4050
+ background: var(--bg-tertiary);
4051
+ border: 1px solid var(--border-color);
4052
+ border-radius: var(--radius-md);
4053
+ padding: 24px;
4054
+ }
4055
+
4056
+ .cross-subset-results:empty {
4057
+ display: none;
4058
+ }
4059
+
4060
+ .cross-subset-results h3 {
4061
+ font-size: 0.875rem;
4062
+ color: var(--text-muted);
4063
+ text-transform: uppercase;
4064
+ letter-spacing: 0.05em;
4065
+ margin-bottom: 16px;
4066
+ }
4067
+
4068
+ /* ========== Responsive Adjustments ========== */
4069
+ @media (max-width: 1200px) {
4070
+ .full-page {
4071
+ padding: 24px 32px;
4072
+ }
4073
+ }
4074
+
4075
+ @media (max-width: 768px) {
4076
+ .header-center {
4077
+ flex-wrap: wrap;
4078
+ gap: 8px;
4079
+ }
4080
+
4081
+ .header-nav {
4082
+ order: -1;
4083
+ width: 100%;
4084
+ justify-content: center;
4085
+ }
4086
+
4087
+ .subset-controls {
4088
+ flex-wrap: wrap;
4089
+ justify-content: center;
4090
+ }
4091
+
4092
+ .full-page {
4093
+ padding: 16px;
4094
+ }
4095
+
4096
+ .overview-table {
4097
+ font-size: 0.75rem;
4098
+ }
4099
+
4100
+ .overview-table th,
4101
+ .overview-table td {
4102
+ padding: 8px 10px;
4103
+ }
4104
+ }