Commit Graph

47 Commits

Author SHA1 Message Date
sven 5f14649112 Fix #30: Fade-Timer für Treffen erst nach Rating-Survey starten
Treffen-Momente warten in pendingFadeAfterSurvey bis momentForRating
wieder auf nil wechselt (Survey abgeschlossen oder geskipped). Erst dann
startet der 5-s-Timer. Notizen und Vorhaben starten den Timer weiterhin
sofort. Eingeblendet werden alle neuen Logbuch-Momente bereits beim
Schließen des Sheets.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 12:31:09 +02:00
sven e365400537 Fix #30: Verlaufsansicht – neue Momente 5 s in Momente, dann in Verlauf
Neue Logbuch-Momente (vergangene Treffen, Notizen) erscheinen nach dem
Speichern 5 Sekunden mit 45 % Deckkraft in der Momente-Sektion und wandern
dann animiert in den Verlauf. Aktive Momente (offene Vorhaben, Zukunfts-
treffen) bleiben dauerhaft in der Momente-Sektion. Der Verlauf zeigt nur
noch abgeschlossene/vergangene Einträge.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 12:26:56 +02:00
sven 801095d9b9 Fix #34: Abo-Badges selbst-versteckend + IchView-Bereinigung
- ProBadge und MaxBadge verstecken sich intern via StoreManager (eiserne Regel: nie extern mit !isPro/!isMax wrappen)
- AddMomentView und TodayView: MaxBadge nicht mehr bei isMax anzeigen
- ThemePickerView: Inline-PRO-Text durch ProBadge() ersetzt
- IchView: Geschlecht aus Leseansicht entfernt, Picker im Bearbeitungsformular erhalten
- Geschlecht-Picker: Duplikat "Keine Angabe" entfernt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 12:20:05 +02:00
sven bf1b49697b Fix #22, #28, #31: Kontakt-Sektion, Nudge-Chip, KI-Analyse-Button
- #22: Dedizierte Kontakt-Sektion mit Telefon (Action Sheet) und E-Mail (mailto + Fallback-Alert mit Kopieren)
- #28: Nudge-Intervall-Chip im Header mit Farb-Dot, relativem Zeitstempel und direktem Menu zur Anpassung; NudgeStatus-Enum + Tests
- #31: KI-Analyse-Button im Kontakt-Header (oben rechts) mit MaxBadge; AIAnalysisSheet mit Auto-Start, Consent-Flow und allen Zuständen (idle/loading/result/error)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 12:07:04 +02:00
sven ec0dc68db9 Notifications: \"Vorhaben\" durch passende Begriffe ersetzen
- Todo-Erinnerungen (AddTodoView, PersonDetailView): Subtitle \"Dein Todo\"
- Moment-Erinnerungen (AddMomentView): Subtitle \"Geplanter Moment\"
- Localizable.xcstrings: \"Dein Vorhaben\" entfernt, neue Strings ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 21:02:29 +02:00
sven 86ddc10e7b Tests: TourTargetID, Step-Targets, Vorname-Extraktion, OnboardingStep-Fix
- Neu: TourTargetIDTests – allCases-Anzahl, rawValues, addMomentButton/addTodoButton
- Neu: TourStepTargetTests – Onboarding-Steps 3/4 targeten .addMomentButton/.addTodoButton
- Neu: GreetingFirstNameTests – Vorname-Extraktion aus Begrüßungslogik
- Fix: OnboardingStepQuizTests – an tatsächliche Enum-Cases angepasst (3 statt 5)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 20:56:48 +02:00
sven c647553eb7 Fix #26: Vorname im Gruß + Tour-Verbesserungen + UI-Feinschliff
- TodayView: Begrüßung zeigt Vornamen aus UserProfileStore
- TodayView: Leerer Zustand mit zwei CTA-Buttons (Moment / Todo)
- TodayView: Untertitel auf "Lass uns mit der Beziehungspflege starten." geändert
- Tour: Neue Schritte highlighten +Moment und +Todo in PersonDetailView
- Tour: PeopleListView navigiert automatisch zum ersten Kontakt beim Tour-Schritt
- Tour: App-Touren-Sektion in Einstellungen deaktiviert
- Schriftgrößen: Alle Überschriften um 2pt verkleinert (34→32, etc.)
- ContentView Preview: TourCoordinator-Environment ergänzt
- Lokalisierung: Neue Strings für Gruß, Leerzustand und Tour

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 20:50:00 +02:00
sven 1e75f357ba Fix #27: Onboarding-Tour im Haupt-Kontext + UI-Verbesserungen
- Tour-Spotlight-System: Overlay transparent, Hintergrund bleibt sichtbar
- Tour startet nach Splash-Screen im ContentView-Kontext (nicht mehr im fullScreenCover)
- Splash-Screen: UI-Präsentation (Onboarding, CallWindow-Setup) wartet auf Splash-Ende
- TodayView: Leerer Zustand mit zwei separaten CTAs (Moment erfassen / Todo hinzufügen)
- OnboardingCoordinator: 3 Schritte (profile, contacts, complete), Tour separat
- PeopleListView: .tourTarget() für addContactButton und contactCardFirst
- SettingsView: resetSeenTours() bei App-Reset

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 20:20:17 +02:00
sven a0741ba608 Fix #23: Tour-Übersetzung – deutsche Strings als Keys, Lokalisierungen ergänzt
- TourCatalog.swift: Technische Keys (tour.onboarding.*) durch deutschen
  Klartext ersetzt (konform mit Projekt-xcstrings-Konvention)
