Site personnel courcellematthi.eu

This commit is contained in:
lrdlg
2026-08-05 22:40:03 +02:00
commit df12d21165
39 changed files with 4503 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
/**
* 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();
}