// KPI strip + traffic chart
const { useState: useStateK, useRef: useRefK } = React;
const KPIStrip = () => {
const kpis = [
{ label: 'Requests / min', value: '448', unit: '', delta: '+12%', kind: 'up', spark: window.LLMGateData.trafficSeries.map(p => p.external + p.selfhosted + p.cached), color: 'var(--accent)' },
{ label: 'Tokens / min', value: '314', unit: 'K', delta: '+8.1%', kind: 'up', spark: [40,42,38,50,54,60,62,58,66,72,68,74,80,76,82,78,86,90,88,94,92,96,102,100], color: 'var(--blue)' },
{ label: 'Spend today', value: '$82.96', unit: '', delta: '-4.2%', kind: 'down-good', spark: [20,24,22,28,30,34,36,40,42,46,48,52,56,58,62,66,68,72,74,76,78,80,82,82], color: 'var(--green)' },
{ label: 'Error rate', value: '0.38', unit: '%', delta: '+0.06', kind: 'up-bad', spark: [0.2,0.3,0.25,0.22,0.28,0.35,0.40,0.38,0.42,0.48,0.32,0.30,0.28,0.33,0.38,0.41,0.36,0.34,0.38,0.42,0.39,0.36,0.40,0.38], color: 'var(--amber)' },
{ label: 'p99 latency', value: '1.82', unit: 's', delta: '-120ms', kind: 'down-good', spark: [2.1,2.0,1.9,2.1,2.2,2.0,1.8,1.9,2.0,1.85,1.82,1.78,1.90,1.88,1.86,1.84,1.82,1.80,1.88,1.85,1.83,1.82,1.80,1.82], color: 'var(--purple)' },
];
const deltaClass = (kind) => {
if (kind === 'up' || kind === 'down-good') return '';
if (kind === 'up-bad') return 'down';
if (kind === 'down') return 'down';
return 'neutral';
};
return (
{kpis.map((k, i) => (
{k.label}
{k.value}{k.unit && {k.unit}}
{k.delta}
vs yesterday
))}
);
};
const TrafficChart = () => {
const data = window.LLMGateData.trafficSeries;
const wrapRef = useRefK(null);
const [tooltip, setTooltip] = useStateK(null);
const W = 1000, H = 180, pad = { l: 36, r: 12, t: 12, b: 22 };
const chartW = W - pad.l - pad.r;
const chartH = H - pad.t - pad.b;
const maxY = Math.ceil(Math.max(...data.map(p => p.external + p.selfhosted + p.cached)) / 100) * 100;
const xFor = (i) => pad.l + (i / (data.length - 1)) * chartW;
const yFor = (v) => pad.t + chartH - (v / maxY) * chartH;
// Stacked areas: cached (bottom), self-hosted (mid), external (top)
const stacks = data.map(p => ({
t: p.t,
cached: p.cached,
selfhostedTop: p.cached + p.selfhosted,
externalTop: p.cached + p.selfhosted + p.external,
}));
const areaPath = (key, prevKey) => {
const top = stacks.map((p, i) => `${i === 0 ? 'M' : 'L'}${xFor(i).toFixed(1)},${yFor(p[key]).toFixed(1)}`).join(' ');
const bot = stacks.slice().reverse().map((p, ri) => {
const i = stacks.length - 1 - ri;
const v = prevKey ? p[prevKey] : 0;
return `L${xFor(i).toFixed(1)},${yFor(v).toFixed(1)}`;
}).join(' ');
return `${top} ${bot} Z`;
};
const handleMove = (e) => {
const rect = wrapRef.current.getBoundingClientRect();
const ratio = W / rect.width;
const x = (e.clientX - rect.left) * ratio;
const idx = Math.round(((x - pad.l) / chartW) * (data.length - 1));
if (idx < 0 || idx >= data.length) { setTooltip(null); return; }
const p = data[idx];
setTooltip({
x: xFor(idx) / ratio,
y: yFor(p.external + p.selfhosted + p.cached) / ratio,
idx, p,
});
};
// grid lines
const yTicks = [0, 0.25, 0.5, 0.75, 1].map(r => Math.round(maxY * r));
return (
Request volume — last 60 min
avg 448/min · peak 612/min
external
self-hosted
cached
setTooltip(null)}>
{tooltip && (
t-{59 - tooltip.idx}m
external{Math.round(tooltip.p.external)}
self-hosted{Math.round(tooltip.p.selfhosted)}
cached{Math.round(tooltip.p.cached)}
total{Math.round(tooltip.p.external + tooltip.p.selfhosted + tooltip.p.cached)}
)}
);
};
Object.assign(window, { KPIStrip, TrafficChart });