# GAB-035 · UnlockBlock — « Déblocage visuel »

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

## Pack (structure officielle par-GAB)
```
GAB-035/
  renderer.html            ← moteur déblocage visuel (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_block_id` · `kicker` · `title` · `body` · `primary_cta{label,action}`

Optionnels : `icon` (emoji, défaut 🔓) · `highlight` (enum gold/violet/coral/mint, défaut gold).

## Ce qui vient du JSON vs HTML
- **JSON** : kicker (texte + couleur via highlight), titre, corps, libellé du bouton CTA, icône, couleur d'accentuation.
- **HTML** : animation shake/glow, structure de la carte sombre, layout, fallback BLOCKED.

## Archétype
Carte foncée (gradient `#2E2456 → ink`) avec anneau lock animé (🔒 → 🔓 + shake + glow radial violet) au centre. Un seul CTA coloré selon `highlight`. Destiné à célébrer un déblocage de contenu, mission ou récompense.

## Garde-fous (child_safety)
- **BLOCKED** si `kicker`, `title`, `body` ou `primary_cta` absent : message d'erreur lisible affiché.
- **Anti-invention** : aucun texte pédagogique en dur dans le HTML.
- **Highlight = signal**, jamais une valeur officielle.
- `aria-live` sur le lock pour accessibilité lecteur d'écran.
- `prefers-reduced-motion` : animations réduites à 0.01ms.

## QA à vérifier
1. Modifier `title`/`body` → rendu change sans toucher au HTML (critère d'or).
2. `primary_cta` absent → BLOCKED propre.
3. `highlight:"mint"` → bouton et kicker passent en vert mint.
4. CTA cliqué → animation replay (🔒 → 🔓 + glow).
5. Responsive 375/768/1024 : 0 débordement horizontal.

## Liens do_not_use_when (références hors-lot)
- Accès verrouillé non obtenu → `ENG-010`
- Simple complétion → `GAB-028`
- Attestation visuelle → `GAB-034`

## external_refs / dependencies
Aucune dépendance externe. Polices Google Fonts non chargées (renderer autonome, fontes système en fallback). L'instance est auto-suffisante.

## Source
`INDEX-300-playkit-GAB-031-035-PLAYABLE.html` (stage `data-tpl="35"`, handler `unlockReplay`, classes `.unlock-*`).
