# GAB-078 · VisualTimelineBlock — « Frise chronologique »

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

## Pack (structure officielle par-GAB)
```
GAB-078/
  renderer.html            ← moteur frise chronologique (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` · `timeline_id` · `title` · `events[]{date, icon, label, detail}`
Optionnels : `caption`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre hero, chaque point de frise (date, icône, label), texte détail au clic, légende caption.
- **HTML** : track de la frise, zone détail, layout, comportements clic/clavier, fallback BLOCKED.

## Contenu extrait de la source
Extrait de `INDEX-300-visuallearning-GAB-074-080-PLAYABLE.html`, stage `data-tpl="78"`, handler `vtlPick`.
4 événements Révolution française 1789 (stage de démonstration) :
- Mai 1789 · Convocation des États généraux
- 14 juil. · Prise de la Bastille
- 4 août · Abolition des privilèges
- 26 août · Déclaration des droits de l'homme et du citoyen

## Garde-fous (child_safety)
- **BLOCKED** si `events` absent/vide ou `title` absent.
- Le premier event est actif + affiché par défaut (pas d'état vide au chargement).
- Aucun texte pédagogique hardcodé dans le moteur.

## QA à vérifier
1. Modifier `events[].detail` → zone détail change sans toucher au HTML (critère d'or).
2. `events:[]` → BLOCKED propre.
3. `title` absent → BLOCKED propre.
4. Clic sur chaque point → zone détail mise à jour.
5. Navigation clavier (Tab + Entrée/Espace) → accessible.
6. Responsive 375/768/1024.

## external_refs / dependencies
Aucune dépendance externe. Moteur JS vanilla autonome, 0 bibliothèque.

## Source
`INDEX-300-visuallearning-GAB-074-080-PLAYABLE.html` (stage `data-tpl="78"`, handler JS `vtlPick`).
