# GAB-093 · VisualExamRecap — « Récap orienté examen »

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

## Pack (structure officielle par-GAB)
```
GAB-093/
  renderer.html            ← moteur récap examen (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` · `exam_recap_id` · `title` · `tabs[]{tab_id, label, items[]{icon, text}}`
Optionnels : `subject`, `primary_cta{label, action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : chaque onglet (label, icônes, textes), le libellé du bouton CTA.
- **HTML** : structure des onglets (band + panels), rendu des rows, bouton structurel, layout, fallback BLOCKED.

## Archétype
Gabarit à **3 rubriques tabulées** (À savoir / À expliquer / À éviter) pour structurer la révision finale avant un examen (brevet, bac). Les rubriques et leur contenu sont entièrement pilotés par l'instance JSON.

## Garde-fous
- **BLOCKED** si `tabs` absent ou vide, `exam_recap_id` absent, ou `title` absent.
- Chaque onglet doit contenir au moins 1 item ; un tab sans items reste affiché vide mais ne bloque pas.
- Le premier onglet est activé par défaut (index 0) — comportement câblé dans le moteur, pas dans les données.
- 0 ombre noire (`rgba(0,0,0,…)`) — palette DS V2 uniquement (ombres colorées).

## QA à vérifier
1. Modifier un `text` dans un item → rendu change sans toucher au HTML (critère d'or).
2. `tabs:[]` → BLOCKED propre.
3. Navigation clavier entre onglets (Tab + Enter/espace).
4. CTA → panel de confirmation.
5. Responsive 375/768/1024 — sur mobile les onglets passent en colonne.

## Source
`INDEX-300-visuallearning-GAB-091-095-PLAYABLE.html` (stage `data-tpl="93"`, handler `exrTab(idx, el)`).
