# GAB-094 · VisualKeyNumbersPanel — « Panneau de chiffres clés »

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

## Pack (structure officielle par-GAB)
```
GAB-094/
  renderer.html            ← moteur panneau chiffres clés (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` · `panel_id` · `title` · `items[]{num, label, desc}`
Optionnels : `cta_label`, `cta_action`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre du panneau, chaque item (num affiché en grand, label, description révélée), libellé du bouton CTA.
- **HTML** : grille de cartes, toggle open/closed, bouton structurel, layout responsive, fallback BLOCKED.

## Interaction
- Clic / Entrée / Espace sur une carte → toggle description (classe `open`).
- Bouton « Tout révéler » → toutes les cartes passent en état `open`.

## Garde-fous (child_safety)
- **BLOCKED** si `items` absent ou vide.
- **BLOCKED** si `title` absent.
- Aucun contenu pédagogique hardcodé dans le HTML.

## QA à vérifier
1. Modifier un `num`/`label`/`desc` → rendu change sans toucher au HTML (critère d'or).
2. `items:[]` → BLOCKED propre.
3. `title` absent → BLOCKED propre.
4. Clic carte → description visible ; deuxième clic → masquée.
5. Bouton Tout révéler → toutes cartes ouvertes.
6. Responsive 375/768/1024.

## Source
`INDEX-300-visuallearning-GAB-091-095-PLAYABLE.html` (stage `data-tpl="94"`, classe `.kn-card` + toggle `open`).

## external_refs / dependencies
Aucune dépendance hors-lot. Ce GAB est autonome (pas de référence à un autre GAB dans le moteur).
