From 9986179153e7265077d06593d2373ec4224efd5b Mon Sep 17 00:00:00 2001 From: ouidade Date: Tue, 9 Dec 2025 12:54:21 +0100 Subject: [PATCH] header sans animation --- .../quartiers_de_demain/dist/assets/bundle.js | 621 +++++----- .../dist/assets/bundle.js.map | 2 +- .../dist/assets/css/bundle.css | 313 ++--- .../src/assets/js/header.js | 622 +++++----- .../src/assets/scss/partials/header.scss | 1073 ++++++++++------- .../field--block-content--logo-link.html.twig | 4 +- 6 files changed, 1300 insertions(+), 1335 deletions(-) diff --git a/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js b/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js index e1dba3f..317d253 100644 --- a/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js +++ b/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js @@ -785,194 +785,74 @@ document.addEventListener('keydown', (e) => { /*!*********************************!*\ !*** ./src/assets/js/header.js ***! \*********************************/ -// // //////// start header //////////// + + + // // document.addEventListener('DOMContentLoaded', function() { -// // const header = document.querySelector('header[role="banner"]'); -// // const logo = document.querySelector('#block-quartiers-de-demain-logoquartiersdedemain > div:nth-child(1) > div:nth-child(1) > a:nth-child(1) > svg:nth-child(1)'); -// // const headerNavContainer = document.querySelector('.header_nav_container'); -// // const isFirstLoad = !performance.getEntriesByType("navigation")[0].type.includes('back_forward'); -// // const isTargetPath = window.location.pathname === '/'; - -// // // Fonction pour démarrer l'animation du logo SVG -// // function startLogoAnimation() { -// // logo.classList.add('animated'); -// // } - -// // // Fonction pour arrêter l'animation du logo SVG -// // function stopLogoAnimation() { -// // logo.classList.remove('animated'); -// // } - -// // // Vérifier si le header a la classe header--collapse -// // function checkHeaderCollapse() { -// // if (header.classList.contains('header--collapsed')) { -// // stopLogoAnimation(); -// // } else if (header.classList.contains('header--collapsed-already')) { -// // stopLogoAnimation(); -// // } else { -// // startLogoAnimation(); -// // } - -// // } +// // const header = document.querySelector('header[role="banner"]'); +// // const headerNavContainer = document.querySelector('.header_nav_container'); +// // const threshold = 100; +// // let lastScrollTop = 0; +// // let isHidden = false; +// // let introDone = true; // ✅ plus d'intro, donc on considère qu'elle est "déjà finie" +// // /* ------------------- +// // Animations nav +// // ------------------- */ -// // // Appeler la fonction au chargement initial -// // checkHeaderCollapse(); - -// // // Observer les changements de classe sur le header -// // const observer = new MutationObserver(function(mutations) { -// // mutations.forEach(function(mutation) { -// // if (mutation.attributeName === 'class') { -// // checkHeaderCollapse(); -// // } -// // }); +// // function slideOut() { +// // headerNavContainer.animate([ +// // { transform: 'translateX(0)' }, +// // { transform: 'translateX(-100%)' } +// // ], { +// // duration: 300, +// // fill: 'forwards' // // }); -// // observer.observe(header, { attributes: true }); - - -// // // Si ce n'est pas la première charge ou si le chemin n'est pas le chemin cible, ajouter la classe immédiatement -// // if (!isFirstLoad || !isTargetPath) { -// // header.classList.add('header--collapsed-already'); -// // stopLogoAnimation(); -// // } else { -// // // Sinon, appliquer la transition après un délai, sauf si scroll -// // let collapseTimeout = setTimeout(() => { -// // header.classList.add('header--collapsed'); -// // }, 1000); - -// // function interruptCollapseOnScroll() { -// // if (!header.classList.contains('header--collapsed')) { -// // clearTimeout(collapseTimeout); // annule l'animation -// // header.classList.add('header--collapsed'); -// // } -// // window.removeEventListener('scroll', interruptCollapseOnScroll); // une seule fois -// // } - -// // window.addEventListener('scroll', interruptCollapseOnScroll); -// // } -// // ////////////////////////////////////// - -// // let lastScrollTop = 0; -// // let threshold = 100; // Change this value as needed -// // let isHidden = false; - -// // function slideOut() { -// // headerNavContainer.animate([ -// // { transform: 'translateX(0)' }, -// // { transform: 'translateX(-100%)' } -// // ], { -// // duration: 300, -// // fill: 'forwards' -// // }); -// // isHidden = true; -// // } - -// // function slideIn() { -// // headerNavContainer.animate([ -// // { transform: 'translateX(-100%)' }, -// // { transform: 'translateX(0)' } -// // ], { -// // duration: 300, -// // fill: 'forwards' -// // }); -// // isHidden = false; -// // } - -// // function slideDown() { -// // // headerNavContainer.style.display = 'block'; -// // headerNavContainer.animate([ -// // { transform: 'translateY(0%)' }, -// // { transform: 'translateY(+100%)' } -// // ], { -// // duration: 300, -// // fill: 'forwards' -// // }); -// // isHidden = false; -// // } - -// // function slideUp() { -// // headerNavContainer.animate([ -// // { transform: 'translateY(100%)' }, -// // { transform: 'translateY(0%)' } -// // ], { -// // duration: 300, -// // fill: 'forwards' -// // }).onfinish = function() { -// // // headerNavContainer.style.display = 'none'; -// // }; -// // isHidden = true; -// // } -// // // Fonction pour ajuster la hauteur du header lors du défilement -// // function adjustHeaderHeight() { -// // if (window.scrollY > 0) { -// // header.classList.add('shrink'); -// // } else { -// // header.classList.remove('shrink'); -// // } -// // } - -// // function handleScroll() { -// // let scrollTop = window.pageYOffset || document.documentElement.scrollTop; -// // const isMobile = window.innerWidth < 811; - -// // if (scrollTop > threshold && !isHidden) { -// // if (isMobile) { -// // slideUp(); -// // } else { -// // slideOut(); -// // } -// // } else if (scrollTop <= threshold && isHidden) { -// // if (isMobile) { -// // slideDown(); -// // } else { -// // slideIn(); -// // } -// // } - - -// // lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; // For Mobile or negative scrolling -// // } - -// // function handleTouchAndMouseEnter() { -// // if (isHidden) { -// // if (window.innerWidth < 811) { -// // slideDown(); -// // } else { -// // slideIn(); -// // } -// // } -// // } - -// // function handleTouchAndMouseLeave() { -// // if (lastScrollTop > threshold && !isHidden) { -// // if (window.innerWidth < 811) { -// // slideUp(); -// // } else { -// // slideOut(); -// // } -// // } -// // } - -// // window.addEventListener('scroll', handleScroll); -// // window.addEventListener('scroll', adjustHeaderHeight); - -// // // Mouse events for desktop -// // header.addEventListener('mouseenter', handleTouchAndMouseEnter); -// // header.addEventListener('mouseleave', handleTouchAndMouseLeave); - -// // // Touch events for tablets and mobile devices -// // header.addEventListener('touchstart', handleTouchAndMouseEnter); -// // header.addEventListener('touchend', handleTouchAndMouseLeave); - -// // // Initial check to see if we're at the top of the page +// // isHidden = true; +// // } + +// // function slideIn() { +// // headerNavContainer.animate([ +// // { transform: 'translateX(-100%)' }, +// // { transform: 'translateX(0)' } +// // ], { +// // duration: 300, +// // fill: 'forwards' +// // }); +// // isHidden = false; +// // } + +// // function slideDown() { +// // headerNavContainer.animate([ +// // { transform: 'translateY(-100%)' }, +// // { transform: 'translateY(0%)' } +// // ], { +// // duration: 300, +// // fill: 'forwards' +// // }); +// // isHidden = false; +// // } + +// // function slideUp() { +// // headerNavContainer.animate([ +// // { transform: 'translateY(0%)' }, +// // { transform: 'translateY(-100%)' } +// // ], { +// // duration: 300, +// // fill: 'forwards' +// // }); +// // isHidden = true; +// // } + +// // function initNavPosition() { // // if (window.pageYOffset <= threshold) { // // if (window.innerWidth < 811) { // // slideDown(); -// // } else { +// // } else { // // slideIn(); -// // } +// // } // // } else { // // if (window.innerWidth < 811) { // // slideUp(); @@ -980,105 +860,227 @@ document.addEventListener('keydown', (e) => { // // slideIn(); // // } // // } - -// // }); - -// // //////// end header //////////// - +// // } + +// // /* ------------------- +// // Scroll / resize header +// // ------------------- */ + +// // function adjustHeaderHeight() { +// // if (window.scrollY > 0) { +// // header.classList.add('shrink'); +// // } else { +// // header.classList.remove('shrink'); +// // } +// // } + +// // function handleScroll() { +// // if (!introDone) return; // ici ça passe, introDone = true + +// // let scrollTop = window.pageYOffset || document.documentElement.scrollTop; +// // const isMobile = window.innerWidth < 811; + +// // if (scrollTop > threshold && !isHidden) { +// // if (isMobile) { +// // slideUp(); +// // } else { +// // slideOut(); +// // } +// // } else if (scrollTop <= threshold && isHidden) { +// // if (isMobile) { +// // slideDown(); +// // } else { +// // slideIn(); +// // } +// // } + +// // lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; +// // } + +// // function handleTouchAndMouseEnter() { +// // if (!introDone) return; + +// // if (isHidden) { +// // if (window.innerWidth < 811) { +// // slideDown(); +// // } else { +// // slideIn(); +// // } +// // } +// // } + +// // function handleTouchAndMouseLeave() { +// // if (!introDone) return; + +// // if (lastScrollTop > threshold && !isHidden) { +// // if (window.innerWidth < 811) { +// // slideUp(); +// // } else { +// // slideOut(); +// // } +// // } +// // } + +// // // ✅ on n'a plus besoin de masquer la nav au début +// // if (headerNavContainer) { +// // headerNavContainer.style.visibility = 'visible'; +// // } + +// // window.addEventListener('scroll', handleScroll); +// // window.addEventListener('scroll', adjustHeaderHeight); + +// // header.addEventListener('mouseenter', handleTouchAndMouseEnter); +// // header.addEventListener('mouseleave', handleTouchAndMouseLeave); + +// // header.addEventListener('touchstart', handleTouchAndMouseEnter); +// // header.addEventListener('touchend', handleTouchAndMouseLeave); + +// // // ✅ position initiale de la nav +// // initNavPosition(); + +// // }); -///////////////start header sans animation logo//////////////// +// document.addEventListener('DOMContentLoaded', function() { -document.addEventListener('DOMContentLoaded', function() { +// const header = document.querySelector('header[role="banner"]'); +// const headerNavContainer = document.querySelector('.header_nav_container'); +// if (!header || !headerNavContainer) return; + +// const threshold = 100; +// let lastScrollTop = 0; +// let isHidden = false; +// let introDone = true; // ✅ pas d'intro, donc direct prêt + +// /* ------------------- +// Helpers show / hide +// ------------------- */ + +// function hideNav() { +// headerNavContainer.classList.add('nav-hidden'); +// isHidden = true; +// } + +// function showNav() { +// headerNavContainer.classList.remove('nav-hidden'); +// isHidden = false; +// } + +// function isMobile() { +// return window.innerWidth < 811; +// } + +// /* ------------------- +// Position initiale +// ------------------- */ + +// function initNavPosition() { +// if (window.pageYOffset <= threshold) { +// showNav(); // en haut de page → nav visible +// } else { +// if (isMobile()) { +// hideNav(); // mobile scrollé → nav cachée +// } else { +// showNav(); // desktop : nav visible même en bas +// } +// } +// } + +// /* ------------------- +// Scroll / resize header +// ------------------- */ + +// function adjustHeaderHeight() { +// if (window.scrollY > 0) { +// header.classList.add('shrink'); +// } else { +// header.classList.remove('shrink'); +// } +// } + +// function handleScroll() { +// if (!introDone) return; + +// let scrollTop = window.pageYOffset || document.documentElement.scrollTop; + +// if (scrollTop > threshold && !isHidden) { +// // on cache la nav +// hideNav(); +// } else if (scrollTop <= threshold && isHidden) { +// // on ré-affiche la nav +// showNav(); +// } + +// lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; +// } + +// function handleTouchAndMouseEnter() { +// if (!introDone) return; +// if (isHidden) { +// showNav(); +// } +// } + +// function handleTouchAndMouseLeave() { +// if (!introDone) return; + +// if (lastScrollTop > threshold && !isHidden) { +// hideNav(); +// } +// } + +// // Rendre la nav visible (plus de visibility:hidden) +// headerNavContainer.style.visibility = 'visible'; + +// window.addEventListener('scroll', handleScroll); +// window.addEventListener('scroll', adjustHeaderHeight); + +// header.addEventListener('mouseenter', handleTouchAndMouseEnter); +// header.addEventListener('mouseleave', handleTouchAndMouseLeave); + +// header.addEventListener('touchstart', handleTouchAndMouseEnter); +// header.addEventListener('touchend', handleTouchAndMouseLeave); + +// // Position de départ +// initNavPosition(); +// adjustHeaderHeight(); +// }); + + + +document.addEventListener('DOMContentLoaded', function () { const header = document.querySelector('header[role="banner"]'); - const logo = document.querySelector('#block-quartiers-de-demain-logoquartiersdedemain svg'); const headerNavContainer = document.querySelector('.header_nav_container'); - const navEntry = performance.getEntriesByType("navigation")[0]; - const isFirstLoad = !navEntry.type.includes('back_forward'); - const isTargetPath = window.location.pathname === '/'; - const isMobile = window.innerWidth < 811; // 🔹 breakpoint mobile + if (!header || !headerNavContainer) return; const threshold = 100; let lastScrollTop = 0; - let isHidden = false; - let introDone = false; // ✅ on saura quand l'intro est finie + let isHidden = false; // au chargement : nav visible - // 🔹 On cache la nav au tout début (pour éviter toute secousse) - if (headerNavContainer) { - headerNavContainer.style.visibility = 'hidden'; + function isMobile() { + return window.innerWidth < 811; } - /* ------------------- - Animations nav - ------------------- */ + /* --- helpers --- */ - function slideOut() { - headerNavContainer.animate([ - { transform: 'translateX(0)' }, - { transform: 'translateX(-100%)' } - ], { - duration: 300, - fill: 'forwards' - }); + function hideNav() { + headerNavContainer.classList.add('nav-hidden'); isHidden = true; } - function slideIn() { - headerNavContainer.animate([ - { transform: 'translateX(-100%)' }, - { transform: 'translateX(0)' } - ], { - duration: 300, - fill: 'forwards' - }); + function showNav() { + headerNavContainer.classList.remove('nav-hidden'); isHidden = false; } - function slideDown() { - headerNavContainer.animate([ - { transform: 'translateY(0%)' }, - { transform: 'translateY(+100%)' } - ], { - duration: 300, - fill: 'forwards' - }); - isHidden = false; - } + /* --- init : nav visible au chargement --- */ - function slideUp() { - headerNavContainer.animate([ - { transform: 'translateY(100%)' }, - { transform: 'translateY(0%)' } - ], { - duration: 300, - fill: 'forwards' - }).onfinish = function() {}; - isHidden = true; - } + headerNavContainer.style.visibility = 'visible'; + showNav(); - // ✅ Position initiale de la nav, - // appelée UNIQUEMENT après la fin de l'intro - function initNavPosition() { - if (window.pageYOffset <= threshold) { - if (window.innerWidth < 811) { - slideDown(); - } else { - slideIn(); - } - } else { - if (window.innerWidth < 811) { - slideUp(); - } else { - slideIn(); - } - } - } - - /* ------------------- - Scroll / resize header - ------------------- */ + /* --- shrink header --- */ function adjustHeaderHeight() { if (window.scrollY > 0) { @@ -1088,118 +1090,49 @@ document.addEventListener('DOMContentLoaded', function() { } } - function handleScroll() { - if (!introDone) return; // ⛔ rien tant que l'intro n'est pas finie + /* --- scroll : cache / montre la nav --- */ - let scrollTop = window.pageYOffset || document.documentElement.scrollTop; - const isMobile = window.innerWidth < 811; + function handleScroll() { + const scrollTop = window.pageYOffset || document.documentElement.scrollTop; if (scrollTop > threshold && !isHidden) { - if (isMobile) { - slideUp(); - } else { - slideOut(); - } + // on cache la nav (desktop & mobile) + hideNav(); } else if (scrollTop <= threshold && isHidden) { - if (isMobile) { - slideDown(); - } else { - slideIn(); - } + // on la remonte en haut de page + showNav(); } lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; } - function handleTouchAndMouseEnter() { - if (!introDone) return; // ⛔ pas de hover avant la fin de l'intro + /* --- hover / touch sur le header : on montre la nav --- */ + function handleEnter() { if (isHidden) { - if (window.innerWidth < 811) { - slideDown(); - } else { - slideIn(); - } + showNav(); } } - function handleTouchAndMouseLeave() { - if (!introDone) return; - + function handleLeave() { if (lastScrollTop > threshold && !isHidden) { - if (window.innerWidth < 811) { - slideUp(); - } else { - slideOut(); - } + hideNav(); } } - window.addEventListener('scroll', handleScroll); - window.addEventListener('scroll', adjustHeaderHeight); + window.addEventListener('scroll', handleScroll, { passive: true }); + window.addEventListener('scroll', adjustHeaderHeight, { passive: true }); - header.addEventListener('mouseenter', handleTouchAndMouseEnter); - header.addEventListener('mouseleave', handleTouchAndMouseLeave); + header.addEventListener('mouseenter', handleEnter); + header.addEventListener('mouseleave', handleLeave); - header.addEventListener('touchstart', handleTouchAndMouseEnter); - header.addEventListener('touchend', handleTouchAndMouseLeave); - - /* ------------------- - Intro du logo - ------------------- */ - - if (isFirstLoad && isTargetPath && logo && !isMobile) { - // On bloque le scroll - document.body.classList.add('logo-intro-animating'); - - // 1) Logo plein écran SANS ANIMATION + header figé - logo.style.transition = 'none'; - header.style.transition = 'none'; - document.body.classList.add('logo-intro-active'); // logo centré, scale(2) - - void logo.offsetWidth; // reflow - - const INTRO_DELAY = 1000; // temps où le logo reste plein écran - const TRANSITION_DURATION = 1000; // durée de l'anim de collapse - - // 2) Après ce délai : on réactive les transitions et on lance l'anim - setTimeout(() => { - logo.style.transition = ''; - header.style.transition = ''; - - header.classList.add('header--collapsed'); // header se rétracte - document.body.classList.remove('logo-intro-active'); // logo retourne dans le header - - // 3) Quand le header + logo ont fini de bouger : - setTimeout(() => { - document.body.classList.remove('logo-intro-animating'); - introDone = true; - - // 👉 maintenant seulement on affiche la nav et on la fait glisser - if (headerNavContainer) { - headerNavContainer.style.visibility = 'visible'; - } - initNavPosition(); - - }, TRANSITION_DURATION + 100); - - }, INTRO_DELAY); - - } else { - // 🔹 CAS MOBILE OU PAS HOME / PAS 1re LOAD : - // pas d'intro : header direct réduit, nav directement dispo - - header.classList.add('header--collapsed-already'); - introDone = true; - if (headerNavContainer) { - headerNavContainer.style.visibility = 'visible'; - } - initNavPosition(); - } + header.addEventListener('touchstart', handleEnter); + header.addEventListener('touchend', handleLeave); + // init + adjustHeaderHeight(); }); -///////////////end header sans animation logo//////////////// }(); // This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. !function() { diff --git a/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js.map b/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js.map index 3e545a3..a376a26 100644 --- a/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js.map +++ b/web/themes/custom/quartiers_de_demain/dist/assets/bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./bundle.js","mappings":";UAAA;UACA;;;;;WCDA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAE;;;;;;AAMF;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,sDAAsD;AAClG;AACA;;AAEA;AACA;AACA,KAAK;;;AAGL;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA,GAAG;;AAEH;;;;;AAKA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf,OAAO;;AAEP;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,CAAC;AACD;;;;;;AAMA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mDAAmD;;AAEnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,CAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;AAID;AACA;AACA;AACA;AACA;AACA;;AAEA,kCAAkC;AAClC;AACA,kDAAkD;AAClD;AACA,IAAI,OAAO;AACX;AACA;AACA,0DAA0D;AAC1D;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;;;AAGA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;;;AAIA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH,CAAC;;AAED;;;;AAIA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,2CAA2C;AAC3C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH,CAAC;;AAED;;;;;;;AAOA,CAAC;;;;;;;;;;AC1gBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;AAKD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,MAAM;AACN,IAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA6B;AAC7B;;AAEA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mFAAmF;AACnF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,4DAA4D;;AAE5D;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA,4BAA4B;AAC5B,4BAA4B;AAC5B;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,CAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;AAGD,6E;;;;;;;AC7HA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA,gBAAgB;AAChB;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,WAAW;AACX,qCAAqC,kBAAkB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA,+EAA+E;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA,gBAAgB,4BAA4B;AAC5C,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gBAAgB,gCAAgC;AAChD,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,6BAA6B;AAC7C,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,gBAAgB,+BAA+B;AAC/C,gBAAgB;AAChB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA,cAAc;AACd;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,YAAY;AACZ;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA4C;;AAE5C;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,4BAA4B;AACpC,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,QAAQ,gCAAgC;AACxC,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,QAAQ,6BAA6B;AACrC,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA,QAAQ,+BAA+B;AACvC,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA,4BAA4B;;AAE5B;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAsD;;AAEtD,2BAA2B;;AAE3B,uCAAuC;AACvC,uCAAuC;;AAEvC;AACA;AACA;AACA;;AAEA,2DAA2D;AAC3D,2DAA2D;;AAE3D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,OAAO;;AAEP,KAAK;;AAEL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED,6D;;;;;;;;AC7ZA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;;AAGH;AACA;;AAEA;AACA;AACA,4BAA4B;AAC5B,MAAM;;AAEN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;;;;AAIA;AACA,CAAC,kB;;;;;;;AC5FD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD;AACxD;AACA;AACA,8CAA8C;AAC9C;AACA,SAAS;AACT;;;;;AAKA;;;AAGA;AACA;AACA;AACA,qCAAqC;AACrC,sDAAsD;AACtD,kCAAkC;;AAElC;AACA;AACA,sGAAsG;;AAEtG;AACA;AACA,8BAA8B;AAC9B,8BAA8B;AAC9B;;AAEA;AACA;AACA,kCAAkC;AAClC,cAAc;AACd,kCAAkC;AAClC;;AAEA;AACA;AACA,wBAAwB;AACxB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,mFAAmF;;AAEnF;AACA,6CAA6C;;AAE7C;AACA,mEAAmE;AACnE;AACA,kBAAkB;AAClB,gFAAgF;AAChF,8DAA8D;AAC9D;AACA,aAAa;AACb,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,SAAS;AACT;;AAEA,KAAK;;;;AAIL;;AAEA,CAAC,oB;;;;;;;;;ACtJD,+DAAe,qBAAuB,qBAAqB,E","sources":["webpack://quartiers_de_demain/webpack/bootstrap","webpack://quartiers_de_demain/webpack/runtime/global","webpack://quartiers_de_demain/webpack/runtime/make namespace object","webpack://quartiers_de_demain/webpack/runtime/publicPath","webpack://quartiers_de_demain/./src/assets/js/quartiers_de_demain.js","webpack://quartiers_de_demain/./src/assets/js/animated_formes.js","webpack://quartiers_de_demain/./src/assets/js/lightbox.js","webpack://quartiers_de_demain/./src/assets/js/header.js","webpack://quartiers_de_demain/./src/assets/js/timeline.js","webpack://quartiers_de_demain/./src/assets/js/ressources.js","webpack://quartiers_de_demain/./src/assets/scss/quartiers_de_demain.scss"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","/**\n * @file\n * quartiers_de_demain behaviors.\n */\n (function (Drupal) {\n\n 'use strict';\n\n Drupal.behaviors.quartiers_de_demain = {\n attach: function (context, settings) {\n console.log('It works!');\n }\n };\n} (Drupal));\n\n\n\n\n\n(function($, window) {\n\n\n//// ancre dans texte au click paragraphe correspondant arrive en dessous du header \n\n var adjustAnchor = function() {\n var $anchor = $('.sidebar_first_container'),\n fixedElementHeight = 500;\n if ($anchor.length > 0) {\n $('html, body').stop().animate({scrollTop: $anchor.offset().top - fixedElementHeight }, 0);\n }\n };\n\n $(window).on('hashchange', function() {\n adjustAnchor();\n });\n\n\n//////////////////////// start script smooth apparition des textes /////////////////\n\n// div.view-rows-wrapper:nth-child(3) > div:nth-child(2) > article:nth-child(1) > div:nth-child(3)\n// html.js.sr body div.dialog-off-canvas-main-canvas div.layout-container.partenaires main div.layout-content div.content_container div.views-element-container div.js-view-dom-id-92e061b83776a5ae5f470b8d32637dba5a87d248e6f275adc7abe863e5c527c3.view div.view-rows-wrapper div.views-row article.node-type-partenaire div.field_body\n\n function scrollReaveal(){\n\n const nodes = {\n logo : document.querySelectorAll('#logo-animated-container'),\n chapeau : document.querySelectorAll('.field_body:not(article.node-type-partenaire div.field_body)'),\n paragraph: document.querySelectorAll('.field_field_textes .paragraph--type--static-parts'),\n enjeux : document.querySelectorAll('.field_field_textes .paragraph--type--static-parts .enjeux'),\n // mapHome : document.querySelectorAll('.field_field_map_block #block-sitesmapblock'),\n // mapSite : document.querySelectorAll('#sites-map-container'),\n lienDoc : document.querySelectorAll('.field_field_documents'),\n lienURL : document.querySelectorAll('.field_field_liens_site, .field_field_liens'),\n // nodeProjet : document.querySelectorAll('.node-type-projet .field_field_infos, .btn-equipe-toggle, .field_field_nom_de_l_equipe, .node-type-projet .field_field_texte_partie_texte_projet, .node-type-projet .field_field_titre_partie_texte_projet, .node-type-projet .field_field_images_projet'),\n }\n\n const showUp = {\n origin: 'bottom',\n delay: 100,\n duration: 1000,\n distance: '50px',\n easing: 'cubic-bezier(0.5, 0, 0, 1)'\n }\n\n const Show = {\n delay: 100,\n duration: 600,\n easing: 'cubic-bezier(0.5, 0, 0, 1)'\n }\n\n console.log(nodes);\n\n ScrollReveal().reveal(nodes.logo, Show);\n ScrollReveal().reveal(nodes.chapeau, showUp);\n ScrollReveal().reveal(nodes.paragraph, showUp);\n ScrollReveal().reveal(nodes.enjeux, showUp);\n // ScrollReveal().reveal(nodes.mapHome, showUp);\n // ScrollReveal().reveal(nodes.mapSite, showUp);\n ScrollReveal().reveal(nodes.lienDoc, showUp);\n ScrollReveal().reveal(nodes.lienURL, showUp);\n // ScrollReveal().reveal(nodes.nodeProjet, showUp);\n\n }\n\n\n $( document ).ready(function() {\n scrollReaveal();\n });\n\n//////////////////////// end script smooth apparition des textes /////////////////\n\n\n\n\n//////////// start slideshow images home ////////////////////////// \n$(document).ready(function(){\n let diapohome = $('.config_pages--type--diaporama-home .diaporama');\n\n if (diapohome.length) {\n // Initialisation de Slick\n diapohome.slick({\n slidesToShow: 1,\n dots: false,\n arrows: false,\n // centerMode: true,\n adaptiveHeight: false,\n autoplay: true, // Activer l'autoplay\n autoplaySpeed: 4000, // Changement de slide toutes les 4 secondes\n // infinite: true,\n pauseOnHover: false, // Ne pas arrêter l'autoplay lors du survol\n pauseOnFocus: false,\n responsive: [\n {\n breakpoint: 810,\n settings: {\n slidesToShow: 1,\n adaptiveHeight: false,\n arrows: false,\n draggable: true,\n centerMode: false,\n }\n }]\n });\n\n}\n\n//////////// end slideshow images home ////////////////////////// \n\n\n//////////// start slideshow /actualites ////////////////////////// \n\n // Vérifier si on N'EST PAS sur la page #home\n if (!$(\"#page-node\").length) {\n let actuview2 = $('.content-wrapper-actu .field_field_images .actu-diaporama');\n\n if (actuview2.length > 0) {\n actuview2.slick({\n slidesToShow: 1,\n dots: false,\n arrows: true,\n adaptiveHeight: false,\n autoplay: false,\n responsive: [\n {\n breakpoint: 810,\n settings: {\n slidesToShow: 1,\n adaptiveHeight: false,\n arrows: true,\n draggable: true,\n autoplay: false,\n }\n }\n ]\n });\n console.log('Slick activé sur les actualités');\n console.log('Slick activé sur 1 actu');\n }\n // } else {\n // console.log('Slick désactivé sur la page Home');\n }\n});\n//////////// end slideshow /actualites ////////////////////////// \n\n\n\n\n\n//////////////////// start wrapper views-row lessites /////////////////////////\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n// Sélectionne le conteneur principal avec l'ID 'lessites'\nconst container = document.getElementById(\"lessites\");\n\n// Vérifie si le conteneur existe pour éviter toute erreur sur d'autres pages\nif (container) {\n // Sélectionne l'élément 'view' à l'intérieur de '.views-element-container'\n const viewContainer = container.querySelector(\".views-element-container .view\");\n\n // Vérifie si 'viewContainer' existe pour éviter les erreurs\n if (viewContainer) {\n // Crée une div englobante pour tous les éléments 'views-row'\n const wrapperDiv = document.createElement(\"div\");\n wrapperDiv.classList.add(\"views-row-wrapper\"); // ajoute une classe pour faciliter le style CSS\n\n // Déplace tous les éléments 'views-row' dans la nouvelle div\n const viewsRows = viewContainer.querySelectorAll(\".views-row\");\n viewsRows.forEach(row => wrapperDiv.appendChild(row));\n\n // Ajoute la div englobante dans le 'viewContainer'\n viewContainer.appendChild(wrapperDiv);\n }\n}\n});\n//////////////////// end wrapper views-row lessites /////////////////////////\n\n\n//////////////////// start div infos site ////////////////////////\n\nif (document.body.classList.contains('node-type-site')) {\nconst blockRegion = document.querySelector('.block-region-second');\nconst fieldClasses = [\n '.field_field_region',\n '.field_field_nom_du_qpv_nb_d_hab',\n '.field_field_departement_s',\n '.field_field_programme_de_l_etat',\n '.field_field_porteur_s_de_site',\n '.field_field_nom_de_la_commune_nb_d_hab'\n];\n\n// Sélectionne les div parents de chacun des champs listés\nconst elementsToWrap = [];\nfieldClasses.forEach(className => {\n const fieldElement = blockRegion.querySelector(className);\n if (fieldElement) {\n // Ajoute le parent du champ au tableau si trouvé\n elementsToWrap.push(fieldElement.parentElement);\n }\n});\n\nif (elementsToWrap.length > 0) {\n const infosContainer = document.createElement('div');\n infosContainer.className = 'infos';\n\n // Insère le conteneur `.infos` avant le premier élément ciblé\n const firstElement = elementsToWrap[0];\n blockRegion.insertBefore(infosContainer, firstElement);\n\n // Déplace chaque élément dans le conteneur `.infos`\n elementsToWrap.forEach(element => infosContainer.appendChild(element));\n}\n}\n//////////////////// end div infos site ////////////////////////\n\n\n//////////////////// start div infos actualité ////////////////////////\n$(document).ready(function () {\n // Vérifier si .layout-container A l'ID #page-node (et non un élément enfant)\n if ($(\".layout-container\").attr(\"id\") === \"page-node\") {\n $(\"article.node-type-actualite\").each(function () {\n let article = $(this);\n let dateField = article.find(\".field_field_date\");\n let typeField = article.find(\".field_field_type_d_actualite\");\n let siteField = article.find(\".field_field_site\");\n\n \n\n // Vérifier si les deux éléments existent\n if (dateField.length > 0 || typeField.length > 0) {\n // Vérifier si l'encapsulation n'existe pas déjà\n if (article.find(\".infos-actu\").length === 0) {\n // Créer un conteneur et y insérer les éléments\n let infosActu = $(\"
\").addClass(\"infos-actu\").append(dateField, typeField, siteField);\n \n // Ajouter ce conteneur après les champs existants\n article.append(infosActu);\n }\n }\n });\n }\n});\n//////////////////// end div infos actualité ////////////////////////\n\n//////////////////////////////////////////////////////////////////\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n// Sélectionner les éléments à déplacer\nconst documentsField = document.querySelector(\".field_field_documents\");\nconst liensSiteField = document.querySelector(\".field_field_liens_site\");\n\n// Sélectionner la destination\nconst thirdRegion = document.querySelector(\".block-region-third > div\");\n\n// Créer une nouvelle div pour englober les éléments déplacés\nconst wrapperDiv = document.createElement(\"div\");\nwrapperDiv.classList.add(\"documents-liens-wrapper\");\n\n// Déplacer les éléments dans la nouvelle div\nif (documentsField && liensSiteField && thirdRegion) {\n wrapperDiv.appendChild(documentsField);\n wrapperDiv.appendChild(liensSiteField);\n\n // Ajouter la nouvelle div dans la destination\n thirdRegion.appendChild(wrapperDiv);\n}\n});\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n// Sélectionner les éléments pertinents\nconst documentsLiensWrapper = document.querySelector(\".documents-liens-wrapper\");\nconst blockRegionThird = document.querySelector(\".block-region-third\");\n\n// Vérifier que les éléments existent avant de les manipuler\nif (documentsLiensWrapper && blockRegionThird) {\n // Déplacer .documents-liens-wrapper en dehors du div contenant les boutons prev/next\n blockRegionThird.appendChild(documentsLiensWrapper);\n}\n});\n\n\n\n/////////////////// start langswitcher position responsive//////////////////////\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n// Fonction pour déplacer le bloc en fonction de la taille de l'écran\nfunction moveLanguageSwitcher() {\n const languageSwitcher = document.getElementById(\"block-quartiers-de-demain-selecteurdelangue\");\n const navContainer = document.querySelector(\".header_nav_container\");\n\n if (window.innerWidth <= 810) { // Si écran téléphone\n if (languageSwitcher && navContainer && !navContainer.contains(languageSwitcher)) {\n navContainer.appendChild(languageSwitcher); // Déplace le bloc dans header_nav_container\n }\n } else { // Si écran non téléphone\n const headerRightContainer = document.querySelector(\".header_right_container\");\n if (languageSwitcher && headerRightContainer && !headerRightContainer.contains(languageSwitcher)) {\n headerRightContainer.appendChild(languageSwitcher); // Remet le bloc dans sa position initiale\n }\n }\n}\n\n// Déclencher au chargement et au redimensionnement\nmoveLanguageSwitcher();\nwindow.addEventListener(\"resize\", moveLanguageSwitcher);\n});\n/////////////////// end langswitcher position responsive///////////////////////////////////////////////////////////\n\n\n$(document).ready(function () {\n\n\n/////////////////// start voir plus... actualite dans /actualites & /home ////////////////////\n\n if ($(\"#actualites\" ).length > 0 || $(\"#home\").length > 0) {\n $(\".node-type-actualite\").each(function () {\n let article = $(this);\n \n let body = article.find(\".field_body\");\n let links = article.find(\".field_field_liens\");\n \n body.hide();\n links.hide();\n \n let toggleButton = $(\"