Update templates/index.html
Browse files- templates/index.html +121 -195
templates/index.html
CHANGED
|
@@ -236,70 +236,69 @@
|
|
| 236 |
.results-container {
|
| 237 |
margin-top: 24px;
|
| 238 |
}
|
| 239 |
-
|
| 240 |
-
/* Styles pour
|
| 241 |
-
.flashcard {
|
| 242 |
-
background: var(--white);
|
| 243 |
-
border-radius: 20px;
|
| 244 |
-
padding: 24px;
|
| 245 |
-
margin-bottom: 16px;
|
| 246 |
-
box-shadow: var(--shadow);
|
| 247 |
-
border-left: 4px solid var(--primary-blue);
|
| 248 |
-
cursor: pointer;
|
| 249 |
-
transition: all 0.3s ease;
|
| 250 |
-
position: relative;
|
| 251 |
-
min-height: 120px;
|
| 252 |
perspective: 1000px;
|
|
|
|
| 253 |
}
|
| 254 |
|
| 255 |
-
.flashcard
|
| 256 |
-
transform: translateY(-2px);
|
| 257 |
-
box-shadow: var(--shadow-lg);
|
| 258 |
-
}
|
| 259 |
-
|
| 260 |
-
.flashcard-content {
|
| 261 |
position: relative;
|
| 262 |
-
|
| 263 |
-
height: 100%;
|
| 264 |
-
transition: transform 0.6s;
|
| 265 |
transform-style: preserve-3d;
|
|
|
|
|
|
|
| 266 |
}
|
| 267 |
|
| 268 |
-
.flashcard.flipped
|
| 269 |
transform: rotateY(180deg);
|
| 270 |
}
|
| 271 |
|
| 272 |
.flashcard-front, .flashcard-back {
|
| 273 |
position: absolute;
|
| 274 |
width: 100%;
|
|
|
|
|
|
|
| 275 |
backface-visibility: hidden;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 276 |
}
|
| 277 |
|
| 278 |
.flashcard-back {
|
| 279 |
transform: rotateY(180deg);
|
| 280 |
-
|
| 281 |
-
border-radius: 12px;
|
| 282 |
-
padding: 16px;
|
| 283 |
-
border: 1px solid var(--gray-100);
|
| 284 |
}
|
| 285 |
-
|
| 286 |
.flashcard h3 {
|
| 287 |
color: var(--primary-blue);
|
| 288 |
margin-bottom: 12px;
|
| 289 |
font-size: 1.1rem;
|
| 290 |
font-weight: 600;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 291 |
}
|
| 292 |
|
| 293 |
-
.
|
|
|
|
| 294 |
position: absolute;
|
| 295 |
-
bottom:
|
| 296 |
-
right: 12px;
|
| 297 |
font-size: 0.8rem;
|
| 298 |
-
color: var(--gray-
|
| 299 |
-
|
| 300 |
}
|
| 301 |
|
| 302 |
-
/* Styles pour les quiz */
|
| 303 |
.quiz-question {
|
| 304 |
background: var(--white);
|
| 305 |
border-radius: 20px;
|
|
@@ -313,12 +312,12 @@
|
|
| 313 |
.quiz-question:hover {
|
| 314 |
transform: translateX(4px);
|
| 315 |
}
|
| 316 |
-
|
| 317 |
.quiz-question h3 {
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
}
|
| 323 |
|
| 324 |
.quiz-options {
|
|
@@ -333,43 +332,33 @@
|
|
| 333 |
cursor: pointer;
|
| 334 |
transition: all 0.3s ease;
|
| 335 |
background: var(--white);
|
| 336 |
-
position: relative;
|
| 337 |
}
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
}
|
| 344 |
|
| 345 |
-
.quiz-option
|
| 346 |
-
border-color: var(--
|
| 347 |
background: var(--extra-light-blue);
|
| 348 |
}
|
| 349 |
|
| 350 |
.quiz-option.correct {
|
| 351 |
border-color: var(--success);
|
| 352 |
background: #f0fdf4;
|
|
|
|
|
|
|
| 353 |
}
|
| 354 |
|
| 355 |
.quiz-option.incorrect {
|
| 356 |
border-color: var(--error);
|
| 357 |
background: #fef2f2;
|
|
|
|
| 358 |
}
|
| 359 |
-
|
| 360 |
-
.quiz-option.
|
| 361 |
-
cursor: not-allowed;
|
| 362 |
-
opacity: 0.7;
|
| 363 |
-
}
|
| 364 |
-
|
| 365 |
-
.quiz-option i {
|
| 366 |
-
margin-right: 8px;
|
| 367 |
-
opacity: 0;
|
| 368 |
-
transition: opacity 0.3s ease;
|
| 369 |
-
}
|
| 370 |
-
|
| 371 |
-
.quiz-option.correct i.fa-check,
|
| 372 |
-
.quiz-option.incorrect i.fa-times {
|
| 373 |
opacity: 1;
|
| 374 |
}
|
| 375 |
|
|
@@ -379,23 +368,6 @@
|
|
| 379 |
background: var(--extra-light-blue);
|
| 380 |
border-radius: 12px;
|
| 381 |
border-left: 4px solid var(--primary-blue);
|
| 382 |
-
display: none;
|
| 383 |
-
}
|
| 384 |
-
|
| 385 |
-
.quiz-explanation.show {
|
| 386 |
-
display: block;
|
| 387 |
-
animation: slideDown 0.3s ease-out;
|
| 388 |
-
}
|
| 389 |
-
|
| 390 |
-
@keyframes slideDown {
|
| 391 |
-
from {
|
| 392 |
-
opacity: 0;
|
| 393 |
-
transform: translateY(-10px);
|
| 394 |
-
}
|
| 395 |
-
to {
|
| 396 |
-
opacity: 1;
|
| 397 |
-
transform: translateY(0);
|
| 398 |
-
}
|
| 399 |
}
|
| 400 |
|
| 401 |
.error-message {
|
|
@@ -468,7 +440,7 @@
|
|
| 468 |
|
| 469 |
/* Animations d'entrée */
|
| 470 |
.fade-in {
|
| 471 |
-
animation: fadeIn 0.5s ease-out;
|
| 472 |
}
|
| 473 |
|
| 474 |
@keyframes fadeIn {
|
|
@@ -578,44 +550,6 @@
|
|
| 578 |
const generateBtn = document.getElementById('generateBtn');
|
| 579 |
const resultsContainer = document.getElementById('results');
|
| 580 |
|
| 581 |
-
// Données d'exemple pour la démonstration
|
| 582 |
-
const sampleData = {
|
| 583 |
-
flashcards: [
|
| 584 |
-
{
|
| 585 |
-
question: "Qu'est-ce que la photosynthèse ?",
|
| 586 |
-
answer: "La photosynthèse est le processus par lequel les plantes vertes utilisent la lumière du soleil pour convertir le dioxyde de carbone et l'eau en glucose et en oxygène."
|
| 587 |
-
},
|
| 588 |
-
{
|
| 589 |
-
question: "Quelle est la formule chimique de l'eau ?",
|
| 590 |
-
answer: "H2O - deux atomes d'hydrogène liés à un atome d'oxygène."
|
| 591 |
-
},
|
| 592 |
-
{
|
| 593 |
-
question: "Qui a développé la théorie de la relativité ?",
|
| 594 |
-
answer: "Albert Einstein a développé la théorie de la relativité restreinte (1905) et générale (1915)."
|
| 595 |
-
}
|
| 596 |
-
],
|
| 597 |
-
quiz: [
|
| 598 |
-
{
|
| 599 |
-
question: "Quelle est la capitale de la France ?",
|
| 600 |
-
options: ["Lyon", "Paris", "Marseille", "Bordeaux"],
|
| 601 |
-
correctAnswer: "Paris",
|
| 602 |
-
explanation: "Paris est la capitale et la plus grande ville de France, située sur la Seine au cœur de la région Île-de-France."
|
| 603 |
-
},
|
| 604 |
-
{
|
| 605 |
-
question: "Combien de chromosomes possède l'être humain ?",
|
| 606 |
-
options: ["44", "46", "48", "50"],
|
| 607 |
-
correctAnswer: "46",
|
| 608 |
-
explanation: "L'être humain possède 46 chromosomes organisés en 23 paires dans chaque cellule somatique."
|
| 609 |
-
},
|
| 610 |
-
{
|
| 611 |
-
question: "Quel est l'élément chimique le plus abondant dans l'univers ?",
|
| 612 |
-
options: ["Oxygène", "Carbone", "Hydrogène", "Hélium"],
|
| 613 |
-
correctAnswer: "Hydrogène",
|
| 614 |
-
explanation: "L'hydrogène représente environ 75% de la masse normale de l'univers et constitue le carburant principal des étoiles."
|
| 615 |
-
}
|
| 616 |
-
]
|
| 617 |
-
};
|
| 618 |
-
|
| 619 |
form.addEventListener('submit', async function(e) {
|
| 620 |
e.preventDefault();
|
| 621 |
|
|
@@ -627,66 +561,73 @@
|
|
| 627 |
return;
|
| 628 |
}
|
| 629 |
|
| 630 |
-
// Animation du bouton
|
| 631 |
generateBtn.classList.add('loading');
|
| 632 |
generateBtn.disabled = true;
|
| 633 |
resultsContainer.innerHTML = '';
|
| 634 |
|
| 635 |
-
|
| 636 |
-
|
| 637 |
-
|
| 638 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 639 |
showMessage(`${type === 'flashcards' ? 'Flashcards' : 'Quiz'} généré avec succès !`, 'success');
|
| 640 |
-
}
|
| 641 |
-
|
| 642 |
-
showMessage('Une erreur est survenue lors de la génération.', 'error');
|
| 643 |
-
} finally {
|
| 644 |
-
// Restaurer le bouton
|
| 645 |
-
generateBtn.classList.remove('loading');
|
| 646 |
-
generateBtn.disabled = false;
|
| 647 |
}
|
| 648 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 649 |
});
|
| 650 |
|
| 651 |
function displayResults(data, type) {
|
| 652 |
resultsContainer.innerHTML = '';
|
| 653 |
|
| 654 |
if (type === 'flashcards') {
|
|
|
|
| 655 |
data.forEach((item, index) => {
|
| 656 |
-
const
|
| 657 |
-
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
|
|
|
| 661 |
<div class="flashcard-front">
|
| 662 |
<h3><i class="fas fa-question"></i> ${item.question}</h3>
|
| 663 |
-
<div class="flip-hint">
|
| 664 |
-
<i class="fas fa-sync-alt"></i> Cliquez pour retourner
|
| 665 |
-
</div>
|
| 666 |
</div>
|
| 667 |
<div class="flashcard-back">
|
| 668 |
-
<
|
|
|
|
|
|
|
| 669 |
</div>
|
| 670 |
</div>
|
| 671 |
`;
|
| 672 |
-
|
| 673 |
-
// Ajouter l'événement de retournement
|
| 674 |
-
flashcardEl.addEventListener('click', function() {
|
| 675 |
-
this.classList.toggle('flipped');
|
| 676 |
-
});
|
| 677 |
-
|
| 678 |
-
resultsContainer.appendChild(flashcardEl);
|
| 679 |
});
|
| 680 |
-
} else {
|
|
|
|
| 681 |
data.forEach((item, index) => {
|
| 682 |
const quizEl = document.createElement('div');
|
| 683 |
quizEl.className = 'quiz-question fade-in';
|
| 684 |
quizEl.style.animationDelay = `${index * 0.1}s`;
|
|
|
|
|
|
|
| 685 |
|
| 686 |
const optionsHtml = item.options.map(option => `
|
| 687 |
-
<div class="quiz-option"
|
| 688 |
-
<i class="fas fa-check"></i>
|
| 689 |
-
<i class="fas fa-times"></i>
|
| 690 |
${option}
|
| 691 |
</div>
|
| 692 |
`).join('');
|
|
@@ -694,42 +635,10 @@
|
|
| 694 |
quizEl.innerHTML = `
|
| 695 |
<h3><i class="fas fa-question-circle"></i> ${item.question}</h3>
|
| 696 |
<div class="quiz-options">${optionsHtml}</div>
|
| 697 |
-
<div class="quiz-explanation">
|
| 698 |
<i class="fas fa-info-circle"></i> <strong>Explication :</strong> ${item.explanation}
|
| 699 |
</div>
|
| 700 |
`;
|
| 701 |
-
|
| 702 |
-
// Ajouter les événements de clic pour les options
|
| 703 |
-
const options = quizEl.querySelectorAll('.quiz-option');
|
| 704 |
-
const explanation = quizEl.querySelector('.quiz-explanation');
|
| 705 |
-
|
| 706 |
-
options.forEach(option => {
|
| 707 |
-
option.addEventListener('click', function() {
|
| 708 |
-
if (this.classList.contains('disabled')) return;
|
| 709 |
-
|
| 710 |
-
const selectedAnswer = this.dataset.option;
|
| 711 |
-
|
| 712 |
-
// Désactiver toutes les options
|
| 713 |
-
options.forEach(opt => opt.classList.add('disabled'));
|
| 714 |
-
|
| 715 |
-
// Marquer la réponse sélectionnée
|
| 716 |
-
this.classList.add('selected');
|
| 717 |
-
|
| 718 |
-
// Révéler les bonnes et mauvaises réponses
|
| 719 |
-
options.forEach(opt => {
|
| 720 |
-
if (opt.dataset.option === item.correctAnswer) {
|
| 721 |
-
opt.classList.add('correct');
|
| 722 |
-
} else {
|
| 723 |
-
opt.classList.add('incorrect');
|
| 724 |
-
}
|
| 725 |
-
});
|
| 726 |
-
|
| 727 |
-
// Afficher l'explication
|
| 728 |
-
explanation.classList.add('show');
|
| 729 |
-
explanation.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
| 730 |
-
});
|
| 731 |
-
});
|
| 732 |
-
|
| 733 |
resultsContainer.appendChild(quizEl);
|
| 734 |
});
|
| 735 |
}
|
|
@@ -743,29 +652,46 @@
|
|
| 743 |
${message}
|
| 744 |
`;
|
| 745 |
|
| 746 |
-
// Supprimer les anciens messages
|
| 747 |
const oldMessages = document.querySelectorAll('.error-message, .success-message');
|
| 748 |
oldMessages.forEach(msg => msg.remove());
|
| 749 |
|
| 750 |
resultsContainer.insertBefore(messageEl, resultsContainer.firstChild);
|
| 751 |
|
| 752 |
-
// Supprimer le message après 5 secondes
|
| 753 |
setTimeout(() => {
|
| 754 |
messageEl.remove();
|
| 755 |
}, 5000);
|
| 756 |
}
|
| 757 |
|
| 758 |
-
//
|
| 759 |
-
|
| 760 |
-
|
| 761 |
-
|
| 762 |
-
|
| 763 |
-
|
| 764 |
-
|
| 765 |
-
|
| 766 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 767 |
});
|
| 768 |
-
|
|
|
|
|
|
|
|
|
|
| 769 |
});
|
| 770 |
</script>
|
| 771 |
</body>
|
|
|
|
| 236 |
.results-container {
|
| 237 |
margin-top: 24px;
|
| 238 |
}
|
| 239 |
+
|
| 240 |
+
/* Styles pour le retournement des flashcards */
|
| 241 |
+
.flashcard-container {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 242 |
perspective: 1000px;
|
| 243 |
+
margin-bottom: 16px;
|
| 244 |
}
|
| 245 |
|
| 246 |
+
.flashcard {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 247 |
position: relative;
|
| 248 |
+
min-height: 150px;
|
|
|
|
|
|
|
| 249 |
transform-style: preserve-3d;
|
| 250 |
+
transition: transform 0.6s;
|
| 251 |
+
cursor: pointer;
|
| 252 |
}
|
| 253 |
|
| 254 |
+
.flashcard.is-flipped {
|
| 255 |
transform: rotateY(180deg);
|
| 256 |
}
|
| 257 |
|
| 258 |
.flashcard-front, .flashcard-back {
|
| 259 |
position: absolute;
|
| 260 |
width: 100%;
|
| 261 |
+
height: 100%;
|
| 262 |
+
-webkit-backface-visibility: hidden;
|
| 263 |
backface-visibility: hidden;
|
| 264 |
+
display: flex;
|
| 265 |
+
flex-direction: column;
|
| 266 |
+
justify-content: center;
|
| 267 |
+
align-items: center;
|
| 268 |
+
padding: 24px;
|
| 269 |
+
border-radius: 20px;
|
| 270 |
+
background: var(--white);
|
| 271 |
+
box-shadow: var(--shadow);
|
| 272 |
+
border-left: 4px solid var(--primary-blue);
|
| 273 |
}
|
| 274 |
|
| 275 |
.flashcard-back {
|
| 276 |
transform: rotateY(180deg);
|
| 277 |
+
border-left-color: var(--success);
|
|
|
|
|
|
|
|
|
|
| 278 |
}
|
| 279 |
+
|
| 280 |
.flashcard h3 {
|
| 281 |
color: var(--primary-blue);
|
| 282 |
margin-bottom: 12px;
|
| 283 |
font-size: 1.1rem;
|
| 284 |
font-weight: 600;
|
| 285 |
+
text-align: center;
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
.flashcard .answer {
|
| 289 |
+
color: var(--gray-600);
|
| 290 |
+
text-align: center;
|
| 291 |
}
|
| 292 |
|
| 293 |
+
.flashcard-front::after {
|
| 294 |
+
content: 'Cliquez pour révéler';
|
| 295 |
position: absolute;
|
| 296 |
+
bottom: 15px;
|
|
|
|
| 297 |
font-size: 0.8rem;
|
| 298 |
+
color: var(--gray-300);
|
| 299 |
+
font-style: italic;
|
| 300 |
}
|
| 301 |
|
|
|
|
| 302 |
.quiz-question {
|
| 303 |
background: var(--white);
|
| 304 |
border-radius: 20px;
|
|
|
|
| 312 |
.quiz-question:hover {
|
| 313 |
transform: translateX(4px);
|
| 314 |
}
|
| 315 |
+
|
| 316 |
.quiz-question h3 {
|
| 317 |
+
color: var(--primary-blue);
|
| 318 |
+
margin-bottom: 12px;
|
| 319 |
+
font-size: 1.1rem;
|
| 320 |
+
font-weight: 600;
|
| 321 |
}
|
| 322 |
|
| 323 |
.quiz-options {
|
|
|
|
| 332 |
cursor: pointer;
|
| 333 |
transition: all 0.3s ease;
|
| 334 |
background: var(--white);
|
|
|
|
| 335 |
}
|
| 336 |
+
|
| 337 |
+
/* Désactive le clic une fois la réponse donnée */
|
| 338 |
+
.quiz-question.answered .quiz-option {
|
| 339 |
+
pointer-events: none;
|
| 340 |
+
opacity: 0.8;
|
| 341 |
}
|
| 342 |
|
| 343 |
+
.quiz-option:hover {
|
| 344 |
+
border-color: var(--light-blue);
|
| 345 |
background: var(--extra-light-blue);
|
| 346 |
}
|
| 347 |
|
| 348 |
.quiz-option.correct {
|
| 349 |
border-color: var(--success);
|
| 350 |
background: #f0fdf4;
|
| 351 |
+
color: #059669;
|
| 352 |
+
font-weight: bold;
|
| 353 |
}
|
| 354 |
|
| 355 |
.quiz-option.incorrect {
|
| 356 |
border-color: var(--error);
|
| 357 |
background: #fef2f2;
|
| 358 |
+
color: #dc2626;
|
| 359 |
}
|
| 360 |
+
|
| 361 |
+
.quiz-question.answered .quiz-option.correct {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 362 |
opacity: 1;
|
| 363 |
}
|
| 364 |
|
|
|
|
| 368 |
background: var(--extra-light-blue);
|
| 369 |
border-radius: 12px;
|
| 370 |
border-left: 4px solid var(--primary-blue);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 371 |
}
|
| 372 |
|
| 373 |
.error-message {
|
|
|
|
| 440 |
|
| 441 |
/* Animations d'entrée */
|
| 442 |
.fade-in {
|
| 443 |
+
animation: fadeIn 0.5s ease-out forwards;
|
| 444 |
}
|
| 445 |
|
| 446 |
@keyframes fadeIn {
|
|
|
|
| 550 |
const generateBtn = document.getElementById('generateBtn');
|
| 551 |
const resultsContainer = document.getElementById('results');
|
| 552 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 553 |
form.addEventListener('submit', async function(e) {
|
| 554 |
e.preventDefault();
|
| 555 |
|
|
|
|
| 561 |
return;
|
| 562 |
}
|
| 563 |
|
|
|
|
| 564 |
generateBtn.classList.add('loading');
|
| 565 |
generateBtn.disabled = true;
|
| 566 |
resultsContainer.innerHTML = '';
|
| 567 |
|
| 568 |
+
try {
|
| 569 |
+
// MODIFICATION : L'appel au backend a été restauré.
|
| 570 |
+
// La fonction de simulation a été supprimée.
|
| 571 |
+
const response = await fetch('/generate', {
|
| 572 |
+
method: 'POST',
|
| 573 |
+
headers: {
|
| 574 |
+
'Content-Type': 'application/json',
|
| 575 |
+
},
|
| 576 |
+
body: JSON.stringify({ topic, type })
|
| 577 |
+
});
|
| 578 |
+
|
| 579 |
+
const data = await response.json();
|
| 580 |
+
|
| 581 |
+
if (data.success) {
|
| 582 |
+
displayResults(data[type], type);
|
| 583 |
showMessage(`${type === 'flashcards' ? 'Flashcards' : 'Quiz'} généré avec succès !`, 'success');
|
| 584 |
+
} else {
|
| 585 |
+
showMessage(data.error || 'Une erreur est survenue lors de la génération.', 'error');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 586 |
}
|
| 587 |
+
} catch (error) {
|
| 588 |
+
console.error('Erreur:', error);
|
| 589 |
+
showMessage('Erreur de connexion. Veuillez réessayer.', 'error');
|
| 590 |
+
} finally {
|
| 591 |
+
generateBtn.classList.remove('loading');
|
| 592 |
+
generateBtn.disabled = false;
|
| 593 |
+
}
|
| 594 |
});
|
| 595 |
|
| 596 |
function displayResults(data, type) {
|
| 597 |
resultsContainer.innerHTML = '';
|
| 598 |
|
| 599 |
if (type === 'flashcards') {
|
| 600 |
+
// Logique d'affichage pour les flashcards retournables
|
| 601 |
data.forEach((item, index) => {
|
| 602 |
+
const flashcardContainer = document.createElement('div');
|
| 603 |
+
flashcardContainer.className = 'flashcard-container fade-in';
|
| 604 |
+
flashcardContainer.style.animationDelay = `${index * 0.1}s`;
|
| 605 |
+
|
| 606 |
+
flashcardContainer.innerHTML = `
|
| 607 |
+
<div class="flashcard" onclick="this.classList.toggle('is-flipped')">
|
| 608 |
<div class="flashcard-front">
|
| 609 |
<h3><i class="fas fa-question"></i> ${item.question}</h3>
|
|
|
|
|
|
|
|
|
|
| 610 |
</div>
|
| 611 |
<div class="flashcard-back">
|
| 612 |
+
<div class="answer">
|
| 613 |
+
<i class="fas fa-lightbulb"></i> ${item.answer}
|
| 614 |
+
</div>
|
| 615 |
</div>
|
| 616 |
</div>
|
| 617 |
`;
|
| 618 |
+
resultsContainer.appendChild(flashcardContainer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 619 |
});
|
| 620 |
+
} else { // Quiz
|
| 621 |
+
// Logique d'affichage pour le quiz interactif
|
| 622 |
data.forEach((item, index) => {
|
| 623 |
const quizEl = document.createElement('div');
|
| 624 |
quizEl.className = 'quiz-question fade-in';
|
| 625 |
quizEl.style.animationDelay = `${index * 0.1}s`;
|
| 626 |
+
// On stocke la bonne réponse dans un attribut data-*
|
| 627 |
+
quizEl.dataset.correctAnswer = item.correctAnswer;
|
| 628 |
|
| 629 |
const optionsHtml = item.options.map(option => `
|
| 630 |
+
<div class="quiz-option" onclick="checkAnswer(this)">
|
|
|
|
|
|
|
| 631 |
${option}
|
| 632 |
</div>
|
| 633 |
`).join('');
|
|
|
|
| 635 |
quizEl.innerHTML = `
|
| 636 |
<h3><i class="fas fa-question-circle"></i> ${item.question}</h3>
|
| 637 |
<div class="quiz-options">${optionsHtml}</div>
|
| 638 |
+
<div class="quiz-explanation" style="display: none;">
|
| 639 |
<i class="fas fa-info-circle"></i> <strong>Explication :</strong> ${item.explanation}
|
| 640 |
</div>
|
| 641 |
`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 642 |
resultsContainer.appendChild(quizEl);
|
| 643 |
});
|
| 644 |
}
|
|
|
|
| 652 |
${message}
|
| 653 |
`;
|
| 654 |
|
|
|
|
| 655 |
const oldMessages = document.querySelectorAll('.error-message, .success-message');
|
| 656 |
oldMessages.forEach(msg => msg.remove());
|
| 657 |
|
| 658 |
resultsContainer.insertBefore(messageEl, resultsContainer.firstChild);
|
| 659 |
|
|
|
|
| 660 |
setTimeout(() => {
|
| 661 |
messageEl.remove();
|
| 662 |
}, 5000);
|
| 663 |
}
|
| 664 |
|
| 665 |
+
// Nouvelle fonction pour vérifier la réponse du quiz
|
| 666 |
+
window.checkAnswer = function(optionEl) {
|
| 667 |
+
const quizQuestion = optionEl.closest('.quiz-question');
|
| 668 |
+
if (quizQuestion.classList.contains('answered')) return; // Empêche de répondre à nouveau
|
| 669 |
+
|
| 670 |
+
quizQuestion.classList.add('answered');
|
| 671 |
+
const correctAnswer = quizQuestion.dataset.correctAnswer;
|
| 672 |
+
const selectedAnswer = optionEl.textContent.trim();
|
| 673 |
+
const explanation = quizQuestion.querySelector('.quiz-explanation');
|
| 674 |
+
const allOptions = quizQuestion.querySelectorAll('.quiz-option');
|
| 675 |
+
|
| 676 |
+
if (selectedAnswer === correctAnswer) {
|
| 677 |
+
optionEl.classList.add('correct');
|
| 678 |
+
} else {
|
| 679 |
+
optionEl.classList.add('incorrect');
|
| 680 |
+
}
|
| 681 |
+
|
| 682 |
+
allOptions.forEach(opt => {
|
| 683 |
+
const optText = opt.textContent.trim();
|
| 684 |
+
if (optText === correctAnswer) {
|
| 685 |
+
opt.classList.add('correct');
|
| 686 |
+
opt.innerHTML = `<i class="fas fa-check"></i> ${optText}`;
|
| 687 |
+
} else if (opt.classList.contains('incorrect')) {
|
| 688 |
+
opt.innerHTML = `<i class="fas fa-times"></i> ${optText}`;
|
| 689 |
+
}
|
| 690 |
});
|
| 691 |
+
|
| 692 |
+
explanation.style.display = 'block';
|
| 693 |
+
explanation.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
| 694 |
+
};
|
| 695 |
});
|
| 696 |
</script>
|
| 697 |
</body>
|