- TourCardView.swift: Ternary-Ausdrucks-Bug behoben (String statt
  LocalizedStringKey); Button-Labels mit deutschen Strings
- SettingsView.swift: settings.tours.* durch deutsche Keys ersetzt
- Localizable.xcstrings: Technische Keys entfernt, alle Tour-Strings als
  deutsche Keys mit EN-Übersetzungen hinzugefügt (19 neue Einträge)
- TourCatalogTests: import Foundation ergänzt (LocalizedStringResource)
- TourCoordinatorTests: import CoreGraphics ergänzt (CGRect)
- StoreTests: Closure-Argument-Fehler behoben (_ in)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 19:33:04 +02:00
sven b214bb6c50 Fix #23: Spotlight-Tour-System – Onboarding + Update-Touren
Neue wiederverwendbare Tour-Komponente (11 Swift-Dateien):

Model:
- TourID, TourTargetID, TourStep, Tour (max 6 Steps per precondition)
- TourCatalog: statische Registry; initiale Onboarding-Tour mit 6 Steps

State:
- TourSeenStore: UserDefaults-backed, injizierbar für Tests
- TourCoordinator: @Observable, Pending-Queue, Auto-Start-Logik
  · checkForPendingTours() startet .autoOnUpdate-Touren bei App-Update
  · .manualOrFirstLaunch-Touren werden explizit per start(_:) gestartet

UI:
- SpotlightShape: Even-Odd-Fill-Shape mit animatableData
- TourCardView: Progress-Dots, Navigation, Haptic-Feedback
- TourOverlayView: Spotlight-Cutout via thinMaterial + SpotlightShape eoFill,
  Coral-Glow-Ring, automatische Card-Positionierung (above/below/center)
- TourViewModifiers: .tourTarget() + .tourPresenter()

Integration:
- NahbarApp: TourCoordinator via @State + .environment()
- OnboardingContainerView: FeatureTourView ersetzt durch TourCoordinator.start(.onboarding);
  .tourPresenter() im fullScreenCover-Kontext; OnboardingPrivacyView bleibt erhalten
- ContentView: .tourPresenter() für main-app Update-Touren + checkForPendingTours()
- SettingsView: neue "App-Touren"-Sektion zum manuellen Neu-Starten

Tests (40 Tests in 4 Dateien):
- TourCatalogTests, TourSeenStoreTests, TourCoordinatorTests, AutoStartLogicTests

Lokalisierung: DE + EN für alle Tour-Strings in Localizable.xcstrings

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 19:06:56 +02:00
sven 55991808cf Fix #21: Onboarding-Fragebogen lokalisiert + Skip-Button besser sichtbar
- PersonalityModels: Alle 30 QuizQuestion-Strings in String(localized:) gewrappt
  → Quiz nutzt jetzt korrekt die Lokaliserungsstrings (vorher: stale in xcstrings)
