{title}
{value}
{detail}
"use client";
import {
ArrowTrendingDownIcon,
BoltIcon,
ChartBarIcon,
FireIcon,
ScaleIcon,
SparklesIcon,
TrophyIcon,
} from "@heroicons/react/24/outline";
import { useMemo } from "react";
import { HealthStatsSummary, todayKey } from "@/lib/hellth-data";
import { trpc } from "@/lib/trpc";
function formatDate(dateKey: string) {
return new Date(`${dateKey}T12:00:00`).toLocaleDateString("de-DE", {
day: "2-digit",
month: "2-digit",
});
}
function StatCard({
title,
value,
detail,
tone = "gray",
icon: Icon,
}: {
title: string;
value: string;
detail: string;
tone?: "gray" | "green" | "blue" | "amber" | "rose";
icon: React.ComponentType<{ className?: string }>;
}) {
const tones = {
gray: "bg-gray-50 text-gray-950",
green: "bg-emerald-50 text-emerald-800",
blue: "bg-blue-50 text-blue-800",
amber: "bg-amber-50 text-amber-800",
rose: "bg-rose-50 text-rose-800",
};
return (
{title} {value} {detail}
{formatDate(day.date)}
Noch zu wenig Gewichtsdaten für eine faire Prognose. Ab drei Messungen über mindestens eine Woche wird hier ein vorsichtiger Trend angezeigt.
{summary.projection.message}
{summary.projection.targetDate ? (Hochrechnung Zieltermin: {new Date(`${summary.projection.targetDate}T12:00:00`).toLocaleDateString("de-DE", { day: "2-digit", month: "long", year: "numeric" })}
) : null}Vertrauen: {summary.projection.confidence === "medium" ? "mittel" : "niedrig"} · nur als Orientierung, nicht als Urteil.
Statistiken
Trends, kleine Siege und Prognosen, wenn die Daten dafür stark genug sind.
Schwarz: Essen/Planung · Grün: Sportbonus
Ø {summary.averages.calories.toLocaleString("de-DE")} kcal
{win}
))}{summary.week.plannedBudget.toLocaleString("de-DE")}
geplantes Budget
{summary.week.eatenCalories.toLocaleString("de-DE")}
gegessen/geplant
+{summary.week.activityCalories.toLocaleString("de-DE")}
Sportbonus
{summary.week.availableCalories.toLocaleString("de-DE")}
Restbudget