# GAB-381 · MediaLearningIntro — « Intro média (contrat) »

**Archétype / renderer_key :** `media_viewer` (cartographie) · **module :** EdTechMediaLearning
**renderer_key à concevoir (pas de moteur kit)** : `media_viewer` n'a pas de moteur kit de référence dans la bibliothèque actuelle. Le renderer est dérivé directement de l'écran source (bloc `data-tpl="381"` du fichier INDEX-300-medialearning-GAB-381-385-PLAYABLE.html).
**Critère validé :** changer le JSON change le rendu sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-381/
  renderer.html            ← moteur contrat média (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
```

## Archétype
Écran de **contrat de lecture** : avant d'exposer un média à un élève, on vérifie droits, accessibilité et on garantit l'absence d'autoplay. Les trois items du contrat (Source/droits, Accessibilité, No autoplay) sont animés au clic sur le CTA principal. Le bouton secondaire affiche la notice de droits détaillée.

## Champs requis (instance, à plat)
`gab_id` · `media_intro_id` · `media_type` (enum video/audio/image/mixed) · `title` · `source_info` · `rights` · `contract_items[]{icon,label,detail}`

## Champs optionnels
`description` · `alt_transcript` · `no_autoplay` · `cta_prepare_label` · `cta_rights_label` · `feedback_prepared` · `feedback_rights` · `minor_safety` · `fallback`

## Ce qui vient du JSON vs HTML
- **JSON** : titre du média, type (affiché via un badge), description, libellés des CTA, items du contrat (icône + label + détail), feedbacks préparation et droits.
- **HTML** : layout, animation des items, bouton structurel désactivation après clic, panel feedback.

## Garde-fous (child_safety)
- **No autoplay enforced** : `no_autoplay:true` est la valeur par défaut ; le renderer ne lance jamais de lecture automatique.
- **Droits obligatoires** : `rights` est un champ requis — BLOCKED si absent. Jamais afficher un média sans mention de droits.
- **Accessibilité** : `alt_transcript` requis pour video/audio (RGAA/WCAG 1.2). Item Accessibilité dans le contrat signale la présence du transcript.
- **Anti-invention** : aucune métadonnée ou contenu pédagogique n'est inventé. Les feedbacks viennent de l'instance.
- **BLOCKED** si `media_intro_id`, `media_type`, `rights` ou `contract_items` absent/vide.

## QA à vérifier
1. Modifier `title` ou `contract_items` → rendu change sans toucher au HTML (critère d'or).
2. Supprimer `rights` → BLOCKED propre avec message lisible.
3. Clic CTA principal → items animés séquentiellement + feedback_prepared + bouton désactivé.
4. Clic CTA secondaire → panel feedback_rights affiché.
5. `contract_items:[]` → BLOCKED.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change.
7. Responsive 375/768/1024 — aucun débordement.

## Source
`INDEX-300-medialearning-GAB-381-385-PLAYABLE.html` (stage `data-tpl="381"`, handlers `d381Start`, `d381Rights`).

## external_refs / dependencies
- GAB-382 (MediaLearningImageViewer) : suite naturelle pour les médias de type image.
- GAB-383 (MediaLearningVideoPlayer) : suite naturelle pour les médias de type video.
- GAB-384 (MediaLearningAudioPlayer) : suite naturelle pour les médias de type audio.
- GAB-385 (MediaLearningTranscriptSync) : pour synchroniser le transcript avec la lecture.