- PersonalityQuizView: "Überspringen"-Button in allen 3 Screens vereinheitlicht
  → .subheadline.weight(.medium) + .secondary statt caption/tertiary

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 18:48:01 +02:00
sven 9ca54e6a82 Fix #15: Push-Nachrichten – warmer Ton + Persönlichkeitsanpassung
- PersonalityEngine: callWindowCopy() + aftermathCopy() zentralisieren
  alle Notification-Texte (bisher verstreut und teils unlokalisiert)
- CallWindowManager: 3 Varianten nach Profil (high E / high N / default),
  String(localized:) + Error-Logging ergänzt
- AftermathNotificationManager: Titel "Nachwirkung: %@" → "Wie war's mit %@?",
  Body via PersonalityEngine.aftermathCopy()
- Todo- und Vorhaben-Erinnerungen: subtitle "Dein Vorhaben" für
  persönlicheren Kontext (AddTodoView, EditTodoView, AddMomentView)
- AddMomentView: Logging + Error-Callback nachgezogen (wie AddTodoView)
- 9 neue Tests in NahbarPersonalityTests (NotificationCopyTests)
- Lokalisierung: 4 neue Strings inkl. bisher unlokalisierter Texte

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 18:29:51 +02:00
sven 17f4dbd3ab Fix: Push-Benachrichtigungen für Todo-Erinnerungen im Vordergrund
- AppDelegate mit UNUserNotificationCenterDelegate: Notifications werden
  jetzt auch angezeigt wenn die App im Vordergrund läuft (.banner + .sound)
- scheduleReminder: Fehler-Logging bei abgelehnter Berechtigung und
  center.add-Fehler hinzugefügt (analog zu AftermathNotificationManager)
- userInfo mit todoID in Notification-Content aufgenommen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 18:17:57 +02:00
sven 7605a2d30c Fix #12: Interessen als farbige Chips mit Autocomplete
- InterestTagHelper: parse/join/add/remove/suggestions (alphabetisch sortiert)
- InterestChipRow: wiederverwendbare Display-Komponente (grün/rot)
- InterestTagEditor: Chip-Editor mit × + Tipp-Autocomplete
- AddPersonView, PersonDetailView, IchView auf neue Komponenten umgestellt
- 20 InterestTagHelper-Tests in StoreTests
- Lokalisierung: "Tag hinzufügen…" → "Add tag…"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 18:17:50 +02:00
sven c4202cbf2f Fix #19: FeatureGate-Abstraktion + umfassende Abo-Tests
Kapselt die gesamte Abo-Logik in einem testbaren `FeatureGate` Value-Type.
`refreshStatus()` nutzt nun `FeatureGate.from(foundPro:foundMax:)` als
zentrale Factory — die "Max implies Pro"-Invariante ist so nicht mehr
implizit im StoreManager vergraben, sondern explizit und durch 18 neue
Unit-Tests abgesichert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 17:52:04 +02:00
sven 1ecc44a625 Gesprächsthemen: Halluzinations-Schutz + Datenmangel-Hinweis
- Code-seitiger Guard: < 2 Momente/Einträge → .insufficientData-State
  statt API-Call (verhindert Halluzinationen bei leeren Profilen)
