/** * 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];