{
  "chapter": {
    "id": "html-structure",
    "level": "premiere",
    "theme": "IHM Web",
    "title": "Structure HTML",
    "description": "Langage HTML : balises, attributs, structure d'une page\n(doctype, html, head, body), balises sémantiques, en-têtes,\nparagraphes, listes, liens, images, tableaux.",
    "prerequisites": [],
    "references": []
  },
  "questions": [
    {
      "id": "q01",
      "difficulty": 1,
      "skills": [
        "definition"
      ],
      "title": "Que signifie HTML ?",
      "statement": "Que signifie l'acronyme **HTML** ?",
      "options": [
        {
          "text": "High Tech Modern Language",
          "correct": false,
          "feedback": "Cette expression n'a\naucune signification\nhistorique. Le sigle HTML\ndécrit précisément la\nnature du langage : un\nbalisage hypertexte.\n"
        },
        {
          "text": "Hypertext Modern Layout",
          "correct": false,
          "feedback": "Erreur : nom incorrect.\n"
        },
        {
          "text": "Home Tool Markup Language",
          "correct": false,
          "feedback": "Erreur : nom incorrect.\n"
        },
        {
          "text": "HyperText Markup Language",
          "correct": true,
          "feedback": "Bonne réponse : HTML est un **langage de\nbalisage** (markup) pour structurer des\ndocuments hypertexte (avec liens). Inventé\npar Tim Berners-Lee en 1991.\n"
        }
      ],
      "explanation": "« Hypertext » désigne les liens ; « markup »\nindique qu'on utilise des balises ; « language »\nqu'il s'agit d'un langage formel (mais pas un\nlangage de programmation au sens strict)."
    },
    {
      "id": "q02",
      "difficulty": 1,
      "skills": [
        "balise"
      ],
      "title": "Balise HTML",
      "statement": "Quelle est la **forme générale** d'une balise HTML ?",
      "options": [
        {
          "text": "`balise(contenu)`",
          "correct": false,
          "feedback": "Erreur : pas de parenthèses.\n"
        },
        {
          "text": "`<balise>contenu</balise>`",
          "correct": true,
          "feedback": "Bonne réponse : balise ouvrante, contenu,\nbalise fermante. Certaines balises sont\nauto-fermantes comme `<img />` ou `<br />`.\n"
        },
        {
          "text": "`{balise contenu}`",
          "correct": false,
          "feedback": "Erreur : pas d'accolades en HTML.\n"
        },
        {
          "text": "`[balise: contenu]`",
          "correct": false,
          "feedback": "Erreur : pas de crochets.\n"
        }
      ],
      "explanation": "Les balises sont encadrées par `<` et `>`. La\nbalise fermante a un `/` en plus. Le HTML\ntolère certaines erreurs de fermeture, mais\nc'est une mauvaise pratique."
    },
    {
      "id": "q03",
      "difficulty": 1,
      "skills": [
        "doctype"
      ],
      "title": "Doctype",
      "statement": "Que doit contenir la **première ligne** d'un\ndocument HTML moderne ?",
      "options": [
        {
          "text": "`<body>`",
          "correct": false,
          "feedback": "Erreur : pareil, vient plus loin dans le\ndocument.\n"
        },
        {
          "text": "`<html>`",
          "correct": false,
          "feedback": "Erreur : `<html>` vient **après** la\ndéclaration de doctype.\n"
        },
        {
          "text": "`<!DOCTYPE html>`",
          "correct": true,
          "feedback": "Bonne réponse : déclare au navigateur que\nc'est du HTML5. Sans doctype, les\nnavigateurs basculent en mode « quirks »\n(compatibilité HTML4 ancien) avec un rendu\nimprévisible.\n"
        },
        {
          "text": "`<head>`",
          "correct": false,
          "feedback": "Erreur : `<head>` vient à l'intérieur de\n`<html>`.\n"
        }
      ],
      "explanation": "`<!DOCTYPE html>` est la déclaration HTML5\nsimplifiée. Les anciennes versions (HTML4,\nXHTML) avaient des doctypes plus longs."
    },
    {
      "id": "q04",
      "difficulty": 1,
      "skills": [
        "structure-page"
      ],
      "title": "Structure d'une page",
      "statement": "Quelle est la **structure minimale** d'une page\nHTML5 ?",
      "options": [
        {
          "text": "```html\n<!DOCTYPE html>\n<html>\n  <head>...</head>\n  <body>...</body>\n</html>\n```\n",
          "correct": true,
          "feedback": "Bonne réponse : `<head>` (méta-données :\ntitre, encodage, styles), `<body>` (contenu\nvisible). Tous deux dans `<html>`.\n"
        },
        {
          "text": "```html\n<html><body>...</body></html>\n```\n",
          "correct": false,
          "feedback": "Erreur : il manque le doctype et `<head>`.\n"
        },
        {
          "text": "```html\n<body>...</body>\n```\n",
          "correct": false,
          "feedback": "Erreur : il manque le doctype, `<html>`,\n`<head>`.\n"
        },
        {
          "text": "```html\n<main>...</main>\n```\n",
          "correct": false,
          "feedback": "Erreur : `<main>` est une balise sémantique\nà utiliser dans `<body>`, pas comme\nstructure racine.\n"
        }
      ],
      "explanation": "`<head>` contient titre (`<title>`), encodage\n(`<meta charset=\"utf-8\">`), feuilles de style\n(`<link>`), scripts (`<script>`). `<body>`\ncontient le contenu visible."
    },
    {
      "id": "q05",
      "difficulty": 1,
      "skills": [
        "titre"
      ],
      "title": "Titres",
      "statement": "Quelle balise produit un titre de **niveau 1**\n(le plus grand) ?",
      "options": [
        {
          "text": "`<head>`",
          "correct": false,
          "feedback": "Erreur : `<head>` est la zone des\nméta-données.\n"
        },
        {
          "text": "`<title1>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante.\n"
        },
        {
          "text": "`<title>`",
          "correct": false,
          "feedback": "Erreur : `<title>` est dans `<head>` et\ndéfinit le titre de l'onglet/de la page,\npas un titre visible.\n"
        },
        {
          "text": "`<h1>`",
          "correct": true,
          "feedback": "Bonne réponse : `<h1>` (header level 1) à\n`<h6>` (level 6). Convention : un seul\n`<h1>` par page (le titre principal).\n"
        }
      ],
      "explanation": "Hiérarchie : `<h1>` à `<h6>`. Importante pour\nl'accessibilité et le référencement. Ne pas\nsauter de niveau (de `<h1>` à `<h3>`)."
    },
    {
      "id": "q06",
      "difficulty": 1,
      "skills": [
        "paragraphe"
      ],
      "title": "Paragraphe",
      "statement": "Quelle balise délimite un **paragraphe** de texte ?",
      "options": [
        {
          "text": "`<para>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante.\n"
        },
        {
          "text": "`<paragraph>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante. Le nom est\nabrégé en `<p>`.\n"
        },
        {
          "text": "`<text>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante en HTML standard.\n"
        },
        {
          "text": "`<p>`",
          "correct": true,
          "feedback": "Bonne réponse : `<p>` (paragraph). Le\nnavigateur ajoute automatiquement un\nespacement avant et après.\n"
        }
      ],
      "explanation": "`<p>` est l'une des balises les plus utilisées.\nPour un saut de ligne simple sans nouveau\nparagraphe, utiliser `<br>`."
    },
    {
      "id": "q07",
      "difficulty": 1,
      "skills": [
        "lien"
      ],
      "title": "Lien hypertexte",
      "statement": "Quelle est la syntaxe d'un **lien** vers\n`https://example.com` ?",
      "options": [
        {
          "text": "`<link href=\"https://example.com\">texte</link>`",
          "correct": false,
          "feedback": "Erreur : `<link>` est utilisée dans `<head>`\npour les feuilles de style, pas pour les\nliens visibles.\n"
        },
        {
          "text": "`<href=\"https://example.com\">texte</href>`",
          "correct": false,
          "feedback": "Erreur : pas de balise `<href>`. C'est un\nattribut.\n"
        },
        {
          "text": "`<url=\"https://example.com\">texte</url>`",
          "correct": false,
          "feedback": "Erreur : pas de balise `<url>` non plus.\n"
        },
        {
          "text": "`<a href=\"https://example.com\">texte</a>`",
          "correct": true,
          "feedback": "Bonne réponse : `<a>` (anchor) avec\nl'attribut `href` (hypertext reference).\nLe texte entre les balises est le texte\ncliquable.\n"
        }
      ],
      "explanation": "Attribut `target=\"_blank\"` pour ouvrir dans un\nnouvel onglet. Pour un lien interne (vers une\nancre dans la page) : `<a href=\"#section1\">`."
    },
    {
      "id": "q08",
      "difficulty": 1,
      "skills": [
        "image"
      ],
      "title": "Image",
      "statement": "Quelle est la balise pour afficher une **image** ?",
      "options": [
        {
          "text": "`<image src=\"...\">`",
          "correct": false,
          "feedback": "Erreur : balise inexistante en HTML. Le\nnom est abrégé.\n"
        },
        {
          "text": "`<picture src=\"...\">`",
          "correct": false,
          "feedback": "`<picture>` existe (pour les images\nresponsives), mais c'est plus complexe et\ncontient plusieurs `<source>` et un\n`<img>`.\n"
        },
        {
          "text": "`<src=\"...\">`",
          "correct": false,
          "feedback": "Erreur : `src` est un attribut, pas une\nbalise.\n"
        },
        {
          "text": "`<img src=\"...\" alt=\"...\">`",
          "correct": true,
          "feedback": "Bonne réponse : `<img>` avec `src` (chemin)\net `alt` (texte alternatif pour\nl'accessibilité et si l'image ne charge\npas). Balise auto-fermante.\n"
        }
      ],
      "explanation": "L'attribut `alt` est **obligatoire** pour\nl'accessibilité (lecteurs d'écran). Sans `alt`,\nla page n'est pas accessible."
    },
    {
      "id": "q09",
      "difficulty": 1,
      "skills": [
        "liste-non-ordonnee"
      ],
      "title": "Liste non ordonnée",
      "statement": "Quelle balise crée une **liste à puces** ?",
      "options": [
        {
          "text": "`<ol>` (ordered list)",
          "correct": false,
          "feedback": "Erreur : `<ol>` est une liste **ordonnée**\n(numérotée).\n"
        },
        {
          "text": "`<list>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante.\n"
        },
        {
          "text": "`<ul>` (unordered list)",
          "correct": true,
          "feedback": "Bonne réponse : `<ul>` contient des\n`<li>` (list item). Affichage avec puces\npar défaut.\n"
        },
        {
          "text": "`<bullet>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante.\n"
        }
      ],
      "explanation": "Mnémotechnique : **u** = unordered (puces),\n**o** = ordered (numéros). Les deux contiennent\ndes `<li>`."
    },
    {
      "id": "q10",
      "difficulty": 1,
      "skills": [
        "attribut"
      ],
      "title": "Attributs",
      "statement": "Dans `<a href=\"page.html\">lien</a>`, qu'est-ce\nque `href` ?",
      "options": [
        {
          "text": "Une variable JavaScript",
          "correct": false,
          "feedback": "Une variable JavaScript\nappartient au langage\nde programmation, pas\nau balisage HTML. Un\nattribut HTML décrit\nquant à lui la balise\ndans laquelle il figure.\n"
        },
        {
          "text": "Une balise",
          "correct": false,
          "feedback": "Erreur : `href` est à l'intérieur d'une\nbalise.\n"
        },
        {
          "text": "Une fonction",
          "correct": false,
          "feedback": "Une fonction est une\nconstruction propre aux\nlangages de programmation.\nEn HTML, on ne définit\npas de fonctions ; on\ndécrit la structure d'un\ndocument.\n"
        },
        {
          "text": "Un attribut de la balise `<a>`",
          "correct": true,
          "feedback": "Bonne réponse : un attribut a la forme\n`nom=\"valeur\"` et complète l'information\nde la balise.\n"
        }
      ],
      "explanation": "Attributs courants : `id`, `class`, `style`,\n`href`, `src`, `alt`. La syntaxe est toujours\n`attribut=\"valeur\"` à l'intérieur de la balise\nouvrante."
    },
    {
      "id": "q11",
      "difficulty": 2,
      "skills": [
        "semantique"
      ],
      "title": "Balises sémantiques",
      "statement": "Pourquoi préfère-t-on les balises **sémantiques**\n(`<header>`, `<nav>`, `<article>`, `<footer>`)\nà des `<div>` génériques ?",
      "options": [
        {
          "text": "Pour l'accessibilité (lecteurs d'écran), le référencement (SEO) et la lisibilité du code",
          "correct": true,
          "feedback": "Bonne réponse : les balises sémantiques\ndécrivent la fonction de la zone, pas son\napparence. Bénéfices techniques et\nmaintenabilité.\n"
        },
        {
          "text": "Parce que `<div>` est obsolète",
          "correct": false,
          "feedback": "Erreur : `<div>` reste très utilisé pour\nregrouper du contenu sans signification\nsémantique particulière.\n"
        },
        {
          "text": "Pour le rendu visuel",
          "correct": false,
          "feedback": "Erreur : par défaut, le rendu visuel est le\nmême qu'un `<div>`.\n"
        },
        {
          "text": "Parce que ces balises sont plus rapides",
          "correct": false,
          "feedback": "Erreur : aucune différence de performance.\n"
        }
      ],
      "explanation": "Balises sémantiques HTML5 : `<header>`,\n`<nav>`, `<main>`, `<article>`, `<section>`,\n`<aside>`, `<footer>`. Apparues en 2014 pour\nremplacer les `<div class=\"header\">`\nomniprésents."
    },
    {
      "id": "q12",
      "difficulty": 2,
      "skills": [
        "div-span"
      ],
      "title": "div vs span",
      "statement": "Quelle est la différence entre `<div>` et\n`<span>` ?",
      "options": [
        {
          "text": "`<div>` est obsolète",
          "correct": false,
          "feedback": "Erreur : très utilisé.\n"
        },
        {
          "text": "`<div>` est un conteneur de bloc (prend toute la largeur, saut de ligne) ; `<span>` est un conteneur inline (intégré dans le flux du texte)",
          "correct": true,
          "feedback": "Bonne réponse : distinction fondamentale en\nHTML/CSS. `<div>` est utilisé pour\nstructurer des sections ; `<span>` pour\nmettre en forme une portion de texte au\nsein d'une phrase.\n"
        },
        {
          "text": "Aucune",
          "correct": false,
          "feedback": "Erreur : différence importante de\ncomportement.\n"
        },
        {
          "text": "`<span>` ne fonctionne que dans `<head>`",
          "correct": false,
          "feedback": "Erreur : `<span>` fonctionne dans `<body>`.\n"
        }
      ],
      "explanation": "Tous les éléments HTML ont une nature : **bloc**\n(par défaut sur une nouvelle ligne) ou **inline**\n(dans le flux). On peut changer cela en CSS\navec `display: block;` ou `display: inline;`."
    },
    {
      "id": "q13",
      "difficulty": 2,
      "skills": [
        "meta-charset"
      ],
      "title": "Encodage",
      "statement": "À quoi sert\n`<meta charset=\"utf-8\">` dans `<head>` ?",
      "options": [
        {
          "text": "À définir la couleur de la page",
          "correct": false,
          "feedback": "Erreur : aucun rapport avec les couleurs\n(c'est CSS).\n"
        },
        {
          "text": "À indiquer au navigateur l'encodage des caractères du document (ici UTF-8, qui supporte les caractères français, asiatiques, emojis...)",
          "correct": true,
          "feedback": "Bonne réponse : sans déclaration, le\nnavigateur peut interpréter les caractères\naccentués différemment (par exemple, voir\n« café » au lieu de « café »).\n"
        },
        {
          "text": "À activer JavaScript",
          "correct": false,
          "feedback": "JavaScript s'active par\nla balise `<script>`. La\nbalise `<meta charset>`\nne joue aucun rôle dans\nl'exécution du code, elle\nprécise uniquement le jeu\nde caractères du document.\n"
        },
        {
          "text": "À cacher la page aux moteurs de recherche",
          "correct": false,
          "feedback": "Erreur : c'est `<meta name=\"robots\"\ncontent=\"noindex\">`.\n"
        }
      ],
      "explanation": "UTF-8 est aujourd'hui le standard universel.\nToujours le déclarer en première ligne du\n`<head>` pour garantir un affichage correct\ndes caractères spéciaux."
    },
    {
      "id": "q14",
      "difficulty": 2,
      "skills": [
        "classe-id"
      ],
      "title": "class et id",
      "statement": "Quelle est la différence entre les attributs\n`class` et `id` ?",
      "options": [
        {
          "text": "`class` est obsolète",
          "correct": false,
          "feedback": "Erreur : très utilisé.\n"
        },
        {
          "text": "`id` doit être unique dans la page ; `class` peut être attribuée à plusieurs éléments",
          "correct": true,
          "feedback": "Bonne réponse : `id` identifie un seul\nélément (par exemple `id=\"header-principal\"`),\n`class` regroupe des éléments partageant un\nstyle (par exemple `class=\"bouton\"`).\n"
        },
        {
          "text": "`id` ne fonctionne pas en HTML5",
          "correct": false,
          "feedback": "Erreur : fonctionne parfaitement.\n"
        },
        {
          "text": "Aucune, ce sont des synonymes",
          "correct": false,
          "feedback": "Erreur : différence importante.\n"
        }
      ],
      "explanation": "Bonne pratique : utiliser surtout `class` pour\nle style ; `id` pour les ancres et les\néléments uniques nécessitant une référence\nJavaScript."
    },
    {
      "id": "q15",
      "difficulty": 2,
      "skills": [
        "tableau"
      ],
      "title": "Tableau",
      "statement": "Quelles balises HTML structurent un **tableau** ?",
      "options": [
        {
          "text": "`<table>`, `<tr>` (table row), `<td>` (table data) et `<th>` (table header)",
          "correct": true,
          "feedback": "Bonne réponse : structure standard. `<th>`\npour les en-têtes (mis en gras et centré\npar défaut). `<thead>`, `<tbody>`, `<tfoot>`\npour les groupements.\n"
        },
        {
          "text": "`<grid>`, `<row>`, `<cell>`",
          "correct": false,
          "feedback": "Erreur : balises inexistantes.\n"
        },
        {
          "text": "`<table>` seul suffit",
          "correct": false,
          "feedback": "Erreur : il faut aussi `<tr>` et `<td>` (ou\n`<th>`) pour avoir un contenu.\n"
        },
        {
          "text": "`<spreadsheet>`, `<line>`, `<column>`",
          "correct": false,
          "feedback": "Erreur : balises inexistantes.\n"
        }
      ],
      "explanation": "Aujourd'hui, on n'utilise plus les tableaux\npour la mise en page (grosse erreur d'antan) ;\nils sont réservés aux données réellement\ntabulaires. Pour la mise en page : Flexbox ou\nGrid CSS."
    },
    {
      "id": "q16",
      "difficulty": 2,
      "skills": [
        "imbriquation"
      ],
      "title": "Imbrication correcte",
      "statement": "Lequel des codes suivants est **incorrect** ?",
      "options": [
        {
          "text": "```html\n<a href=\"x\"><strong>texte</strong></a>\n```\n",
          "correct": false,
          "feedback": "Correct : un inline dans un autre inline.\n"
        },
        {
          "text": "```html\n<ul><li>élément</li></ul>\n```\n",
          "correct": false,
          "feedback": "Correct : `<li>` dans `<ul>`.\n"
        },
        {
          "text": "```html\n<p>Voici un <strong>mot</strong> important.</p>\n```\n",
          "correct": false,
          "feedback": "Correct : un élément inline (`<strong>`)\ndans un bloc (`<p>`).\n"
        },
        {
          "text": "```html\n<p>Texte <p>imbriqué</p>.</p>\n```\n",
          "correct": true,
          "feedback": "Incorrect (donc bonne réponse) : on ne\npeut pas imbriquer un `<p>` dans un autre\n`<p>`. Le navigateur fermera\nautomatiquement le premier au début du\nsecond.\n"
        }
      ],
      "explanation": "Règles d'imbrication HTML : un bloc peut\ncontenir des inlines, mais pas l'inverse en\ngénéral. `<p>` ne peut pas contenir de bloc\n(ni un autre `<p>`)."
    },
    {
      "id": "q17",
      "difficulty": 2,
      "skills": [
        "auto-fermante"
      ],
      "title": "Balises auto-fermantes",
      "statement": "Lesquelles de ces balises sont **auto-fermantes**\n(sans balise fermante) ?",
      "options": [
        {
          "text": "`<img>`, `<br>`, `<hr>`, `<meta>`, `<link>`, `<input>`",
          "correct": true,
          "feedback": "Bonne réponse : ces balises sont dites\n« void » : elles n'ont pas de contenu donc\npas de fermeture. En HTML5 on peut écrire\n`<br>` ou `<br />`.\n"
        },
        {
          "text": "`<p>`, `<div>`, `<span>`",
          "correct": false,
          "feedback": "Erreur : ces balises requièrent une fermeture.\n"
        },
        {
          "text": "`<title>`",
          "correct": false,
          "feedback": "Erreur : `<title>` doit être fermée\n(`<title>Mon site</title>`).\n"
        },
        {
          "text": "`<head>`, `<body>`",
          "correct": false,
          "feedback": "Erreur : ces balises **doivent** être\nfermées (elles contiennent du contenu).\n"
        }
      ],
      "explanation": "Liste des principales : `<area>`, `<base>`,\n`<br>`, `<col>`, `<embed>`, `<hr>`, `<img>`,\n`<input>`, `<link>`, `<meta>`, `<source>`,\n`<track>`, `<wbr>`."
    },
    {
      "id": "q18",
      "difficulty": 2,
      "skills": [
        "emphasis"
      ],
      "title": "Mise en valeur",
      "statement": "Quelle balise utilise-t-on pour mettre un mot\n**important** en valeur ?",
      "options": [
        {
          "text": "`<important>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante.\n"
        },
        {
          "text": "`<text-bold>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante.\n"
        },
        {
          "text": "`<bold>`",
          "correct": false,
          "feedback": "Erreur : balise inexistante.\n"
        },
        {
          "text": "`<strong>` ou `<b>`",
          "correct": true,
          "feedback": "Bonne réponse : `<strong>` exprime\nl'**importance** sémantique (et est\nrendue en gras par défaut). `<b>` est\npurement visuel (à éviter en pratique).\nPour l'italique : `<em>` (sémantique) ou\n`<i>`.\n"
        }
      ],
      "explanation": "`<strong>` vs `<b>` : la première a un sens\n(lecteur d'écran insiste), la seconde est\nuniquement présentation. HTML moderne\nprivilégie le sémantique, le style étant géré\npar CSS."
    },
    {
      "id": "q19",
      "difficulty": 2,
      "skills": [
        "chemin-relatif"
      ],
      "title": "Chemins relatifs",
      "statement": "Si la page est `/site/index.html` et l'image\nest `/site/img/photo.jpg`, quel `src` utiliser\npour le chemin **relatif** ?",
      "options": [
        {
          "text": "`../img/photo.jpg`",
          "correct": false,
          "feedback": "Erreur : `..` remonte d'un dossier, ici\non aboutirait à `/img/photo.jpg`.\n"
        },
        {
          "text": "`https://./img/photo.jpg`",
          "correct": false,
          "feedback": "Erreur : syntaxe d'URL invalide.\n"
        },
        {
          "text": "`img/photo.jpg`",
          "correct": true,
          "feedback": "Bonne réponse : sans `/` initial, c'est\nrelatif au document courant. Depuis\n`/site/index.html`, `img/photo.jpg`\npointe sur `/site/img/photo.jpg`.\n"
        },
        {
          "text": "`/img/photo.jpg`",
          "correct": false,
          "feedback": "Erreur : ce serait un chemin **absolu** à\npartir de la racine du site (qui pourrait\nfonctionner ou pas selon la racine).\n"
        }
      ],
      "explanation": "Trois types de chemins : **relatif**\n(`img/photo.jpg`), **absolu** par rapport au\nsite (`/img/photo.jpg`), **absolu** complet\n(`https://...`). Les chemins relatifs sont\nportables."
    },
    {
      "id": "q20",
      "difficulty": 2,
      "skills": [
        "accessibilite"
      ],
      "title": "Accessibilité",
      "statement": "Quelle pratique améliore le plus\nl'**accessibilité** d'une page web ?",
      "options": [
        {
          "text": "Désactiver le clavier",
          "correct": false,
          "feedback": "Erreur : le contraire est attendu (la\nnavigation au clavier est essentielle).\n"
        },
        {
          "text": "Utiliser des couleurs vives",
          "correct": false,
          "feedback": "Pas la priorité (cela peut même nuire au\ncontraste).\n"
        },
        {
          "text": "Mettre tout le texte en gras",
          "correct": false,
          "feedback": "Erreur : nuit à la hiérarchie visuelle.\n"
        },
        {
          "text": "Fournir des textes alternatifs (`alt`) pour les images, utiliser des balises sémantiques, structurer avec des titres `<h1>...<h6>`",
          "correct": true,
          "feedback": "Bonne réponse : ces pratiques permettent\naux lecteurs d'écran et autres outils\nd'assistance d'interpréter correctement la\npage. Standard RGAA (France) et WCAG\n(international).\n"
        }
      ],
      "explanation": "L'accessibilité est essentielle : 15 % de la\npopulation a un handicap. Et les bénéfices\nprofitent à tous (référencement, mobile,\nergonomie)."
    },
    {
      "id": "q21",
      "difficulty": 3,
      "skills": [
        "trace-rendu"
      ],
      "title": "Trace de rendu",
      "statement": "Que produit visuellement le code suivant ?\n```html\n<ul>\n  <li>Pomme</li>\n  <li>Banane</li>\n  <ol>\n    <li>Cerise</li>\n  </ol>\n</ul>\n```",
      "options": [
        {
          "text": "Une liste à puces avec « Pomme », « Banane » et une sous-liste numérotée contenant « Cerise »",
          "correct": false,
          "feedback": "Presque, mais le code est techniquement\n**invalide** : `<ol>` ne peut pas être un\nenfant direct de `<ul>`. Il devrait être\ndans un `<li>`. Le rendu peut varier selon\nle navigateur.\n"
        },
        {
          "text": "Une erreur empêche tout affichage",
          "correct": false,
          "feedback": "Erreur : HTML est tolérant, le navigateur\nrend ce qu'il peut. Mais la structure\nest invalide selon le standard.\n"
        },
        {
          "text": "Le code est mal structuré : `<ol>` doit être imbriqué dans un `<li>`",
          "correct": true,
          "feedback": "Bonne réponse : la structure correcte est\n`<ul><li>Banane<ol><li>Cerise</li></ol></li></ul>`.\nLes listes ne peuvent contenir que des\n`<li>` directement.\n"
        },
        {
          "text": "Une seule liste fusionnée",
          "correct": false,
          "feedback": "Le navigateur ne fusionne\npas deux listes en une\nseule. Il rend chaque\nbalise telle quelle, mais\nla structure produite\nn'est pas conforme au\nstandard.\n"
        }
      ],
      "explanation": "Pour un sous-niveau de liste : imbriquer la\nsous-liste **dans** un `<li>` du parent.\nBonnes pratiques : valider avec validator.w3.org."
    },
    {
      "id": "q22",
      "difficulty": 3,
      "skills": [
        "structure-document"
      ],
      "title": "Document complet",
      "statement": "Quel élément est manquant dans cette structure\npour un document HTML5 conforme ?\n```html\n<!DOCTYPE html>\n<html>\n  <head></head>\n  <body></body>\n</html>\n```",
      "options": [
        {
          "text": "Un `<title>` dans `<head>`",
          "correct": true,
          "feedback": "Bonne réponse : `<title>` est obligatoire.\nIl définit le titre de l'onglet et est\naffiché dans les résultats de recherche.\n"
        },
        {
          "text": "Un attribut `lang` sur `<html>`",
          "correct": false,
          "feedback": "Recommandé pour l'accessibilité (par\nexemple `<html lang=\"fr\">`), mais\ntechniquement pas obligatoire.\n"
        },
        {
          "text": "Un `<script>`",
          "correct": false,
          "feedback": "Erreur : facultatif.\n"
        },
        {
          "text": "Une balise `<style>`",
          "correct": false,
          "feedback": "Erreur : facultatif.\n"
        }
      ],
      "explanation": "Document minimal vraiment conforme :\n`<!DOCTYPE html><html lang=\"fr\"><head><meta\ncharset=\"utf-8\"><title>Titre</title></head>\n<body></body></html>`."
    },
    {
      "id": "q23",
      "difficulty": 3,
      "skills": [
        "tableau-pieges"
      ],
      "title": "Mise en page interdite",
      "statement": "Pourquoi utiliser un `<table>` pour la **mise en\npage** d'une page web (en dehors de présenter\ndes données tabulaires) est-il fortement\ndéconseillé ?",
      "options": [
        {
          "text": "Aucune raison, c'est une bonne pratique",
          "correct": false,
          "feedback": "Erreur : c'est exactement l'inverse.\n"
        },
        {
          "text": "Mauvaise sémantique (les tableaux décrivent des données tabulaires), accessibilité dégradée (lecteurs d'écran annoncent « tableau »), code rigide difficile à adapter (responsive)",
          "correct": true,
          "feedback": "Bonne réponse : pratique des années 1990\ndevenue obsolète depuis l'arrivée de CSS\n(Flexbox, Grid). Aujourd'hui considérée\ncomme une mauvaise pratique.\n"
        },
        {
          "text": "HTML5 a supprimé `<table>`",
          "correct": false,
          "feedback": "Erreur : `<table>` existe toujours, mais\nréservé aux données tabulaires.\n"
        },
        {
          "text": "Cela ralentit le navigateur",
          "correct": false,
          "feedback": "Erreur : la performance n'est pas l'argument\nprincipal.\n"
        }
      ],
      "explanation": "Pour la mise en page : utiliser CSS Flexbox\n(1D) ou Grid (2D). Pour les données :\n`<table>`, mais avec `<thead>`, `<tbody>`, et\nles attributs d'accessibilité."
    },
    {
      "id": "q24",
      "difficulty": 3,
      "skills": [
        "validation"
      ],
      "title": "Validation HTML",
      "statement": "Comment **vérifier** que son code HTML est\nconforme au standard ?",
      "options": [
        {
          "text": "En utilisant le validateur du W3C (validator.w3.org) qui détecte les erreurs de syntaxe et de structure",
          "correct": true,
          "feedback": "Bonne réponse : outil officiel et gratuit.\nSoumettre l'URL ou le fichier HTML, on\nobtient une liste d'erreurs et\nd'avertissements à corriger.\n"
        },
        {
          "text": "En lançant un programme Python",
          "correct": false,
          "feedback": "Possible (avec html-validator), mais ce\nn'est pas la méthode standard.\n"
        },
        {
          "text": "En relisant le code visuellement",
          "correct": false,
          "feedback": "Pratique, mais incomplet, la validation\nautomatique est plus exhaustive.\n"
        },
        {
          "text": "En attendant que ça plante",
          "correct": false,
          "feedback": "Plaisanterie. HTML est très tolérant et\nplante rarement.\n"
        }
      ],
      "explanation": "Le W3C (World Wide Web Consortium) maintient\nles standards web. La validation est un bon\nréflexe avant de mettre un site en\nproduction."
    },
    {
      "id": "q25",
      "difficulty": 3,
      "skills": [
        "synthese"
      ],
      "title": "Synthèse",
      "statement": "Parmi les affirmations suivantes sur HTML,\nlaquelle est **fausse** ?",
      "options": [
        {
          "text": "Les balises sémantiques (`<header>`, `<nav>`, etc.) améliorent l'accessibilité et le SEO",
          "correct": false,
          "feedback": "Vrai : sens et structure compréhensibles\npar les machines.\n"
        },
        {
          "text": "La structure d'une page comprend toujours `<head>` et `<body>` dans `<html>`",
          "correct": false,
          "feedback": "Vrai : structure standard HTML5.\n"
        },
        {
          "text": "HTML est un langage de balisage (pas un langage de programmation)",
          "correct": false,
          "feedback": "Vrai : pas de variables ni de boucles. Le\ndynamisme vient de JavaScript.\n"
        },
        {
          "text": "Un même `id` peut être utilisé pour plusieurs éléments dans la même page",
          "correct": true,
          "feedback": "Faux (donc bonne réponse) : `id` doit être\n**unique**. Pour grouper plusieurs\néléments, utiliser `class`.\n"
        }
      ],
      "explanation": "Mnémonique : `id` = identifiant **unique**\n(comme une carte d'identité) ; `class` =\ncatégorie (comme une classe d'élèves)."
    },
    {
      "id": "q26",
      "difficulty": 2,
      "skills": [
        "meta",
        "head"
      ],
      "title": "Métadonnées d'une page",
      "statement": "Dans la balise `<head>` d'une page HTML, à quoi sert\nla balise suivante ?\n\n```html\n<meta name=\"description\" content=\"Cours de NSI en ligne\">\n```",
      "options": [
        {
          "text": "À fournir une description de la page utilisée par les moteurs de recherche dans leurs résultats",
          "correct": true,
          "feedback": "Bonne réponse : les moteurs de recherche peuvent\nafficher cette description sous le titre dans\nleurs résultats. Une bonne description\n(concise, informative) aide au référencement et\nau taux de clic.\n"
        },
        {
          "text": "À définir le titre affiché dans l'onglet du navigateur",
          "correct": false,
          "feedback": "Erreur : le titre de l'onglet est défini par la\nbalise `<title>`, distincte de\n`<meta name=\"description\">`.\n"
        },
        {
          "text": "À empêcher l'indexation de la page",
          "correct": false,
          "feedback": "Erreur : pour empêcher l'indexation, on utilise\n`<meta name=\"robots\" content=\"noindex\">`. La\ndescription, elle, sert au contraire à\nprésenter la page aux moteurs.\n"
        },
        {
          "text": "À afficher la phrase « Cours de NSI en ligne » sur la page",
          "correct": false,
          "feedback": "Erreur : tout le contenu placé dans `<head>` est\ninvisible pour le visiteur. Cette balise ne\nproduit aucun affichage direct.\n"
        }
      ],
      "explanation": "Dans `<head>`, on regroupe toutes les informations\nqui décrivent la page sans s'afficher : `<title>`\n(titre de l'onglet), `<meta charset>` (encodage),\n`<meta name=\"description\">` (résumé pour les\nmoteurs), `<meta name=\"viewport\">` (adaptation\nmobile), liens vers les feuilles de style et\nscripts."
    },
    {
      "id": "q27",
      "difficulty": 2,
      "skills": [
        "iframe",
        "integration"
      ],
      "title": "Intégrer une page externe",
      "statement": "Quelle balise HTML permet d'intégrer le contenu\nd'une autre page web à l'intérieur de la page\ncourante ?",
      "options": [
        {
          "text": "`<iframe>`",
          "correct": true,
          "feedback": "Bonne réponse : la balise `<iframe>` (cadre en\nligne) permet d'afficher une autre page web à\nl'intérieur de la page courante, par exemple\nune vidéo YouTube ou une carte. Sa source se\nprécise avec l'attribut `src`.\n"
        },
        {
          "text": "`<embed>`",
          "correct": false,
          "feedback": "Erreur : `<embed>` insère plutôt des objets\nexternes comme des fichiers PDF ou Flash. Pour\nintégrer une page web complète, ce n'est pas\nla balise standard.\n"
        },
        {
          "text": "`<include>`",
          "correct": false,
          "feedback": "Erreur : aucune balise `<include>` n'existe en\nHTML standard. Cette syntaxe se rencontre dans\ncertains préprocesseurs ou systèmes de\nmodèles, mais elle n'est pas du HTML pur.\n"
        },
        {
          "text": "`<link>`",
          "correct": false,
          "feedback": "Erreur : `<link>` sert à déclarer des\nressources liées à la page (feuille de style,\nfavicon, etc.) dans le `<head>`, et non à\nintégrer une autre page web dans le contenu.\n"
        }
      ],
      "explanation": "Une iframe est très utile pour intégrer du contenu\ntiers (vidéos, cartes, éditeurs en ligne), mais\nelle pose des questions de sécurité (clickjacking)\net de performance. C'est pourquoi de nombreux\nsites contrôlent leur affichage en `<iframe>` à\nl'aide d'en-têtes HTTP comme\n`Content-Security-Policy`."
    },
    {
      "id": "q28",
      "difficulty": 2,
      "skills": [
        "block",
        "inline",
        "affichage"
      ],
      "title": "Élément en ligne et élément en bloc",
      "statement": "Parmi les balises suivantes, laquelle est par défaut\nun **élément en bloc** (qui occupe toute la largeur\ndisponible et provoque un retour à la ligne) ?",
      "options": [
        {
          "text": "`<strong>`",
          "correct": false,
          "feedback": "Erreur : la balise `<strong>` (mise en valeur\nforte) est un élément en ligne, qui s'applique\nautour d'un fragment de texte sans provoquer\nde saut de ligne.\n"
        },
        {
          "text": "`<span>`",
          "correct": false,
          "feedback": "Erreur : `<span>` est l'archétype de l'élément\n**en ligne** (*inline*). Il s'insère dans le\nflux du texte sans imposer de retour à la\nligne.\n"
        },
        {
          "text": "`<div>`",
          "correct": true,
          "feedback": "Bonne réponse : `<div>` est un élément en bloc\ngénérique. Par défaut, il occupe toute la\nlargeur disponible et place les éléments\nsuivants à la ligne suivante.\n"
        },
        {
          "text": "`<a>`",
          "correct": false,
          "feedback": "Erreur : un lien `<a>` est par défaut un\nélément en ligne, ce qui permet de l'inclure\nau milieu d'un paragraphe sans casser la mise\nen page.\n"
        }
      ],
      "explanation": "Distinction essentielle pour la mise en page :\nles éléments en bloc (`<div>`, `<p>`, `<h1>`,\n`<ul>`, `<section>`...) prennent toute la largeur\net passent à la ligne ; les éléments en ligne\n(`<span>`, `<a>`, `<strong>`, `<em>`,\n`<img>`...) restent au sein de la ligne courante.\nCSS permet de modifier ce comportement avec la\npropriété `display`."
    }
  ]
}