feat: add period tracker with calendar, predictions, fertility tracking, and sharing

Full period tracking system for the fitness measure page:
- Period logging with start/end dates, edit/delete support
- EMA-based cycle and period length predictions (α=0.3, 12 future cycles)
- Calendar view with connected range strips, overflow days, today marker
- Fertility window, peak fertility, ovulation, and luteal phase visualization
- Period sharing between users with profile picture avatars
- Cycle/period stats with 95% CI below calendar
- Redesigned profile card as inline header metadata with Venus/Mars icons
- Collapsible weight and period history sections
- Full DE/EN i18n support
This commit is contained in:
2026-04-06 15:12:02 +02:00
parent add05f0fad
commit f4e0617fc7
14 changed files with 2028 additions and 87 deletions
File diff suppressed because it is too large Load Diff
+32
View File
@@ -298,6 +298,38 @@ const translations: Translations = {
log_food: { en: 'Log', de: 'Eintragen' },
delete_entry_confirm: { en: 'Delete this food entry?', de: 'Diesen Eintrag löschen?' },
// Period tracker
period_tracker: { en: 'Period Tracker', de: 'Periodentracker' },
current_period: { en: 'Current Period', de: 'Aktuelle Periode' },
no_period_data: { en: 'No period data yet. Log your first period to start tracking.', de: 'Noch keine Periodendaten. Erfasse deine erste Periode.' },
start_period: { en: 'Start Period', de: 'Periode starten' },
end_period: { en: 'End Period', de: 'Periode beenden' },
period_day: { en: 'Day', de: 'Tag' },
predicted_end: { en: 'Predicted end', de: 'Voraussichtliches Ende' },
next_period: { en: 'Next period', de: 'Nächste Periode' },
cycle_length: { en: 'Cycle length', de: 'Zykluslänge' },
period_length: { en: 'Period length', de: 'Periodenlänge' },
avg_cycle: { en: 'Avg. cycle', de: 'Ø Zyklus' },
avg_period: { en: 'Avg. period', de: 'Ø Periode' },
days: { en: 'days', de: 'Tage' },
delete_period_confirm: { en: 'Delete this period entry?', de: 'Diesen Periodeneintrag löschen?' },
add_past_period: { en: 'Add Past Period', de: 'Vergangene Periode hinzufügen' },
period_start: { en: 'Start', de: 'Beginn' },
period_end: { en: 'End', de: 'Ende' },
ongoing: { en: 'ongoing', de: 'laufend' },
share: { en: 'Share', de: 'Teilen' },
shared_with: { en: 'Shared with', de: 'Geteilt mit' },
add_user: { en: 'Add user…', de: 'Nutzer hinzufügen…' },
no_shared: { en: 'Not shared with anyone.', de: 'Mit niemandem geteilt.' },
shared_by: { en: 'Shared by', de: 'Geteilt von' },
fertile_window: { en: 'Fertile window', de: 'Fruchtbares Fenster' },
peak_fertility: { en: 'Peak fertility', de: 'Höchste Fruchtbarkeit' },
ovulation: { en: 'Ovulation', de: 'Eisprung' },
fertile: { en: 'Fertile', de: 'Fruchtbar' },
luteal_phase: { en: 'Luteal', de: 'Luteal' },
predicted_ovulation: { en: 'Predicted ovulation', de: 'Voraussichtlicher Eisprung' },
to: { en: 'to', de: 'bis' },
// Custom meals
custom_meals: { en: 'Custom Meals', de: 'Eigene Mahlzeiten' },
custom_meal: { en: 'Custom Meal', de: 'Eigene Mahlzeit' },