diff --git a/CORRECTION_barre_recherche.md b/CORRECTION_barre_recherche.md
new file mode 100644
index 0000000..5607840
--- /dev/null
+++ b/CORRECTION_barre_recherche.md
@@ -0,0 +1,116 @@
+# đ§ Correction â `BarreRecherche.jsx` (+ le Badge)
+
+Super boulot : ton app **marche** (likes par carte, total qui monte, donnĂ©es chargĂ©es via `fetch`, persistance `localStorage`). đ Il te reste Ă **bien dĂ©couper** (Module H) et Ă rĂ©parer le Badge. On y va.
+
+---
+
+## đ Pourquoi `BarreRecherche.jsx` casse tout
+
+Ton fichier actuel :
+```jsx
+const [jeux, setJeux] = useState([]); // â hook AU NIVEAU DU FICHIER
+const [recherche, setRecherche] = useState(""); // â idem
+useEffect(() => { ... }, [jeux]); // â idem
+
+function BarreRecherche() {
+ return (
+
+ {filtres.length === 0 &&
...
} // â plusieurs Ă©lĂ©ments sans <> >
+ {filtres.map(...)}
+ );
+}
+```
+
+Trois erreurs :
+1. **Les hooks (`useState`, `useEffect`) doivent ĂȘtre DANS le composant**, pas au niveau du fichier. Hors d'une fonction composant, ils n'ont aucun sens â erreur.
+2. **Un composant doit renvoyer UN seul Ă©lĂ©ment.** LĂ , tu renvoies un `` **et** des ``/`` cĂŽte Ă cĂŽte â erreur JSX. (On enveloppe avec `<> ⊠>` quand il y en a plusieurs.)
+3. Tu essaies de remettre **tout** (Ă©tat, liste, total) dans `BarreRecherche` â alors que ça marche dĂ©jĂ trĂšs bien dans `App`.
+
+> đ§ **L'erreur de raisonnement :** tu veux « sortir » du code dans un composant, mais tu emmĂšnes l'**Ă©tat** avec. Or l'Ă©tat doit **rester dans `App`** (c'est lui qui orchestre). Un petit composant comme `BarreRecherche` doit ĂȘtre **« bĂȘte »** : il reçoit ce dont il a besoin en **props**, et ne dĂ©cide de rien.
+
+---
+
+## â
La bonne version : un composant qui reçoit des **props**
+
+`BarreRecherche` n'a besoin que de **deux choses** : la valeur Ă afficher, et quoi faire quand on tape. On les lui passe en props.
+
+### `BarreRecherche.jsx`
+```jsx
+function BarreRecherche({ valeur, onChange }) {
+ return (
+
+ );
+}
+
+export default BarreRecherche;
+```
+> đ Pas de `useState` ici, pas de liste, pas de total. Juste un input qui **affiche** `valeur` et **remonte** les frappes via `onChange`. C'est tout son travail.
+
+### Dans `App.jsx` : l'état RESTE ici, on passe les props
+```jsx
+import BarreRecherche from "./components/BarreRecherche";
+
+// ... dans le return, Ă la place de ton :
+ setRecherche(e.target.value)}
+/>
+```
+
+> đ§© **Ă retenir :** l'Ă©tat (`recherche`, `total`, `jeux`âŠ) vit dans `App`. Les petits composants reçoivent des **props** (des donnĂ©es + des fonctions) et restent **simples et rĂ©utilisables**. C'est exactement la mĂȘme idĂ©e que `Carte` qui reçoit `onLike`.
+
+**â
Test :** la recherche fonctionne **exactement comme avant**, mais l'`` est maintenant dans son propre composant propre.
+
+> đĄ Tu peux faire pareil pour la **liste** : un composant `Liste` qui reçoit le tableau filtrĂ© et fait le `.map()`. `App` ne ferait plus qu'**assembler** ``, ``, ``.
+
+---
+
+## đïž Le Badge qui s'affiche partout (« Jeu 3D » sur tout)
+
+Ton `Badge` attend une prop `Type` :
+```jsx
+function Badge({ Type }) {
+ if (Type === "2d") return null;
+ return Jeu 3D ;
+}
+```
+Mais dans `Carte` tu l'appelles **sans rien** : ``. Donc `Type` vaut `undefined` â ce n'est pas `"2d"` â il affiche « Jeu 3D » **sur toutes les cartes**, mĂȘme les jeux 2D.
+
+### La correction : faire **descendre** `Type` jusqu'au Badge
+Il faut passer `Type` de `App` â `Carte` â `Badge`.
+
+1. Dans `App.jsx`, ajoute la prop Ă la carte :
+```jsx
+ setTotal((t) => t + 1)}
+/>
+```
+2. Dans `Carte.jsx`, passe-le au Badge :
+```jsx
+
+```
+
+**â
Test :** seuls les jeux **3D** affichent le badge ; les 2D (comme *Oracle of Ages*) n'ont rien.
+
+> đ§© **Ă retenir :** une prop ne « saute » pas les Ă©tages. Pour qu'un petit composant tout en bas (`Badge`) connaisse une donnĂ©e, il faut la lui **transmettre de parent en enfant** (`App` â `Carte` â `Badge`).
+
+---
+
+## â
Récap
+- [ ] `BarreRecherche` = composant simple qui reçoit `valeur` + `onChange` en props (pas de hook dedans)
+- [ ] L'état reste dans `App` ; on passe les props
+- [ ] (Bonus) extraire aussi un composant `Liste`
+- [ ] Passer `Type` jusqu'au `Badge` (`App` â `Carte` â `Badge`)
+
+Quand c'est bon, tu peux enchaĂźner sur **`ENONCE_react_3_contact.md`** (la suite). đ
diff --git a/ENONCE_react_3_contact.md b/ENONCE_react_3_contact.md
new file mode 100644
index 0000000..79c3588
--- /dev/null
+++ b/ENONCE_react_3_contact.md
@@ -0,0 +1,155 @@
+# đĄïž ĂnoncĂ© React #3 â formulaire, tri & plusieurs pages
+
+(à attaquer une fois `BarreRecherche` et le Badge réparés via `CORRECTION_barre_recherche.md`.)
+
+Tu maßtrises déjà : composants, props, état, **lifting state up**, `useEffect`, **`fetch`**. On monte d'un cran avec **3 nouveaux gros morceaux**. Explications + mini-exemples ; à toi d'appliquer sur tes jeux Zelda.
+
+| Module | Tu apprends | Niveau |
+|---|---|---|
+| I | **Formulaire d'ajout** : modifier une liste en state | ââ |
+| J | **Trier** la liste (select contrĂŽlĂ© + `sort`) | ââ |
+| K | **Plusieurs pages** avec React Router | âââ |
+
+---
+
+## đ Module I â Ajouter un jeu via un formulaire
+
+Ta liste `jeux` est **déjà ** un état (tu l'as remplie avec `fetch`), parfait : on peut donc y **ajouter**.
+
+### Un formulaire contrÎlé
+```jsx
+const [titre, setTitre] = useState("");
+const [annee, setAnnee] = useState("");
+
+function ajouter(e) {
+ e.preventDefault(); // empĂȘche le rechargement de page
+ if (titre.trim() === "") return; // on n'ajoute pas du vide
+ const nouveau = { id: Date.now(), titre, annee: Number(annee), console: "?", Type: "3d" };
+ setJeux([...jeux, nouveau]); // đ NOUVEAU tableau = ancien + le nouveau
+ setTitre(""); // on vide les champs
+ setAnnee("");
+}
+
+return (
+
+);
+```
+
+> đ§© **Le point clĂ© :** on ne « pousse » pas dans le tableau existant (`jeux.push(...)` â). On crĂ©e un **nouveau tableau** avec `[...jeux, nouveau]` et on le donne Ă `setJeux`. React ne rĂ©affiche que si on lui passe une **nouvelle** valeur. C'est l'**immutabilitĂ©** : on remplace, on ne modifie pas sur place.
+
+**â
Test :** remplis le formulaire, clique « Ajouter » â la carte apparaĂźt, les champs se vident, la page ne recharge pas.
+
+> đ Bonus : un bouton « đïž Supprimer » par carte â `setJeux(jeux.filter((j) => j.id !== id))` (un nouveau tableau **sans** celui-lĂ ).
+
+---
+
+## đ Module J â Trier la liste
+
+Un `