Sync content.py from kosmonautical/openhands-index-paul

#22
Files changed (1) hide show
  1. content.py +789 -227
content.py CHANGED
@@ -17,16 +17,13 @@ def create_gradio_anchor_id(text: str, validation) -> str:
17
  TITLE = """<h1 align="left" id="space-title">OpenHands Index</h1>"""
18
 
19
  INTRO_PARAGRAPH = """
 
20
  <p>
21
- The <strong>OpenHands Index</strong> is a comprehensive benchmark for evaluating AI coding agents across real-world software engineering tasks. As agents become more capable, we need ways to measure their performance across diverse challenges, from fixing bugs to building applications.
22
  </p>
23
-
24
-
25
  <p>
26
- The OpenHands Index assesses models across five categories: <strong>Issue Resolution</strong> (fixing bugs), <strong>Greenfield</strong> (building new apps), <strong>Frontend</strong> (UI development), <strong>Testing</strong> (test generation), and <strong>Information Gathering</strong>. All models are currently evaluated using the <a href="https://github.com/OpenHands/software-agent-sdk">OpenHands Software Agent SDK</a>. This provides a single view of both <strong>performance</strong> and <strong>cost efficiency</strong>, enabling fair comparisons between agents.
27
  </p>
28
-
29
-
30
  <p>
31
  For methodology details, see the <a href="/about" class="intro-link">About</a> page.
32
  </p>
@@ -235,45 +232,234 @@ def hf_uri_to_web_url(uri: str) -> str:
235
 
236
 
237
  css = """
238
- /* CSS Color Variables aligned with OpenHands brand (openhands-ui/tokens.css) */
239
  :root {
240
- /* Primary - Yellow */
241
- --color-primary-accent: #FFE165;
242
- --color-primary-light: #FFF3C0;
243
- --color-primary-dark: #BBA54A;
244
-
245
- /* Secondary - Green */
246
- --color-secondary-accent: #BCFF8C;
247
- --color-secondary-dark: #577641;
248
-
249
- /* Neutral - Grey scale */
250
- --color-neutral-50: #F7F8FB;
251
- --color-neutral-100: #EBEDF3;
252
- --color-neutral-200: #D4D8E7;
253
- --color-neutral-300: #B1B9D3;
254
- --color-neutral-700: #2F3137;
255
- --color-neutral-800: #222328;
256
- --color-neutral-900: #18191C;
257
- --color-neutral-950: #0D0D0F;
258
-
259
- /* Semantic colors */
260
- --color-primary-link: #2F3137;
261
- --color-primary-link-dark: #B1B9D3;
262
- --color-background-light: #F7F8FB;
263
- --color-background-dark: #18191C;
264
- --color-text-dark: #0D0D0F;
265
- --color-text-light: #F7F8FB;
266
- --color-button-hover: #222328;
267
-
268
- /* Danger/Error - Red */
269
- --color-danger: #FF684E;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  }
271
 
272
- /* This makes space for the huggingface header bar which must shown on HF spaces. */
273
- /* FIXME Media queries don't seem to survive rendering. */
274
- /* @media (min-width: 768px) { ... } */
275
  gradio-app {
276
- padding-top: 65px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
277
  }
278
 
279
  /* Global Styles */
@@ -281,42 +467,117 @@ h2 {
281
  overflow: hidden;
282
  }
283
 
284
- /* Global link color styles */
285
- .dark a {
286
- color: var(--color-primary-link-dark);
287
- }
288
- .dark a:hover {
289
- color: #dddddd;
290
- }
291
- .dark a:visited {
292
- color: #bbbbbb;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  }
294
 
295
  #intro-paragraph {
296
- font-size: 18px;
297
- max-width: 90%;
298
- padding-left: 35px;
299
- margin-top: 20px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
300
  }
301
 
302
  #intro-paragraph p,
303
  #intro-paragraph li {
304
- font-size: 16px;
305
- line-height: 1.8;
 
 
 
 
 
 
 
306
  }
307
 
308
- /* Links in intro paragraph */
309
  .intro-link {
310
- color: var(--color-primary-link);
311
- text-decoration: underline;
 
312
  }
313
- .dark .intro-link {
314
- color: var(--color-primary-link-dark);
315
  }
316
 
317
  #intro-paragraph ul {
318
- margin-top: 20px;
319
- margin-bottom: 20px;
 
 
 
320
  }
321
 
322
  #diagram-image {
@@ -329,40 +590,82 @@ h2 {
329
  object-fit: cover;
330
  }
331
  #intro-category-paragraph {
332
- font-size: 18px;
333
- max-width: 90%;
334
- margin-top: 20px;
 
335
  }
336
 
337
  #intro-category-paragraph p,
338
  #intro-category-paragraph li {
339
- font-size: 16px;
340
- line-height: 1.8;
 
 
 
 
 
 
341
  }
342
 
343
  #intro-category-paragraph ul {
344
- margin-top: 20px;
345
- margin-bottom: 20px;
 
 
 
346
  }
347
 
348
  #about-content {
349
- font-size: 18px;
350
- max-width: 60%;
351
- padding-left: 25px;
 
 
 
 
 
 
 
 
352
  }
353
  #category-intro {
354
- font-size: 18px;
355
- max-width: 60%;
 
 
 
 
 
 
 
 
356
  }
357
  #logo-image {
358
  margin: 0;
359
- margin-bottom: 30px;
360
  justify-content: flex-start;
361
- max-width: 250px;
362
  height: auto;
363
  }
364
- #page-content-wrapper{
365
- padding-left: 25px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
366
  }
