# GAB-193 · PathMapNodeUnlockAnimation — « Animation déverrouillage »

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

## Pack (structure officielle par-GAB)
```
GAB-193/
  renderer.html            ← moteur animation déverrouillage (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` · `unlock_animation_id` · `title` · `subtitle` · `unlock_condition{label,status:'validated',display}` · `primary_cta{label,action}`

Optionnels : `feedback{heading,body}`, `progress{label,current,total,percent}`, `confetti[string]`, `burst_icon`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, sous-titre, condition préalable affichée, texte du feedback pédagogique, données de progression, libellé du CTA, icônes confetti + burst.
- **HTML** : layout de la carte, animations CSS (burst + confetti), barre de progression, bouton structurel, fallback BLOCKED.

## Archétype
Animation modale/carte déclenchée lorsqu'un nœud PathMap passe de l'état `locked` à `unlocked` (état confirmé côté serveur). Renforce émotionnellement le progrès de l'élève (confetti, burst 🔓) et contextualise le déverrouillage par un feedback pédagogique ("Pourquoi maintenant ?").

## Garde-fous (child_safety)
- **Validation serveur obligatoire** : `unlock_condition.status` DOIT être `"validated"` — BLOCKED sinon. Interdit d'utiliser ce GAB pour un unlock simulé côté front.
- **Ne pas confondre avec** : GAB-039 UnlockBlock PlayKit (unlock dans un exercice), gain XP → PlayKit.
- **Contenu débloqué doit exister** : ne pas afficher si la ressource n'est pas réellement disponible.

## QA à vérifier
1. Modifier `title`/`subtitle`/`primary_cta.label` → rendu change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. `unlock_condition` absent ou `status != validated` → BLOCKED.
4. `feedback` absent → carte rendue sans bloc feedback, aucune erreur.
5. `progress` absent → carte rendue sans barre de progression, aucune erreur.
6. Bouton replay → animation redémarre (confetti + burst).
7. Bouton CTA → confirmation affichée.
8. `prefers-reduced-motion` → durées 0.01ms, rendu intact.
9. Responsive 375/768/1024 → aucun débordement horizontal.

## Source
`INDEX-300-pathmap-GAB-191-195-PLAYABLE.html` (stage `data-tpl="193"`, handler `nuReplay`).


## external_refs / dependencies
Réfs à d'autres GAB présentes dans le contenu de CET écran (navigation/prérequis pédagogiques extraits de la source, PAS des GAB à convertir ici) :
- GAB-039
