123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /* themes/custom/reha/assets/js/menu-burger-auto.js */
- (function (Drupal) {
- console.log("helloBurger");
- Drupal.behaviors.rehaAutoBurger = {
- attach: function (context) {
- const root = context.querySelector('#block-reha-navigationprincipale');
- if (!root) return;
-
- const menu = root.querySelector('#main-nav');
- if (!menu) return;
-
- // Éviter le double-init
- if (root.dataset.burgerInit === '1') return;
- root.dataset.burgerInit = '1';
-
- // Crée le bouton
- const btn = document.createElement('button');
- btn.type = 'button';
- btn.className = 'rb-toggle';
- btn.setAttribute('aria-expanded', 'false');
- btn.setAttribute('aria-controls', 'main-nav');
- btn.innerHTML = `
- <span class="rb-sr">Ouvrir le menu</span>
- <span aria-hidden="true" class="rb-burger">
- <span class="rb-line"></span><span class="rb-line"></span><span class="rb-line"></span>
- </span>
- `;
-
- // Insère le bouton avant la liste
- menu.parentNode.insertBefore(btn, menu);
-
- // Marque le menu comme repliable
- menu.classList.add('rb-list');
- // Masqué par défaut en mobile (le CSS gère desktop)
- menu.hidden = true;
-
- // Helpers
- function openMenu() {
- btn.setAttribute('aria-expanded', 'true');
- btn.classList.add('is-active');
- menu.hidden = false;
- const first = menu.querySelector('a');
- if (first) first.focus();
- }
- function closeMenu() {
- btn.setAttribute('aria-expanded', 'false');
- btn.classList.remove('is-active');
- menu.hidden = true;
- btn.focus();
- }
- function toggleMenu() {
- (btn.getAttribute('aria-expanded') === 'true') ? closeMenu() : openMenu();
- }
-
- // Événements
- btn.addEventListener('click', toggleMenu);
- document.addEventListener('keydown', (e) => {
- if (e.key === 'Escape' && btn.getAttribute('aria-expanded') === 'true') closeMenu();
- });
- document.addEventListener('click', (e) => {
- if (btn.getAttribute('aria-expanded') !== 'true') return;
- if (!root.contains(e.target)) closeMenu();
- });
-
- // Responsif : desktop >= 768px => menu toujours visible
- const mql = window.matchMedia('(min-width: 768px)');
- function handleMQ(e) {
- if (e.matches) {
- // Desktop
- menu.hidden = false;
- btn.setAttribute('aria-expanded', 'false');
- btn.classList.remove('is-active');
- } else {
- // Mobile
- if (btn.getAttribute('aria-expanded') !== 'true') menu.hidden = true;
- }
- }
- if (mql.addEventListener) mql.addEventListener('change', handleMQ);
- else mql.addListener(handleMQ);
- handleMQ(mql);
- }
- };
- })(Drupal);
-
|