# GAB-043 · CooldownTimer — « Micro-pause guidée »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechPlayKit
**Critère validé :** changer le JSON change la pause (titre, corps, durée, CTA) sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-043/
  renderer.html            ← moteur micro-pause guidée (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` · `cooldown_timer_id` · `title` · `body` · `duration_seconds`

Optionnels : `icon`, `primary_cta{label,icon,action}`, `cta_done_label`, `accessibility{ring_aria_label,keyboard_navigable,prefers_reduced_motion}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre, corps, durée (secondes), icône, libellé CTA de démarrage, libellé CTA de fin.
- **HTML** : ring SVG animé (stroke-dashoffset), layout carte, couleurs DS V2 sky, logique compte à rebours.

## Archétype
Micro-pause guidée avec compte à rebours circulaire. Le ring se remplit progressivement (stroke-dashoffset ÷ duration_seconds). À 0, le compteur affiche ✓ et le CTA change de libellé (cta_done_label). Le layout, l'animation et les couleurs sont fixes ; seul le contenu textuel et la durée viennent de l'instance.

## Garde-fous (child_safety)
- **Anti-durée infinie** : `duration_seconds` doit être > 0 — BLOCKED si absent ou invalide.
- **Anti-bouton piégé** : le CTA est re-activé automatiquement à la fin du compte à rebours (disabled=false).
- **BLOCKED** si `title`, `body` ou `duration_seconds` absents/invalides.
- **prefers-reduced-motion** : transitions en 0.12s si l'utilisateur a activé l'accessibilité.

## QA à vérifier
1. Modifier `title`/`body` → rendu change sans toucher au HTML (critère d'or).
2. `duration_seconds=3` → ring démarre à 3, coche ✓ après 3s, CTA re-activé.
3. `cta_done_label` personnalisé → bouton change de libellé sans rebuild.
4. Instance vide / champ requis manquant → BLOCKED propre dans le panel.
5. Responsive 375/768/1024.

## Source
`INDEX-300-playkit-GAB-041-044-PLAYABLE.html` (stage `data-tpl="43"`, handler `coolStart()`).

## external_refs / dependencies
Aucune dépendance hors-lot. Les couleurs DS V2 (`--sky`, `--sky-deep`, `--sky-soft`) sont auto-portées dans le renderer. Le gradient SVG `coolGrad` (#4DA8FF → #2486E6) est inline dans le renderer.
