/** * 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"; } /** * @param {String} scheme */ function setPictoOnMenu(scheme) { document.querySelectorAll(".icon-theme").forEach((item) => { item.classList.add("hidden"); }); document .querySelector(`.icon-theme.theme-${scheme}`) .classList.remove("hidden"); } /** * 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 === "system" ? getPreferredColorScheme() : scheme ); setPictoOnMenu(scheme); } /** * Fonction déclenchée lorsqu'un utilisateur clique sur un bouton dans le menu déroulant * @param {Object} e */ function changeTheme(e) { e.preventDefault(); const scheme = this.dataset.value; saveColorScheme(scheme); setColorScheme(scheme); } // INFO: On place un event sur le bouton const buttonsTheme = document.getElementsByClassName("theme"); // INFO: On récupère du local storage (ou des préférences navigateur) le thème actuel const currentTheme = localStorage.getItem("theme") || getPreferredColorScheme(); /** * 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); } }); } // INFO: Au chargement de la page on détecte le thème à charger setColorScheme(currentTheme); // INFO: On place un event au click sur chacun des boutons du menu for (let i = 0; i < buttonsTheme.length; i += 1) { buttonsTheme[i].addEventListener("click", changeTheme, false); }