diff --git a/src/components/dashboard/recent-workouts-tile.tsx b/src/components/dashboard/recent-workouts-tile.tsx index 69e6c26dd..e52db6cab 100644 --- a/src/components/dashboard/recent-workouts-tile.tsx +++ b/src/components/dashboard/recent-workouts-tile.tsx @@ -109,14 +109,14 @@ export function RecentWorkoutsTile() { >
-
{t("dashboard.recentWorkouts.viewAll")} diff --git a/src/components/gamification/recent-achievements-card.tsx b/src/components/gamification/recent-achievements-card.tsx index f7a7feb40..df7807644 100644 --- a/src/components/gamification/recent-achievements-card.tsx +++ b/src/components/gamification/recent-achievements-card.tsx @@ -115,14 +115,14 @@ export function RecentAchievementsCard() { >
-
{t("achievements.dashboardCard.viewAll")} diff --git a/src/components/measurement-reminders/vorsorge-section.tsx b/src/components/measurement-reminders/vorsorge-section.tsx index 98b927df9..945ef0fb0 100644 --- a/src/components/measurement-reminders/vorsorge-section.tsx +++ b/src/components/measurement-reminders/vorsorge-section.tsx @@ -13,9 +13,10 @@ * relative to "now" but never recomputes the cadence. */ import { useState } from "react"; -import { CheckCircle2, Plus } from "lucide-react"; +import { CalendarClock, CheckCircle2, Plus } from "lucide-react"; import { useTranslations } from "@/lib/i18n/context"; +import { SettingsCardHeader } from "@/components/settings/_card-header"; import { DeleteButton } from "@/components/data-list"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; @@ -120,28 +121,23 @@ export function VorsorgeSection({ enabled = true }: { enabled?: boolean }) { aria-labelledby="vorsorge-section-title" className="space-y-4" > -
-
-

setShowForm((v) => !v)} > - {t("measurementReminders.sectionTitle")} -

-

- {t("measurementReminders.sectionDescription")} -

-
- -
+ + {t("measurementReminders.addButton")} + + } + /> {showForm && ( diff --git a/src/components/medications/medication-card.tsx b/src/components/medications/medication-card.tsx index 3cf0bb210..693d1ef73 100644 --- a/src/components/medications/medication-card.tsx +++ b/src/components/medications/medication-card.tsx @@ -221,9 +221,12 @@ export function MedicationCard({ const rate7 = display?.short.rate ?? compliance?.compliance7?.rate ?? 0; const rate30 = display?.long.rate ?? compliance?.compliance30?.rate ?? 0; const streak = display?.short.streak ?? compliance?.compliance7?.streak ?? 0; - // v1.15.9 — the open dose's server-derived status drives the card's green - // take-window highlight + the overdue / heavily-overdue top line. Defaults - // to "upcoming" (calm) when the display block is absent (older mocks). + // v1.15.9 — the open dose's server-derived status drives a discreet status + // line/glyph (text + icon only) and the overdue / heavily-overdue top line. + // Per the neutral med-card rule there is NO green take-window highlight and + // no grade-tinted card chrome — status is conveyed by a calm line, never a + // background/border tint. Defaults to "upcoming" (calm) when the display + // block is absent (older mocks). const doseStatus = display?.currentDose.status ?? "upcoming"; const categoryLabel = getMedicationCategoryLabel(medication.category, t); const sortedSchedules = [...medication.schedules].sort( diff --git a/src/components/settings/export-section.tsx b/src/components/settings/export-section.tsx index ea99c154e..07b0463b0 100644 --- a/src/components/settings/export-section.tsx +++ b/src/components/settings/export-section.tsx @@ -32,12 +32,14 @@ import { Loader2, Pill, Waves, + type LucideIcon, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { DateInput } from "@/components/ui/date-input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; +import { SettingsCardHeader } from "@/components/settings/_card-header"; import { ImportPanel } from "@/components/settings/import-panel"; import { queryKeys } from "@/lib/query-keys"; import { useTranslations } from "@/lib/i18n/context"; @@ -120,7 +122,7 @@ export function ExportSection() { interface ExportCardShellProps { testId: string; - icon: React.ComponentType<{ className?: string }>; + icon: LucideIcon; title: string; description: string; format: ExportFormat; @@ -146,16 +148,16 @@ function ExportCardShell({ data-testid={testId} className={`bg-card border-border flex h-full flex-col rounded-xl border p-4 sm:p-6${outerClassName ? ` ${outerClassName}` : ""}`} > -
-
- -

{title}

-
- - {format} - -
-

{description}

+ + {format} + + } + /> {children &&
{children}
}
{footer}
@@ -220,7 +222,7 @@ function buildQueryString(base: Record): string { interface CsvCardProps { testId: string; actionTestId: string; - icon: React.ComponentType<{ className?: string }>; + icon: LucideIcon; titleKey: string; descriptionKey: string; endpoint: string; diff --git a/src/components/settings/health-record-export-panel.tsx b/src/components/settings/health-record-export-panel.tsx index 61e96d18f..ec21299e3 100644 --- a/src/components/settings/health-record-export-panel.tsx +++ b/src/components/settings/health-record-export-panel.tsx @@ -24,6 +24,7 @@ import { useId, useState } from "react"; import { ChevronDown, Download, FileText, Loader2 } from "lucide-react"; +import { SettingsCardHeader } from "@/components/settings/_card-header"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; @@ -202,21 +203,13 @@ export function HealthRecordExportPanel() { "relative isolate overflow-hidden rounded-xl p-4 sm:p-5", )} > -
-
-

- {t("settings.healthRecord.description")} -

+
{/* Format + range share a row on desktop so the panel opens diff --git a/src/components/settings/medications-section.tsx b/src/components/settings/medications-section.tsx index 966c00174..61dce559d 100644 --- a/src/components/settings/medications-section.tsx +++ b/src/components/settings/medications-section.tsx @@ -8,6 +8,7 @@ import { type ReorderMedication, } from "@/components/medications/medication-order-editor"; import { MedicationViewToggle } from "@/components/medications/medication-view-toggle"; +import { SettingsCardHeader } from "@/components/settings/_card-header"; import { InjectionSitesCard } from "@/components/settings/injection-sites-card"; import { useAuth } from "@/hooks/use-auth"; import { apiGet } from "@/lib/api/api-fetch"; @@ -90,12 +91,10 @@ export function MedicationsSection() { id="medications-view" className="bg-card border-border scroll-mt-28 space-y-4 rounded-xl border p-4 sm:p-6" > -
- -

- {t("medications.viewToggleLabel")} -

-
+

{t("medications.viewToggleHint")} @@ -113,15 +112,11 @@ export function MedicationsSection() { id="medications-order" className="bg-card border-border scroll-mt-28 space-y-4 rounded-xl border p-4 sm:p-6" > -

- -

- {t("medications.reorderTitle")} -

-
-

- {t("medications.reorderDescription")} -

+ {isLoading || isLayoutLoading ? (
diff --git a/src/components/settings/mood-section.tsx b/src/components/settings/mood-section.tsx index d8a82248e..f4a251e96 100644 --- a/src/components/settings/mood-section.tsx +++ b/src/components/settings/mood-section.tsx @@ -2,6 +2,7 @@ import { Archive, Folders, Loader2, Tags } from "lucide-react"; +import { SettingsCardHeader } from "@/components/settings/_card-header"; import { ArchivedTagsCard } from "@/components/mood/manage/archived-tags-card"; import { TagGroupsCard } from "@/components/mood/manage/tag-groups-card"; import { TagManagerCard } from "@/components/mood/manage/tag-manager-card"; @@ -58,12 +59,10 @@ export function MoodSection() { id="mood-groups" className="bg-card border-border scroll-mt-28 space-y-4 rounded-xl border p-4 sm:p-6" > -
- -

- {t("mood.manage.groupsTitle")} -

-
+ {isLoading || !catalog ? loading : }
@@ -72,12 +71,7 @@ export function MoodSection() { id="mood-tags" className="bg-card border-border scroll-mt-28 space-y-4 rounded-xl border p-4 sm:p-6" > -
- -

- {t("mood.manage.tagsTitle")} -

-
+ {isLoading || !catalog ? loading : }
@@ -86,12 +80,10 @@ export function MoodSection() { id="mood-archived" className="bg-card border-border scroll-mt-28 space-y-4 rounded-xl border p-4 sm:p-6" > -
- -

- {t("mood.manage.archivedTitle")} -

-
+ {isLoading || !catalog ? ( loading ) : (