Belohnungs-Schicht¶
Die Belohnungs-Schicht (EXP-008, Phase 55) ergänzt das emotionale Feedback über dem bestehenden mechanischen Tracking. Sie ist rein im Frontend und funktioniert in beiden Speicher-Modi.
Bausteine¶
| Modul | Aufgabe |
|---|---|
lib/praise/phrase-picker.ts |
Wiederholungsfreies Durchlaufen der Lob-Phrasen, liest data/praise/{lang}.json (gebündelt aus backend/config/praise/*.yaml via make sync-praise). |
lib/feedback/feedbackPref.ts |
Intensität (subtle/normal/enthusiastic) + Ton-Einstellungen in localStorage; Reduced-Motion-Override; Gating + Frequenz-Helfer pro Stufe. |
hooks/useFeedbackIntensity.ts |
Live-Effektiv-Intensität (liest neu bei Pref- und Reduced-Motion-Änderung). |
lib/feedback/milestones.ts |
Reine Schwellenwert-Erkennung (Serie/Mastery/Level). |
lib/feedback/celebrationQueue.ts |
Modul-globaler FIFO mit ID-Deduplizierung; ein Listener (der Host). |
lib/praise/celebration-bus.ts |
emitCelebration (spielt den zugeordneten Ton + benachrichtigt Abonnenten) und die celebrate*-Meilenstein-Helfer. |
lib/feedback/celebration-stats.ts |
Erfasst den Gamification-Stand + steuert die Meilenstein/Abzeichen-Belohnung beim Abschluss. |
lib/audio/sound-effects.ts |
Zur Laufzeit synthetisierte Töne (keine Audio-Dateien). |
components/exercises/AnswerCelebration.tsx |
Haptik + Lob + Bus-Emit pro Antwort. |
components/feedback/Confetti.tsx |
Reiner CSS-Konfetti-Regen. |
components/feedback/MilestoneHost.tsx + MilestoneOverlay.tsx |
Leert die Queue, zeigt eine Einblendung nach der anderen. |
Ablauf¶
- Eine Übung rendert
<AnswerCelebration isCorrect>; sie löst Haptik aus, wählt eine Phrase (Intensität + Frequenz gefiltert) und emittiertanswer_correct/answer_wrongauf dem Bus. emitCelebrationspielt den zugeordneten Ton (selbst-gefiltert über die Ton-Einstellung) und benachrichtigt Abonnenten.- Beim Lektionsabschluss erfasst die Seite den
Gamification-Stand, führt die Belohnung aus, und
celebrateProgressSinceerkennt Meilensteine + Abzeichen und leitet sie übercelebrateMilestone, das eine Einblendung in die Queue stellt und einen Ton emittiert.MilestoneHostzeigt die Einblendungen nacheinander.
Regeln¶
- Alle Animationen sind CSS (transform + opacity); keine
Animations-Bibliotheken.
prefers-reduced-motionunterdrückt jede Animation und erzwingt die effektive Intensitätsubtle. - Töne werden zur Laufzeit aus additiven Rezepten synthetisiert
(
renderSamplesist der reine, testbare Kern); derAudioContextwird beim ersten Abspielen innerhalb einer Nutzergeste verzögert erzeugt. - Die Belohnungs-Schicht ist ergänzend: jeder Hinweis ist auch sichtbar. Ein Fehler darin darf den Lektions-Ablauf nie unterbrechen (die Stat-Lesezugriffe sind defensiv).