+
) : (
/* Focusable, named scroll region: on a phone the table scrolls
sideways, and a keyboard user has to be able to reach it
diff --git a/src/components/admin/host-metrics-chart.tsx b/src/components/admin/host-metrics-chart.tsx
index 20377f6be..702b779fe 100644
--- a/src/components/admin/host-metrics-chart.tsx
+++ b/src/components/admin/host-metrics-chart.tsx
@@ -48,6 +48,7 @@ import { SettingsCardHeader } from "@/components/settings/_card-header";
import { apiGet } from "@/lib/api/api-fetch";
import { readStoredTimezone } from "@/lib/timezone-mirror";
import { resolveIntlLocale } from "@/lib/format-locale";
+import { EmptyState } from "@/components/ui/empty-state";
interface HostMetricsApiSample {
capturedAt: string;
@@ -227,9 +228,11 @@ export function HostMetricsChart() {
}
/>
-
- {t("admin.hostMetrics.empty")}
-
+
);
}
diff --git a/src/components/admin/provider-health-section.tsx b/src/components/admin/provider-health-section.tsx
index 3032ee8ef..4df470bea 100644
--- a/src/components/admin/provider-health-section.tsx
+++ b/src/components/admin/provider-health-section.tsx
@@ -11,6 +11,7 @@ import { queryKeys } from "@/lib/query-keys";
import { apiGet } from "@/lib/api/api-fetch";
import { formatDateTime } from "@/lib/format";
import { QueryErrorRow } from "@/components/ui/query-error-row";
+import { EmptyState } from "@/components/ui/empty-state";
/**
* v1.37.31 — the delivery-health readout the `provider_health` ledger never
@@ -143,9 +144,11 @@ export function ProviderHealthSection() {
onRetry={() => void refetch()}
/>
) : providers.length === 0 ? (
-
+
) : (
<>
diff --git a/src/components/documents/document-ai-panels.tsx b/src/components/documents/document-ai-panels.tsx
index daf342284..b2c5e8d66 100644
--- a/src/components/documents/document-ai-panels.tsx
+++ b/src/components/documents/document-ai-panels.tsx
@@ -30,6 +30,7 @@ import {
} from "@/lib/validations/inbound-documents";
import type { DocumentDescribeResult } from "./use-document-assist";
+import { EmptyState } from "@/components/ui/empty-state";
/**
* The line under a document AI action while its read runs in the background,
@@ -220,9 +221,11 @@ export function AssistSuggestionReview({
) : null}
) : (
-
- {t("documents.assist.empty")}
-
+
)}
);
diff --git a/src/components/documents/document-link-picker.tsx b/src/components/documents/document-link-picker.tsx
index 8e5357132..c80956ae2 100644
--- a/src/components/documents/document-link-picker.tsx
+++ b/src/components/documents/document-link-picker.tsx
@@ -31,6 +31,7 @@ import type {
InboundDocumentDto,
} from "@/lib/validations/inbound-documents";
import { DOCUMENT_KIND_ICONS } from "./document-kind-meta";
+import { EmptyState } from "@/components/ui/empty-state";
interface ListPage {
documents: InboundDocumentDto[];
@@ -140,9 +141,11 @@ export function DocumentLinkPicker({
onRetry={() => list.refetch()}
/>
) : documents.length === 0 ? (
-
- {t("documents.linkPicker.empty")}
-
+
) : (
{documents.map((doc) => {
diff --git a/src/components/gamification/recent-achievements-card.tsx b/src/components/gamification/recent-achievements-card.tsx
index 2c778df45..e3ba79fd6 100644
--- a/src/components/gamification/recent-achievements-card.tsx
+++ b/src/components/gamification/recent-achievements-card.tsx
@@ -27,6 +27,7 @@ import { useAchievementsQuery } from "@/lib/queries/use-achievements-query";
import type { AchievementProgress } from "@/lib/gamification/achievements";
import { Skeleton } from "@/components/ui/skeleton";
import { TileHeader } from "@/components/insights/tile-header";
+import { EmptyState } from "@/components/ui/empty-state";
const iconMap: Record = {
Activity,
@@ -168,9 +169,11 @@ export function RecentAchievementsCard() {
))}
) : recent.length === 0 ? (
-
- {t("achievements.dashboardCard.empty")}
-
+
) : (
{recent.map((achievement) => {
diff --git a/src/components/illness/illness-day-timeline.tsx b/src/components/illness/illness-day-timeline.tsx
index dbf60b7b6..47a636a7f 100644
--- a/src/components/illness/illness-day-timeline.tsx
+++ b/src/components/illness/illness-day-timeline.tsx
@@ -26,6 +26,7 @@ import { ILLNESS_SYMPTOM_CATALOG } from "./symptom-catalog";
import { useIllnessDayLogList } from "./use-illness";
import type { IllnessDayLogDTO } from "./types";
import { QueryErrorRow } from "@/components/ui/query-error-row";
+import { EmptyState } from "@/components/ui/empty-state";
function symptomLabelKey(key: string): string | null {
return ILLNESS_SYMPTOM_CATALOG.find((s) => s.key === key)?.labelKey ?? null;
@@ -64,9 +65,11 @@ function DayLogRow({ log }: { log: IllnessDayLogDTO }) {
})}
) : (
-
+
);
}
// v1.11.5 — for SLEEP_DURATION the drill-down rows are stage segments;
diff --git a/src/components/medications/detail/efficacy/efficacy-tab.tsx b/src/components/medications/detail/efficacy/efficacy-tab.tsx
index 1fd9b33f5..1e7b7e24c 100644
--- a/src/components/medications/detail/efficacy/efficacy-tab.tsx
+++ b/src/components/medications/detail/efficacy/efficacy-tab.tsx
@@ -42,6 +42,7 @@ import type {
MedicationEfficacyDTO,
EfficacyTargetView,
} from "@/lib/medications/efficacy/build-efficacy";
+import { EmptyState } from "@/components/ui/empty-state";
// v1.30 UI audit (M8) — `EfficacyChart` mounts inside `TargetCard`'s own
// `` as a bare 220px `ResponsiveContainer` with no chrome of its own.
@@ -299,9 +300,11 @@ function TargetCard({
/>
) : (
-
- {t("medications.efficacy.noSeries")}
-
+
)}
diff --git a/src/components/medications/detail/medication-detail-tabs.tsx b/src/components/medications/detail/medication-detail-tabs.tsx
index 62cb75fe6..140e60ab6 100644
--- a/src/components/medications/detail/medication-detail-tabs.tsx
+++ b/src/components/medications/detail/medication-detail-tabs.tsx
@@ -105,6 +105,7 @@ import { IntakeTrackingBody } from "@/components/medications/sections/intake-tra
import { MedicationRelatedSection } from "@/components/medications/detail/medication-related-section";
import type { RelatedLink } from "@/lib/links/related";
import { InlineAction } from "@/components/ui/inline-action";
+import { EmptyState } from "@/components/ui/empty-state";
// v1.15.20 — Recharts stays out of the detail page's initial bundle:
// both chart bodies load through `next/dynamic` (client-only) with the
@@ -677,9 +678,11 @@ export function MedicationDetailTabs({
longDays={longDays}
/>
) : (
-