Merge the separator sweep into the day and Coach polish

This commit is contained in:
Marc-André Bombeck committed 2026-10-09 13:44:58 +02:00
commit da92dabb55
39 files changed
+1027 -881

No files matched your search

@@ -38,7 +38,7 @@ const okResult: CorrelationResult = {
pValue: 0.001,
confidenceBand: { low: -0.85, high: -0.39, label: "high" },
interpretation:
"Higher medication compliance lines up with lower systolic readings — a pattern worth watching.",
"Higher medication compliance lines up with lower systolic readings, a pattern worth watching.",
points: [
{ x: 60, y: 140 },
{ x: 70, y: 135 },
@@ -255,7 +255,7 @@ describe("<MessageThread>", () => {
it("folds an older message's provenance into the thought-process row, never a raw key", () => {
const html = render(<MessageThread conversation={baseConversation} />);
expect(html).toContain('data-slot="coach-turn-steps-done"');
expect(html).toContain("Thought process · 1 step");
expect(html).toContain("Thought process (1 step)");
expect(html).not.toContain('data-slot="coach-source-chips"');
expect(html).not.toContain("insights.coach.metric.");
expect(html).not.toContain("n=26");
@@ -479,7 +479,7 @@ describe("<MessageThread>", () => {
expect(html).not.toContain("What I&#x27;m looking at");
expect(html).not.toContain("138 mmHg");
// The areas the answer drew on stay reachable from the row.
expect(html).toContain("Thought process · 1 step");
expect(html).toContain("Thought process (1 step)");
});
it("names the thought-process row in German under 'de'", () => {
@@ -487,7 +487,7 @@ describe("<MessageThread>", () => {
<MessageThread conversation={baseConversation} />,
"de",
);
expect(html).toContain("Denkprozess · 1 Schritt");
expect(html).toContain("Denkprozess (1 Schritt)");
expect(html).not.toContain("Worauf bezieht sich das?");
});
@@ -413,7 +413,7 @@ describe("after the answer", () => {
);
expect(html).toContain('data-state="done"');
expect(html).toMatch(
/data-slot="coach-turn-steps-done"[^>]*>Thought process · 5 steps</,
/data-slot="coach-turn-steps-done"[^>]*>Thought process \(5 steps\)</,
);
expect(html).not.toContain("text-shimmer");
expect(html).not.toContain("waiting-dot");
@@ -428,7 +428,7 @@ describe("after the answer", () => {
<CoachTurnActivity activity={[ANSWER_DONE]} steps={[]} active={false} />,
"de",
);
expect(de).toContain("Denkprozess · 1 Schritt<");
expect(de).toContain("Denkprozess (1 Schritt)<");
const pl = render(
<CoachTurnActivity
activity={[THINKING_DONE, FETCH_BP, ANSWER_DONE]}
@@ -437,7 +437,7 @@ describe("after the answer", () => {
/>,
"pl",
);
expect(pl).toContain("Tok myślenia · 3 kroki<");
expect(pl).toContain("Tok myślenia (3 kroki)<");
});
it("an older message counts its steps, or the areas it drew on", () => {
@@ -445,7 +445,7 @@ describe("after the answer", () => {
render(
<CoachTurnActivity activity={[]} steps={[BP, SLEEP]} active={false} />,
),
).toContain("Thought process · 2 steps<");
).toContain("Thought process (2 steps)<");
expect(
render(
<CoachTurnActivity
@@ -455,7 +455,7 @@ describe("after the answer", () => {
areas={["bp"]}
/>,
),
).toContain("Thought process · 1 step<");
).toContain("Thought process (1 step)<");
});
it("says an answer is needed while a question waits, without shimmer", () => {
@@ -681,7 +681,7 @@ describe("the visible row text", () => {
),
),
),
).toBe("Thought process · 5 steps");
).toBe("Thought process (5 steps)");
expect(
textOf(
rowHtml(render(<CoachTurnActivity activity={[]} steps={[]} active />)),
@@ -132,6 +132,10 @@ export function MoodFactorMetricCrosstab({
const metricLabel = t(
METRIC_LABEL_KEY[row.metricKey] ?? row.metricKey,
);
const pairLabel = t("insights.mood.factorCrosstab.pairLabel", {
factor: factorLabel,
metric: metricLabel,
});
// v1.32.26 — the weight ("kg") row follows the metric/imperial
// preference: the unit symbol + the values (averages + delta, all in
// kg, offset-free) convert together. Every other display is unitless
@@ -168,12 +172,9 @@ export function MoodFactorMetricCrosstab({
)}
<span
className="text-foreground min-w-0 flex-1 truncate"
title={`${factorLabel} · ${metricLabel}`}
title={pairLabel}
>
{t("insights.mood.factorCrosstab.pairLabel", {
factor: factorLabel,
metric: metricLabel,
})}
{pairLabel}
</span>
<span className="text-foreground shrink-0 text-sm font-semibold tabular-nums">
{deltaText}
@@ -139,6 +139,10 @@ export function MoodTagMetricCrosstab({
const metricLabel = t(
METRIC_LABEL_KEY[row.metricKey] ?? row.metricKey,
);
const pairLabel = t("insights.mood.crosstab.pairLabel", {
tag: tagLabel,
metric: metricLabel,
});
const unit = t(UNIT_KEY[row.display]);
const up = row.delta >= 0;
const deltaText = `${up ? "+" : ""}${formatValue(row.delta, row.display, nf)} ${unit}`;
@@ -160,12 +164,9 @@ export function MoodTagMetricCrosstab({
)}
<span
className="text-foreground min-w-0 flex-1 truncate"
title={`${tagLabel} · ${metricLabel}`}
title={pairLabel}
>
{t("insights.mood.crosstab.pairLabel", {
tag: tagLabel,
metric: metricLabel,
})}
{pairLabel}
</span>
<span className="text-foreground shrink-0 text-sm font-semibold tabular-nums">
{deltaText}