# GAB-149 · InteractiveFeedbackOverlay — « Overlay de feedback contextualisé »

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

## Pack (structure officielle par-GAB)
```
GAB-149/
  renderer.html            ← moteur overlay feedback (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` · `overlay_id` · `title` · `feedback_text`

Optionnels : `icon`, `trigger_label`, `close_label`, `context_hint`, `primary_cta{label,action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre de l'overlay, icône, texte de feedback (HTML inline toléré), libellé du bouton déclencheur, libellé du bouton de fermeture, texte contextuel d'invite.
- **HTML** : structure de l'overlay, positionnement, animations, layout de la zone de simulation, boutons structurels.

## Archétype
Composant **transversal** : l'overlay se superpose à n'importe quelle manipulation interactive (SortLab GAB-146, HypothesisTest GAB-147, ScenarioBranch GAB-148…). Le gabarit parent est responsable d'appeler `ENGINE.show()` au bon moment ; GAB-149 gère uniquement l'affichage et la fermeture de l'overlay.

## Garde-fous (child_safety)
- `feedback_text` peut contenir du HTML inline limité (`<b>`, `<em>`) — jamais de `<script>`, `<a>`, ni de balises structurelles.
- `overlay_id` doit être unique par page (évite les collisions si plusieurs overlays sur la même page).
- **BLOCKED** si `title` absent / `feedback_text` absent / `overlay_id` absent.
- Aucun contenu pédagogique inventé : l'instance porte exactement le contenu extrait de la source HTML (zone `data-tpl="149"`).

## QA à vérifier
1. Modifier `feedback_text` → rendu change sans toucher au HTML (critère d'or).
2. `feedback_text` absent → BLOCKED propre.
3. Clic bouton trigger → overlay visible (animation translateY).
4. Clic bouton close → overlay masqué.
5. Injection instance externe via `ENGINE.init(ext)` → rendu mis à jour.
6. Responsive 375/768/1024 — overlay s'adapte à la largeur du stage.

## external_refs / dependencies
| GAB | Rôle | Relation |
|-----|------|----------|
| GAB-146 (SortLab) | Manipulation interactive parente | GAB-149 peut être déclenché depuis GAB-146 après un placement |
| GAB-147 (HypothesisTest) | Manipulation interactive parente | Idem |
| GAB-148 (ScenarioBranch) | Manipulation interactive parente | Idem |
| GAB-126 | Correction d'exercice noté | `do_not_use` — utiliser GAB-126 à la place |
| GAB-150 (CompletionDebrief) | Débrief final | `do_not_use` — utiliser GAB-150 à la place |
| GAB-044 | Notification système | `do_not_use` — utiliser GAB-044 à la place |

## Source
`INDEX-300-interactivelearning-GAB-146-150-PLAYABLE.html` (stage `data-tpl="149"`, handlers `foShow`/`foHide`).
