# GAB-032 · ShareOrSaveBlock — « Garde cette fiche sous la main »

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

## Pack (structure officielle par-GAB)
```
GAB-032/
  renderer.html            ← moteur sauvegarde/partage (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

Bloc d'action terminal (fin de session/fiche) permettant à l'élève de **sauvegarder** une ressource ou de la **partager** (sous conditions contextuelles). Présentation centrée : icône → titre → corps → 2 boutons CTA → zone de feedback.

## Champs requis (instance, à plat)

`gab_id` · `share_or_save_id` · `title` · `body` · `primary_cta{label,action,icon?}`

Optionnels : `icon`, `secondary_cta{label,action,icon?}`, `save_feedback`, `share_feedback`.

## Ce qui vient du JSON vs HTML

- **JSON** : icône, titre, corps, libellé et action de chaque bouton, messages de feedback après clic.
- **HTML** : structure card centrée, boutons (save=violet, share=neutre), zone aria-live feedback, layout, slots debug.

## Garde-fous (child_safety)

- **Partage conditionné** : l'action `share` doit être vérifiée côté applicatif avant exposition d'un lien (RGPD mineurs). Le feedback par défaut rappelle explicitement : « selon règles du contexte ».
- **BLOCKED** si `title`, `body` ou `primary_cta` absents — le bloc masque la card et affiche l'erreur.
- Pas d'URL, pas de lien sortant embarqué dans l'instance (le handler applicatif gère l'URL de partage).

## QA à vérifier

1. Modifier `title` / `body` / `primary_cta.label` → rendu change sans toucher au HTML.
2. Supprimer `title` → BLOCKED propre avec message.
3. Clic bouton save → feedback en `mint-deep` avec `save_feedback`.
4. Clic bouton share → feedback en `gold-deep` avec `share_feedback`.
5. `secondary_cta` absent → 1 seul bouton, pas d'erreur.
6. Instance externe `ENGINE.init(ext)` → rendu change.
7. Responsive 375/768/1024 : boutons wrappent, aucun débordement horizontal.

## Source

`INDEX-300-playkit-GAB-031-035-PLAYABLE.html` — bloc `<!-- GAB-032 -->`, classes `.share-card`, handler `shareAct(type)`.
