From 6f45d72a8469f200de963c927471b2df17f95328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Wed, 10 Jun 2026 12:56:06 +0200 Subject: [PATCH] fix(ui): unclip the score-ring glow, reachable insight pills, consistent destructive actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The score ring's bloom was clipped by the SVG's own viewport — the drop-shadow sits on a child of the viewBox-filling arc — so the glow never extended past the circle; the SVG now overflows visibly on every host. The insight pill strip gains chevron buttons and wheel scrolling so an overflowing row is reachable with a mouse. Safari favourites rendered the transparent icon on a white plate; a flattened apple-touch-icon and a maskable manifest icon fix both. The time-of-day mood chart adopts the damped fill the weekday chart already uses, eighteen delete confirmations move onto the destructive button variant (one of them had the wrong text colour), five confirmation dialogs gain pending states, the sources dialog stacks its primary action on top on mobile, and the token form aligns input and button heights. --- messages/de.json | 4 +- messages/en.json | 2 + messages/es.json | 2 + messages/fr.json | 2 + messages/it.json | 2 + messages/pl.json | 2 + public/apple-touch-icon.png | Bin 0 -> 14474 bytes public/logo-maskable-512.png | Bin 0 -> 27376 bytes public/manifest.json | 12 +- src/app/layout.tsx | 5 +- src/components/admin/backups-section.tsx | 2 +- src/components/admin/danger-zone-section.tsx | 7 +- .../admin/feedback-inbox-section.tsx | 7 +- .../admin/user-management-section.tsx | 4 +- src/components/data-list/delete-button.tsx | 2 +- .../data-list/selection-action-bar.tsx | 2 +- .../insights/derived/score-ring.tsx | 10 +- .../insights/insights-tab-strip.tsx | 114 +++++++++++++++++- .../insights/mood/mood-time-of-day-chart.tsx | 19 +-- .../measurements/measurement-list.tsx | 2 +- src/components/mood/mood-form.tsx | 2 +- src/components/mood/mood-list.tsx | 2 +- src/components/settings/account-section.tsx | 14 ++- src/components/settings/advanced-section.tsx | 4 +- src/components/settings/api-section.tsx | 19 +-- .../settings/coach-memory-section.tsx | 11 +- .../settings/integrations-section.tsx | 6 +- src/components/settings/sources-section.tsx | 12 +- 28 files changed, 221 insertions(+), 49 deletions(-) create mode 100644 public/apple-touch-icon.png create mode 100644 public/logo-maskable-512.png diff --git a/messages/de.json b/messages/de.json index 430d15ebc..4026a4aa4 100644 --- a/messages/de.json +++ b/messages/de.json @@ -834,7 +834,7 @@ "title": "Medikament beschreiben", "description": "Beschreibe das Medikament in eigenen Worten — das Formular wird automatisch vorausgefüllt.", "placeholder": "z. B. Mounjaro 5 mg wöchentlich am Mittwochmorgen ab nächstem Montag", - "submit": "Übernehmen", + "submit": "Extrahieren", "submitBusy": "Wird verarbeitet …", "cancel": "Abbrechen", "examples": { @@ -2099,6 +2099,8 @@ "navSteps": "Schritte", "navActiveEnergy": "Aktive Energie", "navAriaLabel": "Zu Abschnitt springen", + "pillScrollLeft": "Tabs nach links scrollen", + "pillScrollRight": "Tabs nach rechts scrollen", "tabStrip": { "vitalsParent": { "label": "Vitalwerte", diff --git a/messages/en.json b/messages/en.json index aac9080a9..ac85b895c 100644 --- a/messages/en.json +++ b/messages/en.json @@ -2099,6 +2099,8 @@ "navSteps": "Steps", "navActiveEnergy": "Active energy", "navAriaLabel": "Skip to section", + "pillScrollLeft": "Scroll tabs left", + "pillScrollRight": "Scroll tabs right", "tabStrip": { "vitalsParent": { "label": "Vitals", diff --git a/messages/es.json b/messages/es.json index b37cd76c0..07da460d5 100644 --- a/messages/es.json +++ b/messages/es.json @@ -2099,6 +2099,8 @@ "navSteps": "Pasos", "navActiveEnergy": "Energía activa", "navAriaLabel": "Saltar a sección", + "pillScrollLeft": "Desplazar las pestañas a la izquierda", + "pillScrollRight": "Desplazar las pestañas a la derecha", "tabStrip": { "vitalsParent": { "label": "Vitales", diff --git a/messages/fr.json b/messages/fr.json index 3399e0725..d6020b9c1 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -2099,6 +2099,8 @@ "navSteps": "Pas", "navActiveEnergy": "Énergie active", "navAriaLabel": "Aller à la section", + "pillScrollLeft": "Faire défiler les onglets vers la gauche", + "pillScrollRight": "Faire défiler les onglets vers la droite", "tabStrip": { "vitalsParent": { "label": "Constantes", diff --git a/messages/it.json b/messages/it.json index b56733170..72394ccb9 100644 --- a/messages/it.json +++ b/messages/it.json @@ -2099,6 +2099,8 @@ "navSteps": "Passi", "navActiveEnergy": "Energia attiva", "navAriaLabel": "Vai alla sezione", + "pillScrollLeft": "Scorri le schede a sinistra", + "pillScrollRight": "Scorri le schede a destra", "tabStrip": { "vitalsParent": { "label": "Vitali", diff --git a/messages/pl.json b/messages/pl.json index 71c5b8d23..632887aa3 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -2099,6 +2099,8 @@ "navSteps": "Kroki", "navActiveEnergy": "Energia czynna", "navAriaLabel": "Przejdź do sekcji", + "pillScrollLeft": "Przewiń karty w lewo", + "pillScrollRight": "Przewiń karty w prawo", "tabStrip": { "vitalsParent": { "label": "Witalne", diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b71aacf83e10c04469d31871daec1c76a755ab6f GIT binary patch literal 14474 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 literal 0 HcmV?d00001 diff --git a/public/manifest.json b/public/manifest.json index 8c3882279..d351c6fbb 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -13,12 +13,20 @@ { "src": "/logo-192.png", "sizes": "192x192", - "type": "image/png" + "type": "image/png", + "purpose": "any" }, { "src": "/logo-512.png", "sizes": "512x512", - "type": "image/png" + "type": "image/png", + "purpose": "any" + }, + { + "src": "/logo-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" } ] } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 422457f1e..32757cd95 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -39,7 +39,10 @@ export const metadata: Metadata = { manifest: "/manifest.json", icons: { icon: "/favicon.svg", - apple: "/logo-192.png", + // Pre-flattened 180×180 on the app background — Safari ignores PNG + // alpha in favourites/home-screen tiles and would render the + // transparent logo on a white slab otherwise. + apple: "/apple-touch-icon.png", }, appleWebApp: { capable: true, diff --git a/src/components/admin/backups-section.tsx b/src/components/admin/backups-section.tsx index 9c82204e9..d60abcf4e 100644 --- a/src/components/admin/backups-section.tsx +++ b/src/components/admin/backups-section.tsx @@ -127,7 +127,7 @@ function RestoreRowDialog({ {t("common.cancel")} { if (!matched) return; setOpen(false); diff --git a/src/components/admin/danger-zone-section.tsx b/src/components/admin/danger-zone-section.tsx index fcb45722b..4f42d3047 100644 --- a/src/components/admin/danger-zone-section.tsx +++ b/src/components/admin/danger-zone-section.tsx @@ -104,9 +104,14 @@ export function DangerZoneSection() { {t("common.cancel")} wipeAllData.mutate()} > + {wipeAllData.isPending && ( + + )} {t("admin.finalDelete")} diff --git a/src/components/admin/feedback-inbox-section.tsx b/src/components/admin/feedback-inbox-section.tsx index ebf92acf3..31180ed6c 100644 --- a/src/components/admin/feedback-inbox-section.tsx +++ b/src/components/admin/feedback-inbox-section.tsx @@ -398,8 +398,13 @@ function FeedbackDetailDialog({ {t("common.cancel")} archive.mutate()} - className="bg-destructive text-destructive-foreground hover:bg-destructive/90" + variant="destructive" + disabled={archive.isPending} + aria-busy={archive.isPending || undefined} > + {archive.isPending && ( + + )} {t("admin.feedback.actionArchive")} diff --git a/src/components/admin/user-management-section.tsx b/src/components/admin/user-management-section.tsx index cc4f33dd9..38fa8a431 100644 --- a/src/components/admin/user-management-section.tsx +++ b/src/components/admin/user-management-section.tsx @@ -560,7 +560,9 @@ export function UserManagementSection() { forceLogout.mutate({ id: logoutTarget.id }); } }} - className="bg-destructive hover:bg-destructive/90" + variant="destructive" + disabled={forceLogout.isPending} + aria-busy={forceLogout.isPending || undefined} > {forceLogout.isPending ? ( diff --git a/src/components/data-list/delete-button.tsx b/src/components/data-list/delete-button.tsx index dd53016e3..3252d381e 100644 --- a/src/components/data-list/delete-button.tsx +++ b/src/components/data-list/delete-button.tsx @@ -64,7 +64,7 @@ export function DeleteButton({ {cancelLabel ?? t("common.cancel")} {confirmLabel ?? t("common.delete")} diff --git a/src/components/data-list/selection-action-bar.tsx b/src/components/data-list/selection-action-bar.tsx index f7a48ea36..02cb5c5c9 100644 --- a/src/components/data-list/selection-action-bar.tsx +++ b/src/components/data-list/selection-action-bar.tsx @@ -105,7 +105,7 @@ export function SelectionActionBar({ {t("common.cancel")} diff --git a/src/components/insights/derived/score-ring.tsx b/src/components/insights/derived/score-ring.tsx index 7cbd46b4a..83fa5f717 100644 --- a/src/components/insights/derived/score-ring.tsx +++ b/src/components/insights/derived/score-ring.tsx @@ -122,8 +122,7 @@ export function ScoreRing({ const shouldAnimate = animate && hasScore && !reduced; const dash = (clamped / 100) * C; - const hasBaseline = - baseline != null && Number.isFinite(baseline) && hasScore; + const hasBaseline = baseline != null && Number.isFinite(baseline) && hasScore; const baselineDash = hasBaseline ? (clampScore(baseline) / 100) * C : 0; // Arc starts empty (offset C) and sweeps to its fill on the next frame after @@ -170,9 +169,14 @@ export function ScoreRing({ } as React.CSSProperties } > + {/* `overflow-visible`: the arc's drop-shadow bloom (`.wellness-ring-arc`) + paints outside the viewBox — the arc fills the 0 0 100 100 box, so the + default `overflow: hidden` on SVG clipped the glow flat at the circle's + edge. The -90° rotation is unaffected (the bloom is radially symmetric) + and the parent div never clips, so the glow now feathers out fully. */}
-
+ {pillsOverflow && ( + + )} +
{tabs.map((tab) => { if (tab.kind === "link") { // The overview pill matches the mother page exactly; the @@ -631,6 +720,23 @@ function InsightsTabStripImpl({ ); })}
+ {pillsOverflow && ( + + )} {/* v1.4.27 MB7 / CF-72 — right-edge fade. The gradient absolute-positions over the rightmost ~24 px of the strip so the last visible pill softly fades into the background diff --git a/src/components/insights/mood/mood-time-of-day-chart.tsx b/src/components/insights/mood/mood-time-of-day-chart.tsx index 7c2d43d19..e1e8f61bc 100644 --- a/src/components/insights/mood/mood-time-of-day-chart.tsx +++ b/src/components/insights/mood/mood-time-of-day-chart.tsx @@ -25,11 +25,7 @@ import { useTranslations } from "@/lib/i18n/context"; * a muted zero-height bar so the four-column rhythm stays intact. */ -export type MoodTimeOfDayBucket = - | "morning" - | "afternoon" - | "evening" - | "night"; +export type MoodTimeOfDayBucket = "morning" | "afternoon" | "evening" | "night"; export interface MoodTimeOfDayRow { bucket: MoodTimeOfDayBucket; @@ -88,23 +84,28 @@ export function MoodTimeOfDayChart({ data={data} margin={{ top: 8, right: 12, bottom: 8, left: 0 }} > + {/* Muted chart language — same treatment as the weekday/distribution + siblings: `--muted-foreground` axis ticks, a quiet comment-grey + target guide, and 0.55 bar fill so the level hues inform without + shouting. */} - + {data.map((row) => ( diff --git a/src/components/mood/mood-form.tsx b/src/components/mood/mood-form.tsx index ed63cf8f2..e964e3cf1 100644 --- a/src/components/mood/mood-form.tsx +++ b/src/components/mood/mood-form.tsx @@ -498,7 +498,7 @@ export function MoodForm({ onSuccess, onCancel, footerSlot }: MoodFormProps) { {t("common.cancel")} {t("mood.formResetConfirmAction")} diff --git a/src/components/mood/mood-list.tsx b/src/components/mood/mood-list.tsx index cfcb170cd..d62a6e97b 100644 --- a/src/components/mood/mood-list.tsx +++ b/src/components/mood/mood-list.tsx @@ -1018,7 +1018,7 @@ export function MoodList({ onAddFirst }: MoodListProps = {}) { {t("common.cancel")} diff --git a/src/components/settings/account-section.tsx b/src/components/settings/account-section.tsx index 8e546b13d..117dfbc23 100644 --- a/src/components/settings/account-section.tsx +++ b/src/components/settings/account-section.tsx @@ -940,9 +940,14 @@ function PasskeyListSection({ isAuthenticated }: { isAuthenticated: boolean }) { {t("common.cancel")} deletePasskey.mutate(pk.id)} > + {deletePasskey.isPending && ( + + )} {t("common.delete")} @@ -1022,9 +1027,14 @@ function PasskeyListSection({ isAuthenticated }: { isAuthenticated: boolean }) { {t("common.cancel")} deletePasskey.mutate(pk.id)} > + {deletePasskey.isPending && ( + + )} {t("common.delete")} diff --git a/src/components/settings/advanced-section.tsx b/src/components/settings/advanced-section.tsx index e1802e895..8d7340cab 100644 --- a/src/components/settings/advanced-section.tsx +++ b/src/components/settings/advanced-section.tsx @@ -327,7 +327,7 @@ function DataResetCard() { {t("common.cancel")} { e.preventDefault(); void handleDeleteAllData(); @@ -471,7 +471,7 @@ function AccountDeleteCard() { {t("common.cancel")} { e.preventDefault(); void handleDeleteAccount(); diff --git a/src/components/settings/api-section.tsx b/src/components/settings/api-section.tsx index bc7f1835d..fad61ed8d 100644 --- a/src/components/settings/api-section.tsx +++ b/src/components/settings/api-section.tsx @@ -134,13 +134,13 @@ function ApiEndpointsCard() { {endpoint.path}
-

+

{t("settings.apiEndpointAuth")}

{endpoint.auth}
-

+

{t("settings.apiEndpointExample")}

@@ -263,7 +263,10 @@ function ApiTokensCard() { />
-
+ {/* The button mirrors the Input's responsive height (h-11 / sm:h-10) + so the row reads as one aligned control group instead of a tall + input next to a shorter `sm` button. */} + setNewName(e.target.value)} @@ -274,10 +277,12 @@ function ApiTokensCard() {
@@ -416,7 +421,7 @@ function ApiTokensCard() { {t("common.cancel")} handleRevoke(tok.id)} > {t("settings.tokenRevoked")} @@ -515,7 +520,7 @@ function ApiTokensCard() { {t("common.cancel")} handleRevoke(tok.id)} > {t("settings.tokenRevoked")} diff --git a/src/components/settings/coach-memory-section.tsx b/src/components/settings/coach-memory-section.tsx index dde6912bf..77fd4aad8 100644 --- a/src/components/settings/coach-memory-section.tsx +++ b/src/components/settings/coach-memory-section.tsx @@ -197,8 +197,13 @@ export function CoachMemorySection({ forgetAll.mutate()} > + {forgetAll.isPending && ( + + )} {t("settings.ai.coachMemory.forgetAllConfirmAction")} @@ -208,7 +213,11 @@ export function CoachMemorySection({
{query.isError && ( -

+

{t("settings.ai.coachMemory.loadError")}

)} diff --git a/src/components/settings/integrations-section.tsx b/src/components/settings/integrations-section.tsx index afdc9d224..91c9dcf03 100644 --- a/src/components/settings/integrations-section.tsx +++ b/src/components/settings/integrations-section.tsx @@ -622,7 +622,7 @@ function WithingsCard({ {t("common.cancel")} disconnect.mutate()} > {t("settings.withingsDisconnect")} @@ -1035,7 +1035,7 @@ function WhoopCard({ {t("common.cancel")} disconnect.mutate()} > {t("settings.whoopDisconnect")} @@ -1481,7 +1481,7 @@ function FitbitCard({ {t("common.cancel")} disconnect.mutate()} > {t("settings.fitbitDisconnect")} diff --git a/src/components/settings/sources-section.tsx b/src/components/settings/sources-section.tsx index 232162404..35ece6b40 100644 --- a/src/components/settings/sources-section.tsx +++ b/src/components/settings/sources-section.tsx @@ -387,7 +387,8 @@ export function SourcesSection() { className="h-11 w-11" onClick={() => moveSource(metric, index, 1)} disabled={ - index === list.length - 1 || saveMutation.isPending + index === list.length - 1 || + saveMutation.isPending } aria-label={t("settings.sections.sources.moveDown")} > @@ -536,9 +537,7 @@ export function SourcesSection() { variant="ghost" size="icon" className="h-11 w-11" - onClick={() => - moveDeviceType(null, index, -1) - } + onClick={() => moveDeviceType(null, index, -1)} disabled={index === 0 || saveMutation.isPending} aria-label={t("settings.sections.sources.moveUp")} > @@ -566,8 +565,11 @@ export function SourcesSection() {
)} + {/* `flex-col-reverse` mirrors the DialogFooter idiom: the primary + action stacks on top on mobile, row order stays Cancel → Save + on `sm+`. */} {dirty && priority && ( -
+