Skip to content

Commit c362e51

Browse files
committed
style(bench): bring review + scoreboard reports in line with the chart-page design (Geist, monochrome, light-only)
1 parent 6ae5580 commit c362e51

1 file changed

Lines changed: 107 additions & 62 deletions

File tree

scripts/bench.ts

Lines changed: 107 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -325,56 +325,75 @@ function renderHtml(specs: Map<string, Spec>, results: Result[]): string {
325325
<meta name="viewport" content="width=device-width, initial-scale=1" />
326326
<title>Block Runner — conversion benchmark</title>
327327
<style>
328-
:root {
329-
color-scheme: light dark;
330-
--bg: oklch(0.992 0.003 255); --surface: oklch(1 0 0); --panel: oklch(0.975 0.004 255);
331-
--ink: oklch(0.24 0.02 262); --muted: oklch(0.52 0.018 262); --faint: oklch(0.66 0.012 262);
332-
--line: oklch(0.91 0.006 262); --line-soft: oklch(0.94 0.005 262);
333-
--accent: oklch(0.55 0.15 264); --accent-ink: oklch(0.42 0.13 264);
334-
--radius: 12px;
328+
@font-face {
329+
font-family: 'Geist';
330+
src: url('../benchmarks/visuals/fonts/Geist.woff2') format('woff2');
331+
font-weight: 100 900;
332+
font-style: normal;
333+
font-display: swap;
335334
}
336-
@media (prefers-color-scheme: dark) {
337-
:root {
338-
--bg: oklch(0.19 0.012 262); --surface: oklch(0.225 0.014 262); --panel: oklch(0.25 0.015 262);
339-
--ink: oklch(0.95 0.008 262); --muted: oklch(0.72 0.016 262); --faint: oklch(0.56 0.014 262);
340-
--line: oklch(0.33 0.014 262); --line-soft: oklch(0.29 0.012 262);
341-
--accent: oklch(0.74 0.13 264); --accent-ink: oklch(0.8 0.12 264);
342-
}
335+
@font-face {
336+
font-family: 'Geist Mono';
337+
src: url('../benchmarks/visuals/fonts/GeistMono.woff2') format('woff2');
338+
font-weight: 100 900;
339+
font-style: normal;
340+
font-display: swap;
341+
}
342+
:root {
343+
--font-sans: Geist, system-ui, -apple-system, sans-serif;
344+
--font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
345+
346+
--bg: #f7f7f5;
347+
--raised: #ffffff;
348+
--band: #f0efec;
349+
--ink: #14181f;
350+
--body: #1f2430;
351+
--muted: #4a5160;
352+
--faint: #6b7280;
353+
--line: rgba(20, 24, 31, 0.1);
354+
--line-strong: rgba(20, 24, 31, 0.16);
355+
356+
--brand: #2b303b;
357+
--brand-ink: #14181f;
358+
--brand-soft: rgba(20, 24, 31, 0.05);
359+
360+
--shadow: 0 1px 2px rgba(20, 24, 31, 0.04), 0 8px 24px rgba(20, 24, 31, 0.05);
361+
--radius: 16px;
343362
}
344363
* { box-sizing: border-box; }
345-
body { margin: 0; background: var(--bg); color: var(--ink); font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; font-size: 15px; line-height: 1.55; -webkit-font-smoothing: antialiased; }
364+
body { margin: 0; background: var(--bg); color: var(--body); font-family: var(--font-sans); font-size: 15px; line-height: 1.5; letter-spacing: -0.006em; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
346365
.wrap { max-width: 1500px; margin-inline: auto; padding: 72px 32px; }
347366
.masthead { margin-bottom: 64px; max-width: 70ch; }
348-
.masthead h1 { font-size: clamp(1.6rem, 1.2rem + 1.4vw, 2.2rem); font-weight: 620; letter-spacing: -0.025em; margin: 0 0 0.25rem; text-wrap: balance; }
367+
.masthead h1 { font-size: clamp(1.6rem, 1.2rem + 1.4vw, 2.2rem); font-weight: 600; letter-spacing: -0.025em; color: var(--ink); margin: 0 0 0.25rem; text-wrap: balance; }
349368
.masthead p { margin: 0; color: var(--muted); }
350-
.producers-line { margin-top: 1rem; font-size: 0.85rem; color: var(--faint); }
351-
.producers-line b { color: var(--muted); }
369+
.producers-line { margin-top: 1rem; font-family: var(--font-mono); font-size: 12px; color: var(--faint); }
370+
.producers-line b { color: var(--ink); font-weight: 500; }
352371
353372
.layout { margin-bottom: 72px; padding-top: 28px; border-top: 1px solid var(--line); }
354373
.layout__head { margin-bottom: 24px; }
355-
.layout__head h2 { font-size: 1.3rem; font-weight: 640; letter-spacing: -0.015em; margin: 0; }
356-
.intent { margin: 0.4rem 0 0; color: var(--muted); font-style: italic; max-width: 80ch; text-wrap: pretty; }
374+
.layout__head h2 { font-size: 1.3rem; font-weight: 600; letter-spacing: -0.015em; color: var(--ink); margin: 0; }
375+
.intent { margin: 0.4rem 0 0; color: var(--muted); max-width: 80ch; text-wrap: pretty; }
357376
358377
.split { display: grid; grid-template-columns: minmax(280px, 360px) 1fr; gap: 40px; align-items: start; }
359378
@media (max-width: 1024px) { .split { grid-template-columns: 1fr; gap: 28px; } }
360-
.panel-label { font-size: 0.72rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--faint); margin: 0 0 14px; }
379+
.panel-label { font-family: var(--font-mono); font-size: 11.5px; font-weight: 400; letter-spacing: 0.14em; text-transform: uppercase; color: var(--faint); margin: 0 0 14px; }
361380
362-
.tree { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12.5px; line-height: 1.85; position: sticky; top: 24px; }
381+
.tree { font-family: var(--font-mono); font-size: 12.5px; line-height: 1.85; position: sticky; top: 24px; }
363382
.tree ul { list-style: none; margin: 0; padding: 0; }
364383
.tree ul ul { margin-left: 6px; padding-left: 14px; border-left: 1px solid var(--line); }
365384
.ns { color: var(--faint); }
366385
.blk { color: var(--ink); font-weight: 600; }
367-
.blk--3p { color: var(--accent-ink); }
368-
.blk--html { color: oklch(0.55 0.17 25); }
386+
.blk--3p { color: var(--muted); }
387+
.blk--html { color: var(--faint); }
369388
.note { color: var(--muted); font-weight: 400; }
370389
.note::before { content: "· "; color: var(--faint); }
371390
372391
.prod-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); gap: 24px; }
373392
.prod { margin: 0; }
374-
.prod figcaption { font-size: 0.8rem; font-weight: 600; color: var(--muted); margin-bottom: 8px; text-transform: capitalize; }
375-
.frame { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--surface); box-shadow: 0 1px 2px oklch(0 0 0 / 0.04), 0 8px 24px -16px oklch(0 0 0 / 0.18); }
393+
.prod figcaption { font-family: var(--font-mono); font-size: 12px; font-weight: 500; color: var(--muted); margin-bottom: 8px; text-transform: capitalize; }
394+
.frame { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--raised); box-shadow: var(--shadow); }
376395
iframe { display: block; width: 100%; height: clamp(320px, 38vh, 460px); border: 0; background: #fff; }
377-
.missing { color: var(--faint); font-style: italic; }
396+
.missing { color: var(--faint); }
378397
</style>
379398
</head>
380399
<body>
@@ -417,10 +436,12 @@ function escAttr(value: string): string {
417436
return esc(value).replaceAll('"', '&quot;');
418437
}
419438

439+
// Monochrome score scale: low score = weak (light grey), high score = strong (dark slate).
420440
function scoreColor(score: number): string {
421-
if (score >= 85) return '#16a34a';
422-
if (score >= 50) return '#d97706';
423-
return '#dc2626';
441+
if (score >= 85) return '#2a2f3a'; // --c-eng-c
442+
if (score >= 70) return '#5f6775'; // --c-eng-cgpt
443+
if (score >= 50) return '#939aa6'; // --c-codex-alone
444+
return '#cdd2d9'; // --c-eng-a
424445
}
425446

426447
// ── Scoreboard (report/scoreboard.html) ──────────────────────────────────────
@@ -459,7 +480,7 @@ function renderScoreboard(history: RunRecord[], current: RunRecord): string {
459480
const before = prev?.fixtures[label];
460481
const delta = before === undefined ? '' : score - before;
461482
const deltaCell =
462-
delta === '' ? '<span class="faint">—</span>' : delta === 0 ? '<span class="faint">·</span>' : `<span style="color:${delta > 0 ? '#16a34a' : '#dc2626'}">${delta > 0 ? '+' : ''}${delta}</span>`;
483+
delta === '' ? '<span class="faint">—</span>' : delta === 0 ? '<span class="faint">·</span>' : `<span class="delta ${delta > 0 ? 'up' : 'down'}">${delta > 0 ? '+' : ''}${delta}</span>`;
463484
return `<tr><td class="mono">${esc(label)}</td><td class="num"><b style="color:${scoreColor(score)}">${score}</b></td><td class="num">${deltaCell}</td></tr>`;
464485
})
465486
.join('\n');
@@ -471,41 +492,64 @@ function renderScoreboard(history: RunRecord[], current: RunRecord): string {
471492
<meta name="viewport" content="width=device-width, initial-scale=1" />
472493
<title>Block Runner — benchmark scoreboard</title>
473494
<style>
474-
:root {
475-
color-scheme: light dark;
476-
--bg: oklch(0.992 0.003 255); --surface: oklch(1 0 0); --panel: oklch(0.975 0.004 255);
477-
--ink: oklch(0.24 0.02 262); --muted: oklch(0.52 0.018 262); --faint: oklch(0.66 0.012 262);
478-
--line: oklch(0.91 0.006 262); --accent: oklch(0.55 0.15 264);
495+
@font-face {
496+
font-family: 'Geist';
497+
src: url('../benchmarks/visuals/fonts/Geist.woff2') format('woff2');
498+
font-weight: 100 900;
499+
font-style: normal;
500+
font-display: swap;
479501
}
480-
@media (prefers-color-scheme: dark) {
481-
:root {
482-
--bg: oklch(0.19 0.012 262); --surface: oklch(0.225 0.014 262); --panel: oklch(0.25 0.015 262);
483-
--ink: oklch(0.95 0.008 262); --muted: oklch(0.72 0.016 262); --faint: oklch(0.56 0.014 262);
484-
--line: oklch(0.33 0.014 262); --accent: oklch(0.74 0.13 264);
485-
}
502+
@font-face {
503+
font-family: 'Geist Mono';
504+
src: url('../benchmarks/visuals/fonts/GeistMono.woff2') format('woff2');
505+
font-weight: 100 900;
506+
font-style: normal;
507+
font-display: swap;
508+
}
509+
:root {
510+
--font-sans: Geist, system-ui, -apple-system, sans-serif;
511+
--font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
512+
513+
--bg: #f7f7f5;
514+
--raised: #ffffff;
515+
--band: #f0efec;
516+
--ink: #14181f;
517+
--body: #1f2430;
518+
--muted: #4a5160;
519+
--faint: #6b7280;
520+
--line: rgba(20, 24, 31, 0.1);
521+
--line-strong: rgba(20, 24, 31, 0.16);
522+
523+
--brand: #2b303b;
524+
--brand-ink: #14181f;
525+
--brand-soft: rgba(20, 24, 31, 0.05);
526+
--grid: rgba(20, 24, 31, 0.07);
527+
--shadow: 0 1px 2px rgba(20, 24, 31, 0.04), 0 8px 24px rgba(20, 24, 31, 0.05);
486528
}
487529
* { box-sizing: border-box; }
488-
body { margin: 0; background: var(--bg); color: var(--ink); font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; font-size: 15px; line-height: 1.55; -webkit-font-smoothing: antialiased; }
530+
body { margin: 0; background: var(--bg); color: var(--body); font-family: var(--font-sans); font-size: 15px; line-height: 1.5; letter-spacing: -0.006em; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
489531
.wrap { max-width: 1100px; margin-inline: auto; padding: 72px 32px; }
490-
h1 { font-size: clamp(1.6rem, 1.2rem + 1.4vw, 2.2rem); font-weight: 620; letter-spacing: -0.025em; margin: 0 0 0.25rem; }
532+
h1 { font-size: clamp(1.6rem, 1.2rem + 1.4vw, 2.2rem); font-weight: 600; letter-spacing: -0.025em; color: var(--ink); margin: 0 0 0.25rem; }
491533
.sub { color: var(--muted); margin: 0 0 2.5rem; }
492-
h2 { font-size: 0.95rem; font-weight: 600; margin: 2.5rem 0 1rem; }
493-
.snapshot { display: flex; align-items: baseline; gap: 1.5rem; flex-wrap: wrap; padding: 1.25rem 1.5rem; border: 1px solid var(--line); border-radius: 14px; background: var(--panel); }
494-
.big { font-size: 2.6rem; font-weight: 800; letter-spacing: -0.03em; line-height: 1; }
495-
.big small { display: block; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); margin-bottom: 6px; }
534+
h2 { font-family: var(--font-mono); font-size: 11.5px; font-weight: 400; letter-spacing: 0.14em; text-transform: uppercase; color: var(--faint); margin: 2.5rem 0 1rem; }
535+
.snapshot { display: flex; align-items: baseline; gap: 1.5rem; flex-wrap: wrap; padding: 1.25rem 1.5rem; border: 1px solid var(--line); border-radius: 16px; background: var(--raised); box-shadow: var(--shadow); }
536+
.big { font-size: 2.6rem; font-weight: 600; letter-spacing: -0.03em; line-height: 1; color: var(--ink); }
537+
.big small { display: block; font-family: var(--font-mono); font-size: 11px; font-weight: 400; letter-spacing: 0.12em; text-transform: uppercase; color: var(--faint); margin-bottom: 6px; }
496538
.chips { display: flex; gap: 8px; flex-wrap: wrap; }
497-
.chip { font-size: 0.8rem; font-weight: 600; color: #fff; background: var(--c); padding: 3px 10px; border-radius: 999px; }
498-
.prov { color: var(--faint); font-size: 0.82rem; margin-left: auto; text-align: right; }
499-
.prov .mono { font-family: ui-monospace, monospace; }
500-
.chart { border: 1px solid var(--line); border-radius: 14px; background: var(--panel); padding: 20px; }
539+
.chip { font-family: var(--font-mono); font-size: 11.5px; font-weight: 500; color: var(--raised); background: var(--c, var(--brand)); padding: 3px 10px; border-radius: 999px; }
540+
.prov { color: var(--faint); font-family: var(--font-mono); font-size: 11px; margin-left: auto; text-align: right; line-height: 1.6; }
541+
.prov .mono { font-family: var(--font-mono); }
542+
.chart { border: 1px solid var(--line); border-radius: 16px; background: var(--raised); box-shadow: var(--shadow); padding: 20px; }
501543
table { width: 100%; border-collapse: collapse; font-size: 0.88rem; }
502-
th { text-align: left; font-weight: 600; color: var(--faint); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; padding: 0 12px 8px; border-bottom: 1px solid var(--line); }
503-
td { padding: 9px 12px; border-bottom: 1px solid var(--line); }
544+
th { text-align: left; font-family: var(--font-mono); font-weight: 400; color: var(--faint); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.1em; padding: 0 12px 8px; border-bottom: 1px solid var(--line); }
545+
td { padding: 9px 12px; border-bottom: 1px solid var(--line); color: var(--body); }
504546
.num { text-align: right; font-variant-numeric: tabular-nums; }
505-
.mono { font-family: ui-monospace, monospace; font-size: 0.82rem; }
547+
.mono { font-family: var(--font-mono); font-size: 0.82rem; }
506548
.faint { color: var(--faint); }
507-
.empty { color: var(--muted); background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 16px 20px; }
508-
.empty code { font-family: ui-monospace, monospace; background: var(--surface); padding: 1px 6px; border-radius: 6px; }
549+
.delta.up { color: var(--ink); }
550+
.delta.down { color: var(--faint); }
551+
.empty { color: var(--muted); background: var(--raised); border: 1px solid var(--line); border-radius: 16px; box-shadow: var(--shadow); padding: 16px 20px; }
552+
.empty code { font-family: var(--font-mono); font-size: 11.5px; background: var(--band); padding: 1px 6px; border-radius: 4px; color: var(--body); }
509553
.grids { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; align-items: start; }
510554
@media (max-width: 820px) { .grids { grid-template-columns: 1fr; } }
511555
</style>
@@ -560,12 +604,13 @@ function trendChart(history: RunRecord[], producers: string[]): string {
560604
return `<polyline points="${poly}" fill="none" stroke="${color}" stroke-width="${width}" vector-effect="non-scaling-stroke"/>${dots}`;
561605
};
562606

563-
const palette = ['#7c7cf0', '#16a34a', '#d97706', '#dc2626', '#0ea5e9'];
564-
const producerLines = producers.map((p, idx) => series((r) => r.producers[p], palette[(idx + 1) % palette.length], 1.5)).join('');
565-
const corpusLine = series((r) => r.corpusAvg, 'var(--accent)', 2.5);
607+
// Monochrome producer series — a grey→slate scale, distinct from the dark brand corpus line.
608+
const palette = ['#cdd2d9', '#b6bcc5', '#939aa6', '#5f6775', '#2a2f3a'];
609+
const producerLines = producers.map((p, idx) => series((r) => r.producers[p], palette[idx % palette.length], 1.5)).join('');
610+
const corpusLine = series((r) => r.corpusAvg, 'var(--brand)', 2.5);
566611

567-
const legend = [`<span class="chip" style="--c:var(--accent)">corpus</span>`]
568-
.concat(producers.map((p, idx) => `<span class="chip" style="--c:${palette[(idx + 1) % palette.length]}">${esc(p)}</span>`))
612+
const legend = [`<span class="chip" style="--c:var(--brand)">corpus</span>`]
613+
.concat(producers.map((p, idx) => `<span class="chip" style="--c:${palette[idx % palette.length]}">${esc(p)}</span>`))
569614
.join(' ');
570615

571616
return `<div class="chart">

0 commit comments

Comments
 (0)