367
  .table-component{
368
  height: auto !important;
@@ -383,7 +686,7 @@ table.svelte-1e98i6s td {
383
  vertical-align: top !important;
384
  }
385
  table.gr-table {
386
- font-size: 15px !important;
387
  }
388
  .html-container {
389
  padding-top: 0 !important;
@@ -392,22 +695,152 @@ table.gr-table {
392
  overflow: visible !important;
393
  }
394
  #pareto-disclaimer {
395
- color: var(--color-primary-accent) !important;
396
  }
397
  thead.svelte-1e98i6s th {
398
- background: white !important;
399
  }
400
  .dark thead.svelte-1e98i6s th {
401
- background: var(--color-background-dark) !important;
402
  }
403
  .cell-wrap.svelte-v1pjjd {
404
- font-family: Arial, sans-serif;
405
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
406
  nav.svelte-ti537g.svelte-ti537g {
407
- justify-content: flex-start;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
408
  }
409
- .nav-holder {
410
- padding-left: 20px !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
411
  }
412
  #legend-markdown span {
413
  margin-right: 15px !important;
@@ -418,7 +851,7 @@ nav.svelte-ti537g.svelte-ti537g {
418
  position: relative !important;
419
  }
420
  .dark #leaderboard-accordion .label-wrap {
421
- color: var(--color-primary-accent) !important;
422
  }
423
  .dark block.svelte-1svsvh2 {
424
  background: var(--color-background-dark) !important;
@@ -430,40 +863,48 @@ nav.svelte-ti537g.svelte-ti537g {
430
  display: flex !important;
431
  flex-wrap: wrap !important;
432
  align-items: center !important;
433
- gap: 10px !important;
434
- }
435
- .dark .primary-link-button {
436
- color: var(--color-primary-link-dark);
437
  }
 
438
  .primary-link-button {
439
  background: none;
440
  border: none;
441
  padding: 0;
442
  margin: 0;
443
  font-family: inherit;
444
- font-size: 16px;
445
- color: var(--color-primary-link);
 
446
  text-decoration: none;
447
  cursor: pointer;
448
  white-space: nowrap;
 
449
  }
450
  .primary-link-button:hover {
451
- text-decoration: underline;
 
 
 
 
 
 
 
 
452
  }
453
  .sub-nav-label {
454
- font-weight: bold;
455
- font-size: 16px;
456
  display: flex;
457
  align-items: center;
458
  }
459
- .wrap-header-df th span{
460
  white-space: normal !important;
461
  word-break: normal !important;
462
  overflow-wrap: break-word !important;
463
  line-height: 1.2 !important;
464
  vertical-align: top !important;
465
  font-size: 12px !important;
466
- font-family: Arial, sans-serif;
467
  }
468
  .wrap-header-df th {
469
  height: auto !important;
@@ -537,110 +978,149 @@ span.wrap[tabindex="0"][role="button"][data-editable="false"] {
537
  /* --- inside table tooltips --- */
538
  .native-tooltip-icon {
539
  cursor: help;
540
- text-decoration: underline dotted 1px;
541
- }
542
- /* Main Nav bar styling */
543
- .nav-holder nav {
544
- display: grid !important;
545
- grid-template-columns: auto auto auto auto auto 1fr auto auto !important;
546
- gap: 10px 20px !important; /* Vertical and horizontal spacing */
547
- width: 100% !important;
548
- align-items: center;
549
- }
550
- .nav-holder nav a[href*="about"] {
551
- grid-row: 1 !important;
552
- grid-column: 7 !important;
553
  }
554
- .nav-holder nav a[href*="submit"] {
555
- grid-row: 1 !important;
556
- grid-column: 8 !important;
 
 
 
 
 
 
 
 
 
 
 
557
  white-space: nowrap !important;
558
- }
559
- /* Hide the Alternative Agents page from the top-level nav for now. */
560
- .nav-holder nav a[href*="alternative-agents"] {
561
- display: none !important;
562
- }
563
-
564
- /* Divider line between header and category nav */
565
- .nav-holder nav::after {
566
- content: ''; /* Required for pseudo-elements to appear */
567
- background-color: #C9C9C3;
568
- height: 1px;
569
- grid-row: 2 !important;
570
- grid-column: 1 / -1 !important;
571
- }
572
-
573
- /* Horizontal scrolling for navigation */
574
- .nav-holder nav {
575
- overflow-x: auto;
576
- scrollbar-width: none;
577
- -ms-overflow-style: none;
578
- }
579
- .nav-holder nav::-webkit-scrollbar {
580
- display: none;
581
- }
582
-
583
- /* Category navigation buttons in row 3 */
584
- .nav-holder nav a[href*="literature-understanding"],
585
- .nav-holder nav a[href*="code-execution"],
586
- .nav-holder nav a[href*="data-analysis"],
587
- .nav-holder nav a[href*="discovery"] {
588
- grid-row: 3 !important;
589
- justify-self: center !important;
590
- width: fit-content !important;
591
- white-space: nowrap;
592
- flex-shrink: 0;
593
- }
594
-
595
- .nav-holder nav a[href*="literature-understanding"] { grid-column: 1 !important; }
596
- .nav-holder nav a[href*="code-execution"] { grid-column: 2 !important; }
597
- .nav-holder nav a[href*="data-analysis"] { grid-column: 3 !important; }
598
- .nav-holder nav a[href*="discovery"] { grid-column: 4 !important; }
599
-
600
- /* Navigation hover styles */
601
- .nav-holder nav a[href*="about"]:hover,
602
- .nav-holder nav a[href*="submit"]:hover,
603
- .nav-holder nav a[href*="literature-understanding"]:hover,
604
- .nav-holder nav a[href*="code-execution"]:hover,
605
- .nav-holder nav a[href*="data-analysis"]:hover,
606
- .nav-holder nav a[href*="discovery"]:hover {
607
- background-color: #FDF9F4;
608
- }
609
-
610
- .dark .nav-holder nav a[href*="about"]:hover,
611
- .dark .nav-holder nav a[href*="submit"]:hover,
612
- .dark .nav-holder nav a[href*="literature-understanding"]:hover,
613
- .dark .nav-holder nav a[href*="code-execution"]:hover,
614
- .dark .nav-holder nav a[href*="data-analysis"]:hover,
615
- .dark .nav-holder nav a[href*="discovery"]:hover {
616
- background-color: #1C3A3C;
617
- }
618
- .benchmark-main-subtitle{
619
- color: var(--color-primary-link);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
620
  overflow: hidden;
621
  padding-top: 120px;
 
 
 
622
  }
623
- .dark .benchmark-main-subtitle{
624
- color: var(--color-primary-link-dark);
 
 
 
 
 
 
625
  }
626
- .benchmark-title{
627
- color: var(--color-primary-link);
628
- margin-top: 50px;
629
- font-size: 20px;
630
- }
631
- .dark .benchmark-title{
632
- color: var(--color-primary-accent);
633
  }
634
  .benchmark-description {
635
- margin: 20px 0;
636
- max-width: 800px;
 
 
637
  }
638
-
639
- .dark #main-header h2 {
640
- color: var(--color-primary-accent);
 
 
641
  }
 
 
 
642
  #main-header h2 {
643
- color: var(--color-primary-link);
 
 
 
 
 
 
 
 
644
  }
645
 
646
  /* --- New HTML-Based Tooltip Styles --- */
@@ -726,18 +1206,66 @@ span.wrap[tabindex="0"][role="button"][data-editable="false"] {
726
  flex-wrap: wrap;
727
  }
728
 
729
- /* About Page CSS */
730
  #about-page-content-wrapper {
731
  margin-left: auto;
732
  margin-right: auto;
733
- max-width: 800px;
734
- padding: 0 24px;
735
  display: flex;
736
  flex-direction: column;
737
- gap: 40px;
738
- margin-top: 40px;
739
- opacity: 85%;
740
- margin-bottom: 60px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
741
  }
742
  .link-buttons-container {
743
  display: flex;
@@ -804,13 +1332,13 @@ html {
804
  min-height: 572px;
805
  background-color: #fff;
806
  padding: 24px 32px;
807
- border: 1px solid var(--color-neutral-300);
808
  border-radius: 4px;
809
  }
810
 
811
  .dark .plot-legend-container {
812
  background: rgba(247, 248, 251, 0.1);
813
- border-color: var(--color-neutral-700);
814
  }
815
 
816
  #plot-legend-logo {
@@ -872,6 +1400,38 @@ h3 .header-link-icon {
872
  .winners-by-category-container {
873
  margin: 20px 0;
874
  overflow-x: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
875
  }
876
 
877
  .winners-unified-table {
@@ -879,22 +1439,23 @@ h3 .header-link-icon {
879
  border-collapse: collapse;
880
  font-size: 13px;
881
  background: #fff;
882
- border: 1px solid var(--color-neutral-300);
883
  border-radius: 12px;
884
  overflow: hidden;
885
  }
886
 
887
  .dark .winners-unified-table {
888
  background: rgba(247, 248, 251, 0.05);
889
- border-color: var(--color-neutral-700);
890
  }
891
 
 
892
  .winners-unified-table thead tr {
893
- background: linear-gradient(to right, rgba(255, 225, 101, 0.15), rgba(220, 194, 87, 0.25));
894
  }
895
 
896
  .dark .winners-unified-table thead tr {
897
- background: linear-gradient(to right, rgba(255, 225, 101, 0.2), rgba(220, 194, 87, 0.3));
898
  }
899
 
900
  .winners-unified-table .category-header {
@@ -903,15 +1464,15 @@ h3 .header-link-icon {
903
  font-weight: 700;
904
  font-size: 13px;
905
  color: var(--color-text-dark);
906
- border-bottom: 2px solid var(--color-primary-accent) !important;
907
- border-right: 2px solid #999 !important;
908
  white-space: nowrap;
909
  }
910
 
911
  .dark .winners-unified-table .category-header {
912
  color: #fff;
913
- border-bottom-color: var(--color-primary-accent) !important;
914
- border-right-color: var(--color-neutral-500) !important;
915
  }
916
 
917
  .winners-unified-table .category-header:last-child {
@@ -928,23 +1489,24 @@ h3 .header-link-icon {
928
  .winners-unified-table td {
929
  padding: 8px 6px;
930
  vertical-align: middle;
931
- border-bottom: 1px solid #eee;
932
  }
933
 
934
  .dark .winners-unified-table td {
935
- border-bottom-color: #2a3a3a;
936
  }
937
 
938
  .winners-unified-table tbody tr:last-child td {
939
  border-bottom: none;
940
  }
941
 
 
942
  .winners-unified-table tbody tr:hover {
943
- background: rgba(255, 225, 101, 0.1);
944
  }
945
 
946
  .dark .winners-unified-table tbody tr:hover {
947
- background: rgba(255, 225, 101, 0.15);
948
  }
949
 
950
  .winners-unified-table .score-cell {
@@ -953,12 +1515,12 @@ h3 .header-link-icon {
953
  color: var(--color-primary-dark);
954
  padding-left: 12px;
955
  min-width: 50px;
956
- border-right: 1px solid #eee;
957
  }
958
 
959
  .dark .winners-unified-table .score-cell {
960
  color: var(--color-primary-accent);
961
- border-right-color: var(--color-neutral-700);
962
  }
963
 
964
  .winners-unified-table .model-cell {
@@ -966,12 +1528,12 @@ h3 .header-link-icon {
966
  color: var(--color-text-dark);
967
  font-weight: 500;
968
  padding-right: 12px;
969
- border-right: 2px solid #999;
970
  }
971
 
972
  .dark .winners-unified-table .model-cell {
973
  color: #fff;
974
- border-right-color: var(--color-neutral-500);
975
  }
976
 
977
  .winners-unified-table td:nth-last-child(1) {
@@ -1061,10 +1623,9 @@ h3 .header-link-icon {
1061
  padding-right: 8px !important;
1062
  }
1063
 
1064
- /* Reduce padding on intro paragraph */
1065
  #intro-paragraph {
1066
- padding-left: 8px !important;
1067
- padding-right: 8px !important;
1068
  max-width: 100% !important;
1069
  }
1070
 
@@ -1075,9 +1636,10 @@ h3 .header-link-icon {
1075
  max-width: 100% !important;
1076
  }
1077
 
1078
- /* Reduce navigation holder padding */
1079
- .nav-holder {
1080
- padding-left: 8px !important;
 
1081
  padding-right: 8px !important;
1082
  }
1083
 
@@ -1088,10 +1650,10 @@ h3 .header-link-icon {
1088
  max-width: 100% !important;
1089
  }
1090
 
1091
- /* Reduce about page wrapper padding */
1092
  #about-page-content-wrapper {
1093
- padding-left: 12px !important;
1094
- padding-right: 12px !important;
1095
  }
1096
 
1097
  /* Reduce gradio container padding */
 
17
  TITLE = """<h1 align="left" id="space-title">OpenHands Index</h1>"""
18
 
19
  INTRO_PARAGRAPH = """
20
+ <h1 class="intro-page-title">The OpenHands Index</h1>
21
  <p>
22
+ This is a comprehensive benchmark for evaluating AI coding agents across real-world software engineering tasks. As agents become more capable, we need ways to measure their performance across diverse challenges, from fixing bugs to building applications.
23
  </p>
 
 
24
  <p>
25
+ The index assesses models across five categories: <strong>Issue Resolution</strong> (fixing bugs), <strong>Greenfield</strong> (building new apps), <strong>Frontend</strong> (UI development), <strong>Testing</strong> (test generation), and <strong>Information Gathering</strong>. All models are currently evaluated using the <a href="https://github.com/OpenHands/software-agent-sdk">OpenHands Software Agent SDK</a>. This provides a single view of both <strong>performance</strong> and <strong>cost efficiency</strong>, enabling fair comparisons between agents.
26
  </p>
 
 
27
  <p>
28
  For methodology details, see the <a href="/about" class="intro-link">About</a> page.
29
  </p>
 
232
 
233
 
234
  css = """
235
+ /* OpenHands-Design tokens (OpenHands-Design/index.html, DESIGN.md) */
236
  :root {
237
+ --oh-bg: hsl(0 0% 5%);
238
+ --oh-card: hsl(0 0% 7%);
239
+ --oh-secondary: hsl(0 0% 8%);
240
+ --oh-muted: hsl(0 0% 12%);
241
+ /* Light mode: 1px strokes / dividers — same grey as top nav bar (#e4e4e7 zinc-200) */
242
+ --oh-border: #e4e4e7;
243
+ /* Slightly stronger on interactive hover (zinc-300) */
244
+ --oh-border-hover: #d4d4d8;
245
+ --oh-muted-hover: hsl(0 0% 18%);
246
+ --oh-fg: hsl(0 0% 98%);
247
+ --oh-fg-muted: hsl(0 0% 55%);
248
+ --oh-primary: hsl(0 0% 100%);
249
+ --oh-primary-fg: hsl(0 0% 0%);
250
+ --oh-success: #22c55e;
251
+ --oh-success-fg: #86efac;
252
+ --oh-warning: #f59e0b;
253
+ --oh-info: #3b82f6;
254
+ --oh-destructive: #dc2626;
255
+ --oh-ring: #cccccc;
256
+ --oh-shadow-card: 0 1px 2px 0 hsl(0 0% 0% / 0.3);
257
+ --oh-font-sans: 'Inter', system-ui, sans-serif;
258
+ --oh-font-mono: 'JetBrains Mono', ui-monospace, monospace;
259
+ /* DESIGN.md §5: spacing (4px scale) — index.html / section rhythm */
260
+ --oh-pad-x-page: 24px;
261
+ /* DESIGN.md: container max 1400px — page column + #page-content-wrapper */
262
+ --oh-content-max: 87.5rem;
263
+ /* DESIGN.md §4: dropdown item hover (light / dark) */
264
+ --oh-form-hover-light: #f4f4f5;
265
+ --oh-form-active-dark: hsl(0 0% 12% / 0.6);
266
+ --oh-pad-y-section: 4rem; /* 64px — .section in index.html */
267
+ --oh-gap-prose-paragraph: 1rem; /* 16px — gap-4 */
268
+ --oh-gap-prose-tight: 0.5rem; /* 8px — gap-2 */
269
+ --oh-prose-size: 0.875rem; /* 14px — text-sm, primary body */
270
+ --oh-prose-leading: 1.5rem; /* 24px — leading-6 w/ text-sm */
271
+ /* DESIGN.md: inline links use --info; focus ring = --oh-ring */
272
+ --oh-link-visited: hsl(217 60% 48%);
273
+ --oh-link-hover: hsl(217 85% 62%);
274
+ /* Legacy var names (charts, tables) — mapped to design surfaces */
275
+ --color-primary-accent: #e8e8e5;
276
+ --color-primary-light: #f5f5f4;
277
+ --color-primary-dark: #a1a1aa;
278
+ --color-secondary-accent: #22c55e;
279
+ --color-secondary-dark: #16a34a;
280
+ --color-neutral-50: #fafafa;
281
+ --color-neutral-100: #f4f4f4;
282
+ --color-neutral-200: #e5e5e5;
283
+ --color-neutral-300: #d4d4d4;
284
+ --color-neutral-700: #404040;
285
+ --color-neutral-800: #262626;
286
+ --color-neutral-900: #171717;
287
+ --color-neutral-950: #0d0d0d;
288
+ --color-primary-link: #404040;
289
+ --color-primary-link-dark: #a3a3a3;
290
+ --color-background-light: #fafafa;
291
+ --color-background-dark: #0d0d0d;
292
+ --color-text-dark: #0d0d0d;
293
+ --color-text-light: #fafafa;
294
+ --color-button-hover: #404040;
295
+ --color-danger: #dc2626;
296
+ }
297
+
298
+ /* Dark theme: near-black strokes (DESIGN.md --border / #242424) */
299
+ html.dark,
300
+ body.dark,
301
+ html:has([class*="gradio-container-"].dark),
302
+ .gradio-container.dark,
303
+ [class*="gradio-container-"].dark {
304
+ --oh-border: hsl(0 0% 14%);
305
+ --oh-border-hover: hsl(0 0% 24%);
306
+ }
307
+
308
+ body, .gradio-container {
309
+ font-family: var(--oh-font-sans) !important;
310
+ -webkit-font-smoothing: antialiased;
311
+ }
312
+ code, kbd, pre, .cell-wrap.svelte-v1pjjd {
313
+ font-family: var(--oh-font-mono) !important;
314
+ }
315
+
316
+ /* Markdown `---` → <hr>. Gradio preflight uses color:inherit on hr, which tracks body text, not the border line. */
317
+ /* Section divider: 1px solid var(--oh-border) — light #e4e4e7 (top nav), dark #242424 */
318
+ gradio-app hr,
319
+ .gradio-container hr,
320
+ #about-page-content-wrapper hr,
321
+ #page-content-wrapper hr,
322
+ .prose hr,
323
+ div[class*="markdown"] hr,
324
+ .divider-line hr,
325
+ [class~="divider-line"] hr {
326
+ box-sizing: border-box;
327
+ display: block;
328
+ height: 0 !important;
329
+ margin: 0.75rem 0 1.5rem 0;
330
+ padding: 0 !important;
331
+ border: 0 !important;
332
+ border-top: 1px solid var(--oh-border) !important;
333
+ background: transparent !important;
334
+ background-color: transparent !important;
335
+ /* Some UAs use `color` for the default <hr> border; lock to the border token (not --body-text-color) */
336
+ color: var(--oh-border) !important;
337
+ opacity: 1 !important;
338
  }
339
 
340
+ /* No top padding on gradio-app (control_page_title is a prop on this element) */
 
 
341
  gradio-app {
342
+ padding-top: 0;
343
+ overflow: visible !important;
344
+ display: block;
345
+ }
346
+ /* In-flow strip so the fixed <nav> does not sit on top of the first line of main content */
347
+ gradio-app::before {
348
+ content: "" !important;
349
+ display: block !important;
350
+ width: 100% !important;
351
+ height: 56px !important;
352
+ flex-shrink: 0 !important;
353
+ pointer-events: none !important;
354
+ }
355
+ html {
356
+ scroll-padding-top: 56px;
357
+ min-height: 100%;
358
+ /* Full-viewport canvas; match body/gradio so gutter + Gradio block fills never show a wrong tone (About’s lighter DOM hides this) */
359
+ background-color: var(--color-background-light, #fafafa);
360
+ }
361
+ html.dark,
362
+ html:has([class*="gradio-container-"].dark) {
363
+ background-color: var(--color-background-dark, #0d0d0d);
364
+ }
365
+ /* Main column: cap width to match DESIGN.md; nav stays full-bleed (sibling, not inside .main) */
366
+ gradio-app .main,
367
+ gradio-app .main.fillable {
368
+ max-width: var(--oh-content-max) !important;
369
+ margin-left: auto !important;
370
+ margin-right: auto !important;
371
+ width: 100% !important;
372
+ box-sizing: border-box !important;
373
+ }
374
+ /*
375
+ * OpenHands-Design §4: Dropdown — menu z-index, min-w, border bg-popover, shadow-md, p-1
376
+ * + menu item: text-sm, rounded-md, px-2 py-1.5, data-[highlighted]:bg-muted/60
377
+ * Gradio uses ul.options / li.item; active row uses bg-gray-100 / dark:bg-gray-600 — override to tokens.
378
+ */
379
+ gradio-app ul.options {
380
+ border: 1px solid var(--border-color-primary) !important;
381
+ border-radius: 0.25rem !important;
382
+ padding: 0.25rem !important;
383
+ background: var(--background-fill-primary) !important;
384
+ box-shadow: var(--shadow-drop-lg) !important;
385
+ scrollbar-width: thin;
386
+ scrollbar-color: hsl(0 0% 55% / 0.45) transparent;
387
+ }
388
+ gradio-app ul.options li.item {
389
+ font-size: 0.875rem !important;
390
+ line-height: 1.25rem;
391
+ border-radius: 0.25rem;
392
+ padding: 0.375rem 0.5rem !important;
393
+ margin: 0 0.125rem;
394
+ transition: color 0.2s ease, background-color 0.2s ease;
395
+ }
396
+ /* Light: hover / keyboard highlight — neutral chip */
397
+ gradio-app ul.options li.item:hover,
398
+ gradio-app ul.options li.item.active {
399
+ background-color: var(--oh-form-hover-light) !important;
400
+ }
401
+ /* Dark: canonical hover:bg-muted/60 (DESIGN.md §2) */
402
+ html.dark gradio-app ul.options li.item:hover,
403
+ html.dark gradio-app ul.options li.item.active,
404
+ body.dark gradio-app ul.options li.item:hover,
405
+ body.dark gradio-app ul.options li.item.active,
406
+ html:has([class*="gradio-container-"].dark) gradio-app ul.options li.item:hover,
407
+ html:has([class*="gradio-container-"].dark) gradio-app ul.options li.item.active,
408
+ .gradio-container.dark gradio-app ul.options li.item:hover,
409
+ .gradio-container.dark gradio-app ul.options li.item.active,
410
+ [class*="gradio-container-"].dark gradio-app ul.options li.item:hover,
411
+ [class*="gradio-container-"].dark gradio-app ul.options li.item.active {
412
+ background-color: var(--oh-form-active-dark) !important;
413
+ color: var(--body-text-color) !important;
414
+ }
415
+ /* Touch target: min h-10 (40px) for dropdown / text field wrap (DESIGN.md §8) */
416
+ gradio-app .container > .wrap > .wrap-inner {
417
+ min-height: 2.5rem;
418
+ box-sizing: border-box;
419
+ transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
420
+ }
421
+ /* Leaderboard filter column: form stacks checkboxes with no gap (Gradio form uses --form-gap-width) */
422
+ gradio-app .column.oh-leaderboard-filter-col .form {
423
+ gap: 0 !important;
424
+ }
425
+ /* Gradio root: overflow: hidden; — keep visible; sticky still fails if scroll is on an inner .main, so nav uses position: fixed */
426
+ body > [class*="gradio-container-"],
427
+ body > div.gradio-container,
428
+ body > [class^="gradio-container"] {
429
+ overflow: visible !important;
430
+ }
431
+ /* Multipage top <nav> — fixed + opaque background + single bottom edge (see .nav-holder: border removed) */
432
+ gradio-app nav.svelte-ti537g {
433
+ position: fixed !important;
434
+ top: 0 !important;
435
+ left: 0 !important;
436
+ right: 0 !important;
437
+ width: 100% !important;
438
+ z-index: 200 !important;
439
+ min-height: 56px !important;
440
+ height: 56px !important;
441
+ max-height: 56px !important;
442
+ box-sizing: border-box !important;
443
+ display: flex !important;
444
+ align-items: center !important;
445
+ flex-wrap: nowrap !important;
446
+ /* Default = light top bar (Gradio / :root use dark design tokens, so we don’t use --oh-bg here) */
447
+ background: #fafafa !important;
448
+ background-color: #fafafa !important;
449
+ border-bottom: 1px solid #e4e4e7 !important;
450
+ box-shadow: none !important;
451
+ -webkit-backface-visibility: hidden;
452
+ backface-visibility: hidden;
453
+ }
454
+ /* Dark theme: restore near-black bar (html/body, or any [class*=gradio-container-] with .dark) */
455
+ html.dark gradio-app nav.svelte-ti537g,
456
+ body.dark gradio-app nav.svelte-ti537g,
457
+ html:has([class*="gradio-container-"].dark) gradio-app nav.svelte-ti537g,
458
+ .gradio-container.dark gradio-app nav.svelte-ti537g,
459
+ [class*="gradio-container-"].dark gradio-app nav.svelte-ti537g {
460
+ background: var(--oh-bg) !important;
461
+ background-color: var(--oh-bg) !important;
462
+ border-bottom: 1px solid var(--oh-border) !important;
463
  }
464
 
465
  /* Global Styles */
 
467
  overflow: hidden;
468
  }
469
 
470
+ /* In-content links (DESIGN.md semantic info for links; top nav is outside #page-content-wrapper) */
471
+ #page-content-wrapper a[href],
472
+ #about-page-content-wrapper a[href],
473
+ #about-content a[href],
474
+ #category-intro a[href],
475
+ #intro-paragraph a[href],
476
+ #intro-category-paragraph a[href],
477
+ .prose a[href],
478
+ table.gr-table a[href] {
479
+ color: var(--oh-info) !important;
480
+ text-decoration: none;
481
+ transition: color 0.2s ease;
482
+ }
483
+ #page-content-wrapper a[href]:hover,
484
+ #about-page-content-wrapper a[href]:hover,
485
+ #about-content a[href]:hover,
486
+ #category-intro a[href]:hover,
487
+ #intro-paragraph a[href]:hover,
488
+ #intro-category-paragraph a[href]:hover,
489
+ .prose a[href]:hover,
490
+ table.gr-table a[href]:hover {
491
+ color: var(--oh-link-hover) !important;
492
+ }
493
+ #page-content-wrapper a[href]:visited,
494
+ #about-page-content-wrapper a[href]:visited,
495
+ #about-content a[href]:visited,
496
+ #category-intro a[href]:visited,
497
+ #intro-paragraph a[href]:visited,
498
+ #intro-category-paragraph a[href]:visited,
499
+ .prose a[href]:visited,
500
+ table.gr-table a[href]:visited {
501
+ color: var(--oh-link-visited) !important;
502
+ }
503
+ #page-content-wrapper a[href]:focus-visible,
504
+ #about-page-content-wrapper a[href]:focus-visible,
505
+ #about-content a[href]:focus-visible,
506
+ #category-intro a[href]:focus-visible,
507
+ #intro-paragraph a[href]:focus-visible,
508
+ #intro-category-paragraph a[href]:focus-visible,
509
+ .prose a[href]:focus-visible,
510
+ table.gr-table a[href]:focus-visible {
511
+ outline: 2px solid var(--oh-ring);
512
+ outline-offset: 2px;
513
+ border-radius: 2px;
514
  }
515
 
516
  #intro-paragraph {
517
+ font-size: var(--oh-prose-size);
518
+ max-width: min(100%, 52rem);
519
+ padding-left: 0;
520
+ padding-right: 0;
521
+ margin-top: 0;
522
+ margin-bottom: var(--oh-gap-prose-paragraph);
523
+ }
524
+ /* Theme-aware: Gradio’s --body-text-color (matches light/dark theme); prose overrides need same specificity */
525
+ #intro-paragraph h1.intro-page-title,
526
+ #intro-paragraph .prose h1.intro-page-title {
527
+ font-size: clamp(2rem, 2.5rem + 1.2vw, 2.75rem) !important;
528
+ font-weight: 600 !important;
529
+ line-height: 1.1 !important;
530
+ letter-spacing: -0.03em !important;
531
+ margin: 0 0 1.25rem 0 !important;
532
+ color: var(--body-text-color, var(--color-neutral-950)) !important;
533
+ text-align: left;
534
+ }
535
+ html.dark #intro-paragraph h1.intro-page-title,
536
+ html.dark #intro-paragraph .prose h1.intro-page-title,
537
+ body.dark #intro-paragraph h1.intro-page-title,
538
+ body.dark #intro-paragraph .prose h1.intro-page-title,
539
+ .gradio-container.dark #intro-paragraph h1.intro-page-title,
540
+ .gradio-container.dark #intro-paragraph .prose h1.intro-page-title,
541
+ [class*="gradio-container-"].dark #intro-paragraph h1.intro-page-title,
542
+ [class*="gradio-container-"].dark #intro-paragraph .prose h1.intro-page-title {
543
+ color: var(--body-text-color, var(--oh-fg)) !important;
544
+ }
545
+ #intro-paragraph .html-container,
546
+ #intro-paragraph .prose {
547
+ padding-left: 0 !important;
548
+ padding-right: 0 !important;
549
+ margin-left: 0 !important;
550
  }
551
 
552
  #intro-paragraph p,
553
  #intro-paragraph li {
554
+ font-size: var(--oh-prose-size);
555
+ line-height: var(--oh-prose-leading);
556
+ }
557
+ #intro-paragraph p,
558
+ #intro-paragraph .prose p {
559
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
560
+ }
561
+ #intro-paragraph p:last-child {
562
+ margin-bottom: 0;
563
  }
564
 
565
+ /* DESIGN.md: Label pattern same link token, medium weight for explicit intro-link */
566
  .intro-link {
567
+ color: var(--oh-info) !important;
568
+ text-decoration: none;
569
+ font-weight: 500;
570
  }
571
+ .intro-link:hover {
572
+ color: var(--oh-link-hover) !important;
573
  }
574
 
575
  #intro-paragraph ul {
576
+ margin: var(--oh-gap-prose-paragraph) 0;
577
+ padding-left: 1.25rem;
578
+ }
579
+ #intro-paragraph ul li + li {
580
+ margin-top: 0.35em;
581
  }
