refactor(settings): unify card headers, integration verbs, test buttons, and tap targets

Holistic consistency pass over the settings and integration surfaces so the
same concept reads and behaves the same way everywhere.

- Card headers: migrate the four integration cards (Withings, WHOOP,
  Fitbit/Google Health, Mood Log) plus the profile, passkeys, avatar, about,
  api-endpoints, api-tokens, and sharing cards onto the shared
  SettingsCardHeader primitive. Extend the primitive with an inline title
  accessory slot (Fitbit tag + experimental badge) and a multi-line
  description slot (overlap / experimental / deprecation sub-notes), keeping
  the rendered result identical.
- Integration verbs: normalise Mood Log onto the canonical "Sync now" /
  "Sync all data" / "Synchronize" set used by the other integrations, across
  all six locales. Swap the full-sync icon from Download to RefreshCw and
  align its action-row icon metrics with the sibling cards.
- Test buttons: migrate Telegram and ntfy off their hand-rolled "Test
  message" buttons onto the shared TestConnectionButton, so every channel and
  integration test control shares one icon, label, latency readout, and error
  taxonomy. Retire the now-unused testMessage / testSent strings.
- ntfy auth-token placeholder no longer reuses the "Saved" status string;
  it now reads "Saved — enter new to replace" like the other secret fields.
- Save-success copy: collapse the moodLog and Telegram bespoke strings onto
  the shared settings.saved string.
- Tap targets: floor every size="sm" action-row button (sync / full-sync /
  test / disconnect / save / connect-secret copy) at min-h-11, fixed at the
  TestConnectionButton source and across the cards, so they clear the 44px
  touch minimum.
- Contrast: the onboarding source-card badge moves from muted-on-muted to
  text-foreground; web-push card body rhythm aligns on space-y-4; Mood Log's
  deprecation note drops its bespoke 11px-italic treatment for the shared
  sub-note style.

(cherry picked from commit 11931d14b7875b7e2184a3b373d7a34b842f8eae)
This commit is contained in:
Marc-André Bombeck committed 2026-06-05 03:45:04 +02:00
1 parent b64f48bce3
commit 3ce0b69802
17 files changed
+248 -279

No files matched your search

