emolero's picture
Redesign UI as arena.ai x Scale AI hybrid (gsma-labs/open-telco-leaderboard#2)
5db3978 verified
Raw
History Blame Contribute Delete
21.7 kB
:root {
--ink: #121212;
--copy: #484848;
--muted: #696969;
--faint: #a1a1a1;
--hairline: #e5e5e5;
--frame: #d3d3d3;
--wash: #f3f3f3;
--mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--serif: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, "Times New Roman", serif;
--sans: "Inter", "Helvetica Neue", Arial, ui-sans-serif, system-ui, sans-serif;
}
* { box-sizing: border-box; }
html,
body,
#root,
.gradio-container {
min-height: 100%;
margin: 0 !important;
color: var(--ink) !important;
background: #fff !important;
font-family: var(--sans) !important;
-webkit-font-smoothing: antialiased;
}
.gradio-container {
max-width: none !important;
padding: 0 !important;
/* Gradio ships overflow:hidden here, which defeats every position:sticky
descendant (site header, sidebar); the page scrolls on the document. */
overflow: visible !important;
}
.gradio-container > .main,
.gradio-container .contain {
max-width: none !important;
padding: 0 !important;
}
.gradio-container .contain > .column {
gap: 0 !important;
}
.gradio-container .prose { color: inherit !important; }
.gradio-container button { font-family: inherit !important; }
footer { display: none !important; }
/* Suppress Gradio's processing flash (spinner + "x.x/y.ys" text) on re-renders. */
.gradio-container .wrap.default.full,
.gradio-container .progress-text,
.gradio-container .eta-bar,
.gradio-container .meta-text,
.gradio-container .meta-text-center { display: none !important; }
#hidden-controls {
position: absolute !important;
left: -9999px !important;
width: 1px !important;
height: 1px !important;
overflow: hidden !important;
}
.site-header-wrap {
position: sticky !important;
top: 0;
z-index: 50;
margin: 0 !important;
padding: 0 !important;
border: 0 !important;
background: #fff !important;
}
.site-header-wrap .html-container {
padding: 0 !important;
}
.site-header {
height: 53px;
padding: 0 24px; /* wordmark shares the 24px gridline with sidebar labels */
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid var(--hairline);
background: #fff;
}
.wordmark {
color: var(--ink) !important;
font-family: var(--serif);
font-size: 18px;
line-height: 24px;
font-weight: 500;
letter-spacing: -.01em;
text-decoration: none !important;
white-space: nowrap;
}
.top-nav {
display: flex;
align-items: center;
gap: 4px;
}
.top-nav a,
.top-nav span {
padding: 4px 6px;
color: var(--copy) !important;
font-size: 12px;
line-height: 18px;
letter-spacing: .3px;
text-decoration: none !important;
white-space: nowrap;
}
.top-nav .active {
color: var(--ink) !important;
background: var(--wash);
}
.top-nav .search { padding-right: 0; }
.ot-main {
min-height: calc(100vh - 53px);
margin: 0 !important;
gap: 0 !important;
align-items: stretch !important;
flex-wrap: nowrap !important;
}
.ot-sidebar {
position: sticky;
top: 53px;
width: 285px !important;
min-width: 285px !important;
max-width: 285px !important;
height: calc(100vh - 53px);
padding: 0 8px !important;
flex: 0 0 285px !important;
overflow-y: auto;
background: #fff !important;
}
.sidebar-inner {
margin: 0 !important;
padding: 0 !important;
}
/* Gradio's html-container injects 12px that knocks nav text off the 24px gridline. */
.ot-sidebar .html-container { padding: 0 !important; }
.side-section {
margin: 0 8px 0 5px;
padding: 12px 0;
}
.side-heading {
height: 26px;
padding: 4px 8px 4px 11px; /* text lands on the 24px gridline (8+5+11) */
display: flex;
align-items: center;
justify-content: space-between;
color: var(--copy);
font-size: 12px;
line-height: 18px;
font-weight: 600;
letter-spacing: .2px;
}
.side-list { margin-top: 4px; }
.side-link {
width: 100%;
min-height: 37px;
margin: 0 !important;
padding: 8px 8px 8px 9px !important; /* 8+5+2+9 = 24px gridline */
display: flex;
align-items: flex-start;
border: 0 !important;
border-left: 2px solid var(--hairline) !important;
border-radius: 0 !important;
color: var(--copy) !important;
background: #fff !important;
font-size: 14px !important;
line-height: 21px !important;
font-weight: 400 !important;
text-align: left;
cursor: pointer;
}
.side-link:hover { color: var(--ink) !important; }
.side-link.active {
border-left-color: var(--ink) !important;
color: var(--ink) !important;
background: var(--wash) !important;
}
.ot-content {
min-width: 0 !important;
padding: 40px !important;
gap: 0 !important;
flex: 1 1 auto !important;
overflow-x: hidden;
background: #fff !important;
}
/* Overall header + table fill the full content width (fluid with the window). */
.ot-hero-wrap,
.ot-display {
width: 100% !important;
max-width: none !important;
margin: 0 !important;
}
/* Benchmark detail (prose + chart) fills the width too, like Scale;
capped so the chart column keeps a real right gutter at 1512+. */
.bm-detail-row {
width: 100% !important;
max-width: 1400px !important;
margin: 0 !important;
}
.ot-hero-wrap {
padding: 0 !important;
border: 0 !important;
}
.ot-hero-wrap:has(.prose:empty) { display: none !important; }
.ov-header { padding: 4px 0 0; }
.gradio-container .ov-title {
margin: 0 0 10px !important;
color: var(--ink) !important;
font-family: var(--serif) !important;
font-size: 34px !important;
line-height: 36px !important;
font-weight: 500 !important;
letter-spacing: -.8px !important;
}
.gradio-container .ov-desc {
margin: 0 0 16px !important;
max-width: 760px;
color: var(--copy) !important;
font-size: 14px !important;
line-height: 22px !important;
}
.ov-toolbar {
margin-top: 22px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.ov-search {
flex: 1;
max-width: 300px;
height: 40px;
display: flex;
align-items: center;
gap: 8px;
padding: 0 11px;
border: 1px solid var(--hairline);
border-radius: 8px;
color: var(--muted);
}
.ov-search svg { flex: 0 0 auto; }
.ov-search input {
width: 100%;
border: 0;
outline: none;
background: transparent;
color: var(--ink) !important;
font-family: inherit !important;
font-size: 13px;
}
.ov-rankby {
display: inline-flex;
align-items: center;
gap: 8px;
color: var(--copy);
font-size: 12.5px;
white-space: nowrap;
}
.ov-rankby select {
height: 40px;
padding: 0 9px;
border: 1px solid var(--hairline);
border-radius: 8px;
color: var(--ink);
background: #fff;
font-family: inherit;
font-size: 12.5px;
cursor: pointer;
}
.ot-display {
margin-top: 16px !important;
padding: 0 !important;
border: 0 !important;
}
.table-wrapper {
width: 100%;
max-width: 100%;
/* Page owns vertical scroll (Scale-style one long page); only x scrolls here.
The old inner max-height double-scroll clipped rows and ate column width. */
overflow-x: auto;
border: 1px solid var(--frame);
border-radius: 8px;
}
/* Scroll affordances, classes toggled by _updateScrollHints() in app.py JS:
fade at the cut edge says "more columns", so nothing reads as clipped glyphs. */
.table-wrapper.more-x {
-webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 24px), transparent);
mask-image: linear-gradient(90deg, #000 calc(100% - 24px), transparent);
}
.leaderboard-table {
width: 100%;
min-width: 900px;
border-collapse: collapse;
table-layout: fixed;
color: var(--ink);
font-size: 14px;
line-height: 20px;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
/* Scale-style header: white with a hairline rule, no gray band. */
.leaderboard-table thead tr { background: #fff; }
/* _pinThead() translates the whole thead to keep headers in view; the row
needs its own stacking level above the sticky identity td cells (z 2). */
.leaderboard-table thead {
position: relative;
z-index: 5;
}
.leaderboard-table th,
.leaderboard-table td {
height: 56px;
padding: 10px 10px;
overflow: hidden;
border-bottom: 1px solid var(--hairline);
color: var(--ink);
background: transparent;
/* Grotesk sans for headers and numbers; mono is model identity ONLY. */
font-family: var(--sans) !important;
text-align: right;
text-overflow: clip;
}
/* Single vertical rule at the identity | scores boundary; a second rule after
AVG boxed it into an island, so it whispers with one. */
.leaderboard-table .col-model { border-right: 1px solid var(--hairline); }
/* One header voice across the full row (identity + benchmark columns alike);
sticky within the wrapper so column context survives long scrolls. */
.leaderboard-table th {
position: sticky;
top: 0;
z-index: 3;
color: #6b7280;
background: #fff;
font-size: 11px;
line-height: 16px;
font-weight: 500;
letter-spacing: .02em;
cursor: pointer;
user-select: none;
box-shadow: 0 1px 0 var(--hairline);
}
.leaderboard-table tbody tr:last-child td { border-bottom: 0; }
.leaderboard-table tbody tr:hover td { background: #fafafa; }
/* Identity columns stay frozen while the score columns scroll under them. */
.leaderboard-table .col-rank,
.leaderboard-table .col-spread,
.leaderboard-table .col-model {
position: sticky;
z-index: 2;
background: #fff;
}
.leaderboard-table .col-rank { left: 0; width: 44px; text-align: left; }
.leaderboard-table .col-spread { left: 44px; width: 67px; text-align: center; }
.leaderboard-table .col-model { left: 111px; width: 240px; text-align: left; }
.leaderboard-table th.col-rank,
.leaderboard-table th.col-spread,
.leaderboard-table th.col-model { z-index: 4; background: #fff; }
/* Sorted column header carries the ink, not just the arrow. */
.leaderboard-table th.col-active {
color: #111827;
font-weight: 600;
}
/* Sticky Model seam: elevation cue appears only once content actually slides
underneath (scrollLeft > 0), so the resting table stays flat and editorial. */
.table-wrapper.scrolled-x .leaderboard-table td.col-model {
border-right-color: var(--frame);
box-shadow: 10px 0 12px -6px rgba(0, 0, 0, .22);
}
.table-wrapper.scrolled-x .leaderboard-table th.col-model {
border-right-color: var(--frame);
box-shadow: 10px 0 12px -6px rgba(0, 0, 0, .22), 0 1px 0 var(--hairline);
}
.leaderboard-table thead th.col-spread { cursor: default; }
@media (max-width: 900px) {
.leaderboard-table .col-spread { display: none; }
.leaderboard-table .col-model { left: 44px; }
.model-name { font-size: 12.5px; }
}
.rspread {
color: var(--muted);
font-size: 12px;
font-variant-numeric: tabular-nums;
}
/* 44+67+240+140 + 7x88 = 1107px: fits the measured 1115px wrapper at 1512
(Gradio chrome eats ~32px beyond the raw padding math); 88px keeps the
srsRANBench header clear (probe had it overflowing at 84); 240px Model
shows the longest model IDs without ellipsis. */
.leaderboard-table .col-avg { width: 140px; text-align: left; }
.leaderboard-table .col-score { width: 88px; }
/* Header digits share one right edge with the values below (same 10px inset). */
.leaderboard-table th.col-score {
padding-left: 2px;
padding-right: 10px;
}
.leaderboard-table th.col-spread {
padding-left: 4px;
padding-right: 4px;
}
.rank-num {
color: var(--ink);
font-size: 14px;
font-weight: 500;
}
.rank-num.rank-1,
.rank-num.rank-2,
.rank-num.rank-3 { color: var(--ink); }
.model-cell {
min-width: 0;
display: flex;
align-items: center;
gap: 8px;
}
.model-logo {
width: 24px;
height: 24px;
flex: 0 0 24px;
overflow: hidden;
border: 1px solid var(--hairline);
border-radius: 50%;
object-fit: cover;
}
.model-meta {
min-width: 0;
display: flex;
flex-direction: column;
line-height: 1.25;
}
.model-name {
min-width: 0;
overflow: hidden;
padding-right: 12px;
color: var(--ink);
font-family: var(--mono) !important;
font-size: 13px;
line-height: 20px;
font-weight: 500;
text-overflow: ellipsis;
}
.model-sub {
margin-top: 1px;
overflow: hidden;
color: var(--muted);
font-size: 12px;
line-height: 16px;
text-overflow: ellipsis;
}
.avg-wrap {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 10px;
}
/* Quiet 6px bar; the 13px/500 number is the dominant ink (Scale's restraint).
Detail-page chart bars stay 14px, locked. */
.avg-track {
position: relative;
flex: 1 1 auto;
min-width: 48px;
height: 6px;
overflow: visible;
border-radius: 2px;
background: #f1f2f4;
}
.avg-fill {
height: 100%;
border-radius: 2px;
opacity: .8;
}
.avg-num {
flex: 0 0 auto;
display: inline-flex;
align-items: baseline;
}
.avg-score,
.score-main {
color: var(--ink);
font-size: 13px;
line-height: 20px;
font-weight: 500;
font-variant-numeric: tabular-nums;
font-feature-settings: "tnum" 1;
}
/* Column leader's score in arena's signal green. */
.score-main.score-lead,
.avg-score.score-lead { color: #38a341; }
.score-stderr {
margin-left: 6px;
color: #9ca3af;
font-size: 11px;
line-height: 16px;
font-variant-numeric: tabular-nums;
}
.sort-arrow {
margin-left: 3px;
color: var(--ink);
}
.bm-detail-row {
gap: 64px !important;
align-items: flex-start !important;
flex-wrap: nowrap !important;
}
.bm-detail-row:has(.bm-prose-inner div:empty) { display: none !important; }
.bm-prose-inner:empty,
.bm-chart-inner:empty { display: none; }
.bm-prose-wrap {
min-width: 0 !important;
max-height: none !important;
padding: 0 !important;
flex: 1 1 auto !important;
overflow: visible !important;
border: 0 !important;
}
.bm-chart-wrap {
width: 430px !important;
min-width: 430px !important;
max-width: 430px !important;
max-height: none !important;
padding: 0 !important;
flex: 0 0 430px !important;
overflow: visible !important;
border: 0 !important;
}
.bm-prose-inner,
.bm-chart-inner {
margin: 0 !important;
padding: 0 !important;
border: 0 !important;
}
.gradio-container .bm-title {
margin: 0 0 12px !important;
color: var(--ink) !important;
font-family: var(--serif) !important;
font-size: 34px !important;
line-height: 36px !important;
font-weight: 500 !important;
letter-spacing: -.8px !important;
}
.gradio-container .bm-metrics {
margin: 0 0 16px !important;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.gradio-container .bm-pill {
padding: 5px 10px;
border: 1px solid var(--hairline);
border-radius: 0;
color: var(--copy);
background: #fff;
font-size: 12px !important;
line-height: 16px;
font-weight: 500;
letter-spacing: .35px;
text-transform: uppercase;
}
.gradio-container .bm-description,
.gradio-container .bm-section-content {
margin: 0 0 20px !important;
max-width: 640px;
color: #374151 !important;
font-size: 14px !important;
line-height: 22px !important;
}
.gradio-container .bm-section-heading {
margin: 24px 0 10px !important;
padding-top: 12px;
color: var(--ink) !important;
font-size: 13px !important;
line-height: 20px !important;
font-weight: 600 !important;
letter-spacing: .8px;
text-transform: uppercase;
}
.gradio-container .bm-separator {
margin: 28px 0 !important;
border: 0;
border-top: 1px solid var(--hairline);
}
.gradio-container .bm-artifacts {
margin-bottom: 32px !important;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.gradio-container .bm-artifact-link {
padding: 6px 12px;
display: inline-flex;
align-items: center;
gap: 8px;
border: 1px solid var(--hairline);
border-radius: 0;
color: var(--ink) !important;
background: #fff;
font-size: 12px !important;
line-height: 18px;
font-weight: 500;
letter-spacing: .35px;
text-decoration: none !important;
}
.bm-artifact-link:hover { background: var(--wash); }
.bm-artifact-icon { width: 14px; height: 14px; }
.bar-chart { padding: 0; }
.bar-title {
margin: 0 0 20px;
color: var(--ink);
font-size: 13px;
line-height: 20px;
font-weight: 600;
letter-spacing: .8px;
text-transform: uppercase;
}
.bar-list {
display: flex;
flex-direction: column;
gap: 18px;
}
.bar-entry {
min-height: 42px;
display: flex;
align-items: center;
gap: 10px;
}
.bar-rank-badge {
width: 28px;
height: 28px;
flex: 0 0 28px;
display: grid;
place-items: center;
border-radius: 50%;
color: var(--muted);
background: transparent;
font-size: 12px;
font-weight: 500;
font-variant-numeric: tabular-nums;
}
.bar-rank-badge.tied-top {
color: #fff;
background: var(--ink);
}
.bar-entry-content {
min-width: 0;
flex: 1;
}
.bar-header {
min-height: 22px;
padding-bottom: 4px;
display: flex;
align-items: center;
gap: 7px;
color: var(--copy);
font-size: 14px;
line-height: 20px;
}
.bar-model-info {
min-width: 0;
display: flex;
align-items: center;
gap: 7px;
flex: 1;
}
.bar-model-info .model-logo {
width: 20px;
height: 20px;
flex-basis: 20px;
}
.bar-model-name {
min-width: 0;
overflow: hidden;
color: var(--ink);
font-family: var(--mono);
font-size: 13px;
font-weight: 500;
text-overflow: ellipsis;
white-space: nowrap;
}
.bar-score-label {
margin-left: auto;
color: var(--ink);
white-space: nowrap;
font-variant-numeric: tabular-nums;
}
.bar-score-label .score-main { font-size: 14px; }
.bar-track-wrapper,
.bar-track {
position: relative;
height: 14px;
}
.bar-track {
overflow: visible;
border-radius: 3px;
background: var(--wash);
}
.bar-fill {
height: 100%;
border-radius: 3px;
opacity: .88;
}
/* CI whisker: thin Scale-style I-beam, centered inside the 14px track.
Pure strokes only; the old white halo box-shadow punched a notch into the
bar fill and read as a paint artifact. */
.ci-tick {
position: absolute;
top: 4px;
width: 1px;
height: 6px;
background: rgba(15, 23, 42, .55);
z-index: 3;
}
.ci-connector {
position: absolute;
top: 6.5px;
height: 1px;
background: rgba(15, 23, 42, .55);
z-index: 3;
}
.bar-empty {
padding: 48px;
color: var(--muted);
text-align: center;
font-size: 14px;
}
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #d4d4d8; border-radius: 3px; }
@media (max-width: 1279px) {
.bm-detail-row {
flex-direction: column-reverse !important;
gap: 40px !important;
}
.bm-chart-wrap {
width: 100% !important;
min-width: 0 !important;
max-width: none !important;
flex-basis: auto !important;
}
}
/* Below the desktop rail width the sidebar becomes a horizontal chip bar under
the header; hiding it entirely left phones with no way to reach benchmarks. */
@media (max-width: 1023px) {
.ot-content { padding: 24px !important; }
.ot-main { flex-direction: column !important; }
.ot-sidebar {
display: block !important;
position: static !important;
width: 100% !important;
min-width: 0 !important;
max-width: none !important;
height: auto !important;
padding: 10px 12px !important;
flex: 0 0 auto !important;
overflow: visible;
border-bottom: 1px solid var(--hairline);
}
.ot-sidebar .html-container > .sidebar-inner {
display: flex;
align-items: center;
gap: 8px;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
}
.ot-sidebar .html-container > .sidebar-inner::-webkit-scrollbar { display: none; }
.side-section,
.side-list { display: contents; }
.side-heading { display: none; }
.side-link {
width: auto;
min-height: 32px;
padding: 5px 12px !important;
flex: 0 0 auto;
border: 1px solid var(--hairline) !important;
border-radius: 8px !important;
font-size: 13px !important;
line-height: 20px !important;
white-space: nowrap;
}
.side-link.active {
border-color: var(--ink) !important;
color: var(--ink) !important;
background: var(--wash) !important;
}
}
@media (max-width: 767px) {
.top-nav a,
.top-nav > span:not(.search) { display: none; }
.top-nav .search { font-size: 0; }
.top-nav .search::first-letter { font-size: 16px; }
.wordmark { font-size: 14px; }
.ot-content { padding: 24px 12px !important; }
}
/* Phones: a 240px frozen Model column would leave almost no scrollable data. */
@media (max-width: 640px) {
.leaderboard-table .col-model { width: 180px; }
.ot-content { padding: 16px 10px !important; }
}
@media (prefers-reduced-motion: reduce) {
* { scroll-behavior: auto !important; }
}