582
 
583
  #diagram-image {
 
590
  object-fit: cover;
591
  }
592
  #intro-category-paragraph {
593
+ font-size: var(--oh-prose-size);
594
+ max-width: min(100%, 52rem);
595
+ margin-top: 1.5rem;
596
+ margin-bottom: var(--oh-gap-prose-paragraph);
597
  }
598
 
599
  #intro-category-paragraph p,
600
  #intro-category-paragraph li {
601
+ font-size: var(--oh-prose-size);
602
+ line-height: var(--oh-prose-leading);
603
+ }
604
+ #intro-category-paragraph p {
605
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
606
+ }
607
+ #intro-category-paragraph p:last-child {
608
+ margin-bottom: 0;
609
  }
610
 
611
  #intro-category-paragraph ul {
612
+ margin: var(--oh-gap-prose-paragraph) 0;
613
+ padding-left: 1.25rem;
614
+ }
615
+ #intro-category-paragraph ul li + li {
616
+ margin-top: 0.35em;
617
  }
618
 
619
  #about-content {
620
+ font-size: var(--oh-prose-size);
621
+ line-height: var(--oh-prose-leading);
622
+ max-width: min(100%, 42rem);
623
+ padding-left: 0;
624
+ margin-bottom: var(--oh-pad-y-section);
625
+ }
626
+ #about-content p {
627
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
628
+ }
629
+ #about-content p:last-child {
630
+ margin-bottom: 0;
631
  }
