# GAB-096 · VisualMiniQuizPreview — « Aperçu mini-quiz (non noté) »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechVisualLearning
**Critère validé :** changer le JSON change le quiz sans modifier le HTML. check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-096/
  renderer.html            ← moteur mini-quiz aperçu (ne pas modifier par instance)
  instance.example.json    ← SOURCE DE VÉRITÉ (contenu réel, à plat)
  schema.contract.json     ← contrat de validation
  README-contract.md       ← ce fichier
```

## Champs requis (instance, à plat)
`gab_id` · `quiz_preview_id` · `question` · `choices[]{id,text,correct}`

Optionnels : `title`, `tag_label`, `note`, `cta_label`, `accessibility`, `child_safety`.

## Ce qui vient du JSON vs HTML
- **JSON** : question posée, liste des choix (text + correct), badge tag, note de bas, libellé du bouton CTA.
- **HTML** : structure du quiz (liste de boutons, marqueurs ok/ko, layout), moteur de sélection, feedback inline.

## Garde-fous (child_safety)
- **Non noté** : ce gabarit ne génère aucun score officiel (`no_scoring: true`). Jamais utiliser pour une évaluation certificative.
- **BLOCKED** si `question` absente, `choices` < 2, ou `quiz_preview_id` absent.
- **Exactement 1 correct:true** requis dans les choices — le moteur révèle la bonne réponse après toute sélection.

## QA à vérifier
1. Modifier `question`/`choices` → rendu change sans toucher au HTML (critère d'or).
2. `choices:[]` (vide) → BLOCKED propre.
3. Clic choix correct → class `ok` (mint), feedback positif.
4. Clic choix incorrect → class `ko` (coral) + bonne réponse révélée en `ok` (mint).
5. CTA → panel de confirmation non noté.
6. Responsive 375/768/1024.

## Source
`INDEX-300-visuallearning-GAB-096-100-PLAYABLE.html` (stage `data-tpl="96"`, handler `mqPick`).
