Afficher la table des matières Masquer la table des matières
- Page de garde histoire-géo rapide : créez la vôtre en 15 minutes chrono
- Télécharger un modèle prêt à personnaliser (0–2 minutes)
- Personnalisation express : nom, classe, pictos (3–10 minutes)
- Choisir les bons outils de coloriage (optionnel mais impactant, 2–5 minutes)
- Quizz : Créer une page de garde Histoire-Géo en 15 minutes
- ${escapeHtml(q.question)} `; main.appendChild(qHeader); // Options (buttons for better mobile and keyboard) const optionsList = document.createElement('div'); optionsList.className = 'flex flex-col gap-2 mt-3'; optionsList.setAttribute('role', 'list'); q.choices.forEach(choice => { const btn = document.createElement('button'); btn.className = 'text-left px-4 py-2 border rounded hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-emerald-300'; btn.type = 'button'; btn.setAttribute('role', 'listitem'); btn.setAttribute('data-choice-id', choice.id); btn.setAttribute('aria-pressed', 'false'); btn.innerHTML = `${choice.id.toUpperCase()}.${escapeHtml(choice.text)}`; // If already answered, apply styles const prevAns = STATE.answers[q.id]; if (prevAns) { btn.setAttribute('aria-disabled', 'true'); btn.classList.add('opacity-75', 'cursor-not-allowed'); if (choice.id === q.correct) { btn.classList.add('bg-emerald-50', 'border-emerald-300'); } else if (choice.id === prevAns && prevAns !== q.correct) { btn.classList.add('bg-red-50', 'border-red-300'); } btn.setAttribute('aria-pressed', (prevAns === choice.id).toString()); } // Click handler (select answer) btn.addEventListener('click', () => { if (STATE.answers[q.id]) return; // déjà répondu STATE.answers[q.id] = choice.id; // Apply immediate feedback styles const children = optionsList.querySelectorAll('button'); children.forEach(b => { b.setAttribute('aria-disabled', 'true'); b.classList.add('opacity-75', 'cursor-not-allowed'); }); // Mark chosen + correct if (choice.id === q.correct) { btn.classList.add('bg-emerald-50', 'border', 'border-emerald-300'); announce(`Bonne réponse : ${choice.text}`); } else { btn.classList.add('bg-red-50', 'border', 'border-red-300'); announce(`Réponse incorrecte. La bonne réponse est : ${getChoiceText(q, q.correct)}`); // Reveal correct option visually const correctBtn = optionsList.querySelector(`button[data-choice-id="${q.correct}"]`); if (correctBtn) correctBtn.classList.add('bg-emerald-50', 'border', 'border-emerald-300'); } calculateScore(); }); optionsList.appendChild(btn); }); main.appendChild(optionsList); // Explication (cachée si pas encore répondu) const expl = document.createElement('div'); expl.className = 'mt-3 text-sm text-slate-600'; expl.id = `expl-${q.id}`; if (!STATE.answers[q.id]) { expl.innerHTML = `Choisissez une réponse pour voir l'explication.`; } else { expl.innerHTML = `Explication : ${escapeHtml(q.explanation)}`; } main.appendChild(expl); // Mise à jour des boutons et progression prevBtn.disabled = index === 0 ? true : false; nextBtn.textContent = index === QUESTIONS.length - 1 ? TEXTS.next : TEXTS.next; updateProgress(); } /* Renvoie le texte d'un choix pour une question */ function getChoiceText(q, choiceId) { const c = q.choices.find(x => x.id === choiceId); return c ? c.text : ''; } /* Escape simple pour éviter injection dans innerHTML depuis données */ function escapeHtml(str) { return String(str) .replace(/&/g, '&') .replace(/, '<') .replace(/>/g, '>'); } /* Announcements accessibles (aria-live) */ function announce(msg) { ariaAnnouncer.textContent = ''; setTimeout(() => { ariaAnnouncer.textContent = msg; }, 50); } /* Affiche la bonne réponse pour la question courante (utilisé par bouton 'Afficher la réponse') */ function revealCurrentAnswer() { const q = QUESTIONS[STATE.currentIndex]; const explEl = document.getElementById(`expl-${q.id}`); if (!explEl) return; // Marquer comme montré (ne compte pas comme répondu) explEl.innerHTML = `Réponse : ${escapeHtml(getChoiceText(q, q.correct))} Pourquoi : ${escapeHtml(q.explanation)}`; announce(`Réponse affichée : ${getChoiceText(q, q.correct)}.`); // Highlight correct option visually const optionsList = main.querySelectorAll('button[data-choice-id]'); optionsList.forEach(btn => { if (btn.getAttribute('data-choice-id') === q.correct) { btn.classList.add('bg-emerald-50', 'border', 'border-emerald-300'); } }); } /* Navigation */ prevBtn.addEventListener('click', () => { if (STATE.currentIndex > 0) { STATE.currentIndex -= 1; renderQuestion(STATE.currentIndex); } }); nextBtn.addEventListener('click', () => { if (STATE.currentIndex < QUESTIONS.length - 1) { STATE.currentIndex += 1; renderQuestion(STATE.currentIndex); } else { // Fin du quizz : montrer score final finishQuiz(); } }); revealBtn.addEventListener('click', () => { revealCurrentAnswer(); }); resetBtn.addEventListener('click', () => { if (!confirm("Réinitialiser le quizz ? Vos réponses seront perdues.")) return; STATE.currentIndex = 0; STATE.answers = {}; STATE.score = 0; stopTimer(); STATE.timerEnabled = false; toggleTimerBtn.setAttribute('aria-pressed', 'false'); toggleTimerBtn.textContent = "Chrono : désactivé"; renderQuestion(0); calculateScore(); announce("Quizz réinitialisé."); }); /* Imprimer résumé : génère une fenêtre minimale avec questions et vos réponses */ printBtn.addEventListener('click', () => { const win = window.open('', '_blank', 'width=700,height=800'); if (!win) return alert("Impossible d'ouvrir la fenêtre d'impression (popup bloquée)."); let html = `Résumé Quizz - Page de garde`; html += `${TEXTS.title} — Résumé`; html += `Score : ${STATE.score} / ${Object.keys(STATE.answers).length}`; QUESTIONS.forEach((q, i) => { const ans = STATE.answers[q.id] || '— (non répondu)'; const ansText = ans === '— (non répondu)' ? ans : getChoiceText(q, ans); html += `Q${i+1}: ${escapeHtml(q.question)}`; html += `Votre réponse: ${escapeHtml(ansText)}`; html += `Bonne réponse: ${escapeHtml(getChoiceText(q, q.correct))}`; html += `${escapeHtml(q.explanation)}`; }); html += ``; win.document.write(html); win.document.close(); win.focus(); win.print(); }); /* Toggle timer 15 minutes */ toggleTimerBtn.addEventListener('click', () => { STATE.timerEnabled = !STATE.timerEnabled; toggleTimerBtn.setAttribute('aria-pressed', String(STATE.timerEnabled)); if (STATE.timerEnabled) { STATE.remainingSeconds = 15 * 60; // 15 minutes startTimer(); } else { stopTimer(); } updateTimerButton(); }); /* Mettre à jour libellé du bouton timer */ function updateTimerButton() { if (STATE.timerEnabled) { toggleTimerBtn.textContent = TEXTS.timerOn; } else { toggleTimerBtn.textContent = TEXTS.timerOff; } } /* Démarrage/arrêt du timer */ function startTimer() { stopTimer(); // clear si existant updateTimerButton(); STATE.timerHandle = setInterval(() => { STATE.remainingSeconds -= 1; // Mettre à jour label du bouton pour afficher temps restant const mm = String(Math.floor(STATE.remainingSeconds / 60)).padStart(2, '0'); const ss = String(STATE.remainingSeconds % 60).padStart(2, '0'); toggleTimerBtn.textContent = `Chrono : ${mm}:${ss}`; if (STATE.remainingSeconds ${TEXTS.finished} Vous avez obtenu ${STATE.score} bonne(s) réponse(s). Conseil rapide : appliquez la règle "2 couleurs + espace + titre clair" pour une page de garde en 15 minutes. Revoir les questions Réinitialiser et recommencer `; main.appendChild(fin); document.getElementById('review-btn').addEventListener('click', () => { STATE.currentIndex = 0; renderQuestion(0); }); document.getElementById('finish-reset').addEventListener('click', () => { resetBtn.click(); }); announce(`Quizz terminé. Score ${STATE.score} sur ${QUESTIONS.length}.`); } /* Initial render */ renderQuestion(0); calculateScore(); /* Raccourcis clavier globaux : Entrée = sélectionner premier choix s'il n'y a pas de réponse, N = suivant, P = précédent */ container.addEventListener('keydown', (e) => { // Entrée : si question non répondue, sélectionner premier choix const key = e.key.toLowerCase(); if (key === 'n') { nextBtn.click(); e.preventDefault(); } else if (key === 'p') { prevBtn.click(); e.preventDefault(); } else if (key === 'enter') { const q = QUESTIONS[STATE.currentIndex]; if (q && !STATE.answers[q.id]) { // sélectionner la première option const firstBtn = main.querySelector('button[data-choice-id]'); if (firstBtn) firstBtn.click(); e.preventDefault(); } } }); /* Sauvegarde auto (optionnelle) — ici simple persist via localStorage */ const STORAGE_KEY = 'quiz_cover_builder_state_v1'; function saveState() { try { const data = { currentIndex: STATE.currentIndex, answers: STATE.answers, score: STATE.score, timerEnabled: STATE.timerEnabled, remainingSeconds: STATE.remainingSeconds }; localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); } catch (err) { /* ignore */ } } function loadState() { try { const raw = localStorage.getItem(STORAGE_KEY); if (!raw) return false; const d = JSON.parse(raw); STATE.currentIndex = d.currentIndex || 0; STATE.answers = d.answers || {}; STATE.score = d.score || 0; STATE.timerEnabled = d.timerEnabled || false; STATE.remainingSeconds = d.remainingSeconds || 0; return true; } catch (err) { return false; } } // Charger si existe if (loadState()) { renderQuestion(STATE.currentIndex); calculateScore(); if (STATE.timerEnabled && STATE.remainingSeconds > 0) startTimer(); } /* Sauvegarder périodiquement */ setInterval(saveState, 2000); /* Petit ajustement visuel initial */ updateProgress(); updateScoreDisplay(); updateTimerButton(); /* Note : aucune API externe n'est utilisée pour ce composant. Si vous voulez enrichir via une API publique (ex. rechercher des palettes de couleurs), utilisez uniquement des services gratuits et sans clé. Exemple (commentaire): Exemple d'API palettes gratuite (ex. The Color API, point d'exemple) : URL: https://www.colr.org/json/colors/random/7 Exemple de réponse JSON (simplifié): { "colors": [ {"id":"12345","hex":"ffcc00"}, {"id":"23456","hex":"2b8aef"}, ... ], "new": "true" } (Ne pas oublier : vérifier les limites et la politique CORS avant usage). */ Visionner un second tutoriel offre une perspective différente sur les motifs à ajouter et les erreurs à éviter. Cette diversité d’exemples accélère l’adaptation du modèle au style personnel de l’élève. Impression et finition : ajuster en 3 minutes pour une présentation impeccable
Réalisez une page de garde histoire–géographie unique en 15 minutes — rapide, facile et sans être artiste 🎨✨. Commencez tout de suite : résultats visibles, cahier organisé et présentation soignée en un temps record.
Page de garde histoire-géo rapide : créez la vôtre en 15 minutes chrono
Action immédiate : téléchargez un modèle, personnalisez les informations essentielles et ajoutez quelques décors simples pour un rendu professionnel en quelques coups de crayon. Ce workflow est pensé pour garantir organisation et présentation claires, même sans talent artistique — idéal pour les collégiens et lycéens pressés.
Télécharger un modèle prêt à personnaliser (0–2 minutes)
Objectif : partir d’une base solide pour gagner du temps. Ouvrir un modèle dans un logiciel ou imprimer une page déjà conçue permet d’éviter le blocage créatif et d’attaquer directement la création.
Exemples pratiques : récupérer un modèle sur Pinterest pour l’inspiration ou choisir un gabarit modifiable sur Canva. Ces sources réduisent l’étape de dessin et garantissent un format adapté au cahier.
Personnalisation express : nom, classe, pictos (3–10 minutes)
Conclusion d’abord : mise en place des informations et décor en moins de dix minutes pour rendre la page reconnaissable et personnelle. Prévoir des zones pour nom, classe et une icône pour l’histoire ou la géographie suffit à structurer la présentation.
Méthode concrète : inscrire le nom dans une bannière, coller un petit pictogramme (carte, boussole, casque romain) et colorier en 2–3 touches. Pour les idées à colorier, consultez des modèles à imprimer sur Tête à modeler ou inspirez-vous du style patchwork expliqué sur Chtoby Pomnili.
À lire Cet Eventail Papier Se Fait En 5 Minutes Et Sauve Vraiment De La Canicule À L’Ancienne
Regarder une courte démonstration vidéo accélère la prise en main et montre des astuces de mise en page en direct. Une visualisation aide à reproduire les gestes simples sans hésitation. Insight : reproduire un pas vu à l’écran coupe le temps de réflexion.
Choisir les bons outils de coloriage (optionnel mais impactant, 2–5 minutes)
Décision clé : le rendu dépend surtout du choix des outils, pas du niveau artistique. Des feutres donnent des couleurs vives, les crayons permettent des dégradés subtils, et les stylos gel apportent des touches modernes et métalliques.
Conseil d’application : combiner un feutre pour les contours et des crayons pour les remplissages crée un aspect professionnel rapidement. Pour des modèles prêts à l’impression dans d’autres matières, explorez des déclinaisons sur Univers’Elles et des collections sur Modèles et Plus.
Quizz : Créer une page de garde Histoire-Géo en 15 minutes
Testez vos choix de mise en page, typographie et hiérarchie pour une page de garde efficace — rapide et sans être artiste.