.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();
})();