diff --git a/messages/de.json b/messages/de.json index d33c982f9..56424d29e 100644 --- a/messages/de.json +++ b/messages/de.json @@ -215,7 +215,7 @@ "medication": "Medikament", "medicationDescription": "Eine Dosis als genommen markieren", "mood": "Stimmung", - "moodDescription": "Wie geht es dir?" + "moodDescription": "Stimmung und Tags erfassen" } }, "auth": { diff --git a/messages/en.json b/messages/en.json index c25d5bbdc..15d380056 100644 --- a/messages/en.json +++ b/messages/en.json @@ -215,7 +215,7 @@ "medication": "Medication", "medicationDescription": "Mark a dose as taken", "mood": "Mood", - "moodDescription": "How are you feeling?" + "moodDescription": "Log your mood and tags" } }, "auth": { diff --git a/messages/es.json b/messages/es.json index ff88480e4..1949ec493 100644 --- a/messages/es.json +++ b/messages/es.json @@ -215,7 +215,7 @@ "medication": "Medicamento", "medicationDescription": "Marcar una dosis como tomada", "mood": "Estado de ánimo", - "moodDescription": "¿Cómo te sientes?" + "moodDescription": "Registrar estado de ánimo y etiquetas" } }, "auth": { diff --git a/messages/fr.json b/messages/fr.json index 1bd7ac9f3..b9d7892d7 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -215,7 +215,7 @@ "medication": "Médicament", "medicationDescription": "Marquer une dose comme prise", "mood": "Humeur", - "moodDescription": "Comment vous sentez-vous ?" + "moodDescription": "Enregistrer l'humeur et les tags" } }, "auth": { diff --git a/messages/it.json b/messages/it.json index 7db624f22..ec384b607 100644 --- a/messages/it.json +++ b/messages/it.json @@ -215,7 +215,7 @@ "medication": "Farmaco", "medicationDescription": "Segna una dose come assunta", "mood": "Umore", - "moodDescription": "Come ti senti?" + "moodDescription": "Registra umore e tag" } }, "auth": { diff --git a/messages/pl.json b/messages/pl.json index c86de40e0..b0e1982b5 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -215,7 +215,7 @@ "medication": "Lek", "medicationDescription": "Oznacz dawkę jako przyjętą", "mood": "Nastrój", - "moodDescription": "Jak się czujesz?" + "moodDescription": "Zapisz nastrój i tagi" } }, "auth": { diff --git a/src/components/layout/__tests__/bottom-nav.test.tsx b/src/components/layout/__tests__/bottom-nav.test.tsx index 3889f6f11..1f64665c2 100644 --- a/src/components/layout/__tests__/bottom-nav.test.tsx +++ b/src/components/layout/__tests__/bottom-nav.test.tsx @@ -75,11 +75,24 @@ describe(" iOS-parity layout", () => { it("each strip entry meets the 44 px tap-target floor (min-h-11 min-w-11)", () => { const html = render(); - // Five flanking strip slots (Home, Meds, capture button, Insights, - // More) all carry `min-h-11 min-w-11`. We don't hard-pin the count - // because a future entry would also satisfy the contract. + // The four flanking strip slots (Home, Meds, Insights, More) carry + // `min-h-11 min-w-11`. We don't hard-pin the count because a future + // entry would also satisfy the contract. const matches = html.match(/min-h-11 min-w-11/g) ?? []; - expect(matches.length).toBeGreaterThanOrEqual(5); + expect(matches.length).toBeGreaterThanOrEqual(4); + }); + + it("the center capture FAB is a larger, elevated tap target", () => { + const html = render(); + // The FAB clears the 44px floor with a 56px (h-14 w-14) target and + // is lifted out of the bar (negative top margin + card ring + raised + // shadow) so it reads as the primary CTA, not a flush fifth tab. + const capture = html.match(/]*bottom-nav-capture[^>]*>/); + expect(capture).not.toBeNull(); + expect(capture![0]).toMatch(/h-14 w-14/); + expect(capture![0]).toMatch(/-mt-5/); + expect(capture![0]).toMatch(/ring-4/); + expect(capture![0]).toMatch(/shadow-lg/); }); it("no longer lists the deprecated /targets entry (v1.8.6)", () => { diff --git a/src/components/layout/bottom-nav.tsx b/src/components/layout/bottom-nav.tsx index a90d9637a..415ac897f 100644 --- a/src/components/layout/bottom-nav.tsx +++ b/src/components/layout/bottom-nav.tsx @@ -128,8 +128,13 @@ export function BottomNav() { {PRIMARY_LEFT.map(renderPrimary)} {/* Center capture action — a labeled button (NOT a link) that - opens the capture picker. Visually elevated so it reads as - the primary CTA. */} + opens the capture picker. Elevated as a Floating-Action- + Button: it sits larger than the flanking tabs (h-14 = 56px, + well above the 44px tap-target floor), lifts above the bar + with a negative top margin, and carries a filled-primary + collar (a `bg-card` ring that punches it out of the bar) plus + a stronger shadow so it reads as the bar's primary CTA rather + than a fifth flush tab. */}
@@ -193,8 +198,11 @@ export function BottomNav() { href={item.href} onClick={() => setMoreOpen(false)} aria-current={isActive ? "page" : undefined} + // v1.12 — `min-h-14` matches the capture-picker tiles so + // the equivalent tappable rows share one height at this + // tier (and the larger row is a more comfortable target). className={cn( - "border-border flex min-h-11 items-center gap-3 rounded-lg border px-4 py-3 transition-colors", + "border-border flex min-h-14 items-center gap-3 rounded-lg border px-4 py-3 transition-colors", isActive ? "text-primary bg-primary/5" : "text-foreground hover:bg-accent/40", diff --git a/src/components/mood/mood-form.tsx b/src/components/mood/mood-form.tsx index 44ca476e1..ed63cf8f2 100644 --- a/src/components/mood/mood-form.tsx +++ b/src/components/mood/mood-form.tsx @@ -275,7 +275,14 @@ export function MoodForm({ onSuccess, onCancel, footerSlot }: MoodFormProps) { radiogroup (best-on-the-left order); tapping one picks the mood and reveals the annotate panel below. */}
-