feat: soundboard, toast notifications, robust JSON parsing

Soundboard (Web Audio API):
- 8 ambient loops: rain, wind, fire, ocean, forest, tavern, thunder, cave
- 8 one-shot SFX: sword, bow, spell, door, coins, horn, dice, footsteps
- Brown noise generation for ambient textures
- Oscillator-based SFX with frequency sweeps
- Volume slider, active state indicators with pulsing dot
- Stop All button when ambients are playing
- Toast notifications on SFX trigger

Toast notification system:
- Zustand-based store with auto-dismiss (4s)
- 4 types: success, error, info, warning
- Slide-in animation from top-right
- Dismissible with × button
- Integrated into App shell

JSON parsing (all AI components):
- Shared lib/llm-parse.ts with extractJson, parseLlmJson, flattenValue, ensureArray
- Strips markdown code fences before parsing
- Handles nested objects where strings expected
- All 5 AI components use parseLlmJson instead of raw regex
- All prompts explicitly request raw JSON with no fences
- ItemForge shows raw response in <details> on parse failure

Full production build passing
This commit is contained in:
itsamejms
2026-06-28 23:08:15 +01:00
parent b23ab61841
commit a9cdd10806
7 changed files with 480 additions and 18 deletions
+2 -1
View File
@@ -16,7 +16,8 @@
"framer-motion": "^12",
"lucide-react": "^0.525",
"react": "^19.2.7",
"react-dom": "^19.2.7"
"react-dom": "^19.2.7",
"zustand": "^5.0.14"
},
"devDependencies": {
"@tailwindcss/vite": "^4",