.qcmf-wrap { font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; max-width: 800px; margin: 24px auto; padding: 16px; } .qcmf-card { background: #fff; border-radius: 16px; box-shadow: 0 10px 30px rgba(0,0,0,.08); padding: 24px; } .qcmf-header { display:flex; justify-content:space-between; align-items:center; margin-bottom: 12px; gap:12px; flex-wrap: wrap; } .qcmf-title { font-size: clamp(18px, 2.4vw, 22px); font-weight: 700; margin:0; } .qcmf-badge { font-size:12px; padding:6px 10px; border-radius:999px; background:#f2f4f7; } .qcmf-progress { height:10px; background:#eef2f7; border-radius:999px; overflow:hidden; margin:12px 0 20px; } .qcmf-progress > div { height:100%; width:0; background: linear-gradient(90deg,#4f46e5,#22c55e); transition: width .35s ease; } .qcmf-question { font-size: clamp(18px, 2.6vw, 22px); line-height: 1.4; margin: 10px 0 14px; } .qcmf-options { display:grid; gap:12px; grid-template-columns: 1fr; } .qcmf-btn { border:1px solid #e5e7eb; background:#fff; border-radius: 12px; padding: 12px 14px; text-align:left; cursor:pointer; font-size:16px; transition: transform .06s ease, border-color .2s, background .2s; color:#111; } .qcmf-btn:hover { transform: translateY(-1px); border-color:#c7d2fe; background:#f8fafc; } .qcmf-btn[disabled] { opacity:.8; cursor:not-allowed; } .qcmf-btn.correct { border-color:#22c55e; background:#ecfdf5; } .qcmf-btn.wrong { border-color:#ef4444; background:#fef2f2; } .qcmf-feedback { margin-top: 12px; padding: 12px 14px; border-left: 4px solid #e5e7eb; border-radius:10px; background:#f8fafc; font-size:14px; } .qcmf-feedback.good { border-color:#22c55e; background:#ecfdf5; } .qcmf-feedback.bad { border-color:#ef4444; background:#fef2f2; } .qcmf-cta { border:none; border-radius:10px; padding:10px 14px; font-weight:600; cursor:pointer; margin-top:16px; } .qcmf-cta.primary { background:#4f46e5; color:#fff; } .qcmf-note { font-size: clamp(20px, 3vw, 28px); font-weight:800; margin-top:12px; } .qcmf-encourage { font-size:14px; color:#1f2937; margin-top:8px; } @media (min-width: 640px) { .qcmf-options { grid-template-columns: 1fr 1fr; } } (function(){ // 1-5 : accord avec le nom noyau du GN // 6-10 : noms collectifs (sens global vs détaillé) // 11-15 : énumération reprise par tout / rien / cela / personne → verbe au singulier const QUESTIONS = [ // — Nom noyau du GN — { question: « Les mots de l’énigme (tourner) dans sa tête. », options: [« tourne », « tournent », « tourneront », « tournait »], correctIndex: 1, explications: [ « Erreur : le nom noyau ‘mots’ est pluriel. », « Correct : accord avec le nom noyau ‘mots’ → tournent. », « Erreur : futur ; on travaille au présent. », « Erreur : imparfait. » ] }, { question: « La collection de timbres (intéresser) les visiteurs. », options: [« intéresse », « intéressent », « intéressait », « intéresseront »], correctIndex: 0, explications: [ « Correct : nom noyau ‘collection’ au singulier → intéresse. », « Erreur : on n’accorde pas avec ‘timbres’. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « Des groupes d’amis (arriver) au compte-gouttes. », options: [« arrive », « arrivent », « arrivait », « arrivera »], correctIndex: 1, explications: [ « Erreur : le nom noyau ‘groupes’ est pluriel. », « Correct : ‘groupes’ (plur.) → arrivent. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « Le bouquet de fleurs (embaumer) la pièce. », options: [« embaume », « embaument », « embaumait », « embaumeront »], correctIndex: 0, explications: [ « Correct : nom noyau ‘bouquet’ (sing.) → embaume. », « Erreur : on n’accorde pas avec ‘fleurs’. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « Les paires de chaussures (être) en solde. », options: [« est », « sont », « étaient », « seront »], correctIndex: 1, explications: [ « Erreur : le nom noyau ‘paires’ est pluriel. », « Correct : pluriel → sont. », « Erreur : imparfait. », « Erreur : futur. » ] }, // — Noms collectifs — { question: « (sens global) Une foule de supporters (crier) devant le stade. », options: [« crie », « crient », « criaient », « criera »], correctIndex: 0, explications: [ « Correct : sens global → on accorde avec ‘foule’ (sing.). », « Erreur : pluriel = sens détaillé, pas ici. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « (sens détaillé) Une foule de supporters (crier) devant le stade. », options: [« crie », « crient », « criait », « criera »], correctIndex: 1, explications: [ « Erreur : singulier = sens global. », « Correct : sens détaillé → on accorde avec ‘supporters’ (plur.) → crient. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « (sens global) La majorité des élèves (être) d’accord. », options: [« est », « sont », « étaient », « seront »], correctIndex: 0, explications: [ « Correct : sens global → accord avec ‘majorité’ (sing.). », « Erreur : pluriel = lecture détaillée, pas ici. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « (sens détaillé) La majorité des élèves (rendre) les devoirs. », options: [« rend », « rendent », « rendait », « rendront »], correctIndex: 1, explications: [ « Erreur : singulier ; ici on insiste sur les élèves pris séparément. », « Correct : sens détaillé → on accorde avec ‘élèves’ (plur.) → rendent. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « (sens global) Un tas de papiers (traîner) sur le bureau. », options: [« traîne », « traînent », « traînaient », « traîneront »], correctIndex: 0, explications: [ « Correct : on voit le tas comme un tout → singulier. », « Erreur : pluriel = lecture détaillée. », « Erreur : imparfait. », « Erreur : futur. » ] }, // — Énumération reprise par un mot global — { question: « La fatigue, le bruit, la chaleur, tout (agacer) Paul. », options: [« agace », « agacent », « agaçait », « agaça »], correctIndex: 0, explications: [ « Correct : ‘tout’ reprend l’énumération → verbe au singulier. », « Erreur : pluriel ; on n’accorde pas avec la liste. », « Erreur : imparfait. », « Erreur : passé simple. » ] }, { question: « Son sérieux, sa patience, cela (impressionner) les professeurs. », options: [« impressionne », « impressionnent », « impressionnait », « impressionnera »], correctIndex: 0, explications: [ « Correct : ‘cela’ = singulier → impressionne. », « Erreur : on n’accorde pas avec l’énumération. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « Des cris, des rires, rien ne (troubler) sa concentration. », options: [« troublent », « trouble », « troublait », « troublera »], correctIndex: 1, explications: [ « Erreur : on n’accorde pas avec ‘cris/rires’. », « Correct : ‘rien’ est singulier → trouble. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « Ta gentillesse, ta franchise, personne ne (douter) de ta sincérité. », options: [« doutent », « doute », « doutait », « doutera »], correctIndex: 1, explications: [ « Erreur : pluriel ; ‘personne’ commande le singulier. », « Correct : ‘personne’ = singulier → doute. », « Erreur : imparfait. », « Erreur : futur. » ] }, { question: « Le courage, l’entraînement, la persévérance, tout (payer) un jour. », options: [« paient », « paie », « payent », « paiera »], correctIndex: 1, explications: [ « Erreur : pluriel ; ‘tout’ impose le singulier. », « Correct : ‘tout’ = singulier → paie. », « Erreur : autre graphie possible de ‘paie’, mais ici on demande le singulier présent (sans -nt). », « Erreur : futur. » ] } ]; const elRoot = document.getElementById(« qcm-francais-accords-gn »); let index = 0, correct = 0; const h = (t, a = {}, …c) => { const e = document.createElement(t); for (const [k, v] of Object.entries(a || {})) { if (k === « class ») e.className = v; else if (k === « html ») e.innerHTML = v; else e.setAttribute(k, v); } c.forEach(x => { if (x != null) e.appendChild(typeof x === « string » ? document.createTextNode(x) : x); }); return e; }; function render(){ elRoot.innerHTML = «  »; const q = QUESTIONS[index]; const header = h(« div »,{class: »qcmf-header »}, h(« h2″,{class: »qcmf-title »}, »Accords sujet/verbe – GN, collectifs, énumérations »), h(« span »,{class: »qcmf-badge »},`Question ${index+1}/${QUESTIONS.length}`) ); const progress = h(« div »,{class: »qcmf-progress »}, h(« div »,{style:`width:${(index/QUESTIONS.length)*100}%`})); const opts = h(« div »,{class: »qcmf-options »}); q.options.forEach((opt,i)=>{ const btn = h(« button »,{class: »qcmf-btn »},opt); btn.onclick = ()=>{ […opts.children].forEach(b=>b.disabled=true); if(i===q.correctIndex){ correct++; btn.classList.add(« correct »); } else { btn.classList.add(« wrong »); } const fb = h(« div »,{class: »qcmf-feedback « +(i===q.correctIndex? »good »: »bad »)}, q.explications[i] + (i===q.correctIndex ?  » ✅ » :  » Astuce : repère le NOM NOYAU ou le mot global (‘tout’, ‘cela’, ‘rien’, ‘personne’) 💡 ») ); opts.appendChild(fb); const next = h(« button »,{class: »qcmf-cta primary »}, »Suivant »); next.onclick = ()=>{ if(index=15 ? « Bravo ! Les accords complexes n’ont plus de secret 🎯 » : note>=10 ? « Solide ! Un dernier tour et ce sera parfait 💪 » : « Pas grave ! Repère d’abord le nom noyau ou le mot global, puis retente 😉 » ), (()=>{ const btn = h(« button »,{class: »qcmf-cta primary »}, »Recommencer »); btn.onclick = ()=>{ index=0; correct=0; render(); }; return btn; })() ); elRoot.appendChild(card); } render(); })();