632
  #category-intro {
633
+ font-size: var(--oh-prose-size);
634
+ line-height: var(--oh-prose-leading);
635
+ max-width: min(100%, 42rem);
636
+ margin-bottom: var(--oh-gap-prose-paragraph);
637
+ }
638
+ #category-intro p {
639
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
640
+ }
641
+ #category-intro p:last-child {
642
+ margin-bottom: 0;
643
  }
644
  #logo-image {
645
  margin: 0;
646
+ margin-bottom: 2rem;
647
  justify-content: flex-start;
648
+ max-width: 250px;
649
  height: auto;
650
  }
651
+ /* index.html hero/section: comfortable row gap for intro + diagram */
652
+ #intro-row {
653
+ gap: 1.5rem;
654
+ align-items: flex-start;
655
+ width: 100%;
656
+ }
657
+ /* DESIGN.md: container max 1400px, horizontal padding 24px (index .section) */
658
+ #page-content-wrapper {
659
+ box-sizing: border-box;
660
+ width: 100%;
661
+ max-width: min(100%, var(--oh-content-max));
662
+ margin-left: auto;
663
+ margin-right: auto;
664
+ /* Match home: gradio-app::before (56px nav) + intro-paragraph’s former margin-top */
665
+ padding: 1.5rem var(--oh-pad-x-page) 0;
666
+ display: flex;
667
+ flex-direction: column;
668
+ gap: 1.5rem; /* gap-6 between major blocks */
669
  }
