menu-burger-auto.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* themes/custom/reha/assets/js/menu-burger-auto.js */
  2. (function (Drupal) {
  3. console.log("helloBurger");
  4. Drupal.behaviors.rehaAutoBurger = {
  5. attach: function (context) {
  6. const root = context.querySelector('#block-reha-navigationprincipale');
  7. if (!root) return;
  8. const menu = root.querySelector('#main-nav');
  9. if (!menu) return;
  10. // Éviter le double-init
  11. if (root.dataset.burgerInit === '1') return;
  12. root.dataset.burgerInit = '1';
  13. // Crée le bouton
  14. const btn = document.createElement('button');
  15. btn.type = 'button';
  16. btn.className = 'rb-toggle';
  17. btn.setAttribute('aria-expanded', 'false');
  18. btn.setAttribute('aria-controls', 'main-nav');
  19. btn.innerHTML = `
  20. <span class="rb-sr">Ouvrir le menu</span>
  21. <span aria-hidden="true" class="rb-burger">
  22. <span class="rb-line"></span><span class="rb-line"></span><span class="rb-line"></span>
  23. </span>
  24. `;
  25. // Insère le bouton avant la liste
  26. menu.parentNode.insertBefore(btn, menu);
  27. // Marque le menu comme repliable
  28. menu.classList.add('rb-list');
  29. // Masqué par défaut en mobile (le CSS gère desktop)
  30. menu.hidden = true;
  31. // Helpers
  32. function openMenu() {
  33. btn.setAttribute('aria-expanded', 'true');
  34. btn.classList.add('is-active');
  35. menu.hidden = false;
  36. const first = menu.querySelector('a');
  37. if (first) first.focus();
  38. }
  39. function closeMenu() {
  40. btn.setAttribute('aria-expanded', 'false');
  41. btn.classList.remove('is-active');
  42. menu.hidden = true;
  43. btn.focus();
  44. }
  45. function toggleMenu() {
  46. (btn.getAttribute('aria-expanded') === 'true') ? closeMenu() : openMenu();
  47. }
  48. // Événements
  49. btn.addEventListener('click', toggleMenu);
  50. document.addEventListener('keydown', (e) => {
  51. if (e.key === 'Escape' && btn.getAttribute('aria-expanded') === 'true') closeMenu();
  52. });
  53. document.addEventListener('click', (e) => {
  54. if (btn.getAttribute('aria-expanded') !== 'true') return;
  55. if (!root.contains(e.target)) closeMenu();
  56. });
  57. // Responsif : desktop >= 768px => menu toujours visible
  58. const mql = window.matchMedia('(min-width: 768px)');
  59. function handleMQ(e) {
  60. if (e.matches) {
  61. // Desktop
  62. menu.hidden = false;
  63. btn.setAttribute('aria-expanded', 'false');
  64. btn.classList.remove('is-active');
  65. } else {
  66. // Mobile
  67. if (btn.getAttribute('aria-expanded') !== 'true') menu.hidden = true;
  68. }
  69. }
  70. if (mql.addEventListener) mql.addEventListener('change', handleMQ);
  71. else mql.addListener(handleMQ);
  72. handleMQ(mql);
  73. }
  74. };
  75. })(Drupal);