PageSourceSearch

https://avocats.be/themes/custom/avocats/js/main-menu.js?tm6k4m

js avocats.be collected 2026-10-01 11:43:45 UTC 3,555 bytes, 120 lines download raw bytes

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.