Menu
Public repository / 439f0dcabf5cdf2b120c7724be895cf1df30507f
AkurAI-Framework / site/frontend/ai/components/display/stats_display.js
Latest change 88d669a6b3c5464f8a947a66be0437a90424470f - feat(ai): add Display components — citation, link_preview, stats_display, terminal, weather_widget by Ólafur Búi Ólafsson
/**
* Stats Display — a stat grid from an array of { label, value, delta? }.
* Reuses .stat / .stat-value / .stat-label from the design system.
* Payload: { stats: Array<{ label: string, value: string|number, delta?: string }> }
*/
function el(tag, cls) {
const node = document.createElement(tag);
if (cls) node.className = cls;
return node;
}
export const def = {
name: "stats_display",
category: "Display",
title: "Stats Display",
match(payload) {
return (
payload !== null &&
typeof payload === "object" &&
Array.isArray(payload.stats) &&
payload.stats.length > 0 &&
typeof payload.stats[0].label === "string"
);
},
render(payload) {
const { stats } = payload;
const grid = el("div", "tc-display-stats");
for (const item of stats) {
const cell = el("div", "stat tc-display-stats__cell");
const valueEl = el("div", "stat-value");
valueEl.textContent = String(item.value ?? "");
cell.appendChild(valueEl);
if (item.delta !== undefined && item.delta !== null) {
const deltaEl = el("span", "tc-display-stats__delta");
const raw = String(item.delta);
// Colour by sign: starts with "-" → danger, else ok
const isNeg = raw.trim().startsWith("-");
deltaEl.className += isNeg
? " tc-display-stats__delta--down"
: " tc-display-stats__delta--up";
deltaEl.textContent = raw;
cell.appendChild(deltaEl);
}
const labelEl = el("div", "stat-label");
labelEl.textContent = String(item.label ?? "");
cell.appendChild(labelEl);
grid.appendChild(cell);
}
return grid;
},
example: {
stats: [
{ label: "Monthly revenue", value: "ISK 1.2M", delta: "+18%" },
{ label: "Active customers", value: 34, delta: "+3" },
{ label: "Avg response time", value: "1.4 s", delta: "-0.3 s" },
{ label: "Uptime", value: "99.97%", delta: null },
],
},
};