# GAB-079 · VisualComparisonSimple — « Comparaison simple »

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

## Pack (structure officielle par-GAB)
```
GAB-079/
  renderer.html            ← moteur comparaison simple (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` · `comparison_id` · `col_a_label` · `col_a_items[]` · `col_b_label` · `col_b_items[]`
Optionnels : `title`, `col_a_color`, `col_b_color`, `_note_dev`.

## Ce qui vient du JSON vs HTML
- **JSON** : libellés des colonnes, couleurs d'entête, chaque item des deux listes, titre hero.
- **HTML** : grille 2 colonnes, entêtes colorées, lignes séparées, layout responsive, fallback BLOCKED.

## Garde-fous (child_safety)
- **Anti-invention** : aucun contenu pédagogique en dur dans le HTML ; les items viennent tous de l'instance.
- **BLOCKED** si `col_a_items` ou `col_b_items` absent/vide, ou si un libellé de colonne est absent.
- **Couleurs** : seules les valeurs `violet`, `mint`, `sky`, `coral`, `gold` sont acceptées (valeur non reconnue → fallback `violet`).

## QA à vérifier
1. Modifier un item d'une colonne → rendu change sans toucher au HTML (critère d'or).
2. `col_a_items:[]` → BLOCKED propre.
3. `col_b_label` absent → BLOCKED : libellé colonne absent.
4. Instance externe injectée via `ENGINE.init(ext)` → rendu change instantanément.
5. Responsive 375/768/1024 — colonnes empilées sur mobile (< 560px).

## Source
`INDEX-300-visuallearning-GAB-074-080-PLAYABLE.html` (stage `data-tpl="79"`, CSS `.cmp-simple`).
