// 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 (
);
};
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 (
);
};
// 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 (
);
};
// 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 (
);
};
// 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 (
);
};
// 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;