@@ -26,9 +26,28 @@ function destroyTimeline() {
2626 if ( timelineChart ) { try { timelineChart . destroy ( ) ; } catch ( e ) { } timelineChart = null ; }
2727}
2828
29+ function renderMeta ( data ) {
30+ const fmt = v => { if ( v == null || ! isFinite ( v ) ) return '-' ; const r = Number ( v ) . toFixed ( 2 ) ; return r === '-0.00' ? '0.00' : r ; } ;
31+ const meta = data ;
32+ document . getElementById ( 'metaCards' ) . innerHTML = `
33+ <div class="card"><div class="label">Scenario</div><div class="value" style="font-size:18px">${ esc ( meta . scenario_description || '' ) } </div></div>
34+ <div class="card"><div class="label">Region</div><div class="value">${ esc ( meta . region || '' ) } </div></div>
35+ <div class="card"><div class="label">Model</div><div class="value">${ esc ( meta . model || '' ) } </div></div>
36+ <div class="card"><div class="label">Years</div><div class="value">${ meta . historical_years ? meta . historical_years . join ( ', ' ) : '-' } </div></div>
37+ <div class="card"><div class="label">Start</div><div class="value" style="font-size:22px">${ meta . start_time ? new Date ( meta . start_time ) . toLocaleDateString ( undefined , { month :'short' , day :'numeric' } ) : '-' } </div></div>
38+ <div class="card"><div class="label">CO\u2082 Savings</div><div class="value ${ meta . co2_savings_pct > 0.01 ? 'pos' : meta . co2_savings_pct < - 0.01 ? 'neg' : 'zero' } " style="font-size:22px">${ fmt ( meta . co2_savings_pct ) } %</div></div>
39+ <div class="card"><div class="label">Score</div><div class="value">${ meta . score != null && isFinite ( meta . score ) ? Number ( meta . score ) . toFixed ( 4 ) : '-' } </div></div>
40+ <div class="card"><div class="label">Pauses</div><div class="value">${ meta . num_pauses != null ? meta . num_pauses : '-' } </div></div>
41+ <div class="card"><div class="label">Wall Time</div><div class="value">${ fmt ( meta . total_wall_time_h ) } h</div></div>
42+ <div class="card"><div class="label">Overhead</div><div class="value">${ fmt ( meta . actual_overhead_pct ) } %</div></div>
43+ <div class="card"><div class="label">Status</div><div class="value">${ meta . completed ? '<span style="font-size:20px;font-weight:700;color:var(--accent2)">\u2713 Done</span>' : '<span style="font-size:14px;font-weight:600;color:var(--red)">' + esc ( meta . stop_reason || 'Incomplete' ) + '</span>' } </div></div>
44+ ` ;
45+ }
46+
2947function renderTimeline ( data ) {
3048 destroyTimeline ( ) ;
3149 document . getElementById ( 'dropZone' ) . style . display = 'none' ;
50+ renderMeta ( data ) ;
3251 const n = data . carbon_intensity . length ;
3352 if ( n === 0 ) return ;
3453
@@ -158,6 +177,12 @@ function renderTimeline(data) {
158177 } ) ;
159178}
160179
180+ function esc ( s ) {
181+ const d = document . createElement ( 'div' ) ;
182+ d . textContent = s ;
183+ return d . innerHTML ;
184+ }
185+
161186// ── Load from JSON string (shared by fetch + file drop) ──────────
162187function loadData ( data ) {
163188 if ( ! data || ! data . carbon_intensity || ! data . carbon_intensity . length ) {
0 commit comments