5.7 KiB
5.7 KiB
Phase 4: Polish + Audio - Context
Gathered: 2026-03-29 (assumptions mode) Status: Ready for planning
## Phase BoundaryVisuell und auditiv angenehmes Erlebnis, bereit zum Testen mit dem Kind. Umfasst: Sound-Effekte (Web Audio API), Sprachausgabe (Web Speech API), sanfte Animationen (Blätter-Fall, Sternenstaub, Avatar-Schweben), Responsive bis 700px, globaler Error-Handler, Export/Import/Reset im Elternbereich. Keine neuen Features — rein Polish auf bestehendem Spielerlebnis.
## Implementation DecisionsAudio System
- D-01: Ein Modul
src/audio/sounds.tsmit Web Audio API. SharedAudioContext, procedural Sounds (Oszillatoren, Noise Buffers). Exportiert:playCorrectSound()(800Hz, 0.1s),playRewardSound()(aufsteigende Tonfolge, 0.8s),playForestElementSound()(gefiltertes weisses Rauschen, 0.5s). Alle prüfenaudioEnabledaus Settings Store. - D-02: AudioContext wird bei erster User-Interaktion erstellt/resumed (Auto-Play Policy Compliance). Lazy initialization Pattern.
- D-03: Mute-Button als fixed-position Element in
<body>ausserhalb aller<section>Screens. Liest/schreibtaudioEnabledin Settings Store. Zustand persistiert über Reload.
Speech Synthesis
- D-04: Optionale Sprachausgabe via
window.speechSynthesis(Web Speech API). Deutsch, Rate 0.9, Pitch 1.1. Liest Companion-Texte vor (Begrüssung, Wald-Kommentar). Silent Fallback wenn keine deutsche Stimme verfügbar. - D-05: Eigene Funktion
speakText(text: string)insrc/audio/speech.ts. Prüft Settings-Flag (neues FeldspeechEnabled: booleanin Settings).
Animations
- D-06: Fallende Buchstaben: Neue
@keyframes leaf-fallAnimation mit lateralem Sway (sinusförmig) + sanftem vertikalen Abstieg. Ersetzt bestehendeletter-float. - D-07: Sternenstaub bei richtigem Tastendruck: CSS
::before/::afterPseudo-Elemente auf.falling-letter--dissolvemit kleinen Particles die auseinanderfliegen und verblassen. Pure CSS, kein JS. - D-08: Companion-Avatar Float-Animation: Sanftes Auf-Ab-Schweben via
@keyframes companion-floatauf.companion-area__avatar. - D-09: Alle Animationen respektieren
prefers-reduced-motion: reduceMedia Query.
Responsive
- D-10:
@media (max-width: 700px)in main.css. Keyboard-Tasten von 44px auf ~32px, Leertaste proportional. Fonts skalieren viaclamp(). Forest-Grid reduziert auf 3×4 oder 2×6. Welcome-Cards in 2×2 statt 4×1.
Error Handling
- D-11: Globaler Error-Handler in
src/main.ts:window.addEventListener('error')+window.addEventListener('unhandledrejection'). Zeigt kindgerechtes Overlay ("Oh, der Wald braucht kurz eine Pause...") mit Reload-Button. Console.error für Debugging.
Export/Import/Reset
- D-12: Export:
progress+settingsals JSON-Download. Blobs ausgeschlossen (zu gross). Funktion insrc/ui/parent.ts. - D-13: Import: JSON-Datei hochladen via
<input type="file">. Validiert gegen Progress + Settings Interface-Struktur. Überschreibt nach Bestätigung. - D-14: Reset: Alle 5 IndexedDB Stores löschen. Doppelte Bestätigung ("Wirklich alles löschen?" → "Ja, alles löschen"). Danach Reload auf Welcome-Screen.
Claude's Discretion
- Exakte Frequenzen und Hüllkurven für Belohnungs-Tonfolge und Glitzer-Sound
- CSS Particle-Anzahl und Timing für Sternenstaub
- Leaf-Fall Animation Kurvenparameter
- Exact responsive Breakpoints innerhalb 700px
- Error-Overlay Styling
<canonical_refs>
Canonical References
Downstream agents MUST read these before planning or implementing.
SPEC.mdsection 11 — Audio-Details (Frequenzen, Dauern, Web Audio API)SPEC.mdsection 7.2 — Animationen (sanft, langsam, keine schnellen Blitze)SPEC.mdsection 12 — Responsive, Error-Handlersrc/styles/main.css— Bestehende Animationen (letter-float, falling-letter--dissolve, forest-element-appear)src/ui/screens.ts— Lesson screen (touch points für Audio + Animationen)src/forest/reward.ts— Reward screen (touch point für Belohnungs-Sound)src/forest/scene.ts— Forest scene (touch point für Waldelement-Sound)src/ui/parent.ts— Parent area (Export/Import/Reset einbauen)src/storage/db.ts— IndexedDB Stores (Export liest, Import schreibt, Reset löscht)src/types.ts— Settings Interface (audioEnabled existiert, speechEnabled hinzufügen)src/main.ts— Entry point (Error-Handler hier)index.html— Mute-Button ausserhalb Screens </canonical_refs>
<code_context>
Existing Code Insights
Reusable Assets
Settings.audioEnabled: booleanexistiert in types.ts, Parent-Screen hat Toggle, DB-Methoden fertiggetSettings()/saveSettings()in db.ts ready- Bestehende CSS Animationen:
letter-float,falling-letter--dissolve,forest-element-appear,companion-float(teilweise) getProgress()/saveProgress()für Export ready- Parent-Screen HTML/CSS existiert mit Settings-Section
Established Patterns
- Settings Store für Persistenz (audioEnabled Pattern wiederverwendbar für speechEnabled)
- CSS
@keyframesfür alle Animationen - IndexedDB Promise-Wrapper Pattern in db.ts
Integration Points
screens.tsZeile ~214 (result.correct Branch) →playCorrectSound()reward.tsinitRewardScreen →playRewardSound()+speakText(comment)scene.tsforest element appear →playForestElementSound()app.tsgreeting →speakText(greeting)parent.ts→ Export/Import/Reset Buttonsmain.ts→ Error-Handlerindex.html<body>→ Mute-Button </code_context>
No specific requirements — open to standard approaches
## Deferred IdeasNone — analysis stayed within phase scope