/** * 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(); }