- UI: Info-Hinweis "Noch zu wenig Verlauf für persönliche Vorschläge"
- Prompt: STRIKT-Anweisung, nur vorhandene Daten zu verwenden

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:31:46 +02:00
sven f1de4bfd30 Prompt: Gesprächsthemen-Vorschläge kürzer und knapper
Max. 8 Wörter pro Punkt, Stichwörter statt Sätze.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:29:47 +02:00
sven 3ac221a049 AddMomentView: ScrollView + kleineres Textfeld für KI-Vorschläge
TextEditor auf minHeight 120 verkleinert, VStack in ScrollView
eingebettet – KI-Vorschläge schieben den Editierbereich nicht
mehr aus dem Sichtfeld.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:27:45 +02:00
sven 22e1d68217 Umbenennung: Gesprächsvorschläge → Gesprächsthemen vorschlagen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:25:29 +02:00
sven 74bd53407d Gesprächsvorschläge auch für Gespräch-Typ verfügbar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:22:47 +02:00
sven 7057ccb607 Gesprächsvorschläge: Übernehmen-Button pro Sektion
Jede der drei Vorschlags-Sektionen hat jetzt einen kleinen Button
(Pfeil-Icon), der den jeweiligen Text ins Notizfeld übernimmt.
Kurzes Checkmark-Feedback zeigt die erfolgreiche Übernahme an.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:22:02 +02:00
sven a3ae925a10 Fix Gesprächsvorschläge: ** Markdown-Marker aus Fließtext entfernen
Die KI gibt gelegentlich **fett** formatierten Text zurück. Da die
Vorschläge als Plain Text dargestellt werden, werden verbleibende
** nach der Sektion-Extraktion jetzt bereinigt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:20:41 +02:00
sven 319b59c12e Resolves #18 KI-Gesprächsvorschläge beim Anlegen eines Treffens
Neues Max-Plan-Feature: Beim Anlegen eines Treffens können KI-gestützte
Gesprächsvorschläge abgerufen werden. Die Vorschläge umfassen Themen-
vorschläge, Gesprächsretter (bei Stockungen) und Tipps um Smalltalk
in bedeutsame Gespräche zu verwandeln.

- AIAnalysisService: ConversationSuggestionResult, CachedConversationSuggestion,
  suggestConversation(person:), parseConversationResult (internal),
  buildPrompt auf PromptType-Enum umgestellt
- SettingsView: AppLanguage.conversationInstruction (DE + EN)
- AddMomentView: KI-Sektion (idle/loading/result/error) nur bei Treffen-Typ
- PaywallView: Gesprächsvorschläge in Max-Feature-Liste
- Localizable.xcstrings: 10 neue DE/EN-Strings
- Tests: 8 neue Unit-Tests für Parsing und Codable Round-Trip

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:17:25 +02:00
sven 18112cb52c Resolves #11 Resolves #13 Fragebogen: Abbrechen-Button entfernt
Der Speichern-Button am Ende des Flows ersetzt den Abbrechen-Button
in der Toolbar für beide Fragebögen (Meeting + Nachwirkung).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 06:04:34 +02:00
sven b477a3e04b Resolves #13 Fragebogen: scrollbarer Einblend-Flow
Statt Fragen einzeln zu ersetzen, werden sie jetzt nacheinander von
unten eingeblendet und bleiben sichtbar:
- Tippen auf einen Dot zeigt die nächste Frage darunter an
- "Überspringen" blendet ebenfalls die nächste Frage ein
- Beantwortete Fragen bleiben sichtbar und können angepasst werden
- Nach der letzten Frage erscheint ein "Speichern"-Button
- Gilt für Sofort-Bewertung (MeetingRatingFlowView) und
  Nachwirkung (AftermathRatingFlowView)
- Neuer QuestionCard-Component in RatingQuestionView.swift

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 05:47:58 +02:00
sven d541640c74 Logbuch-Button aus Toolbar entfernt (Zugang über Verlauf-Sektion)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 05:40:36 +02:00
sven 30b150a286 Umbenennung: Verlauf → Verlauf & KI-Analyse (sparkles-Icon)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 05:38:21 +02:00
sven 4a9bb32b5e Logbuch: Todos + alle Momente im Verlauf
- LogEntryType.todoCompleted hinzugefügt (checkmark.square.fill, grün)
- Abgehakte Todos erzeugen jetzt automatisch einen Logbuch-Eintrag
  (sowohl aus PersonDetailView als auch TodayView)
- Verlauf-Vorschau in PersonDetailView zeigt jetzt eine gemischte
  Timeline aus Momenten + Logeinträgen statt nur LogEntries
