diff --git a/src/components/admin/app-log-preview-section.tsx b/src/components/admin/app-log-preview-section.tsx
index 1cc49e2c1..f9b92a01d 100644
--- a/src/components/admin/app-log-preview-section.tsx
+++ b/src/components/admin/app-log-preview-section.tsx
@@ -125,7 +125,7 @@ export function AppLogPreviewSection() {
refetch()}
disabled={isFetching}
aria-label={t("admin.section.app-logs.refresh")}
@@ -133,13 +133,12 @@ export function AppLogPreviewSection() {
-
- {t("admin.section.app-logs.processDetail")}
-
}
/>
+
{t("admin.section.app-logs.processDetail")}
+
{status ? (
-
{status}
+ // `max-w-full` caps the slot at the row once it wraps under the
+ // title, so a status line longer than a phone row wraps inside
+ // the card instead of widening the page.
+
+ {status}
+
) : null}
{/* One sentence, one text run. This slot deliberately carries no
diff --git a/src/components/settings/ai/fallback-chain-card.tsx b/src/components/settings/ai/fallback-chain-card.tsx
index 388a04b1a..80977ecfb 100644
--- a/src/components/settings/ai/fallback-chain-card.tsx
+++ b/src/components/settings/ai/fallback-chain-card.tsx
@@ -294,7 +294,7 @@ function AddProviderControl({
const [picked, setPicked] = useState(addable[0] ?? "");
return (
-
+
@@ -898,7 +898,12 @@ function SortableWidgetRow({
{labels.widgetLabel}
-
+ {/* On a phone the two switches and two arrows (~250 px) left the name
+ five characters ("Gewic…"). Below `sm` the controls wrap onto a
+ second line, right-aligned under the column heads, and the name
+ keeps the first line to itself. */}
+
+
onToggleTile(widget.id, v)}
diff --git a/src/components/settings/low-stock-card.tsx b/src/components/settings/low-stock-card.tsx
index aebcca62f..df910d221 100644
--- a/src/components/settings/low-stock-card.tsx
+++ b/src/components/settings/low-stock-card.tsx
@@ -234,8 +234,6 @@ export function LowStockCard({
disabled={!isAuthenticated || saving}
aria-label={t("notifications.lowStock.toggleAria")}
/>
- {t("notifications.lowStock.detail")}
-
{enabled
? t("notifications.lowStock.statusOn")
@@ -244,6 +242,7 @@ export function LowStockCard({
}
/>
+ {t("notifications.lowStock.detail")}
{enabled && (
diff --git a/src/components/settings/mood-reminder-card.tsx b/src/components/settings/mood-reminder-card.tsx
index 060a8b755..0d814b3a5 100644
--- a/src/components/settings/mood-reminder-card.tsx
+++ b/src/components/settings/mood-reminder-card.tsx
@@ -193,8 +193,6 @@ export function MoodReminderCard({
disabled={!isAuthenticated || saving}
aria-label={t("notifications.moodReminder.toggleAria")}
/>
- {t("notifications.moodReminder.detail")}
-
{enabled
? t("notifications.moodReminder.statusOn")
@@ -203,6 +201,7 @@ export function MoodReminderCard({
}
/>
+
{t("notifications.moodReminder.detail")}
{enabled && (
diff --git a/src/components/settings/report-selection/report-scope-picker.tsx b/src/components/settings/report-selection/report-scope-picker.tsx
index ac191bd8d..29825262f 100644
--- a/src/components/settings/report-selection/report-scope-picker.tsx
+++ b/src/components/settings/report-selection/report-scope-picker.tsx
@@ -112,8 +112,11 @@ export function ReportScopePicker({
{/* The one-click way to a complete report. An inline action row
(UI-STANDARDS §11): the sentence wraps, the action stays beside it.
It is offered, never applied — and it stays offered so a person can
- come back to the standard set after experimenting. */}
-
+ come back to the standard set after experimenting. On a phone the
+ action's own label is wider than half the row, so beside it the
+ sentence shrank to a one-word column and the button ran past the
+ card edge: there the action drops under the sentence instead. */}
+