Docfile commited on
Commit
de8c46c
·
verified ·
1 Parent(s): 78bf8a4

Update templates/index.html

Browse files
Files changed (1) hide show
  1. 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 les flashcards */
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:hover {
256
- transform: translateY(-2px);
257
- box-shadow: var(--shadow-lg);
258
- }
259
-
260
- .flashcard-content {
261
  position: relative;
262
- width: 100%;
263
- height: 100%;
264
- transition: transform 0.6s;
265
  transform-style: preserve-3d;
 
 
266
  }
267
 
268
- .flashcard.flipped .flashcard-content {
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
- background: var(--gray-50);
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
- .flip-hint {
 
294
  position: absolute;
295
- bottom: 8px;
296
- right: 12px;
297
  font-size: 0.8rem;
298
- color: var(--gray-600);
299
- opacity: 0.7;
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
- color: var(--primary-blue);
319
- margin-bottom: 16px;
320
- font-size: 1.1rem;
321
- font-weight: 600;
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
- .quiz-option:hover:not(.disabled) {
340
- border-color: var(--light-blue);
341
- background: var(--extra-light-blue);
342
- transform: translateX(4px);
343
  }
344
 
345
- .quiz-option.selected {
346
- border-color: var(--primary-blue);
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.disabled {
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
- // Simulation d'une requête (remplacez par votre API)
636
- setTimeout(() => {
637
- try {
638
- displayResults(sampleData[type], type);
 
 
 
 
 
 
 
 
 
 
 
639
  showMessage(`${type === 'flashcards' ? 'Flashcards' : 'Quiz'} généré avec succès !`, 'success');
640
- } catch (error) {
641
- console.error('Erreur:', error);
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
- }, 1500);
 
 
 
 
 
 
649
  });
650
 
651
  function displayResults(data, type) {
652
  resultsContainer.innerHTML = '';
653
 
654
  if (type === 'flashcards') {
 
655
  data.forEach((item, index) => {
656
- const flashcardEl = document.createElement('div');
657
- flashcardEl.className = 'flashcard fade-in';
658
- flashcardEl.style.animationDelay = `${index * 0.1}s`;
659
- flashcardEl.innerHTML = `
660
- <div class="flashcard-content">
 
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
- <i class="fas fa-lightbulb"></i> ${item.answer}
 
 
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" data-option="${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
- // Animation au focus des inputs
759
- const inputs = document.querySelectorAll('input[type="text"]');
760
- inputs.forEach(input => {
761
- input.addEventListener('focus', function() {
762
- this.closest('.form-group').style.transform = 'scale(1.02)';
763
- });
764
-
765
- input.addEventListener('blur', function() {
766
- this.closest('.form-group').style.transform = 'scale(1)';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>