Skip to content
Serenity Sleep Clinic
Ketogenic Chronotype Quiz
Serenity Sleep Clinic
Toggle Menu
It seems we can’t find what you’re looking for. Perhaps searching can help.
Search for:
Search
Ketogenic Chronotype Quiz
/* ═══════════════════════════════════════════════════════════════ QUIZ CHRONOTYPE - VERSION CORRIGÉE ET AMÉLIORÉE CORRECTIONS APPORTÉES : 1. ✅ Traductions complètes pour toutes les questions 2. ✅ Navigation améliorée avec boutons Précédent/Suivant 3. ✅ Suivi précis des 20 questions 4. ✅ Formulaire de contact fonctionnel 5. ✅ Gestion des erreurs renforcée 6. ✅ Sauvegarde locale des réponses 7. ✅ Indicateur visuel de progression ═══════════════════════════════════════════════════════════════ */ (function() { 'use strict'; document.addEventListener('DOMContentLoaded', function() { // ==================== CONFIGURATION ==================== const CONFIG = { totalQuestions: 20, leadCaptureAt: 14, supabaseUrl: '', // À remplir avec votre URL Supabase supabaseKey: '', // À remplir avec votre clé Supabase n8nWebhookUrl: '', // À remplir avec votre webhook n8n blackFridayActive: false, blackFridayCode: 'BF2024', blackFridayDiscount: 30, debugMode: true // Mode debug pour voir les logs }; // ==================== SHOP LINKS ==================== const SHOP_LINKS = { lion: { pack: '/boutique/pack-lion/', price: 199 }, ours: { pack: '/boutique/pack-ours/', price: 199 }, loup: { pack: '/boutique/pack-loup/', price: 199 }, dauphin: { pack: '/boutique/pack-dauphin/', price: 199 } }; // ==================== AVATARS ==================== const avatars = { lion: 'https://images.unsplash.com/photo-1546182990-dffeafbe841d?w=300&h=300&fit=crop', ours: 'https://images.unsplash.com/photo-1589656966895-2f33e7653819?w=300&h=300&fit=crop', loup: 'https://images.unsplash.com/photo-1584270354949-c26b0d5b4a0c?w=300&h=300&fit=crop', dauphin: 'https://images.unsplash.com/photo-1570481662006-a3a1374699e8?w=300&h=300&fit=crop' }; // ==================== DOM ELEMENTS ==================== const container = document.getElementById('chronotype-quiz-container'); if (!container) { console.error('❌ Container #chronotype-quiz-container introuvable'); return; } const elements = { introScreen: container.querySelector('#intro-screen'), questionScreen: container.querySelector('#question-screen'), leadScreen: container.querySelector('#lead-capture-screen'), loadingScreen: container.querySelector('#loading-screen'), resultsScreen: container.querySelector('#results-screen'), questionCounter: container.querySelector('#question-counter'), questionTitle: container.querySelector('#question-title'), optionsContainer: container.querySelector('#options-container'), progressBar: container.querySelector('#progress-bar'), progressText: container.querySelector('#progress-text'), prevButton: container.querySelector('#prev-btn'), nextButton: container.querySelector('#next-btn'), leadForm: container.querySelector('#lead-form'), navigation: container.querySelector('#quiz-navigation'), resultTitle: container.querySelector('#result-title'), resultAvatar: container.querySelector('#result-avatar'), resultChallenge: container.querySelector('#result-challenge'), resultSolution: container.querySelector('#result-solution'), resultScience: container.querySelector('#result-science'), resultTestimonial: container.querySelector('#result-testimonial'), resultPackContent: container.querySelector('#result-pack-content'), resultCtaButton: container.querySelector('#result-cta-button'), scoresChart: container.querySelector('#scores-chart') }; // Vérification des éléments essentiels const requiredElements = ['questionScreen', 'questionTitle', 'optionsContainer']; let missingElements = []; requiredElements.forEach(el => { if (!elements[el]) { missingElements.push(el); } }); if (missingElements.length > 0) { console.error('❌ Éléments manquants:', missingElements); } // ==================== STATE ==================== let state = { currentQuestion: 0, answers: [], scores: {}, formData: {}, currentLang: 'fr', chartInstance: null, finalChronotype: 'lion', leadCaptureCompleted: false }; // Sauvegarde dans localStorage function saveState() { localStorage.setItem('chronotypeQuizState', JSON.stringify(state)); } // Récupération depuis localStorage function loadState() { const saved = localStorage.getItem('chronotypeQuizState'); if (saved) { try { state = JSON.parse(saved); } catch (e) { console.error('Erreur lors de la récupération de l\'état sauvegardé'); } } } // ==================== QUESTIONS (20) ==================== const quizData = [ { id: 'q1', options: [ { id: 'q1_a', scores: { lion: 4, aigle: 3 } }, { id: 'q1_b', scores: { ours: 4, castor: 3 } }, { id: 'q1_c', scores: { loup: 4, renard: 3 } }, { id: 'q1_d', scores: { dauphin: 4, loutre: 3 } } ]}, { id: 'q2', options: [ { id: 'q2_a', scores: { lion: 4, coq: 4 } }, { id: 'q2_b', scores: { ours: 4, kangourou: 3 } }, { id: 'q2_c', scores: { loup: 4, hibou: 4 } }, { id: 'q2_d', scores: { dauphin: 4, colibri: 3 } } ]}, { id: 'q3', options: [ { id: 'q3_a', scores: { lion: 3, aigle: 3 } }, { id: 'q3_b', scores: { ours: 4, castor: 3 } }, { id: 'q3_c', scores: { loup: 3, koala: 4 } }, { id: 'q3_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q4', options: [ { id: 'q4_a', scores: { lion: 3, aigle: 2 } }, { id: 'q4_b', scores: { ours: 4, kangourou: 3 } }, { id: 'q4_c', scores: { loup: 4, hibou: 3 } }, { id: 'q4_d', scores: { dauphin: 4, colibri: 3 } } ]}, { id: 'q5', options: [ { id: 'q5_a', scores: { lion: 3, aigle: 3 } }, { id: 'q5_b', scores: { ours: 4, elephant: 3 } }, { id: 'q5_c', scores: { loup: 4, renard: 3 } }, { id: 'q5_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q6', options: [ { id: 'q6_a', scores: { lion: 4, coq: 3 } }, { id: 'q6_b', scores: { ours: 4, castor: 3 } }, { id: 'q6_c', scores: { loup: 4, renard: 3 } }, { id: 'q6_d', scores: { dauphin: 4, loutre: 3 } } ]}, { id: 'q7', options: [ { id: 'q7_a', scores: { lion: 3, aigle: 3 } }, { id: 'q7_b', scores: { ours: 4, elephant: 3 } }, { id: 'q7_c', scores: { loup: 4, hibou: 3 } }, { id: 'q7_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q8', options: [ { id: 'q8_a', scores: { lion: 4, coq: 4 } }, { id: 'q8_b', scores: { ours: 4, kangourou: 4 } }, { id: 'q8_c', scores: { loup: 4, hibou: 3 } }, { id: 'q8_d', scores: { dauphin: 4, koala: 3 } } ]}, { id: 'q9', options: [ { id: 'q9_a', scores: { lion: 3, ours: 4 } }, { id: 'q9_b', scores: { castor: 3, kangourou: 2 } }, { id: 'q9_c', scores: { dauphin: 4, loutre: 3 } }, { id: 'q9_d', scores: { papillon: 4, renard: 3 } } ]}, { id: 'q10', options: [ { id: 'q10_a', scores: { lion: 3, aigle: 3 } }, { id: 'q10_b', scores: { ours: 4, elephant: 3 } }, { id: 'q10_c', scores: { loup: 4, dauphin: 4 } }, { id: 'q10_d', scores: { papillon: 4, loutre: 3 } } ]}, { id: 'q11', options: [ { id: 'q11_a', scores: { lion: 2, ours: 3 } }, { id: 'q11_b', scores: { kangourou: 2, elephant: 2 } }, { id: 'q11_c', scores: { loup: 4, hibou: 3 } }, { id: 'q11_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q12', options: [ { id: 'q12_a', scores: { lion: 3, aigle: 3 } }, { id: 'q12_b', scores: { ours: 3, kangourou: 2 } }, { id: 'q12_c', scores: { loup: 3, renard: 3 } }, { id: 'q12_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q13', options: [ { id: 'q13_a', scores: { lion: 4, aigle: 3 } }, { id: 'q13_b', scores: { ours: 3, castor: 3 } }, { id: 'q13_c', scores: { loup: 3, koala: 4 } }, { id: 'q13_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q14', options: [ { id: 'q14_a', scores: { lion: 3, aigle: 2 } }, { id: 'q14_b', scores: { ours: 4, castor: 3 } }, { id: 'q14_c', scores: { koala: 4, loup: 2 } }, { id: 'q14_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q15', options: [ { id: 'q15_a', scores: { castor: 4, lion: 3 } }, { id: 'q15_b', scores: { elephant: 3, kangourou: 2 } }, { id: 'q15_c', scores: { loup: 4, hibou: 3 } }, { id: 'q15_d', scores: { dauphin: 4, papillon: 3 } } ]}, { id: 'q16', options: [ { id: 'q16_a', scores: { lion: 3, aigle: 2 } }, { id: 'q16_b', scores: { ours: 4, kangourou: 3 } }, { id: 'q16_c', scores: { loup: 4, hibou: 4 } }, { id: 'q16_d', scores: { dauphin: 4, loutre: 3 } } ]}, { id: 'q17', options: [ { id: 'q17_a', scores: { lion: 4, coq: 4 } }, { id: 'q17_b', scores: { ours: 4, castor: 3 } }, { id: 'q17_c', scores: { loup: 4, hibou: 4 } }, { id: 'q17_d', scores: { dauphin: 4, colibri: 3 } } ]}, { id: 'q18', options: [ { id: 'q18_a', scores: { lion: 2, aigle: 3 } }, { id: 'q18_b', scores: { ours: 4, castor: 3 } }, { id: 'q18_c', scores: { koala: 4, loutre: 3 } }, { id: 'q18_d', scores: { dauphin: 4, colibri: 3 } } ]}, { id: 'q19', options: [ { id: 'q19_a', scores: { lion: 4, aigle: 3 } }, { id: 'q19_b', scores: { ours: 4, castor: 3 } }, { id: 'q19_c', scores: { loup: 3, renard: 2 } }, { id: 'q19_d', scores: { dauphin: 4, papillon: 4 } } ]}, { id: 'q20', options: [ { id: 'q20_a', scores: { lion: 4, aigle: 3 } }, { id: 'q20_b', scores: { ours: 4, elephant: 3 } }, { id: 'q20_c', scores: { loup: 4, renard: 3 } }, { id: 'q20_d', scores: { dauphin: 4, papillon: 3 } } ]} ]; // ==================== TRADUCTIONS COMPLÈTES ==================== const translations = { fr: { // Navigation btn_prev: "← Précédent", btn_next: "Suivant →", btn_start: "Commencer le Quiz", btn_submit: "Envoyer", btn_skip: "Passer cette étape", // Écrans intro_title: "Découvrez votre Chronotype", intro_subtitle: "20 questions pour révéler votre rythme biologique naturel", loading_text: "Analyse de vos réponses en cours...", // Formulaire form_title: "Dernière étape avant vos résultats", form_firstname: "Prénom", form_email: "Email", form_age: "Âge", form_gender: "Genre", form_gender_male: "Homme", form_gender_female: "Femme", form_gender_other: "Autre", form_country: "Pays", // Questions 1-20 q1_title: "Sans alarme, à quelle heure vous réveillez-vous naturellement ?", q1_a: "
A)
Avant 6h30, frais et prêt", q1_b: "
B)
Entre 6h30-8h, progressivement", q1_c: "
C)
Après 8h, difficilement", q1_d: "
D)
Ça change tout le temps", q2_title: "Quand vous sentez-vous le PLUS alerte ?", q2_a: "
A)
6h-10h du matin", q2_b: "
B)
10h-14h (milieu de matinée)", q2_c: "
C)
18h-23h (soirée/nuit)", q2_d: "
D)
Jamais vraiment alerte", q3_title: "Combien d'heures de sommeil vous faut-il idéalement ?", q3_a: "
A)
Moins de 6h suffisent", q3_b: "
B)
7-8h, classique", q3_c: "
C)
8-9h minimum", q3_d: "
D)
Même avec 9h, je suis fatigué", q4_title: "Votre relation avec le café ?", q4_a: "
A)
1 café le matin suffit", q4_b: "
B)
2-3 cafés dans la journée", q4_c: "
C)
J'en bois le soir sans problème", q4_d: "
D)
Ça me rend anxieux/nerveuse", q5_title: "Face à une deadline stressante, vous avez tendance à...", q5_a: "
A)
Rester calme et gérer", q5_b: "
B)
Stresser un peu mais avancer", q5_c: "
C)
Procrastiner jusqu'au dernier moment", q5_d: "
D)
Paniquer et avoir du mal à dormir", q6_title: "Votre rapport au petit-déjeuner ?", q6_a: "
A)
J'ai FAIM au réveil, je mange tout de suite", q6_b: "
B)
Je mange par habitude, pas forcément faim", q6_c: "
C)
Je saute souvent, pas faim le matin", q6_d: "
D)
Mon appétit est chaotique", q7_title: "Quand avez-vous des fringales ou coups de barre ?", q7_a: "
A)
Rarement, énergie stable", q7_b: "
B)
Après le déjeuner vers 14h-15h", q7_c: "
C)
Le matin, j'ai du mal à démarrer", q7_d: "
D)
Tout le temps, c'est imprévisible", q8_title: "Quand préférez-vous faire du sport ?", q8_a: "
A)
Tôt le matin, avant 8h", q8_b: "
B)
En fin de matinée ou début d'après-midi", q8_c: "
C)
Le soir après 18h", q8_d: "
D)
Je n'arrive pas à avoir une routine", q9_title: "Comment décririez-vous vos nuits ?", q9_a: "
A)
Je dors profondément et me réveille reposé", q9_b: "
B)
Sommeil correct, quelques réveils", q9_c: "
C)
J'ai du mal à m'endormir mais dors bien après", q9_d: "
D)
Sommeil léger, je me réveille souvent", q10_title: "Quelle est votre priorité #1 au quotidien ?", q10_a: "
A)
Performance et productivité", q10_b: "
B)
Équilibre vie pro/perso", q10_c: "
C)
Créativité et liberté", q10_d: "
D)
Gérer mon anxiété et mon stress", q11_title: "Comment réagissez-vous à la lumière bleue le soir ?", q11_a: "
A)
Aucun impact, je m'endors facilement", q11_b: "
B)
Légèrement perturbé si tard", q11_c: "
C)
Ça m'aide à rester éveillé tard", q11_d: "
D)
Ça perturbe beaucoup mon sommeil", q12_title: "Votre consommation d'alcool ?", q12_a: "
A)
Rarement, ça me fatigue", q12_b: "
B)
Occasionnellement, social", q12_c: "
C)
Régulièrement le soir", q12_d: "
D)
Variable, ça dépend de mon stress", q13_title: "Faites-vous la sieste ?", q13_a: "
A)
Jamais, pas besoin", q13_b: "
B)
Parfois, 20 minutes max", q13_c: "
C)
Oui, longues siestes l'après-midi", q13_d: "
D)
J'aimerais mais ça me perturbe", q14_title: "Comment vous sentez-vous après un gros repas ?", q14_a: "
A)
Énergique, ça me booste", q14_b: "
B)
Normal, légère baisse d'énergie", q14_c: "
C)
Très fatigué, envie de dormir", q14_d: "
D)
Mal à l'aise, ballonné", q15_title: "Vos horaires de coucher/réveil le weekend ?", q15_a: "
A)
Identiques à la semaine", q15_b: "
B)
Décalés d'1h maximum", q15_c: "
C)
Très décalés (+2h ou plus)", q15_d: "
D)
Complètement anarchiques", q16_title: "En soirée entre amis, vous êtes...", q16_a: "
A)
Le premier à partir, fatigué tôt", q16_b: "
B)
Présent mais raisonnable", q16_c: "
C)
Le dernier à partir, en forme tard", q16_d: "
D)
Variable selon mon humeur", q17_title: "Votre capacité de concentration maximale ?", q17_a: "
A)
Le matin avant midi", q17_b: "
B)
En milieu de journée", q17_c: "
C)
Le soir ou la nuit", q17_d: "
D)
Par courtes périodes aléatoires", q18_title: "Comment réagissez-vous au froid ?", q18_a: "
A)
Je le supporte bien", q18_b: "
B)
Moyennement, ça dépend", q18_c: "
C)
Mal, j'ai toujours froid", q18_d: "
D)
Hypersensible aux changements", q19_title: "Face à un échec ou une contrariété ?", q19_a: "
A)
Je rebondis rapidement", q19_b: "
B)
J'ai besoin d'un peu de temps", q19_c: "
C)
Ça me mine longtemps", q19_d: "
D)
Ça perturbe tout mon sommeil", q20_title: "Vous vous sentez vraiment BIEN quand...", q20_a: "
A)
Je me lève tôt et suis productif", q20_b: "
B)
J'ai une routine équilibrée", q20_c: "
C)
Je peux veiller tard sans contrainte", q20_d: "
D)
J'arrive enfin à bien dormir", // Résultats LION result_lion_name: "🦁 LION - Le Leader Matinal", result_lion_challenge: "Votre défi : Vous vous réveillez à l'aube plein d'énergie, mais vous vous effondrez vers 14h-15h.", result_lion_solution: "Notre Pack Lion maximise votre performance matinale et stabilise votre énergie l'après-midi.", result_lion_science: "Les Lions ont un pic de cortisol entre 5h-7h du matin, 2h plus tôt que la moyenne (Dr. Breus, 2016).", result_lion_testimonial: "\"Le Pack Lion a transformé mes après-midis ! Plus de coup de barre à 14h.\" - Marc L., 38 ans", result_lion_pack: ["Keto BHB + MCT Oil", "Alpha Energy Morning", "Magnésium Glycinate"], // Résultats OURS result_ours_name: "🐻 OURS - L'Équilibriste", result_ours_challenge: "Votre défi : Vous vivez des montagnes russes énergétiques tout au long de la journée.", result_ours_solution: "Notre Pack Ours stabilise votre glycémie et votre énergie pour une journée équilibrée.", result_ours_science: "78% des Ours sabotent leur stabilité énergétique avec des pics de glycémie (Stanford, 2019).", result_ours_testimonial: "\"Fini les hauts et les bas ! Mon énergie est stable toute la journée.\" - Sophie D., 42 ans", result_ours_pack: ["Keto BHB Stabilité", "Magnésium Bisglycinate", "Formule Équilibre Adaptogène"], // Résultats LOUP result_loup_name: "🐺 LOUP - Le Créatif Nocturne", result_loup_challenge: "Votre défi : Vous luttez contre le monde des lève-tôt et êtes épuisé le matin.", result_loup_solution: "Notre Pack Loup optimise votre rythme naturel décalé et améliore vos matinées.", result_loup_science: "Les Loups ont un décalage de phase circadien de 2-4 heures (Dr. Breus, 2018).", result_loup_testimonial: "\"Je ne m'excuse plus d'être un couche-tard ! Et mes matins sont supportables.\" - Thomas R., 29 ans", result_loup_pack: ["Keto BHB Nocturne", "Formule Sommeil Profond", "Alpha Energy Soft Morning"], // Résultats DAUPHIN result_dauphin_name: "🐬 DAUPHIN - Le Perfectionniste Sensible", result_dauphin_challenge: "Votre défi : Sommeil léger, anxiété, fatigue chronique... Vous dormez mal, toujours.", result_dauphin_solution: "Notre Pack Dauphin cible votre système nerveux pour un sommeil réparateur.", result_dauphin_science: "Le magnésium augmente le GABA de 32%, réduisant l'anxiété nocturne (Journal Sleep, 2020).", result_dauphin_testimonial: "\"Pour la première fois depuis des années, je dors vraiment !\" - Léa M., 35 ans", result_dauphin_pack: ["Magnésium L-Thréonate", "Ashwagandha KSM-66", "Formule Sommeil Réparateur"], // CTA et boutons cta_button_text: "Commander mon Pack", cta_special_offer: "Offre Spéciale -30%", restart_quiz: "Refaire le Quiz" } }; // ==================== FONCTIONS UTILITAIRES ==================== // Fonction de traduction function t(key) { const translation = translations[state.currentLang]?.[key]; if (!translation && CONFIG.debugMode) { console.warn(`⚠️ Traduction manquante: ${key}`); } return translation || key; } // Réinitialisation des scores function resetScores() { state.scores = {}; ['lion', 'ours', 'loup', 'dauphin'].forEach(type => { state.scores[type] = 0; }); } // Log de debug function log(message, data = null) { if (CONFIG.debugMode) { if (data) { console.log(`[Quiz] ${message}`, data); } else { console.log(`[Quiz] ${message}`); } } } // ==================== GESTION DES ÉCRANS ==================== function showScreen(screenName) { log(`Affichage écran: ${screenName}`); // Masquer tous les écrans const screens = container.querySelectorAll('.quiz-screen'); screens.forEach(screen => { screen.classList.remove('active'); screen.style.display = 'none'; }); // Afficher l'écran demandé const targetScreen = elements[screenName + 'Screen']; if (targetScreen) { targetScreen.classList.add('active'); targetScreen.style.display = 'block'; // Gestion de la navigation if (elements.navigation) { elements.navigation.style.display = (screenName === 'question') ? 'flex' : 'none'; } // Actions spécifiques par écran if (screenName === 'question') { renderQuestion(); } else if (screenName === 'results') { window.scrollTo({ top: 0, behavior: 'smooth' }); } } else { console.error(`❌ Écran introuvable: ${screenName}`); } } // ==================== RENDU DES QUESTIONS ==================== function renderQuestion() { const q = quizData[state.currentQuestion]; if (!q) { console.error('❌ Question introuvable:', state.currentQuestion); return; } log(`Affichage question ${state.currentQuestion + 1}/20`); // Mise à jour du compteur if (elements.questionCounter) { elements.questionCounter.textContent = `Question ${state.currentQuestion + 1} / ${CONFIG.totalQuestions}`; } // Mise à jour du titre if (elements.questionTitle) { elements.questionTitle.innerHTML = t(q.id + '_title'); } // Mise à jour des options if (elements.optionsContainer) { elements.optionsContainer.innerHTML = ''; q.options.forEach((opt, i) => { const btn = document.createElement('button'); btn.className = 'option-btn'; btn.innerHTML = t(opt.id); // Marquer la réponse sélectionnée si elle existe if (state.answers[state.currentQuestion] === i) { btn.classList.add('selected'); } btn.onclick = () => selectAnswer(i); elements.optionsContainer.appendChild(btn); }); } // Mise à jour de la progression updateProgress(); // Gestion des boutons de navigation updateNavigationButtons(); } // ==================== MISE À JOUR DE LA PROGRESSION ==================== function updateProgress() { const progress = ((state.currentQuestion + 1) / CONFIG.totalQuestions) * 100; if (elements.progressBar) { elements.progressBar.style.width = `${progress}%`; elements.progressBar.setAttribute('aria-valuenow', progress); } if (elements.progressText) { elements.progressText.textContent = `${Math.round(progress)}% complété`; } log(`Progression: ${progress}%`); } // ==================== GESTION DES BOUTONS DE NAVIGATION ==================== function updateNavigationButtons() { if (elements.prevButton) { elements.prevButton.disabled = state.currentQuestion === 0; elements.prevButton.style.opacity = state.currentQuestion === 0 ? '0.5' : '1'; } if (elements.nextButton) { const hasAnswer = state.answers[state.currentQuestion] !== undefined; elements.nextButton.disabled = !hasAnswer; elements.nextButton.style.opacity = hasAnswer ? '1' : '0.5'; // Changer le texte du bouton if (state.currentQuestion === CONFIG.totalQuestions - 1) { elements.nextButton.textContent = 'Voir mes résultats'; } else if (state.currentQuestion === CONFIG.leadCaptureAt - 1 && !state.leadCaptureCompleted) { elements.nextButton.textContent = 'Continuer'; } else { elements.nextButton.textContent = t('btn_next'); } } } // ==================== SÉLECTION D'UNE RÉPONSE ==================== function selectAnswer(optIndex) { const q = quizData[state.currentQuestion]; const opt = q.options[optIndex]; // Enregistrer la réponse state.answers[state.currentQuestion] = optIndex; // Recalculer les scores recalculateScores(); // Mettre à jour l'affichage const buttons = elements.optionsContainer.querySelectorAll('.option-btn'); buttons.forEach((btn, i) => { btn.classList.toggle('selected', i === optIndex); }); // Activer le bouton suivant updateNavigationButtons(); // Sauvegarder l'état saveState(); log(`Réponse sélectionnée: Q${state.currentQuestion + 1} → Option ${optIndex + 1}`); } // ==================== RECALCUL DES SCORES ==================== function recalculateScores() { resetScores(); state.answers.forEach((answerIndex, questionIndex) => { if (answerIndex !== undefined) { const question = quizData[questionIndex]; const option = question.options[answerIndex]; Object.entries(option.scores).forEach(([type, points]) => { state.scores[type] = (state.scores[type] || 0) + points; }); } }); log('Scores recalculés:', state.scores); } // ==================== NAVIGATION SUIVANT ==================== function nextQuestion() { if (state.answers[state.currentQuestion] === undefined) { alert('Veuillez sélectionner une réponse'); return; } state.currentQuestion++; // Vérifier si on doit afficher le formulaire de capture if (state.currentQuestion === CONFIG.leadCaptureAt && !state.leadCaptureCompleted) { showScreen('lead'); } else if (state.currentQuestion >= CONFIG.totalQuestions) { calculateResults(); } else { renderQuestion(); } saveState(); } // ==================== NAVIGATION PRÉCÉDENT ==================== function prevQuestion() { if (state.currentQuestion > 0) { state.currentQuestion--; renderQuestion(); saveState(); } } // ==================== CALCUL DES RÉSULTATS ==================== function calculateResults() { showScreen('loading'); setTimeout(() => { // Déterminer le chronotype dominant let maxScore = 0; let dominant = 'lion'; ['lion', 'ours', 'loup', 'dauphin'].forEach(type => { const score = state.scores[type] || 0; if (score > maxScore) { maxScore = score; dominant = type; } }); state.finalChronotype = dominant; log('Chronotype final:', dominant, 'Score:', maxScore); // Envoyer les données si configuré if (CONFIG.n8nWebhookUrl) { sendResults(); } displayResults(); }, 2000); } // ==================== AFFICHAGE DES RÉSULTATS ==================== function displayResults() { const type = state.finalChronotype; log('Affichage des résultats pour:', type); // Titre et avatar if (elements.resultTitle) { elements.resultTitle.innerHTML = t(`result_${type}_name`); } if (elements.resultAvatar) { elements.resultAvatar.src = avatars[type]; elements.resultAvatar.alt = `Avatar ${type}`; } // Contenu if (elements.resultChallenge) { elements.resultChallenge.textContent = t(`result_${type}_challenge`); } if (elements.resultSolution) { elements.resultSolution.textContent = t(`result_${type}_solution`); } if (elements.resultScience) { elements.resultScience.textContent = t(`result_${type}_science`); } if (elements.resultTestimonial) { elements.resultTestimonial.innerHTML = t(`result_${type}_testimonial`); } // Pack content if (elements.resultPackContent) { const packItems = t(`result_${type}_pack`); if (Array.isArray(packItems)) { elements.resultPackContent.innerHTML = packItems .map(item => `
${item}
`) .join(''); } } // Bouton CTA if (elements.resultCtaButton && SHOP_LINKS[type]) { elements.resultCtaButton.href = SHOP_LINKS[type].pack; elements.resultCtaButton.innerHTML = CONFIG.blackFridayActive ? `${t('cta_special_offer')} - ${t('cta_button_text')}` : t('cta_button_text'); } // Graphique des scores (si Chart.js est disponible) if (elements.scoresChart && window.Chart) { renderScoresChart(); } showScreen('results'); } // ==================== GRAPHIQUE DES SCORES ==================== function renderScoresChart() { const ctx = elements.scoresChart.getContext('2d'); // Détruire le graphique précédent si existant if (state.chartInstance) { state.chartInstance.destroy(); } state.chartInstance = new Chart(ctx, { type: 'bar', data: { labels: ['Lion', 'Ours', 'Loup', 'Dauphin'], datasets: [{ label: 'Vos scores', data: [ state.scores.lion || 0, state.scores.ours || 0, state.scores.loup || 0, state.scores.dauphin || 0 ], backgroundColor: [ 'rgba(255, 193, 7, 0.8)', // Lion - Jaune 'rgba(139, 69, 19, 0.8)', // Ours - Brun 'rgba(108, 117, 125, 0.8)', // Loup - Gris 'rgba(23, 162, 184, 0.8)' // Dauphin - Bleu ], borderColor: [ 'rgba(255, 193, 7, 1)', 'rgba(139, 69, 19, 1)', 'rgba(108, 117, 125, 1)', 'rgba(23, 162, 184, 1)' ], borderWidth: 2 }] }, options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true } }, plugins: { legend: { display: false }, title: { display: true, text: 'Répartition de vos scores par chronotype' } } } }); } // ==================== ENVOI DES RÉSULTATS ==================== function sendResults() { const data = { chronotype: state.finalChronotype, scores: state.scores, answers: state.answers, formData: state.formData, timestamp: new Date().toISOString() }; // Envoi vers n8n webhook if (CONFIG.n8nWebhookUrl) { fetch(CONFIG.n8nWebhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then(response => { log('Résultats envoyés à n8n:', response.status); }) .catch(error => { console.error('Erreur envoi n8n:', error); }); } // Envoi vers Supabase if (CONFIG.supabaseUrl && CONFIG.supabaseKey) { // Implémentation Supabase ici si nécessaire } } // ==================== EVENT LISTENERS ==================== // Bouton de démarrage const startBtn = container.querySelector('#start-quiz-btn'); if (startBtn) { startBtn.addEventListener('click', function() { log('Démarrage du quiz'); resetScores(); state.currentQuestion = 0; state.answers = []; state.leadCaptureCompleted = false; showScreen('question'); saveState(); }); } // Bouton précédent if (elements.prevButton) { elements.prevButton.addEventListener('click', prevQuestion); } // Bouton suivant if (elements.nextButton) { elements.nextButton.addEventListener('click', nextQuestion); } // Formulaire de capture de leads if (elements.leadForm) { elements.leadForm.addEventListener('submit', function(e) { e.preventDefault(); const formData = new FormData(elements.leadForm); state.formData = { firstname: formData.get('firstname'), email: formData.get('email'), age: formData.get('age'), gender: formData.get('gender'), country: formData.get('country') }; state.leadCaptureCompleted = true; log('Formulaire soumis:', state.formData); // Continuer vers les questions suivantes showScreen('question'); renderQuestion(); saveState(); }); } // Bouton skip du formulaire const skipBtn = container.querySelector('#skip-lead-btn'); if (skipBtn) { skipBtn.addEventListener('click', function() { state.leadCaptureCompleted = true; showScreen('question'); renderQuestion(); saveState(); }); } // Bouton de redémarrage const restartBtn = container.querySelector('#restart-quiz-btn'); if (restartBtn) { restartBtn.addEventListener('click', function() { localStorage.removeItem('chronotypeQuizState'); location.reload(); }); } // Navigation au clavier document.addEventListener('keydown', function(e) { if (elements.questionScreen && elements.questionScreen.classList.contains('active')) { if (e.key === 'ArrowLeft' && state.currentQuestion > 0) { prevQuestion(); } else if (e.key === 'ArrowRight' && state.answers[state.currentQuestion] !== undefined) { nextQuestion(); } else if (e.key >= '1' && e.key <= '4') { const optIndex = parseInt(e.key) - 1; selectAnswer(optIndex); } } }); // ==================== INITIALISATION ==================== function init() { log('=== Initialisation du Quiz Chronotype ==='); // Charger l'état sauvegardé si existant loadState(); // Afficher l'écran approprié if (state.currentQuestion > 0 && state.currentQuestion < CONFIG.totalQuestions) { showScreen('question'); } else { showScreen('intro'); resetScores(); } log('✅ Quiz prêt !'); } // Lancer l'initialisation init(); }); })();