diff --git a/src/app/insights/page.tsx b/src/app/insights/page.tsx
index 3030eb979..584b87e6f 100644
--- a/src/app/insights/page.tsx
+++ b/src/app/insights/page.tsx
@@ -7,7 +7,10 @@ import { useTranslations, useFormatters } from "@/lib/i18n/context";
import { cn } from "@/lib/utils";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
+import { Button } from "@/components/ui/button";
+import { EmptyState } from "@/components/ui/empty-state";
import { Progress } from "@/components/ui/progress";
+import Link from "next/link";
import dynamic from "next/dynamic";
const HealthChart = dynamic(
@@ -809,10 +812,20 @@ export default function InsightsPage() {
}
if (!data) {
+ // v1.4.15 phase-C5: replace bare "no data" text with EmptyState +
+ // CTA into /measurements so the user has a single-click path out
+ // of the empty insights view.
return (
-
+ // v1.4.15 phase-C5: explicit empty state when the user
+ // hasn't set a height yet — without it the BMI card looked
+ // broken. Plain variant so the dashed border doesn't double
+ // up inside the section card.
+ }
+ title={t("insights.bmiEmptyTitle")}
+ description={t("insights.bmiEmptyDescription")}
+ action={
+
+ }
+ />
)}
a.order - b.order);
+ // v1.4.15 phase-C5: dashboard fully-empty state. When no tile
+ // and no chart has data the dashboard would otherwise paint a
+ // 0-px tile strip with the welcome banner above it — visually
+ // looked like a half-broken page. Render an EmptyState that
+ // re-uses the existing quick-entry dialog so the user has a
+ // single click into "Log measurement" without leaving the page.
+ // The GettingStartedChecklist above renders its own self-gated
+ // surface for very-new accounts; this empty state covers the
+ // case where the checklist has been dismissed but no data was
+ // logged afterwards.
+ if (trendCards.length === 0 && charts.length === 0) {
+ return (
+ }
+ title={t("dashboard.emptyTitle")}
+ description={t("dashboard.emptyDescription")}
+ action={
+
+ }
+ />
+ );
+ }
+
return (
<>
{/* v1.4: dashboard tiles are *always* a single row.