From 32a023dfff9d7b623f2aaafcea11cf51e93039f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 15 May 2026 17:13:42 +0200 Subject: [PATCH] chore(ui): apply M7 + L1 + L3 + L4 polish across medication form, motion-reduce, details aria, therapy timeline W10 design-review carry-over items. M7 lifts the medication-form day-of-week buttons, the more-horizontal trigger, and the schedule label-input gaps to the 44 px / space-y-2 standard used by every other settings surface. L1 pairs every animate-spin/pulse/bounce with motion-reduce:animate-none across the component tree so users with prefers-reduced-motion get a still surface. L3 adds the aria-controls + panel-id pairing to the inventory + coach-evidence
blocks for parity with the Health Score provenance accordion. L4 inserts a sr-only h4 per therapy-timeline entry so screen-reader users can jump between medication blocks. --- src/app/achievements/page.tsx | 2 +- src/app/auth/login/page.tsx | 4 +-- src/app/auth/register/page.tsx | 2 +- src/app/bugreport/page.tsx | 2 +- src/app/insights/medikamente/page.tsx | 4 +-- src/app/insights/page.tsx | 2 +- src/app/measurements/page.tsx | 2 +- src/app/medications/[id]/history/page.tsx | 2 +- src/app/medications/page.tsx | 6 ++-- src/app/mood/page.tsx | 2 +- src/app/notifications/page.tsx | 2 +- src/app/targets/page.tsx | 2 +- src/components/admin/ai-quality-section.tsx | 2 +- .../admin/api-token-overview-section.tsx | 2 +- .../admin/app-log-preview-section.tsx | 4 +-- src/components/admin/backups-section.tsx | 2 +- src/components/admin/bug-report-section.tsx | 2 +- .../admin/coach-feedback-section.tsx | 2 +- src/components/admin/danger-zone-section.tsx | 2 +- .../admin/feedback-inbox-section.tsx | 6 ++-- src/components/admin/glitchtip-section.tsx | 4 +-- .../admin/login-overview-section.tsx | 2 +- src/components/admin/recent-audit-preview.tsx | 2 +- src/components/admin/reminders-section.tsx | 6 ++-- .../admin/system-status-summary.tsx | 2 +- src/components/admin/umami-section.tsx | 4 +-- .../admin/user-management-section.tsx | 8 ++--- .../admin/web-push-vapid-section.tsx | 2 +- src/components/charts/health-chart.tsx | 2 +- .../charts/medication-compliance-chart.tsx | 2 +- src/components/charts/mood-chart.tsx | 2 +- src/components/dashboard/glp1-tile.tsx | 2 +- .../insights/coach-panel/coach-input.tsx | 2 +- .../coach-panel/coach-settings-sheet.tsx | 2 +- .../insights/coach-panel/message-thread.tsx | 7 ++++- .../insights/insight-status-card.tsx | 2 +- .../insights/recommendation-feedback.tsx | 4 +-- src/components/insights/therapy-timeline.tsx | 7 +++++ .../insights/weekly-report-view.tsx | 2 +- src/components/layout/auth-shell.tsx | 4 +-- src/components/layout/top-bar.tsx | 2 +- .../measurements/measurement-form.tsx | 2 +- .../measurements/measurement-list.tsx | 6 ++-- src/components/medications/DrugLevelChart.tsx | 2 +- .../ResearchModeAcknowledgmentDialog.tsx | 2 +- .../medications/SchedulingSection.tsx | 2 +- .../medications/SideEffectsSection.tsx | 4 +-- .../medications/TitrationSection.tsx | 2 +- .../medications/glp1-medication-card.tsx | 2 +- .../medications/intake-history-list.tsx | 8 ++--- .../medications/inventory-section.tsx | 31 ++++++++++++++----- .../medications/medication-card.tsx | 4 +-- .../medications/medication-form.tsx | 22 ++++++------- .../medications/phase-config-dialog.tsx | 4 +-- src/components/mood/mood-form.tsx | 2 +- src/components/mood/mood-list.tsx | 6 ++-- src/components/onboarding/BaselineForm.tsx | 2 +- src/components/settings/about-section.tsx | 4 +-- src/components/settings/account-section.tsx | 8 ++--- src/components/settings/advanced-section.tsx | 2 +- src/components/settings/ai-section.tsx | 14 ++++----- src/components/settings/api-section.tsx | 2 +- .../settings/dashboard-layout-section.tsx | 4 +-- src/components/settings/export-section.tsx | 8 ++--- .../settings/integrations-section.tsx | 10 +++--- .../settings/notification-status-card.tsx | 6 ++-- src/components/settings/ntfy-card.tsx | 4 +-- src/components/settings/telegram-card.tsx | 4 +-- .../settings/test-connection-button.tsx | 2 +- src/components/settings/web-push-card.tsx | 6 ++-- src/components/ui/sonner.tsx | 2 +- 71 files changed, 165 insertions(+), 136 deletions(-) diff --git a/src/app/achievements/page.tsx b/src/app/achievements/page.tsx index 2111c6e80..5d6f013b3 100644 --- a/src/app/achievements/page.tsx +++ b/src/app/achievements/page.tsx @@ -273,7 +273,7 @@ export default function AchievementsPage() { if (authLoading || isLoading) { return (
- +
); } diff --git a/src/app/auth/login/page.tsx b/src/app/auth/login/page.tsx index df6e6d955..4d1d494a3 100644 --- a/src/app/auth/login/page.tsx +++ b/src/app/auth/login/page.tsx @@ -140,7 +140,7 @@ export default function LoginPage() { disabled={loading} > {loading && mode === "passkey" ? ( - + ) : ( )} @@ -198,7 +198,7 @@ export default function LoginPage() { disabled={loading} > {loading && mode === "password" ? ( - + ) : ( )} diff --git a/src/app/auth/register/page.tsx b/src/app/auth/register/page.tsx index b4b300252..9980b46ef 100644 --- a/src/app/auth/register/page.tsx +++ b/src/app/auth/register/page.tsx @@ -131,7 +131,7 @@ export default function RegisterPage() { diff --git a/src/app/insights/medikamente/page.tsx b/src/app/insights/medikamente/page.tsx index e2b2b5356..ff982be9e 100644 --- a/src/app/insights/medikamente/page.tsx +++ b/src/app/insights/medikamente/page.tsx @@ -110,7 +110,7 @@ export default function InsightsMedikamentePage() { return (
- +
); @@ -250,7 +250,7 @@ function MedicationComplianceCalendar({ if (isLoading) { return (
- +
); } diff --git a/src/app/insights/page.tsx b/src/app/insights/page.tsx index 00df750b8..62b698b49 100644 --- a/src/app/insights/page.tsx +++ b/src/app/insights/page.tsx @@ -133,7 +133,7 @@ export default function InsightsPage() { if (isLoading) { return (
- +
); } diff --git a/src/app/measurements/page.tsx b/src/app/measurements/page.tsx index 9901029ff..c075842fe 100644 --- a/src/app/measurements/page.tsx +++ b/src/app/measurements/page.tsx @@ -32,7 +32,7 @@ export default function MeasurementsPage() { if (isLoading) { return (
- +
); } diff --git a/src/app/medications/[id]/history/page.tsx b/src/app/medications/[id]/history/page.tsx index 4904d5fbd..1c495ef65 100644 --- a/src/app/medications/[id]/history/page.tsx +++ b/src/app/medications/[id]/history/page.tsx @@ -51,7 +51,7 @@ export default function IntakeHistoryPage({ if (authLoading || medLoading) { return (
- +
); } diff --git a/src/app/medications/page.tsx b/src/app/medications/page.tsx index 70ba80ec8..373721e66 100644 --- a/src/app/medications/page.tsx +++ b/src/app/medications/page.tsx @@ -113,7 +113,7 @@ export default function MedicationsPage() { if (authLoading) { return (
- +
); } @@ -161,7 +161,7 @@ export default function MedicationsPage() { {isLoading ? (
- +
) : isError ? (
@@ -499,7 +499,7 @@ function IntakeImportDialog({ onClick={handleImport} disabled={importing || !jsonText.trim()} > - {importing && } + {importing && } {t("common.import")} diff --git a/src/app/mood/page.tsx b/src/app/mood/page.tsx index 03cebed31..38f0e0ad2 100644 --- a/src/app/mood/page.tsx +++ b/src/app/mood/page.tsx @@ -32,7 +32,7 @@ export default function MoodPage() { if (isLoading) { return (
- +
); } diff --git a/src/app/notifications/page.tsx b/src/app/notifications/page.tsx index 0ac110b2e..1d4ab703c 100644 --- a/src/app/notifications/page.tsx +++ b/src/app/notifications/page.tsx @@ -129,7 +129,7 @@ export default function NotificationsPage() { if (authLoading || isLoading) { return (
- +
); } diff --git a/src/app/targets/page.tsx b/src/app/targets/page.tsx index b36940b9e..10333214e 100644 --- a/src/app/targets/page.tsx +++ b/src/app/targets/page.tsx @@ -196,7 +196,7 @@ export default function TargetsPage() { if (isLoading) { return (
- +
); } diff --git a/src/components/admin/ai-quality-section.tsx b/src/components/admin/ai-quality-section.tsx index 9c3de650d..be96674e5 100644 --- a/src/components/admin/ai-quality-section.tsx +++ b/src/components/admin/ai-quality-section.tsx @@ -75,7 +75,7 @@ export function AiQualitySection() { if (query.isLoading) { return (
- + {t("admin.aiQuality.loading")} diff --git a/src/components/admin/api-token-overview-section.tsx b/src/components/admin/api-token-overview-section.tsx index 1ab015c19..f8ed57313 100644 --- a/src/components/admin/api-token-overview-section.tsx +++ b/src/components/admin/api-token-overview-section.tsx @@ -170,7 +170,7 @@ export function ApiTokenOverviewSection() { ) : !tokens?.length ? ( // v1.4.15 phase-C5: empty state explains where tokens come // from (native client sign-in / Settings → Account) so a - // fresh admin doesn't think they need to create them here. + // fresh admin doesn motion-reduce:animate-none't think they need to create them here. } title={t("admin.tokensEmptyTitle")} diff --git a/src/components/admin/app-log-preview-section.tsx b/src/components/admin/app-log-preview-section.tsx index 509a0f523..9d6d9fd51 100644 --- a/src/components/admin/app-log-preview-section.tsx +++ b/src/components/admin/app-log-preview-section.tsx @@ -133,7 +133,7 @@ export function AppLogPreviewSection() { aria-label={t("admin.section.app-logs.refresh")} > @@ -195,7 +195,7 @@ export function AppLogPreviewSection() { {isLoading ? (
- +
) : events.length === 0 ? ( {pending ? ( - + ) : ( )} diff --git a/src/components/admin/bug-report-section.tsx b/src/components/admin/bug-report-section.tsx index 871b26c85..fd8a42149 100644 --- a/src/components/admin/bug-report-section.tsx +++ b/src/components/admin/bug-report-section.tsx @@ -119,7 +119,7 @@ export function BugReportSection() { disabled={updateSettings.isPending} > {updateSettings.isPending && ( - + )} {t("common.save")} diff --git a/src/components/admin/coach-feedback-section.tsx b/src/components/admin/coach-feedback-section.tsx index 4121c4fd6..05db00be1 100644 --- a/src/components/admin/coach-feedback-section.tsx +++ b/src/components/admin/coach-feedback-section.tsx @@ -99,7 +99,7 @@ export function CoachFeedbackSection() { {query.isLoading ? (
- + {t("admin.coachFeedback.loading")} diff --git a/src/components/admin/danger-zone-section.tsx b/src/components/admin/danger-zone-section.tsx index 6d1cec635..fcb45722b 100644 --- a/src/components/admin/danger-zone-section.tsx +++ b/src/components/admin/danger-zone-section.tsx @@ -85,7 +85,7 @@ export function DangerZoneSection() { disabled={wipeAllData.isPending} > {wipeAllData.isPending ? ( - + ) : ( )} diff --git a/src/components/admin/feedback-inbox-section.tsx b/src/components/admin/feedback-inbox-section.tsx index c65ae1d3c..589808fa3 100644 --- a/src/components/admin/feedback-inbox-section.tsx +++ b/src/components/admin/feedback-inbox-section.tsx @@ -104,7 +104,7 @@ export function FeedbackInboxSection() { {isLoading ? (
- + {t("admin.feedback.loading")} @@ -435,7 +435,7 @@ function FeedbackDetailDialog({ onClick={() => update.mutate({ adminNote: note || null })} > {update.isPending && ( - + )} {t("admin.feedback.saveNote")} @@ -497,7 +497,7 @@ function FeedbackDetailDialog({ className="ml-auto" > {publish.isPending ? ( - + ) : ( )} diff --git a/src/components/admin/glitchtip-section.tsx b/src/components/admin/glitchtip-section.tsx index 50f7c234e..44944de3e 100644 --- a/src/components/admin/glitchtip-section.tsx +++ b/src/components/admin/glitchtip-section.tsx @@ -148,7 +148,7 @@ export function GlitchtipSection() { disabled={testGlitchtip.isPending || updateSettings.isPending} > {testGlitchtip.isPending && ( - + )} {t("common.test")} @@ -158,7 +158,7 @@ export function GlitchtipSection() { disabled={updateSettings.isPending} > {updateSettings.isPending && ( - + )} {t("common.save")} diff --git a/src/components/admin/login-overview-section.tsx b/src/components/admin/login-overview-section.tsx index d0e193263..22266f65c 100644 --- a/src/components/admin/login-overview-section.tsx +++ b/src/components/admin/login-overview-section.tsx @@ -340,7 +340,7 @@ export function LoginOverviewSection() { {isLoading ? (
- +
) : !entries.length ? (