75 lines
2.7 KiB
JavaScript
75 lines
2.7 KiB
JavaScript
/**
|
|
* main.js — Point d'entrée de l'application
|
|
* =============================================================================
|
|
* Orchestre l'initialisation des modules. Chaque module est indépendant :
|
|
* si l'un échoue, les autres continuent de fonctionner.
|
|
*
|
|
* PRINCIPE DIRECTEUR — amélioration progressive
|
|
* ---------------------------------------------
|
|
* Le site est intégralement lisible, navigable et imprimable sans
|
|
* JavaScript. Tout ce que ce fichier ajoute relève du confort :
|
|
*
|
|
* - navigation.js : replie le menu sur petit écran
|
|
* - scroll-spy.js : surligne la section en cours de lecture
|
|
* - back-to-top.js : raccourci de remontée
|
|
* - copy-email.js : copie de l'adresse en un clic
|
|
*
|
|
* Aucun contenu n'est injecté par script : le HTML servi est complet.
|
|
* C'est ce qui garantit l'indexation par les moteurs de recherche et la
|
|
* lecture par les agents conversationnels, dont beaucoup n'exécutent pas
|
|
* JavaScript.
|
|
*
|
|
* CHARGEMENT
|
|
* ----------
|
|
* Ce fichier est appelé avec type="module", donc :
|
|
* - différé par défaut (équivalent à defer), il ne bloque pas le rendu
|
|
* - exécuté en mode strict
|
|
* - portée isolée, aucune variable globale
|
|
*/
|
|
|
|
import { initNavigation } from "./modules/navigation.js";
|
|
import { initScrollSpy } from "./modules/scroll-spy.js";
|
|
import { initBackToTop } from "./modules/back-to-top.js";
|
|
import { initCopyEmail } from "./modules/copy-email.js";
|
|
|
|
/**
|
|
* Démarre les modules de la page.
|
|
* @returns {void}
|
|
*/
|
|
function init() {
|
|
/* --- Signale que JS est actif : permet au CSS de n'appliquer certains
|
|
comportements (menu replié) que lorsqu'ils sont pilotables ------- */
|
|
document.documentElement.dataset.js = "true";
|
|
|
|
initNavigation({
|
|
toggle: document.querySelector("[data-nav-toggle]"),
|
|
nav: document.querySelector("[data-nav]"),
|
|
});
|
|
|
|
initScrollSpy({
|
|
sections: document.querySelectorAll("[data-section]"),
|
|
links: document.querySelectorAll("[data-nav-link]"),
|
|
});
|
|
|
|
initBackToTop({
|
|
button: document.querySelector("[data-to-top]"),
|
|
sentinel: document.querySelector("[data-scroll-sentinel]"),
|
|
});
|
|
|
|
initCopyEmail({
|
|
button: document.querySelector("[data-copy]"),
|
|
status: document.querySelector("[data-status]"),
|
|
});
|
|
}
|
|
|
|
/* -----------------------------------------------------------------------
|
|
Les modules sont différés, le DOM est donc normalement prêt. On teste
|
|
malgré tout readyState : cela rend le script robuste s'il est un jour
|
|
réutilisé dans un contexte de chargement différent.
|
|
----------------------------------------------------------------------- */
|
|
if (document.readyState === "loading") {
|
|
document.addEventListener("DOMContentLoaded", init, { once: true });
|
|
} else {
|
|
init();
|
|
}
|