# GAB-100 · VisualTeacherBoard — « Tableau enseignant (projetable) »

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

## Pack (structure officielle par-GAB)
```
GAB-100/
  renderer.html            ← moteur tableau projetable (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
```

## Archétype
Tableau enseignant projetable à zones pédagogiques multiples. Conçu pour Allo École : affichage au tableau de classe, structuration visuelle d'une séance. Fond sombre (--ink) pour maximiser la lisibilité en projection.

## Champs requis (instance, à plat)
`gab_id` · `board_id` · `title` · `zones[]{zone_id,zone_type,label,icon,content}`

Optionnels : `board_subtitle`, `board_icon`, `board_note`, `primary_cta{label,action}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre de séance, icône, sous-titre, toutes les zones (label, type, icône, contenu), note de bas de tableau, libellé du bouton CTA.
- **HTML** : layout fond sombre, grille 2×2 de zones, couleurs par zone_type, bouton structurel, fallback BLOCKED.

## Garde-fous (child_safety)
- **Anti-invention** : toutes les zones viennent exclusivement du JSON — aucune zone ni contenu pédagogique codé en dur.
- **BLOCKED** si `zones` absent/vide, `title` absent, ou `board_id` absent.
- **Projection-safe** : fond --ink, textes clairs, tailles lisibles à distance.

## Types de zones supportées
`objectif` (sky) · `causes` (gold) · `frise` (mint) · `question_orale` (magenta) · `definition` · `exemple` · `methode` · `bilan` · fallback `default` (white).

## QA à vérifier
1. Modifier `title` ou `zones[].content` → rendu change sans toucher au HTML.
2. `zones:[]` ou `zones` absent → BLOCKED propre.
3. Bouton CTA → panel confirmation avec nombre de zones.
4. Responsive 375px → zones empilées en colonne unique.
5. `init(extInstance)` → charge une instance externe sans rechargement HTML.

## Source
`INDEX-300-visuallearning-GAB-096-100-PLAYABLE.html` (stage `data-tpl="100"`, section `.tb-card`).
Le GAB-100 est le 100e gabarit jouable du système INDEX-300 (cap symbolique de la vague 5 Visual).
