/* JRN — Mini-gráficos para o visualizador de dashboard (faux Power BI) */ function KpiCard({ label, value, delta, up, accent }) { return (
{label}
{value}
{delta != null && (
{up ? '▲' : '▼'}{delta} vs. mês ant.
)}
); } function BarChart({ data, accent = '#15233f', height = 150 }) { const max = Math.max(...data.map(d => d.v)); return (
{data.map((d, i) => (
{d.l}
))}
); } function LineChart({ data, accent = '#15233f', height = 150 }) { const w = 320, h = height; const max = Math.max(...data) * 1.12, min = Math.min(...data) * 0.9; const pts = data.map((v, i) => [ (i / (data.length - 1)) * w, h - ((v - min) / (max - min)) * (h - 16) - 8, ]); const path = pts.map((p, i) => (i ? 'L' : 'M') + p[0].toFixed(1) + ' ' + p[1].toFixed(1)).join(' '); const area = path + ` L${w} ${h} L0 ${h} Z`; return ( {pts.map((p, i) => i === pts.length - 1 && )} ); } function Donut({ value, accent = '#15233f', label }) { const r = 52, c = 2 * Math.PI * r; return (
{value}%
{label && {label}}
); } function ChartCard({ title, sub, children, span }) { return (
{title}
{sub &&
{sub}
}
{children}
); } Object.assign(window, { KpiCard, BarChart, LineChart, Donut, ChartCard });