diff --git a/src/components/insights/health-score-card.tsx b/src/components/insights/health-score-card.tsx
index f2a3725b8..54a2e410c 100644
--- a/src/components/insights/health-score-card.tsx
+++ b/src/components/insights/health-score-card.tsx
@@ -265,7 +265,7 @@ export function HealthScoreCard({
the bottom, and the card fills the row down to the
"Wirkt mein Medikament?" chip — closing Marc's "Karte hört
bei der Trennlinie auf" report against v1.4.36. */}
-
+
{componentEntries.map(({ key, label, value }) => (
{/* v1.4.25 W3 — widened label column from w-16 (64px) to
w-24 (96px) so the longest German label
@@ -399,7 +405,7 @@ export function HealthScoreCard({
{label}
{/*
* v1.4.20 phase B2b — chip clicks open the Coach drawer
diff --git a/src/components/insights/insight-status-card.tsx b/src/components/insights/insight-status-card.tsx
index c3e2b30d7..24f0f261f 100644
--- a/src/components/insights/insight-status-card.tsx
+++ b/src/components/insights/insight-status-card.tsx
@@ -57,6 +57,7 @@ export function InsightStatusCard({
aria-busy="true"
aria-live="polite"
data-testid="insight-status-card-preparing"
+ className="gap-2 py-4 md:gap-3 md:py-5"
>
@@ -88,7 +89,12 @@ export function InsightStatusCard({
// (`text-sm` → 0.875 rem) so the post-load swap reflows by less
// than a row.
return (
-
+
@@ -108,7 +114,7 @@ export function InsightStatusCard({
if (!hasProvider) {
return (
-
+
{icon}
@@ -126,7 +132,7 @@ export function InsightStatusCard({
if (!text) {
return (
-
+
{icon}
@@ -150,7 +156,14 @@ export function InsightStatusCard({
// on the success card closes the load→loaded transition signal.
diff --git a/src/components/insights/metric-target-summary.tsx b/src/components/insights/metric-target-summary.tsx
index b2733a0a8..9844d67e9 100644
--- a/src/components/insights/metric-target-summary.tsx
+++ b/src/components/insights/metric-target-summary.tsx
@@ -7,7 +7,6 @@ import { Target } from "lucide-react";
import { useAuth } from "@/hooks/use-auth";
import { queryKeys } from "@/lib/query-keys";
import { useTranslations } from "@/lib/i18n/context";
-import { Card, CardContent } from "@/components/ui/card";
/**
* v1.8.0 — surface the numeric target range + in-target share on each
@@ -143,31 +142,39 @@ export function MetricTargetSummary({ slug }: MetricTargetSummaryProps) {
: null;
return (
-
-
-
+ // v1.8.5 W4a — demote the target summary from a full bordered `Card`
+ // (which carried the primitive's `py-4 md:py-6` shell padding around a
+ // `py-3` content block — far too much vertical reserve for one line of
+ // range text) to a compact inline band. The green target glyph, the
+ // range string, the in-target share, and the "adjust" link all stay;
+ // only the wrapper shell changes so the block reads as a strip, not a
+ // card, in the tightened sub-page rhythm.
+
{explainerMetric ? (
// v1.8.4 — surface the explainer definition inline, reusing the
- // exact body string the `?` popover reads. Muted caption styling
- // matches the description paragraph below so the under-heading
- // band reads as one calm block.
+ // exact body string the `?` popover reads.
+ //
+ // v1.8.5 W4a — render the explainer body as the *single* caption
+ // under the heading. Pre-v1.8.5 both this paragraph and the
+ // `description` below it stacked, so every metric page opened
+ // with two near-duplicative muted captions before any data — the
+ // root of the "airy / static under the heading" feel. The
+ // explainer body is the definition, so it wins; the description
+ // only renders when no explainer is set (the mother page and any
+ // future explainer-less sub-page).