diff --git a/src/components/settings/about-section.tsx b/src/components/settings/about-section.tsx index 787c5b46a..4f746ea83 100644 --- a/src/components/settings/about-section.tsx +++ b/src/components/settings/about-section.tsx @@ -13,6 +13,7 @@ import { } from "lucide-react"; import { Button } from "@/components/ui/button"; +import { SettingsCard } from "@/components/settings/settings-card"; import { SettingsCardHeader } from "@/components/settings/_card-header"; import { useFormatters, useTranslations } from "@/lib/i18n/context"; import { queryKeys } from "@/lib/query-keys"; @@ -191,7 +192,7 @@ export function AboutSection() { stacked the license under the version inside its own boxed Badge, which read as a separate field even though the two values belong on the same row. */} -
+ {isLoading || !version ? ( @@ -255,13 +256,13 @@ export function AboutSection() { )} )} -
+ {/* Sources & docs — every link card was untitled in the v1.4.2 About surface, so the buttons floated alone with no heading telling the user what the section was for. */} {version && ( -
+
- + )} {/* v1.18.6 — the tour-replay card consolidated onto a single home in diff --git a/src/components/settings/account-section.tsx b/src/components/settings/account-section.tsx index bddb12312..393370666 100644 --- a/src/components/settings/account-section.tsx +++ b/src/components/settings/account-section.tsx @@ -48,6 +48,7 @@ import { useTranslations } from "@/lib/i18n/context"; import { describePasskeyError } from "@/lib/passkey-errors"; import { queryKeys } from "@/lib/query-keys"; import { AboutMeSection } from "@/components/settings/about-me-section"; +import { SettingsCard } from "@/components/settings/settings-card"; import { SettingsCardHeader } from "@/components/settings/_card-header"; import { TimezonePicker } from "@/components/settings/timezone-picker"; import { TimeFormatSelect } from "@/components/settings/time-format-select"; @@ -375,7 +376,7 @@ export function AccountSection() { {/* Profile photo card */} -
+
- + {/* v1.18.0 (S5) — injection-site exclusions moved to the dedicated Medikamente settings section, where every medication-specific @@ -599,7 +600,7 @@ export function AccountSection() { {/* Passkeys card */} -
+ )} -
+ {/* Password card. v1.4.19 A6: action-button placement contract — on mobile (` +
@@ -665,7 +666,7 @@ export function AccountSection() { {t("settings.changePassword")}
-
+
{/* v1.18.1 (D1) — the "Tour neu starten" card moved to Settings → Erweitert. It is a maintenance / reset action, not a profile or @@ -1096,7 +1097,7 @@ function AvatarSection() { const busy = upload.isPending || remove.isPending; return ( -
+ )} -
+ ); } diff --git a/src/components/settings/advanced-section.tsx b/src/components/settings/advanced-section.tsx index 7650cefee..52cb08886 100644 --- a/src/components/settings/advanced-section.tsx +++ b/src/components/settings/advanced-section.tsx @@ -19,6 +19,7 @@ import { Button } from "@/components/ui/button"; import { Switch } from "@/components/ui/switch"; import { ResearchModeAcknowledgmentDialog } from "@/components/medications/ResearchModeAcknowledgmentDialog"; import { formatDateTime } from "@/lib/format"; +import { SettingsCard } from "@/components/settings/settings-card"; import { SettingsCardHeader } from "@/components/settings/_card-header"; import { useTranslations } from "@/lib/i18n/context"; import { queryKeys } from "@/lib/query-keys"; @@ -139,8 +140,7 @@ function ResearchModeCard() { } return ( -
-
+ ); } @@ -254,8 +254,7 @@ function DataResetCard() { } return ( -
{/* v1.4.43 QoL (L5) — dropped the `AlertTriangle` icon and @@ -338,7 +337,7 @@ function DataResetCard() { {msg}

)} -
+ ); } @@ -402,8 +401,7 @@ function AccountDeleteCard() { } return ( -
@@ -482,6 +480,6 @@ function AccountDeleteCard() { {msg}

)} -
+ ); } diff --git a/src/components/settings/api-section.tsx b/src/components/settings/api-section.tsx index 417b081de..41636a6a7 100644 --- a/src/components/settings/api-section.tsx +++ b/src/components/settings/api-section.tsx @@ -19,6 +19,7 @@ import { import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; +import { SettingsCard } from "@/components/settings/settings-card"; import { SettingsCardHeader } from "@/components/settings/_card-header"; import { useAuth } from "@/hooks/use-auth"; import { formatDate, formatDateTime } from "@/lib/format"; @@ -66,7 +67,7 @@ function ApiEndpointsCard() { ]; return ( -
+ ))} -
+ ); } @@ -229,7 +230,7 @@ function ApiTokensCard() { }, null); return ( -
+ )}
-
+ ); } diff --git a/src/components/settings/medications-section.tsx b/src/components/settings/medications-section.tsx index a1421aba9..9d488a10d 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 { SettingsCard } from "@/components/settings/settings-card"; import { SettingsCardHeader } from "@/components/settings/_card-header"; import { InjectionSitesCard } from "@/components/settings/injection-sites-card"; import { useAuth } from "@/hooks/use-auth"; @@ -79,9 +80,9 @@ export function MedicationsSection() {
{/* View preference — cards vs table. The shared header toggle writes optimistically, so there is no Save button here. */} -
)}
-
+ {/* Manual order — applies to both list views. */} -
)} -
+ {/* v1.18.0 (S5) — injection-site exclusions are a medication setting; they moved here from the account profile so all medication-specific diff --git a/src/components/settings/mood-section.tsx b/src/components/settings/mood-section.tsx index dff7c7019..f05539029 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 { SettingsCard } from "@/components/settings/settings-card"; 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"; @@ -45,30 +46,30 @@ export function MoodSection() { return (
{/* Groups — picker group order + own groups. */} -
{isLoading || !catalog ? loading : } -
+ {/* Tags — visibility, order, edit, move, create. */} -
{isLoading || !catalog ? loading : } -
+ {/* Archived custom tags — restore / hard delete. */} -
)} -
+
); } diff --git a/src/components/settings/notification-status-card.tsx b/src/components/settings/notification-status-card.tsx index eea9c5763..f13ac3c96 100644 --- a/src/components/settings/notification-status-card.tsx +++ b/src/components/settings/notification-status-card.tsx @@ -32,6 +32,7 @@ import { import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { useAuth } from "@/hooks/use-auth"; +import { SettingsCard } from "@/components/settings/settings-card"; import { SettingsCardHeader } from "@/components/settings/_card-header"; import { useFormatters, useTranslations } from "@/lib/i18n/context"; import { queryKeys } from "@/lib/query-keys"; @@ -114,9 +115,9 @@ export function NotificationStatusCard() { if (isLoading) { return ( -
+ -
+ ); } @@ -128,8 +129,7 @@ export function NotificationStatusCard() { const channels = Array.isArray(data) ? data : []; if (channels.length === 0) { return ( -
-
+ ); } return ( -
+ ))} -
+ ); }