// charts.jsx — minimal SVG charts for the cockpit // Sparkline / line chart const LineChart = ({ data, w = 300, h = 80, color = "var(--accent)", fill = true, axis = false, showDots = false, baseline = null }) => { const min = Math.min(...data), max = Math.max(...data); const span = max - min || 1; const stepX = w / (data.length - 1); const padY = 6; const y = v => padY + (h - padY * 2) * (1 - (v - min) / span); const pts = data.map((v, i) => [i * stepX, y(v)]); const path = pts.map((p, i) => (i === 0 ? "M" : "L") + p[0] + " " + p[1]).join(" "); const areaPath = path + ` L ${w} ${h} L 0 ${h} Z`; return ( {axis && ( <> {[0.25, 0.5, 0.75].map(p => ( ))} )} {baseline != null && ( )} {fill && } {showDots && pts.map((p, i) => ( ))} ); }; const Bars = ({ data, w = 300, h = 80, color = "var(--accent)", labels = null }) => { const max = Math.max(...data) || 1; const slot = w / data.length; const bw = Math.max(slot * 0.55, 3); return ( {data.map((v, i) => { const bh = (h - 14) * (v / max); return ( {labels && {labels[i]}} ); })} ); }; // Donut for pie share const Donut = ({ size = 80, value = 0.7, color = "var(--accent)", track = "var(--bg-3)", thick = 8, label }) => { const r = size/2 - thick/2; const c = 2*Math.PI*r; return ( {label && {label}} ); }; // Radial gauge (for speed / soc) const Gauge = ({ value = 0.6, size = 100, color = "var(--accent)", label, sub }) => { const r = size/2 - 8; const c = Math.PI * r; // half circle return ( {label} {sub && {sub}} ); }; // Stacked horizontal bar (battery + h2) const Stack = ({ segs, w = 200, h = 8 }) => { const total = segs.reduce((a, s) => a + s.v, 0) || 1; let x = 0; return ( {segs.map((s, i) => { const sw = w * (s.v/total); const r = ; x += sw; return r; })} ); }; // Sample data generators (deterministic) const seed = (s) => () => { s = (s * 9301 + 49297) % 233280; return s / 233280; }; const genSpeed = () => { const r = seed(12); const out = []; let v = 50; for (let i = 0; i < 60; i++) { v += (r() - 0.5) * 12; v = Math.max(0, Math.min(95, v)); out.push(v); } return out; }; const genSoc = () => { const out = []; let v = 92; for (let i = 0; i < 60; i++) { v -= 0.08 + Math.random()*0.4; out.push(Math.max(15, v)); } return out; }; const genH2 = () => { const out = []; let v = 4.8; for (let i = 0; i < 60; i++) { v -= 0.005 + Math.random()*0.04; out.push(Math.max(0.5, v)); } return out; }; window.LineChart = LineChart; window.Bars = Bars; window.Donut = Donut; window.Gauge = Gauge; window.Stack = Stack; window.genSpeed = genSpeed; window.genSoc = genSoc; window.genH2 = genH2;