fix(insights): move coach-ask to the header and de-emphasise the assessment border

The Coach launch sat at the foot of every category page; move it into the
sub-page header as an icon-only button at heading height, top-right, so
"ask the coach" reads as a header action and the page no longer ends on a
stray button. The shared shell mounts it (gated on the Coach flag plus the
per-user opt-out), so every category page picks it up and the foot
instance is dropped. Also drop the purple left accent on the assessment
("Einschätzung") card — the coloured rule made it read as restless against
the calmer surrounding cards.
This commit is contained in:
Marc-André Bombeck committed 2026-06-01 22:50:59 +02:00
1 parent 4935a9b000
commit 6e61713fc6
12 files changed
+68 -53

No files matched your search

+1 -3
View File
@@ -10,7 +10,6 @@ import { useTranslations } from "@/lib/i18n/context";
import { useInsightsLayoutPrefs } from "@/hooks/use-insights-layout-prefs";
import { Button } from "@/components/ui/button";
import { HealthChartDynamic } from "@/components/charts/health-chart-dynamic";
import { CoachLaunchButton } from "@/components/insights/coach-launch-button";
import { InsightStatusCard } from "@/components/insights/insight-status-card";
import { MetricEmptyState } from "@/components/insights/metric-empty-state";
import { MetricTargetSummary } from "@/components/insights/metric-target-summary";
@@ -101,6 +100,7 @@ export default function InsightsBlutdruckPage() {
title={t("insights.bloodPressureSectionTitle")}
description={t("insights.subPage.blutdruckDescription")}
explainerMetric="bloodPressure"
coachLaunch
>
<HealthChartDynamic
chartKey="bp"
@@ -126,8 +126,6 @@ export default function InsightsBlutdruckPage() {
loading={isStatusLoading}
preparing={status?.preparing ?? false}
/>
<CoachLaunchButton />
</SubPageShell>
);
}
+1 -2
View File
@@ -110,6 +110,7 @@ export default function InsightsBmiPage() {
title={t("insights.bmiSectionTitle")}
description={t("insights.subPage.bmiDescription")}
explainerMetric="bmi"
coachLaunch
>
<HealthChartDynamic
chartKey="bmi"
@@ -135,8 +136,6 @@ export default function InsightsBmiPage() {
loading={isStatusLoading}
preparing={status?.preparing ?? false}
/>
<CoachLaunchButton />
</SubPageShell>
);
}
+1 -2
View File
@@ -187,6 +187,7 @@ export default function InsightsMedikamentePage() {
title={t("insights.medicationCompliance")}
description={t("insights.subPage.medikamenteDescription")}
explainerMetric="medications"
coachLaunch
>
<div
className={
@@ -290,8 +291,6 @@ export default function InsightsMedikamentePage() {
without an active GLP-1 medication, so the page collapses
back to the compliance grid for everyone else. */}
<TherapyTimeline />
<CoachLaunchButton />
</SubPageShell>
);
}
+1 -3
View File
@@ -12,7 +12,6 @@ import { useTranslations } from "@/lib/i18n/context";
import { useInsightsLayoutPrefs } from "@/hooks/use-insights-layout-prefs";
import { Button } from "@/components/ui/button";
import { ChartSkeleton } from "@/components/charts/chart-skeleton";
import { CoachLaunchButton } from "@/components/insights/coach-launch-button";
import { InsightStatusCard } from "@/components/insights/insight-status-card";
import { MetricEmptyState } from "@/components/insights/metric-empty-state";
import { MetricTargetSummary } from "@/components/insights/metric-target-summary";
@@ -99,6 +98,7 @@ export default function InsightsStimmungPage() {
title={t("insights.moodSectionTitle")}
description={t("insights.subPage.stimmungDescription")}
explainerMetric="mood"
coachLaunch
>
<MoodChart
chartKey="mood"
@@ -120,8 +120,6 @@ export default function InsightsStimmungPage() {
loading={isStatusLoading}
preparing={status?.preparing ?? false}
/>
<CoachLaunchButton />
</SubPageShell>
);
}
+1 -3
View File
@@ -10,7 +10,6 @@ import { useTranslations } from "@/lib/i18n/context";
import { useInsightsLayoutPrefs } from "@/hooks/use-insights-layout-prefs";
import { Button } from "@/components/ui/button";
import { HealthChartDynamic } from "@/components/charts/health-chart-dynamic";
import { CoachLaunchButton } from "@/components/insights/coach-launch-button";
import { InsightStatusCard } from "@/components/insights/insight-status-card";
import { MetricEmptyState } from "@/components/insights/metric-empty-state";
import { MetricStatStrip } from "@/components/insights/metric-stat-strip";
@@ -129,6 +128,7 @@ export default function InsightsPulsPage() {
timeZone={user?.timezone ?? undefined}
/>
}
coachLaunch
showAllValuesType="PULSE"
>
<HealthChartDynamic
@@ -166,8 +166,6 @@ export default function InsightsPulsPage() {
compareBaseline={compareBaseline}
userTimezone={user?.timezone}
/>
<CoachLaunchButton />
</SubPageShell>
);
}
+1 -3
View File
@@ -6,7 +6,6 @@ import { Moon } from "lucide-react";
import { useInsightsAnalytics } from "@/hooks/use-insights-analytics";
import { useTranslations } from "@/lib/i18n/context";
import { Button } from "@/components/ui/button";
import { CoachLaunchButton } from "@/components/insights/coach-launch-button";
import { MetricEmptyState } from "@/components/insights/metric-empty-state";
import { MetricTargetSummary } from "@/components/insights/metric-target-summary";
import { SleepOverview } from "@/components/insights/sleep-overview";
@@ -62,6 +61,7 @@ export default function InsightsSchlafPage() {
title={t("insights.sleep.title")}
description={t("insights.sleep.description")}
explainerMetric="sleep"
coachLaunch
>
<SleepOverview />
@@ -78,8 +78,6 @@ export default function InsightsSchlafPage() {
structural slot waits for v1.5 where the route + hook key will
wire in.
*/}
<CoachLaunchButton />
</SubPageShell>
);
}
+1 -3
View File
@@ -10,7 +10,6 @@ import { useTranslations } from "@/lib/i18n/context";
import { useInsightsLayoutPrefs } from "@/hooks/use-insights-layout-prefs";
import { Button } from "@/components/ui/button";
import { HealthChartDynamic } from "@/components/charts/health-chart-dynamic";
import { CoachLaunchButton } from "@/components/insights/coach-launch-button";
import { InsightStatusCard } from "@/components/insights/insight-status-card";
import { MetricEmptyState } from "@/components/insights/metric-empty-state";
import { MetricStatStrip } from "@/components/insights/metric-stat-strip";
@@ -86,6 +85,7 @@ export default function InsightsGewichtPage() {
timeZone={user?.timezone ?? undefined}
/>
}
coachLaunch
showAllValuesType="WEIGHT"
>
<HealthChartDynamic
@@ -111,8 +111,6 @@ export default function InsightsGewichtPage() {
loading={isStatusLoading}
preparing={status?.preparing ?? false}
/>
<CoachLaunchButton />
</SubPageShell>
);
}
+2 -5
View File
@@ -4,7 +4,6 @@ import { Activity } from "lucide-react";
import { useTranslations } from "@/lib/i18n/context";
import { useWorkouts } from "@/hooks/use-workouts";
import { CoachLaunchButton } from "@/components/insights/coach-launch-button";
import { MetricEmptyState } from "@/components/insights/metric-empty-state";
import { SubPageShell } from "@/components/insights/sub-page-shell";
import { WorkoutList } from "@/components/insights/workout-list";
@@ -36,6 +35,7 @@ export default function InsightsWorkoutsPage() {
title={t("insights.workouts.title")}
description={t("insights.workouts.description")}
explainerMetric="workouts"
coachLaunch
>
{isLoading ? (
<div data-slot="workouts-loading" className="space-y-2">
@@ -52,10 +52,7 @@ export default function InsightsWorkoutsPage() {
coachPrefill="I haven't logged any workouts yet — why does tracking them matter, and what should I focus on first?"
/>
) : data ? (
<>
<WorkoutList workouts={data.workouts} />
<CoachLaunchButton />
</>
<WorkoutList workouts={data.workouts} />
) : null}
</SubPageShell>
);