#88 - Améliorer le switch sur le thème
This commit is contained in:
parent
c2ff54ecf2
commit
ec5e43889f
2 changed files with 71 additions and 66 deletions
|
@ -43,53 +43,6 @@ function hideToastr() {
|
||||||
x.getElementsByTagName("SPAN")[0].innerHTML = "";
|
x.getElementsByTagName("SPAN")[0].innerHTML = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de récupérer la valeur d'un cookie
|
|
||||||
* @param {String} cname
|
|
||||||
* @param {String} defaultValue
|
|
||||||
*
|
|
||||||
* @return {String}
|
|
||||||
*/
|
|
||||||
function getCookie(cname, defaultValue = "false") {
|
|
||||||
const name = `${cname}=`;
|
|
||||||
const decodedCookie = decodeURIComponent(document.cookie);
|
|
||||||
const ca = decodedCookie.split(";");
|
|
||||||
for (let i = 0; i < ca.length; i += 1) {
|
|
||||||
let c = ca[i];
|
|
||||||
while (c.charAt(0) === " ") {
|
|
||||||
c = c.substring(1);
|
|
||||||
}
|
|
||||||
if (c.indexOf(name) === 0) {
|
|
||||||
return c.substring(name.length, c.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de créer un cookie
|
|
||||||
* @param {String} cname
|
|
||||||
* @param {String} cvalue
|
|
||||||
* @param {Number} exdays
|
|
||||||
*/
|
|
||||||
function setCookie(cname, cvalue, exdays = 30) {
|
|
||||||
const d = new Date();
|
|
||||||
d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
|
|
||||||
const expires = `expires=${d.toUTCString()}`;
|
|
||||||
document.cookie = `${cname}=${cvalue};${expires};path=/`;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de switcher de thème clair/sombre
|
|
||||||
* @param {Object} e
|
|
||||||
*/
|
|
||||||
function switchTheme(e) {
|
|
||||||
const theme = e.target.checked ? "dark" : "light";
|
|
||||||
|
|
||||||
document.documentElement.setAttribute("data-theme", theme);
|
|
||||||
setCookie("theme", theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensemble d'actions effectuées au chargement de la page
|
* Ensemble d'actions effectuées au chargement de la page
|
||||||
*/
|
*/
|
||||||
|
@ -109,23 +62,4 @@ document.addEventListener("DOMContentLoaded", () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const toggleSwitch = document.querySelector(
|
|
||||||
'.theme-switch input[type="checkbox"]'
|
|
||||||
);
|
|
||||||
if (toggleSwitch) {
|
|
||||||
toggleSwitch.addEventListener("change", switchTheme, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
let currentThemeIsDark = getCookie("theme");
|
|
||||||
if (currentThemeIsDark === "false" && window.matchMedia) {
|
|
||||||
currentThemeIsDark = window.matchMedia("(prefers-color-scheme: dark)")
|
|
||||||
.matches
|
|
||||||
? "dark"
|
|
||||||
: "light";
|
|
||||||
}
|
|
||||||
switchTheme({ target: { checked: currentThemeIsDark === "dark" } });
|
|
||||||
if (toggleSwitch) {
|
|
||||||
toggleSwitch.checked = currentThemeIsDark === "dark";
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
71
javascripts/theme.js
Normal file
71
javascripts/theme.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
);
|
Loading…
Reference in a new issue