/** * Fonction permettant de sauvegarder dans le stockage local le choix du thème * @param {String} scheme */ function saveColorScheme(scheme) { localStorage.setItem("theme", scheme); } /** * Fonction permettant de changer le thème du site * @param {String} scheme */ function setColorScheme(scheme) { document.documentElement.setAttribute("data-theme", scheme); } /** * Fonction permettant de récupérer le thème du système * @return {String} */ function getPreferredColorScheme() { if (window.matchMedia) { if (window.matchMedia("(prefers-color-scheme: dark)").matches) { return "dark"; } return "light"; } return "light"; } // INFO: On place un event sur le bouton const toggleSwitch = document.querySelector( '.theme-switch input[type="checkbox"]' ); /** * Event permettant de détecter les changements de thème du système */ if (window.matchMedia) { const colorSchemeQuery = window.matchMedia("(prefers-color-scheme: dark)"); colorSchemeQuery.addEventListener("change", () => { const selectedColorScheme = localStorage.getItem("theme") || "system"; if (selectedColorScheme === "system") { const preferedColorScheme = getPreferredColorScheme(); setColorScheme(preferedColorScheme); toggleSwitch.checked = preferedColorScheme === "dark"; } }); } const currentTheme = localStorage.getItem("theme") || getPreferredColorScheme(); // INFO: Au chargement de la page on détecte le thème à charger setColorScheme(currentTheme); toggleSwitch.checked = currentTheme === "dark"; toggleSwitch.addEventListener( "change", (e) => { e.preventDefault(); const scheme = e.target.checked ? "dark" : "light"; saveColorScheme(scheme); setColorScheme(scheme); }, false );