670
  .table-component{
671
  height: auto !important;
 
686
  vertical-align: top !important;
687
  }
688
  table.gr-table {
689
+ font-size: 14px !important;
690
  }
691
  .html-container {
692
  padding-top: 0 !important;
 
695
  overflow: visible !important;
696
  }
697
  #pareto-disclaimer {
698
+ color: var(--oh-success) !important;
699
  }
700
  thead.svelte-1e98i6s th {
701
+ background: var(--color-neutral-50) !important;
702
  }
703
  .dark thead.svelte-1e98i6s th {
704
+ background: var(--color-neutral-900) !important;
705
  }
706
  .cell-wrap.svelte-v1pjjd {
707
+ font-family: var(--oh-font-mono) !important;
708
+ }
709
+ /* Gradio 5.30: top route row — right-align; left padding reserves zone for wordmark (app.py) */
710
+ gradio-app .nav-holder > nav.svelte-ti537g,
711
+ gradio-app .nav-holder nav.svelte-ti537g,
712
+ gradio-app nav.svelte-ti537g {
713
+ margin: 0 !important;
714
+ margin-left: 0 !important;
715
+ margin-right: 0 !important;
716
+ width: 100% !important;
717
+ max-width: none !important;
718
+ box-sizing: border-box !important;
719
+ justify-content: flex-end !important;
720
+ padding: 0 20px 0 164px !important;
721
+ }
722
  nav.svelte-ti537g.svelte-ti537g {
723
+ justify-content: flex-end !important;
724
+ }
725
+ /* First paint: default route chip text only — not .active (Gradio gives .active the block fill; we override in app.py last) */
726
+ gradio-app nav.svelte-ti537g > a[href]:not([href*="/home"]):not(.active) {
727
+ font-size: 13px !important;
728
+ font-weight: 400 !important;
729
+ line-height: 1.4 !important;
730
+ color: #71717a !important;
731
+ padding: 6px 12px !important;
732
+ border-radius: 6px !important;
733
+ white-space: nowrap !important;
734
+ }
735
+ html.dark gradio-app nav.svelte-ti537g > a[href]:not([href*="/home"]):not(.active),
736
+ body.dark gradio-app nav.svelte-ti537g > a[href]:not([href*="/home"]):not(.active),
737
+ html:has([class*="gradio-container-"].dark) gradio-app nav.svelte-ti537g > a[href]:not([href*="/home"]):not(.active),
738
+ .gradio-container.dark gradio-app nav.svelte-ti537g > a[href]:not([href*="/home"]):not(.active),
739
+ [class*="gradio-container-"].dark gradio-app nav.svelte-ti537g > a[href]:not([href*="/home"]):not(.active) {
740
+ color: var(--oh-fg-muted) !important;
741
+ }
742
+ /* Dedupe & trim root link before/after .oh-top-nav (mirrors app.py) */
743
+ gradio-app nav.svelte-ti537g a[href$="/"] {
744
+ display: none !important;
745
+ }
746
+ gradio-app .nav-holder nav a[href="/home"]:not(.oh-nav-link) {
747
+ display: none !important;
748
+ }
749
+ /* Gradio: .nav-holder had border-bottom in flow while <nav> is position:fixed — that border scrolled (moving line). No border/background on holder; edge lives on <nav> only. */
750
+ gradio-app .nav-holder,
751
+ .nav-holder.svelte-ti537g.svelte-ti537g {
752
+ padding: 0 !important;
753
+ border: none !important;
754
+ border-bottom: none !important;
755
+ background: transparent !important;
756
+ box-shadow: none !important;
757
+ width: 100% !important;
758
+ max-width: none !important;
759
+ text-align: left !important;
760
+ }
761
+ /* Gradio 5.30: default nav has horizontal margin/padding; keep bar tight */
762
+ nav.oh-top-nav.svelte-ti537g.svelte-ti537g {
763
+ margin: 0 !important;
764
+ }
765
+ /* .oh-top-nav is applied by oh_top_nav_script — Gradio 5.30+ has no .nav-holder */
766
+ .oh-top-nav {
767
+ position: fixed !important;
768
+ top: 0 !important;
769
+ left: 0 !important;
770
+ right: 0 !important;
771
+ z-index: 200 !important;
772
+ flex: 0 0 auto !important;
773
+ display: flex !important;
774
+ flex-direction: row !important;
775
+ flex-flow: row nowrap !important;
776
+ flex-wrap: nowrap !important;
777
+ align-items: center !important;
778
+ align-content: center !important;
779
+ justify-content: flex-end !important;
780
+ gap: 4px !important;
781
+ height: 56px !important;
782
+ min-height: 56px !important;
783
+ max-height: 56px !important;
784
+ width: 100% !important;
785
+ max-width: 100% !important;
786
+ box-sizing: border-box !important;
787
+ padding: 0 20px 0 164px !important;
788
+ margin: 0 !important;
789
+ /* Opaque bar — default light; dark overrides follow */
790
+ background: #fafafa !important;
791
+ background-color: #fafafa !important;
792
+ backdrop-filter: none !important;
793
+ -webkit-backdrop-filter: none !important;
794
+ border-bottom: 1px solid #e4e4e7 !important;
795
+ box-shadow: none !important;
796
+ overflow: visible !important;
797
+ list-style: none !important;
798
+ -webkit-backface-visibility: hidden;
799
+ backface-visibility: hidden;
800
+ }
801
+ /* Gradio .fillable limits max-width at breakpoints; keep route bar edge-to-edge (nav can be .fillable.svelte-ti537g) */
802
+ nav.oh-top-nav.fillable,
803
+ .oh-top-nav.fillable,
804
+ nav.fillable.oh-top-nav,
805
+ nav.oh-top-nav.svelte-ti537g.fillable {
806
+ max-width: none !important;
807
+ width: 100% !important;
808
  }
