diff --git a/src/components/insights/sleep-stage-stacked-bar.tsx b/src/components/insights/sleep-stage-stacked-bar.tsx
index 84f32fe75..0203dc2d8 100644
--- a/src/components/insights/sleep-stage-stacked-bar.tsx
+++ b/src/components/insights/sleep-stage-stacked-bar.tsx
@@ -14,7 +14,8 @@ import {
} from "recharts";
import { Button } from "@/components/ui/button";
-import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Card, CardContent, CardHeader } from "@/components/ui/card";
+import { TileHeader } from "@/components/insights/tile-header";
import { useTranslations } from "@/lib/i18n/context";
import { formatDurationMinutes } from "@/lib/i18n/duration";
import { resolveIntlLocale } from "@/lib/format-locale";
@@ -205,10 +206,14 @@ export function SleepStageStackedBar({ breakdown }: SleepStageStackedBarProps) {
-
-
- {t("insights.sleep.compositionTitle")}
-
+
+ {/* The canonical tile header — the title used to be a bare
+ `CardTitle` in a hand-rolled row. The window toggles stay a
+ sibling of the title+subtitle pair rather than riding the
+ header's `right` slot: the subtitle belongs under the title,
+ and the toggles need to drop to their own row below `sm`
+ (the sanctioned inline-action-row shape). */}
+
{t("insights.sleep.compositionSubtitle", {
nights: breakdown.nights,