${NX.esc(j.name)}
${NX.chip(j.status)}
${NX.esc(j.tier_label)}
${Number(j.n_params).toLocaleString()} params
${bits.join('')}
${NX.ago(j.created_at)}
${showBar ? `
` : ''}
`;
},
/* Minimal dependency-free loss chart.
The viewBox is set to the element's real pixel size so that 1 user unit ==
1 CSS pixel: a fixed 760-wide viewBox squeezed into a 280px phone would
render the axis labels at ~4px. */
lossChart(el, pts){
if(!el) return;
el._pts = pts;
const rect = el.getBoundingClientRect();
const W = Math.max(280, Math.round(rect.width) || 760);
const H = Math.max(170, Math.round(rect.height) || 280);
const narrow = W < 460;
const PL = narrow ? 40 : 54, PR = narrow ? 8 : 14;
const PT = 16, PB = narrow ? 28 : 34;
const TICKS = narrow ? 3 : 4;
el.setAttribute('viewBox', `0 0 ${W} ${H}`);
if(!pts || pts.length < 2){
el.innerHTML = `