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 ( -
- {t("common.noData")} -
+ } + title={t("insights.emptyTitle")} + description={t("insights.emptyDescription")} + action={ + + } + /> ); } @@ -1491,7 +1504,24 @@ export default function InsightsPage() { valueBands={bmiBands} /> ) : ( -

{t("common.noData")}

+ // 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.