809
+ /* Dark top bar: document and/or .dark on Gradio container (including :has when only container is .dark) */
810
+ html.dark .oh-top-nav,
811
+ body.dark .oh-top-nav,
812
+ html:has([class*="gradio-container-"].dark) .oh-top-nav,
813
+ .gradio-container.dark .oh-top-nav,
814
+ [class*="gradio-container-"].dark .oh-top-nav {
815
+ background: var(--oh-bg) !important;
816
+ background-color: var(--oh-bg) !important;
817
+ border-bottom: 1px solid var(--oh-border) !important;
818
+ backdrop-filter: none !important;
819
+ -webkit-backdrop-filter: none !important;
820
+ }
821
+ /* Active route chip visuals: see app.py final_css (appended after this file; must beat Gradio a.active.svelte-ti537g) */
822
+ /* Avoid double line: nav border-bottom + first block border-top */
823
+ .oh-top-nav + * {
824
+ border-top: none !important;
825
+ box-shadow: none !important;
826
+ }
827
+ .oh-top-nav::-webkit-scrollbar { display: none !important; }
828
+ /* Gradio 5.30: every route <a> uses .svelte-ti537g; some (e.g. duplicate Home) lack .oh-nav-link — clear underline/visited */
829
+ .oh-top-nav a.svelte-ti537g,
830
+ .oh-top-nav a.svelte-ti537g:hover,
831
+ .oh-top-nav a.svelte-ti537g:focus,
832
+ .oh-top-nav a.svelte-ti537g:active,
833
+ .oh-top-nav a.svelte-ti537g:visited,
834
+ .oh-top-nav a.svelte-ti537g.active {
835
+ text-decoration: none !important;
836
+ text-decoration-line: none !important;
837
+ }
838
+ /* Gradio can set column layout on parents; keep links in one row */
839
+ .oh-top-nav > a.oh-nav-link,
840
+ .oh-top-nav a.oh-nav-link {
841
+ flex: 0 0 auto !important;
842
+ display: inline-flex !important;
843
+ align-items: center !important;
844
  }
845
  #legend-markdown span {
846
  margin-right: 15px !important;
 
851
  position: relative !important;
852
  }
853
  .dark #leaderboard-accordion .label-wrap {
854
+ color: var(--oh-fg) !important;
855
  }
856
  .dark block.svelte-1svsvh2 {
857
  background: var(--color-background-dark) !important;
 
863
  display: flex !important;
864
  flex-wrap: wrap !important;
865
  align-items: center !important;
866
+ gap: 0.5rem !important; /* gap-2 */
 
 
 
867
  }
868
+ .dark .primary-link-button,
869
  .primary-link-button {
870
  background: none;
871
  border: none;
872
  padding: 0;
873
  margin: 0;
874
  font-family: inherit;
875
+ font-size: var(--oh-prose-size);
876
+ font-weight: 500;
877
+ color: var(--oh-info);
878
  text-decoration: none;
879
  cursor: pointer;
880
  white-space: nowrap;
881
+ transition: color 0.2s ease;
882
  }
883
  .primary-link-button:hover {
884
+ color: var(--oh-link-hover);
885
+ text-decoration: none;
886
+ }
887
+ .primary-link-button:focus-visible {
888
+ color: var(--oh-link-hover);
889
+ text-decoration: none;
890
+ outline: 2px solid var(--oh-ring);
891
+ outline-offset: 2px;
892
+ border-radius: 2px;
893
  }