- Verlauf-Abschnitt erscheint sobald Momente oder Logeinträge vorhanden

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 05:34:50 +02:00
sven 2b9346c78b Fix #16 Logbuch-Button in Toolbar ergänzt
Buchsymbol in der NavBar öffnet LogbuchView unabhängig davon, ob
bereits Logeinträge vorhanden sind (vorheriger Fix griff nur wenn der
Verlauf-Abschnitt sichtbar war).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 05:29:19 +02:00
sven 66a7b23f5a Resolves #16 Logbuch-Button immer sichtbar in PersonDetailView
"Alle"-Link im Verlauf-Header zeigt LogbuchView unabhängig von der
Eintragsanzahl (vorher nur bei >5 Einträgen sichtbar).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 05:27:24 +02:00
sven 9a429f11a6 Resolves #10 Todos: Vollständige Implementierung
- Todo-Modell (V8-Migration): dueDate, reminderDate, isCompleted, completedAt
- AddTodoView + EditTodoView: Fälligkeit, Erinnerungspush, intelligenter Reminder-Default
- TodayView: Fällige Todos-Sektion mit Fade-out (5 s) nach Abhaken
- PersonDetailView: Todo-Sektion, tap-to-edit, Glockensymbol, Fade-out
- Momente: tap-to-edit, Favoritenstern inline, Löschen-Button in EditMomentView
- DeletableMomentRow entfernt (Swipe durch direkte Interaktion ersetzt)
- Geburtstage-Sektion zwischen Unternehmungen und Todos in TodayView
- Lokalisierung (de/en) und Tests aktualisiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 05:18:24 +02:00
sven 3611c849c5 Resolves #1 Resolves #2 Resolves #3 Resolves #4 Resolves #5 Resolves #6 Resolves #7 2026-04-21 20:59:59 +02:00
sven c30fb4e518 Issues 1–7: Kalender, Swipe, Momente, Onboarding, Herkunft, Planung
1. Kalender-Einstellungen: Picker für Standard-Kalender in Settings
2. Swipe-Gesten: Sensitivität reduziert (minimumDistance 50, Snap ×1.5)
3. Momente: Gespräch → Gespräch/Chat; Unternehmung aus Picker entfernt
   (Enum-Case bleibt für Rückwärtskompatibilität)
4. Onboarding: maximal 3 Kontakte auswählbar
5. Herkunft: kultureller Hintergrund auf Personenprofil + AI-Prompt
6. Planung: Erinnerung und Kalendereintrag unabhängig für alle Typen
   außer Gedanke; kein Survey bei zukünftigem Treffen
7. Heute-Ansicht: Erinnerungen für Treffen und Gespräch erscheinen
   in "Anstehende Erinnerungen"; Platzhalter passt sich Planungsstatus an

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 20:56:50 +02:00
sven e5cfb8b4ba Weitere Konsolidierung Momente, Splash Absicherung. Übersetzung... 2026-04-20 19:12:13 +02:00
sven 53812e4924 Umbau aud "Momante" 2026-04-19 19:54:41 +02:00
sven bbf347b508 Komplettumbau auf "Momente" 2026-04-19 19:54:20 +02:00
sven 67cfc95265 Nudge hinzugefügt, Navigation optimiert. 2026-04-19 16:17:07 +02:00
sven a776992f0c Onboarding erweitert, Geschlecht hinzugefügt... 2026-04-19 15:28:05 +02:00
sven 1c770c42d2 Onboaridng-Flow, PersonalityQuiz, UI-Verbesserungen. 2026-04-19 13:09:20 +02:00
sven e75141d23c Umfassende Erweiterung, Lokalisierung, Besuchsbewertung 2026-04-18 20:30:48 +02:00
sven 0b35403096 Share aus Chat 2026-04-17 20:59:33 +02:00
sven c359caab72 Guter Zwischenstand 2026-04-17 16:50:52 +02:00
sven 49c1825c0f AI, Geburtstag, Abo 2026-04-17 15:59:33 +02:00
sven 39a60c10b3 App logo changed 2026-04-16 20:30:52 +02:00
sven 5914fc5ad4 .gitignore hinzugefügt 2026-04-16 20:02:08 +02:00
sven 6ecde12ef7 Delta-Commit 2026-04-16 19:38:39 +02:00
sven 3e04fc3296 erster Commit 2026-04-16 19:37:28 +02:00