/**
* rTasks applet definitions — Task Counter + Due Today.
*/
import type { AppletDefinition, AppletLiveData } from "../../shared/applet-types";
const taskCounter: AppletDefinition = {
id: "task-counter",
label: "Task Counter",
icon: "📋",
accentColor: "#0f766e",
ports: [
{ name: "board-in", type: "json", direction: "input" },
{ name: "count-out", type: "number", direction: "output" },
],
renderCompact(data: AppletLiveData): string {
const { snapshot } = data;
const total = (snapshot.total as number) || 0;
const done = (snapshot.done as number) || 0;
const pct = total > 0 ? Math.round((done / total) * 100) : 0;
return `
${done}/${total}
tasks complete
`;
},
onInputReceived(portName, value, ctx) {
if (portName === "board-in" && value && typeof value === "object") {
const board = value as Record;
ctx.emitOutput("count-out", Number(board.total) || 0);
}
},
};
const dueToday: AppletDefinition = {
id: "due-today",
label: "Due Today",
icon: "⏰",
accentColor: "#0f766e",
ports: [
{ name: "board-in", type: "json", direction: "input" },
{ name: "tasks-out", type: "json", direction: "output" },
],
renderCompact(data: AppletLiveData): string {
const { snapshot } = data;
const count = (snapshot.dueCount as number) || 0;
const urgent = (snapshot.urgentCount as number) || 0;
const urgColor = urgent > 0 ? "#ef4444" : "#22c55e";
return `
${count}
due today
${urgent} urgent
`;
},
onInputReceived(portName, value, ctx) {
if (portName === "board-in" && value && typeof value === "object") {
ctx.emitOutput("tasks-out", value);
}
},
};
export const tasksApplets: AppletDefinition[] = [taskCounter, dueToday];