# GAB-025 · GenericEmbedBlock — « Embed externe sécurisé »

**Archétype / renderer_key :** `text_cta` (cartographie) · **module :** EdTechPlayKit
**Critère validé :** changer le JSON change l'embed (titre, libellés, fallback) sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-025/
  renderer.html            ← moteur embed externe (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` · `embed_id` · `title` · `embed_label` · `fallback_text`

Optionnels : `embed_src`, `embed_type`, `embed_label_hide`, `placeholder_icon`, `placeholder_title`, `placeholder_hint`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre affiché, libellé du bouton charger/masquer, icône placeholder, texte placeholder, fallback texte, URL de l'embed (`embed_src`).
- **HTML** : structure frame 16/10, état loaded/unloaded, toggle, layout, CSS DS V2.

## Garde-fous (child_safety)
- **Consentement explicite** : l'embed ne se charge JAMAIS automatiquement. L'élève clique pour autoriser l'intégration.
- **Fallback obligatoire** : `fallback_text` toujours visible sous le frame — si l'embed est bloqué, l'élève lit le fallback.
- **BLOCKED** si `embed_id`, `title` ou `fallback_text` absents.
- **Aucune URL externe en dur** dans le HTML — `embed_src` vient exclusivement de l'instance (anti-hardcode).

## QA à vérifier
1. Modifier `title` + `embed_label` → rendu change sans toucher au HTML (critère d'or).
2. `embed_id` absent → BLOCKED propre.
3. Clic « Charger » → état loaded, libellé bascule vers `embed_label_hide`.
4. Re-clic → retour placeholder, libellé redevient `embed_label`.
5. `fallback_text` toujours visible sous le frame.
6. Responsive 375/768/1024.

## TODO / contenus manquants
- `embed_src` : URL réelle de l'iframe non fournie dans la source hardcodée → valeur `_TODO:url_embed_reelle` dans l'instance. À remplacer par une URL iframe validée lors de l'intégration pédagogique.

## external_refs / dependencies
Aucune dépendance externe au lot (GAB-025 est autonome dans EdTechPlayKit). Le moteur n'appelle pas d'autres GAB.

## Source
`INDEX-300-playkit-GAB-021-025-PLAYABLE.html` (stage `data-tpl="25"`, handler `embedToggle()`).
