Tasks Run page now switches on question $type and renders one of three layouts:
choice (existing multiple-choice), cloze (Lückentext text input), geo-map
(clickable SVG region picker). Adds Deutsch-Lückentexte + Geografie-Europa
question banks with the required type-specific keys.
- Run.php: replaces submitAnswer/lastAnswerIndex with submitChoice + submitCloze
+ submitRegion. lastAnswer is now an array { type, ...payload }. Cross-type
calls are no-ops so a stray dispatch can't pollute state.
- run.blade.php: branches on $q['type']; cloze has wire:model.live debounce
+ Enter-to-submit; geo-map has SVG + accessible label-button grid; feedback
pill below each layout.
- config/tasks.php: adds deutsch-lueckentexte + geografie-europa-laender.
- config/task-questions.php: type=cloze entries with correct+accept[] for
case-insensitive alt-spelling match; type=geo-map entries with regions[]
and SVG paths.
- Tests: renames submitAnswer→submitChoice across run page suite; adds full
coverage for cloze (correct/wrong/empty/case/accept[]/payload shape/clear
on next), geo-map (correct/wrong/payload/SVG render), and cross-type
guards. TaskQuestionBank test is now type-aware (choice needs options[4],
cloze needs correct string, geo-map needs regions[]+matching correct key).
Test: 204/204 Pest green. Smoke: 10/10 task routes 200, 4/4 modal components
mount cleanly, no errors written to laravel.log during the smoke pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>