894
  .sub-nav-label {
895
+ font-weight: 600;
896
+ font-size: var(--oh-prose-size);
897
  display: flex;
898
  align-items: center;
899
  }
900
+ .wrap-header-df th span {
901
  white-space: normal !important;
902
  word-break: normal !important;
903
  overflow-wrap: break-word !important;
904
  line-height: 1.2 !important;
905
  vertical-align: top !important;
906
  font-size: 12px !important;
907
+ font-family: var(--oh-font-sans) !important;
908
  }
909
  .wrap-header-df th {
910
  height: auto !important;
 
978
  /* --- inside table tooltips --- */
979
  .native-tooltip-icon {
980
  cursor: help;
981
+ text-decoration: none;
 
 
 
 
 
 
 
 
 
 
 
 
982
  }
983
+ /* Route chips: do not require .oh-nav-link (JS adds it async — without it, .dark a and Gradio nav rules used to break hover/active) */
984
+ gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active),
985
+ gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active),
986
+ .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active) {
987
+ font-family: var(--oh-font-sans) !important;
988
+ font-size: 13px !important;
989
+ font-weight: 400 !important;
990
+ line-height: 1.4 !important;
991
+ color: #71717a !important;
992
+ text-decoration: none !important;
993
+ padding: 6px 12px !important;
994
+ border-radius: 6px !important;
995
+ border: 1px solid transparent !important;
996
+ transition: color 0.2s, background-color 0.2s, border-color 0.2s !important;
997
  white-space: nowrap !important;
998
+ box-shadow: none !important;
999
+ cursor: pointer !important;
1000
+ pointer-events: auto !important;
1001
+ position: relative !important;
1002
+ z-index: 1 !important;
1003
+ }
1004
+ gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1005
+ gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1006
+ gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1007
+ gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1008
+ .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):hover,
1009
+ .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):focus-visible {
1010
+ color: #fafafa !important;
1011
+ background-color: #18181b !important;
1012
+ border-color: transparent !important;
1013
+ }
1014
+ /* Dark: muted links on dark bar */
1015
+ html.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active),
1016
+ html.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active),
1017
+ html.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active),
1018
+ body.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active),
1019
+ body.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active),
1020
+ body.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active),
1021
+ html:has([class*="gradio-container-"].dark) gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active),
1022
+ html:has([class*="gradio-container-"].dark) gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active),
1023
+ html:has([class*="gradio-container-"].dark) .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active),
1024
+ .gradio-container.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active),
1025
+ .gradio-container.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active),
1026
+ .gradio-container.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active),
1027
+ [class*="gradio-container-"].dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active),
1028
+ [class*="gradio-container-"].dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active),
1029
+ [class*="gradio-container-"].dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active) {
1030
+ color: var(--oh-fg-muted) !important;
1031
+ }
1032
+ html.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1033
+ html.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1034
+ html.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1035
+ html.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1036
+ html.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):hover,
1037
+ html.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):focus-visible,
1038
+ body.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1039
+ body.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1040
+ body.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1041
+ body.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1042
+ body.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):hover,
1043
+ body.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):focus-visible,
1044
+ html:has([class*="gradio-container-"].dark) gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1045
+ html:has([class*="gradio-container-"].dark) gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1046
+ html:has([class*="gradio-container-"].dark) gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1047
+ html:has([class*="gradio-container-"].dark) gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1048
+ html:has([class*="gradio-container-"].dark) .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):hover,
1049
+ html:has([class*="gradio-container-"].dark) .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):focus-visible,
1050
+ .gradio-container.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1051
+ .gradio-container.dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1052
+ .gradio-container.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1053
+ .gradio-container.dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1054
+ .gradio-container.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):hover,
1055
+ .gradio-container.dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):focus-visible,
1056
+ [class*="gradio-container-"].dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1057
+ [class*="gradio-container-"].dark gradio-app nav.oh-top-nav a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1058
+ [class*="gradio-container-"].dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):hover,
1059
+ [class*="gradio-container-"].dark gradio-app nav.svelte-ti537g a.svelte-ti537g:not([href*="/home"]):not(.active):focus-visible,
1060
+ [class*="gradio-container-"].dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):hover,
1061
+ [class*="gradio-container-"].dark .oh-top-nav a.oh-nav-link:not([href*="/home"]):not(.active):focus-visible {
1062
+ color: #ffffff !important;
1063
+ background-color: var(--oh-muted) !important;
1064
+ }
1065
+ /* Dark app shell (OpenHands-Design near-black) */
1066
+ body.dark, .gradio-container.dark {
1067
+ --body-background-fill: #0d0d0d !important;
1068
+ /* Must match body: #121212 vs #0d0d0d on nested Gradio blocks reads as a full-height left band on leaderboard/row layouts; About is unaffected visually */
1069
+ --block-background-fill: #0d0d0d !important;
1070
+ }
1071
+ body.dark, .gradio-container.dark,
1072
+ .gradio-container.dark .contain,
1073
+ .gradio-container.dark .wrap,
1074
+ .gradio-container.dark .main,
1075
+ .gradio-container.dark {
1076
+ background-color: #0d0d0d !important;
1077
+ color: #fafafa !important;
1078
+ }
1079
+ .benchmark-main-subtitle {
1080
+ color: var(--oh-fg-muted);
1081
  overflow: hidden;
1082
  padding-top: 120px;
1083
+ font-size: var(--oh-prose-size);
1084
+ font-weight: 500;
1085
+ line-height: var(--oh-prose-leading);
1086
  }
1087
+ .benchmark-title {
1088
+ color: var(--color-text-dark);
1089
+ margin-top: 2.5rem;
1090
+ /* DESIGN.md: section heading — text-lg / font-semibold */
1091
+ font-size: 1.125rem;
1092
+ font-weight: 600;
1093
+ line-height: 1.3;
1094
+ letter-spacing: -0.02em;
1095
  }
1096
+ .dark .benchmark-title {
1097
+ color: var(--oh-fg);
 
 
 
 
 
1098
  }
1099
  .benchmark-description {
1100
+ margin: var(--oh-gap-prose-paragraph) 0 1.5rem;
1101
+ max-width: 52rem;
1102
+ font-size: var(--oh-prose-size);
1103
+ line-height: var(--oh-prose-leading);
1104
  }
1105
+ .benchmark-description p {
1106
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
1107
+ }
1108
+ .benchmark-description p:last-child {
1109
+ margin-bottom: 0;
1110
  }
1111
+
1112
+ /* DESIGN.md: page heading — text-2xl / font-semibold */
1113
+ .dark #main-header h2,
1114
  #main-header h2 {
1115
+ color: #fafafa !important;
1116
+ font-size: 1.5rem;
1117
+ line-height: 1.2;
1118
+ font-weight: 600;
1119
+ letter-spacing: -0.02em;
1120
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
1121
+ }
1122
+ .gradio-container:not(.dark) #main-header h2 {
1123
+ color: #0d0d0d !important;
1124
  }
1125
 
1126
  /* --- New HTML-Based Tooltip Styles --- */
 
1206
  flex-wrap: wrap;
1207
  }
1208
 
1209
+ /* About Page CSS — nested in #page-content-wrapper for same horizontal + top padding as Home */
1210
  #about-page-content-wrapper {
1211
  margin-left: auto;
1212
  margin-right: auto;
1213
+ max-width: 50rem; /* 800px — readable line length */
1214
+ padding: 0;
1215
  display: flex;
1216
  flex-direction: column;
