@@ -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 ( '"' , '"' ) ;
418437}
419438
439+ // Monochrome score scale: low score = weak (light grey), high score = strong (dark slate).
420440function 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