// Hand-drawn canvas battery-history chart. Ported intact from the // original single-page UI. Reads theme colors live so it redraws // correctly on theme changes (see the themechange listener in // frame_stats.js). let lastBatteryLog = null; function drawBatteryChart(log) { lastBatteryLog = log; const wrap = document.getElementById('battery-chart-wrap'); if (!log || log.length < 2) { wrap.innerHTML = '
Not enough data yet.
'; return; } wrap.innerHTML = ''; const width = wrap.clientWidth || 440; const height = 180; const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; canvas.style.display = 'block'; canvas.style.border = `1px solid ${themeColor('--border')}`; canvas.style.borderRadius = '8px'; wrap.appendChild(canvas); const ctx = canvas.getContext('2d'); const gridColor = themeColor('--border'); const mutedColor = themeColor('--text-muted'); const accentColor = themeColor('--accent'); const pad = { left: 28, right: 8, top: 10, bottom: 20 }; const plotW = width - pad.left - pad.right; const plotH = height - pad.top - pad.bottom; const times = log.map((p) => p[0]); const minT = Math.min(...times); const maxT = Math.max(...times); const spanT = Math.max(1, maxT - minT); const x = (t) => pad.left + ((t - minT) / spanT) * plotW; const y = (pct) => pad.top + (1 - pct / 100) * plotH; ctx.strokeStyle = gridColor; ctx.fillStyle = mutedColor; ctx.font = '10px system-ui, sans-serif'; ctx.lineWidth = 1; ctx.textAlign = 'left'; [0, 25, 50, 75, 100].forEach((pct) => { const yy = y(pct); ctx.beginPath(); ctx.moveTo(pad.left, yy); ctx.lineTo(width - pad.right, yy); ctx.stroke(); ctx.fillText(String(pct), 2, yy + 3); }); ctx.strokeStyle = accentColor; ctx.lineWidth = 1.5; ctx.beginPath(); log.forEach((p, i) => { const px = x(p[0]); const py = y(p[1]); if (i === 0) ctx.moveTo(px, py); else ctx.lineTo(px, py); }); ctx.stroke(); const fmt = (t) => new Date(t * 1000).toLocaleDateString(undefined, { month: 'short', day: 'numeric' }); ctx.fillStyle = mutedColor; ctx.textAlign = 'left'; ctx.fillText(fmt(minT), pad.left, height - 4); ctx.textAlign = 'right'; ctx.fillText(fmt(maxT), width - pad.right, height - 4); } async function loadBatteryLog() { const wrap = document.getElementById('battery-chart-wrap'); try { const resp = await fetch(`${window.FRAME_API}/battery-log`); if (!resp.ok) { wrap.innerHTML = 'Could not load.
'; return; } const data = await resp.json(); drawBatteryChart(data.log); } catch (e) { wrap.innerHTML = 'Could not load.
'; } }