{
  "contract_version": "gab_079_contract_v1",
  "gab_id": "GAB-079",
  "canonical_name": "VisualComparisonSimple",
  "module_owner": "EdTechVisualLearning",
  "renderer_key": "text_cta",
  "required_fields": [
    "gab_id",
    "comparison_id",
    "col_a_label",
    "col_a_items",
    "col_b_label",
    "col_b_items"
  ],
  "optional_fields": [
    "title",
    "col_a_color",
    "col_b_color",
    "_note_dev"
  ],
  "field_types": {
    "comparison_id": "string — identifiant unique de la comparaison",
    "col_a_label": "string — libellé de la colonne gauche",
    "col_a_color": "enum['violet','mint','sky','coral','gold'] — couleur de l'entête gauche (défaut : violet)",
    "col_a_items": "array<string> — liste des points de la colonne gauche (min 1 item)",
    "col_b_label": "string — libellé de la colonne droite",
    "col_b_color": "enum['violet','mint','sky','coral','gold'] — couleur de l'entête droite (défaut : mint)",
    "col_b_items": "array<string> — liste des points de la colonne droite (min 1 item)"
  },
  "constraints": [
    "col_a_items et col_b_items doivent contenir au moins 1 élément chacun.",
    "col_a_color et col_b_color doivent être différents pour garantir la lisibilité visuelle.",
    "Les libellés des colonnes (col_a_label, col_b_label) doivent être des chaînes non vides.",
    "Aucun contenu pédagogique ne doit être inventé — extraire uniquement depuis la source."
  ],
  "blocked_conditions": [
    "col_a_items absent ou tableau vide",
    "col_b_items absent ou tableau vide",
    "col_a_label absent",
    "col_b_label absent"
  ],
  "accessibility": [
    "keyboard_navigable",
    "focus_visible",
    "prefers_reduced_motion",
    "colonnes lisibles sans couleur (libellés textuels)"
  ],
  "qa_cases": [
    { "case": "instance conforme", "expected": "rendu complet 2 colonnes, 0 erreur" },
    { "case": "col_a_items absent", "expected": "BLOCKED listant le champ manquant" },
    { "case": "col_b_items vide []", "expected": "BLOCKED : tableau vide" },
    { "case": "col_a_label absent", "expected": "BLOCKED : libellé colonne absent" },
    { "case": "instance externe injectée via init(ext)", "expected": "rendu change sans modifier le HTML" },
    { "case": "responsive 375/768/1024", "expected": "aucun débordement horizontal, colonnes empilées sur mobile" }
  ],
  "traceability": {
    "derived_from_core_gab": "GAB-079",
    "note": "Ce schema VALIDE l'instance. Le contrat pédagogique complet (input_contract/validation_logic/feedback_scoring_logic) vit dans le CORE-GAB officiel, pas ici (évite la duplication)."
  }
}