1217
+ gap: 2.5rem; /* 40px — matches index .section-title margin rhythm */
1218
+ margin-top: 0;
1219
+ opacity: 0.85;
1220
+ margin-bottom: 3.75rem; /* 60px */
1221
+ box-sizing: border-box;
1222
+ }
1223
+
1224
+ /* Alternative Agents intro — align with Home / category hero width and heading scale */
1225
+ #alternative-agents-intro {
1226
+ font-size: var(--oh-prose-size);
1227
+ line-height: var(--oh-prose-leading);
1228
+ max-width: min(100%, 52rem);
1229
+ }
1230
+ #alternative-agents-intro h2 {
1231
+ font-size: 1.5rem;
1232
+ font-weight: 600;
1233
+ line-height: 1.2;
1234
+ letter-spacing: -0.02em;
1235
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
1236
+ color: var(--body-text-color, var(--oh-fg)) !important;
1237
+ }
1238
+ #alternative-agents-intro p {
1239
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
1240
+ }
1241
+ #alternative-agents-intro p:last-child {
1242
+ margin-bottom: 0;
1243
+ }
1244
+ #about-page-content-wrapper h2 {
1245
+ font-size: 1.5rem;
1246
+ font-weight: 600;
1247
+ line-height: 1.2;
1248
+ letter-spacing: -0.02em;
1249
+ margin: 0 0 0.75rem 0;
1250
+ color: var(--body-text-color, var(--oh-fg)) !important;
1251
+ }
1252
+ #about-page-content-wrapper p,
1253
+ #about-page-content-wrapper li {
1254
+ font-size: var(--oh-prose-size);
1255
+ line-height: var(--oh-prose-leading);
1256
+ }
1257
+ #about-page-content-wrapper p {
1258
+ margin: 0 0 var(--oh-gap-prose-paragraph) 0;
1259
+ }
1260
+ #about-page-content-wrapper p:last-child {
1261
+ margin-bottom: 0;
1262
+ }
1263
+ #about-page-content-wrapper .info-list {
1264
+ margin: var(--oh-gap-prose-paragraph) 0;
1265
+ padding-left: 1.25rem;
1266
+ }
1267
+ #about-page-content-wrapper .info-list li + li {
1268
+ margin-top: 0.35em;
1269
  }
1270
  .link-buttons-container {
1271
  display: flex;
 
1332
  min-height: 572px;
1333
  background-color: #fff;
1334
  padding: 24px 32px;
1335
+ border: 1px solid var(--oh-border);
1336
  border-radius: 4px;
1337
  }
1338
 
1339
  .dark .plot-legend-container {
1340
  background: rgba(247, 248, 251, 0.1);
1341
+ border-color: var(--oh-border);
1342
  }
1343
 
1344
  #plot-legend-logo {
 
1400
  .winners-by-category-container {
1401
  margin: 20px 0;
1402
  overflow-x: auto;
1403
+ scrollbar-gutter: stable;
1404
+ /* Horizontal scrollbar: thin thumb, no visible track (OpenHands-Design) */
1405
+ scrollbar-width: thin;
1406
+ scrollbar-color: hsl(0 0% 40% / 0.5) transparent;
1407
+ }
1408
+ html.dark .winners-by-category-container,
1409
+ body.dark .winners-by-category-container,
1410
+ .gradio-container.dark .winners-by-category-container {
1411
+ scrollbar-color: hsl(0 0% 55% / 0.45) transparent;
1412
+ }
1413
+ .winners-by-category-container::-webkit-scrollbar {
1414
+ height: 6px;
1415
+ }
1416
+ .winners-by-category-container::-webkit-scrollbar-track {
1417
+ background: transparent;
1418
+ }
1419
+ .winners-by-category-container::-webkit-scrollbar-thumb {
1420
+ background: hsl(0 0% 40% / 0.5);
1421
+ border-radius: 9999px;
1422
+ }
1423
+ .winners-by-category-container::-webkit-scrollbar-thumb:hover {
1424
+ background: hsl(0 0% 35% / 0.7);
1425
+ }
1426
+ html.dark .winners-by-category-container::-webkit-scrollbar-thumb,
1427
+ body.dark .winners-by-category-container::-webkit-scrollbar-thumb,
1428
+ .gradio-container.dark .winners-by-category-container::-webkit-scrollbar-thumb {
1429
+ background: hsl(0 0% 55% / 0.5);
1430
+ }
1431
+ html.dark .winners-by-category-container::-webkit-scrollbar-thumb:hover,
1432
+ body.dark .winners-by-category-container::-webkit-scrollbar-thumb:hover,
1433
+ .gradio-container.dark .winners-by-category-container::-webkit-scrollbar-thumb:hover {
1434
+ background: hsl(0 0% 60% / 0.65);
1435
  }
1436
 
1437
  .winners-unified-table {
 
1439
  border-collapse: collapse;
1440
  font-size: 13px;
1441
  background: #fff;
1442
+ border: 1px solid var(--oh-border);
1443
  border-radius: 12px;
1444
  overflow: hidden;
1445
  }
1446
 
1447
  .dark .winners-unified-table {
1448
  background: rgba(247, 248, 251, 0.05);
1449
+ border-color: var(--oh-border);
1450
  }
1451
 
1452
+ /* Category header bar: flat neutral grey */
1453
  .winners-unified-table thead tr {
1454
+ background: hsl(0 0% 92%);
1455
  }
1456
 
1457
  .dark .winners-unified-table thead tr {
1458
+ background: hsl(0 0% 12%);
1459
  }
1460
 
1461
  .winners-unified-table .category-header {
 
1464
  font-weight: 700;
1465
  font-size: 13px;
1466
  color: var(--color-text-dark);
1467
+ border-bottom: 1px solid var(--oh-border) !important;
1468
+ border-right: 1px solid var(--oh-border) !important;
1469
  white-space: nowrap;
1470
  }
1471
 
1472
  .dark .winners-unified-table .category-header {
1473
  color: #fff;
1474
+ border-bottom-color: var(--oh-border) !important;
1475
+ border-right-color: var(--oh-border) !important;
1476
  }
1477
 
1478
  .winners-unified-table .category-header:last-child {
 
1489
  .winners-unified-table td {
1490
  padding: 8px 6px;
1491
  vertical-align: middle;
1492
+ border-bottom: 1px solid var(--oh-border);
1493
  }
1494
 
1495
  .dark .winners-unified-table td {
1496
+ border-bottom-color: var(--oh-border);
1497
  }
1498
 
1499
  .winners-unified-table tbody tr:last-child td {
1500
  border-bottom: none;
1501
  }
1502
 
1503
+ /* Row hover: muted/60 style (DESIGN.md), not yellow */
1504
  .winners-unified-table tbody tr:hover {
1505
+ background: hsl(0 0% 0% / 0.04);
1506
  }
1507
 
1508
  .dark .winners-unified-table tbody tr:hover {
1509
+ background: hsl(0 0% 12% / 0.5);
1510
  }
1511
 
1512
  .winners-unified-table .score-cell {
 
1515
  color: var(--color-primary-dark);
1516
  padding-left: 12px;
1517
  min-width: 50px;
1518
+ border-right: 1px solid var(--oh-border);
1519
  }
1520
 
1521
  .dark .winners-unified-table .score-cell {
1522
  color: var(--color-primary-accent);
1523
+ border-right-color: var(--oh-border);
1524
  }
1525
 
1526
  .winners-unified-table .model-cell {
 
1528
  color: var(--color-text-dark);
1529
  font-weight: 500;
1530
  padding-right: 12px;
1531
+ border-right: 1px solid var(--oh-border);
1532
  }
1533
 
1534
  .dark .winners-unified-table .model-cell {
1535
  color: #fff;
1536
+ border-right-color: var(--oh-border);
1537
  }
1538
 
1539
  .winners-unified-table td:nth-last-child(1) {
 
1623
  padding-right: 8px !important;
1624
  }
1625
 
 
1626
  #intro-paragraph {
1627
+ padding-left: 0 !important;
1628
+ padding-right: 0 !important;
1629
  max-width: 100% !important;
1630
  }
1631
 
 
1636
  max-width: 100% !important;
1637
  }
1638
 
1639
+ /* Nav: keep left gutter for wordmark; tighten sides on small viewports */
1640
+ .oh-top-nav,
1641
+ gradio-app nav.svelte-ti537g {
1642
+ padding-left: 116px !important;
1643
  padding-right: 8px !important;
1644
  }
1645
 
 
1650
  max-width: 100% !important;
1651
  }
1652
 
1653
+ /* About is inside #page-content-wrapper — outer handles horizontal padding */
1654
  #about-page-content-wrapper {
1655
+ padding-left: 0 !important;
1656
+ padding-right: 0 !important;
1657
  }
1658
 
1659
  /* Reduce gradio container padding */