+3 -7
View File
@@ -3327,12 +3327,9 @@
"backedUp": "gesichert",
"telegram": "Telegram",
"telegramDescription": "Medikamenten-Erinnerungen per Bot.",
"telegramSaved": "Telegram-Einstellungen gespeichert",
"botToken": "Bot-Token",
"chatId": "Chat-ID",
"enableNotifications": "Benachrichtigungen aktivieren",
"testMessage": "Test-Nachricht",
"testSent": "Test-Nachricht gesendet!",
"telegramStep1": "1. Erstelle einen Bot über @BotFather in Telegram und kopiere den Token.",
"telegramStep2": "2. Sende /start an deinen Bot, um den Chat zu aktivieren.",
"telegramStep3": "3. Finde deine Chat-ID über @userinfobot oder die Bot-API.",
@@ -3663,9 +3660,9 @@
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Webhook-Secret",
"moodLogWebhookSecretHelp": "Dieses Secret in moodLog als Webhook-Secret eintragen",
"moodLogSync": "Sync starten",
"moodLogFullSync": "Voll-Sync",
"moodLogFullSyncConfirm": "Vollständig synchronisieren",
"moodLogSync": "Jetzt synchronisieren",
"moodLogFullSync": "Alle Daten synchronisieren",
"moodLogFullSyncConfirm": "Synchronisieren",
"moodLogFullSyncTitle": "Vollsynchronisierung?",
"moodLogFullSyncDescription": "Alle verfügbaren Stimmungsdaten werden vollständig synchronisiert.",
"moodLogDisconnect": "Trennen",
@@ -3674,7 +3671,6 @@
"moodLogEntries": "Einträge",
"moodLogSyncResult": "{count} Einträge synchronisiert",
"moodLogSyncFailed": "Sync fehlgeschlagen",
"moodLogSaved": "moodLog-Verbindung gespeichert",
"moodLogDisconnected": "moodLog getrennt",
"about": {
"version": "App-Version",
+3 -7
View File
@@ -3327,12 +3327,9 @@
"backedUp": "backed up",
"telegram": "Telegram",
"telegramDescription": "Medication reminders via bot.",
"telegramSaved": "Telegram settings saved",
"botToken": "Bot Token",
"chatId": "Chat ID",
"enableNotifications": "Enable notifications",
"testMessage": "Test message",
"testSent": "Test message sent!",
"telegramStep1": "1. Create a bot via @BotFather in Telegram and copy the token.",
"telegramStep2": "2. Send /start to your bot to activate the chat.",
"telegramStep3": "3. Find your Chat ID via @userinfobot or the Bot API.",
@@ -3663,9 +3660,9 @@
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Webhook Secret",
"moodLogWebhookSecretHelp": "Enter this secret in moodLog as webhook secret",
"moodLogSync": "Start sync",
"moodLogFullSync": "Full sync",
"moodLogFullSyncConfirm": "Synchronize fully",
"moodLogSync": "Sync now",
"moodLogFullSync": "Sync all data",
"moodLogFullSyncConfirm": "Synchronize",
"moodLogFullSyncTitle": "Full sync?",
"moodLogFullSyncDescription": "All available mood data will be fully synchronized.",
"moodLogDisconnect": "Disconnect",
@@ -3674,7 +3671,6 @@
"moodLogEntries": "Entries",
"moodLogSyncResult": "{count} entries synchronized",
"moodLogSyncFailed": "Sync failed",
"moodLogSaved": "moodLog connection saved",
"moodLogDisconnected": "moodLog disconnected",
"about": {
"version": "App version",
+3 -7
View File
@@ -3327,12 +3327,9 @@
"backedUp": "con copia de seguridad",
"telegram": "Telegram Notifications",
"telegramDescription": "Get reminders for missed medication intake via Telegram.",
"telegramSaved": "Ajustes de Telegram guardados",
"botToken": "Token del bot",
"chatId": "ID del chat",
"enableNotifications": "Activar notificaciones",
"testMessage": "Mensaje de prueba",
"testSent": "¡Mensaje de prueba enviado!",
"telegramStep1": "1. Crea un bot con @BotFather en Telegram y copia el token.",
"telegramStep2": "2. Envía /start a tu bot para activar el chat.",
"telegramStep3": "3. Obtén tu ID del chat con @userinfobot o la API del bot.",
@@ -3663,9 +3660,9 @@
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Secreto del webhook",
"moodLogWebhookSecretHelp": "Introduce este secreto en moodLog como secreto del webhook",
"moodLogSync": "Iniciar sincronización",
"moodLogFullSync": "Sincronización completa",
"moodLogFullSyncConfirm": "Sincronizar por completo",
"moodLogSync": "Sincronizar ahora",
"moodLogFullSync": "Sincronizar todos los datos",
"moodLogFullSyncConfirm": "Sincronizar",
"moodLogFullSyncTitle": "¿Sincronización completa?",
"moodLogFullSyncDescription": "Se sincronizarán por completo todos los datos de estado de ánimo disponibles.",
"moodLogDisconnect": "Desconectar",
@@ -3674,7 +3671,6 @@
"moodLogEntries": "Entradas",
"moodLogSyncResult": "{count} entradas sincronizadas",
"moodLogSyncFailed": "Falló la sincronización",
"moodLogSaved": "Conexión con moodLog guardada",
"moodLogDisconnected": "moodLog desconectado",
"about": {
"version": "Versión de la app",
+3 -7
View File
@@ -3327,12 +3327,9 @@
"backedUp": "sauvegardée",
"telegram": "Telegram Notifications",
"telegramDescription": "Get reminders for missed medication intake via Telegram.",
"telegramSaved": "Réglages Telegram enregistrés",
"botToken": "Jeton du bot",
"chatId": "ID du chat",
"enableNotifications": "Activer les notifications",
"testMessage": "Message de test",
"testSent": "Message de test envoyé !",
"telegramStep1": "1. Créez un bot via @BotFather dans Telegram et copiez le jeton.",
"telegramStep2": "2. Envoyez /start à votre bot pour activer le chat.",
"telegramStep3": "3. Trouvez votre ID de chat via @userinfobot ou l’API du bot.",
@@ -3663,9 +3660,9 @@
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Secret du webhook",
"moodLogWebhookSecretHelp": "Saisissez ce secret dans moodLog comme secret de webhook",
"moodLogSync": "Démarrer la synchronisation",
"moodLogFullSync": "Synchronisation complète",
"moodLogFullSyncConfirm": "Synchroniser entièrement",
"moodLogSync": "Synchroniser maintenant",
"moodLogFullSync": "Synchroniser toutes les données",
"moodLogFullSyncConfirm": "Synchroniser",
"moodLogFullSyncTitle": "Synchronisation complète ?",
"moodLogFullSyncDescription": "Toutes les données d’humeur disponibles seront entièrement synchronisées.",
"moodLogDisconnect": "Déconnecter",
@@ -3674,7 +3671,6 @@
"moodLogEntries": "Entrées",
"moodLogSyncResult": "{count} entrées synchronisées",
"moodLogSyncFailed": "Échec de la synchronisation",
"moodLogSaved": "Connexion moodLog enregistrée",
"moodLogDisconnected": "moodLog déconnecté",
"about": {
"version": "Version de l’app",
+3 -7
View File
@@ -3327,12 +3327,9 @@
"backedUp": "con backup",
"telegram": "Telegram Notifications",
"telegramDescription": "Get reminders for missed medication intake via Telegram.",
"telegramSaved": "Impostazioni Telegram salvate",
"botToken": "Token del bot",
"chatId": "ID chat",
"enableNotifications": "Attiva le notifiche",
"testMessage": "Messaggio di prova",
"testSent": "Messaggio di prova inviato!",
"telegramStep1": "1. Crea un bot tramite @BotFather su Telegram e copia il token.",
"telegramStep2": "2. Invia /start al tuo bot per attivare la chat.",
"telegramStep3": "3. Trova il tuo ID chat tramite @userinfobot o l’API del bot.",
@@ -3663,9 +3660,9 @@
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Secret del webhook",
"moodLogWebhookSecretHelp": "Inserisci questo secret in moodLog come secret del webhook",
"moodLogSync": "Avvia sincronizzazione",
"moodLogFullSync": "Sincronizzazione completa",
"moodLogFullSyncConfirm": "Sincronizza completamente",
"moodLogSync": "Sincronizza ora",
"moodLogFullSync": "Sincronizza tutti i dati",
"moodLogFullSyncConfirm": "Sincronizza",
"moodLogFullSyncTitle": "Sincronizzazione completa?",
"moodLogFullSyncDescription": "Tutti i dati sull’umore disponibili verranno sincronizzati completamente.",
"moodLogDisconnect": "Disconnetti",
@@ -3674,7 +3671,6 @@
"moodLogEntries": "Voci",
"moodLogSyncResult": "{count} voci sincronizzate",
"moodLogSyncFailed": "Sincronizzazione non riuscita",
"moodLogSaved": "Connessione moodLog salvata",
"moodLogDisconnected": "moodLog disconnesso",
"about": {
"version": "Versione dell’app",
+3 -7
View File
@@ -3327,12 +3327,9 @@
"backedUp": "z kopią zapasową",
"telegram": "Telegram Notifications",
"telegramDescription": "Get reminders for missed medication intake via Telegram.",
"telegramSaved": "Ustawienia Telegrama zapisane",
"botToken": "Token bota",
"chatId": "ID czatu",
"enableNotifications": "Włącz powiadomienia",
"testMessage": "Wiadomość testowa",
"testSent": "Wiadomość testowa wysłana!",
"telegramStep1": "1. Utwórz bota przez @BotFather w Telegramie i skopiuj token.",
"telegramStep2": "2. Wyślij /start do swojego bota, aby aktywować czat.",
"telegramStep3": "3. Znajdź swoje ID czatu przez @userinfobot lub API bota.",
@@ -3663,9 +3660,9 @@
"moodLogApiKeyPlaceholder": "ml_...",
"moodLogWebhookSecret": "Sekret webhooka",
"moodLogWebhookSecretHelp": "Wprowadź ten sekret w moodLog jako sekret webhooka",
"moodLogSync": "Rozpocznij synchronizację",
"moodLogFullSync": "Pełna synchronizacja",
"moodLogFullSyncConfirm": "Synchronizuj w pełni",
"moodLogSync": "Synchronizuj teraz",
"moodLogFullSync": "Synchronizuj wszystkie dane",
"moodLogFullSyncConfirm": "Synchronizuj",
"moodLogFullSyncTitle": "Pełna synchronizacja?",
"moodLogFullSyncDescription": "Wszystkie dostępne dane o nastroju zostaną w pełni zsynchronizowane.",
"moodLogDisconnect": "Rozłącz",
@@ -3674,7 +3671,6 @@
"moodLogEntries": "Wpisy",
"moodLogSyncResult": "{count} wpisów zsynchronizowano",
"moodLogSyncFailed": "Synchronizacja nie powiodła się",
"moodLogSaved": "Połączenie moodLog zapisane",
"moodLogDisconnected": "moodLog rozłączony",
"about": {
"version": "Wersja aplikacji",