1(function (Drupal, once) { 2 Drupal.behaviors.avocatsMainMenu = { 3 attach(context) { 4 once('avocats-main-menu', '.menu-level-0', context).forEach((menu) => { 5 const container = menu.closest('#main-navigation') || menu.parentElement; 6 const parents = menu.querySelectorAll('[data-menu-parent]'); 7 const panels = container.querySelectorAll('.menu-level-1 [data-menu-panel]'); 8 9 const closePanels = () => { 10 panels.forEach((panel) => { 11 panel.hidden = true; 12 }); 13 parents.forEach((parent) => { 14 parent.setAttribute('aria-expanded', 'false'); 15 }); 16 }; 17 18 menu.addEventListener('click', (event) => { 19 const parent = event.target.closest('[data-menu-parent]'); 20 21 if (!parent || !menu.contains(parent)) { 22 return; 23 } 24 25 event.preventDefault(); 26 const panel = Array.from(panels).find( 27 (candidate) => candidate.dataset.menuPanel === parent.dataset.menuParent, 28 ); 29 30 if (!panel) { 31 return; 32 } 33 34 const isOpen = !panel.hidden; 35 closePanels(); 36 37 if (!isOpen) { 38 panel.hidden = false; 39 parent.setAttribute('aria-expanded', 'true'); 40 } 41 }); 42 43 document.addEventListener('click', (event) => { 44 if (!container.contains(event.target)) { 45 closePanels(); 46 } 47 }); 48 49 menu.addEventListener('keydown', (event) => { 50 if (event.key === 'Escape') { 51 closePanels(); 52 menu.querySelector('[aria-expanded="true"]')?.focus(); 53 } 54 }); 55 }); 56 57 once('avocats-mobile-main-menu', '.menu-level-0-mobile', context).forEach((menu) => { 58 const parents = menu.querySelectorAll('[data-mobile-menu-parent]'); 59 const panels = menu.querySelectorAll('[data-mobile-menu-panel]'); 60 61 const closePanels = () => { 62 panels.forEach((panel) => { 63 panel.hidden = true; 64 }); 65 parents.forEach((parent) => { 66 parent.setAttribute('aria-expanded', 'false'); 67 }); 68 }; 69 70 menu.addEventListener('click', (event) => { 71 const parent = event.target.closest('[data-mobile-menu-parent]'); 72 73 if (!parent || !menu.contains(parent)) { 74 return; 75 } 76 77 event.preventDefault(); 78 const panel = Array.from(panels).find( 79 (candidate) => candidate.dataset.mobileMenuPanel === parent.dataset.mobileMenuParent, 80 ); 81 82 if (!panel) { 83 return; 84 } 85 86 const isOpen = !panel.hidden; 87 closePanels(); 88 89 if (!isOpen) { 90 panel.hidden = false; 91 parent.setAttribute('aria-expanded', 'true'); 92 } 93 }); 94 }); 95 96 once('bef-links-dropdown-label', '.bef-links-dropdown', context).forEach((dropdown) => { 97 const toggle = dropdown.querySelector('.bef-links-dropdown__toggle'); 98 const selected = dropdown.querySelector('.dropdown-menu a.bef-link--selected'); 99 100 if (!toggle) { 101 return; 102 } 103 104 const updateLabel = (link) => { 105 const label = link?.textContent.trim(); 106 107 if (label) { 108 toggle.textContent = label; 109 } 110 }; 111 112 updateLabel(selected); 113 114 dropdown.addEventListener('click', (event) => { 115 updateLabel(event.target.closest('.dropdown-menu a')); 116 }); 117 }); 118 }, 119 }; 120})(Drupal, once);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.