{
  "gab_id": "GAB-122",
  "renderer_key": "text_cta",
  "exercise_id": "ex-drag-drop-sort-revolution-francaise",
  "_note_dev": "SOURCE DE VÉRITÉ. Exercice tri par catégories (tap-to-place). Items de la pool + leur catégorie correcte + libellés des zones proviennent tous du JSON. Le HTML (moteur, pool, zones, état armé, feedback) ne change pas — seuls les champs JSON changent le contenu.",
  "title": "Tri par catégories (accessible)",
  "instruction": "Classe",
  "question": "Range chaque élément dans Causes ou Conséquences (touche un élément puis une zone).",
  "items": [
    { "id": "item-1", "text": "La faim", "category": "causes" },
    { "id": "item-2", "text": "Fin des privilèges", "category": "effects" },
    { "id": "item-3", "text": "Les inégalités", "category": "causes" },
    { "id": "item-4", "text": "Déclaration des droits", "category": "effects" }
  ],
  "zones": [
    { "id": "causes", "label": "Causes", "icon": "🔥", "css_class": "causes" },
    { "id": "effects", "label": "Conséquences", "icon": "✨", "css_class": "effects" }
  ],
  "feedback_ok": "Faim et inégalités = causes. Fin des privilèges et Droits = conséquences.",
  "feedback_ko": "Revois : ce qui vient AVANT = cause ; APRÈS = conséquence.",
  "feedback_incomplete": "Classe tous les éléments avant de valider.",
  "status_idle": "👇 Touche un élément ci-dessous pour commencer.",
  "status_armed": "🎯 Maintenant touche une ZONE : Causes ou Conséquences",
  "status_continue": "👇 Touche un élément ci-dessous pour continuer.",
  "cta_label": "Valider le tri",
  "accessibility": {
    "keyboard_navigable": true,
    "focus_visible": true,
    "prefers_reduced_motion": true,
    "tap_to_place_pattern": "Pattern B armé — sélection puis placement, sans drag natif"
  }
}
