@schukai/monster 4.43.2 → 4.43.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,19 +13,19 @@
13
13
  */
14
14
 
15
15
  import {
16
- CustomElement,
17
- getSlottedElements,
18
- registerCustomElement,
19
- assembleMethodSymbol,
16
+ CustomElement,
17
+ getSlottedElements,
18
+ registerCustomElement,
19
+ assembleMethodSymbol,
20
20
  } from "../../dom/customelement.mjs";
21
21
  import { DeadMansSwitch } from "../../util/deadmansswitch.mjs";
22
22
  import { SiteNavigationStyleSheet } from "./stylesheet/site-navigation.mjs";
23
23
  import {
24
- computePosition,
25
- autoUpdate,
26
- flip,
27
- shift,
28
- offset,
24
+ computePosition,
25
+ autoUpdate,
26
+ flip,
27
+ shift,
28
+ offset,
29
29
  } from "@floating-ui/dom";
30
30
 
31
31
  export { SiteNavigation };
@@ -52,68 +52,68 @@ const activeSubmenuHiderSymbol = Symbol("activeSubmenuHider");
52
52
  * @summary Responsive site navigation with hamburger menu and submenus
53
53
  */
54
54
  class SiteNavigation extends CustomElement {
55
- /**
56
- * Returns a unique symbol for the instance.
57
- * @returns {symbol}
58
- */
59
- static get [instanceSymbol]() {
60
- return Symbol.for("@schukai/monster/components/navigation/site@@instance");
61
- }
62
-
63
- /**
64
- * Returns the default options for the component.
65
- * @returns {object}
66
- */
67
- get defaults() {
68
- return Object.assign({}, super.defaults, {
69
- templates: { main: getTemplate() },
70
- });
71
- }
72
-
73
- /**
74
- * Assembles the component and initializes controls and event handlers.
75
- * @returns {void}
76
- */
77
- [assembleMethodSymbol]() {
78
- super[assembleMethodSymbol]();
79
- initControlReferences.call(this);
80
- initEventHandler.call(this);
81
- }
82
-
83
- /**
84
- * Returns the CSS stylesheet for the component.
85
- * @returns {Array<CSSStyleSheet>}
86
- */
87
- static getCSSStyleSheet() {
88
- return [SiteNavigationStyleSheet];
89
- }
90
-
91
- /**
92
- * Returns the custom element tag name.
93
- * @returns {string}
94
- */
95
- static getTag() {
96
- return "monster-site-navigation";
97
- }
98
-
99
- /**
100
- * Called when the component is connected to the DOM.
101
- * @returns {void}
102
- */
103
- connectedCallback() {
104
- super.connectedCallback();
105
- attachResizeObserver.call(this);
106
- setTimeout(() => populateTabs.call(this), 0);
107
- }
108
-
109
- /**
110
- * Called when the component is disconnected from the DOM.
111
- * @returns {void}
112
- */
113
- disconnectedCallback() {
114
- super.disconnectedCallback();
115
- detachResizeObserver.call(this);
116
- }
55
+ /**
56
+ * Returns a unique symbol for the instance.
57
+ * @returns {symbol}
58
+ */
59
+ static get [instanceSymbol]() {
60
+ return Symbol.for("@schukai/monster/components/navigation/site@@instance");
61
+ }
62
+
63
+ /**
64
+ * Returns the default options for the component.
65
+ * @returns {object}
66
+ */
67
+ get defaults() {
68
+ return Object.assign({}, super.defaults, {
69
+ templates: { main: getTemplate() },
70
+ });
71
+ }
72
+
73
+ /**
74
+ * Assembles the component and initializes controls and event handlers.
75
+ * @returns {void}
76
+ */
77
+ [assembleMethodSymbol]() {
78
+ super[assembleMethodSymbol]();
79
+ initControlReferences.call(this);
80
+ initEventHandler.call(this);
81
+ }
82
+
83
+ /**
84
+ * Returns the CSS stylesheet for the component.
85
+ * @returns {Array<CSSStyleSheet>}
86
+ */
87
+ static getCSSStyleSheet() {
88
+ return [SiteNavigationStyleSheet];
89
+ }
90
+
91
+ /**
92
+ * Returns the custom element tag name.
93
+ * @returns {string}
94
+ */
95
+ static getTag() {
96
+ return "monster-site-navigation";
97
+ }
98
+
99
+ /**
100
+ * Called when the component is connected to the DOM.
101
+ * @returns {void}
102
+ */
103
+ connectedCallback() {
104
+ super.connectedCallback();
105
+ attachResizeObserver.call(this);
106
+ setTimeout(() => populateTabs.call(this), 0);
107
+ }
108
+
109
+ /**
110
+ * Called when the component is disconnected from the DOM.
111
+ * @returns {void}
112
+ */
113
+ disconnectedCallback() {
114
+ super.disconnectedCallback();
115
+ detachResizeObserver.call(this);
116
+ }
117
117
  }
118
118
 
119
119
  /**
@@ -123,19 +123,19 @@ class SiteNavigation extends CustomElement {
123
123
  * @returns {void}
124
124
  */
125
125
  function initControlReferences() {
126
- if (!this.shadowRoot) throw new Error("Component requires a shadowRoot.");
127
- this[navElementSymbol] = this.shadowRoot.querySelector(
128
- '[data-monster-role="navigation"]',
129
- );
130
- this[visibleElementsSymbol] =
131
- this.shadowRoot.querySelector("#visible-elements");
132
- this[hiddenElementsSymbol] =
133
- this.shadowRoot.querySelector("#hidden-elements");
134
- this[hamburgerButtonSymbol] =
135
- this.shadowRoot.querySelector("#hamburger-button");
136
- this[hamburgerNavSymbol] = this.shadowRoot.querySelector(
137
- '[data-monster-role="hamburger-nav"]',
138
- );
126
+ if (!this.shadowRoot) throw new Error("Component requires a shadowRoot.");
127
+ this[navElementSymbol] = this.shadowRoot.querySelector(
128
+ '[data-monster-role="navigation"]',
129
+ );
130
+ this[visibleElementsSymbol] =
131
+ this.shadowRoot.querySelector("#visible-elements");
132
+ this[hiddenElementsSymbol] =
133
+ this.shadowRoot.querySelector("#hidden-elements");
134
+ this[hamburgerButtonSymbol] =
135
+ this.shadowRoot.querySelector("#hamburger-button");
136
+ this[hamburgerNavSymbol] = this.shadowRoot.querySelector(
137
+ '[data-monster-role="hamburger-nav"]',
138
+ );
139
139
  }
140
140
 
141
141
  /**
@@ -145,56 +145,56 @@ function initControlReferences() {
145
145
  * @returns {void}
146
146
  */
147
147
  function initEventHandler() {
148
- if (!this.shadowRoot) throw new Error("Component requires a shadowRoot.");
149
-
150
- const hamburgerButton = this[hamburgerButtonSymbol];
151
- const hamburgerNav = this[hamburgerNavSymbol];
152
- let cleanup;
153
-
154
- if (!hamburgerButton || !hamburgerNav) return;
155
-
156
- const showMenu = () => {
157
- hamburgerNav.style.display = "block";
158
- cleanup = autoUpdate(hamburgerButton, hamburgerNav, () => {
159
- computePosition(hamburgerButton, hamburgerNav, {
160
- placement: "bottom-end",
161
- middleware: [offset(8), flip(), shift({ padding: 8 })],
162
- }).then(({ x, y }) => {
163
- Object.assign(hamburgerNav.style, {
164
- left: `${x}px`,
165
- top: `${y}px`,
166
- });
167
- });
168
- });
169
- setTimeout(() => document.addEventListener("click", handleOutsideClick), 0);
170
- };
171
-
172
- const hideMenu = () => {
173
- hamburgerNav.style.display = "none";
174
- if (cleanup) {
175
- cleanup();
176
- }
177
- document.removeEventListener("click", handleOutsideClick);
178
- };
179
-
180
- const handleOutsideClick = (event) => {
181
- if (
182
- !hamburgerButton.contains(event.target) &&
183
- !hamburgerNav.contains(event.target)
184
- ) {
185
- hideMenu();
186
- }
187
- };
188
-
189
- hamburgerButton.addEventListener("click", (event) => {
190
- event.stopPropagation();
191
- const isVisible = hamburgerNav.style.display === "block";
192
- if (isVisible) {
193
- hideMenu();
194
- } else {
195
- showMenu();
196
- }
197
- });
148
+ if (!this.shadowRoot) throw new Error("Component requires a shadowRoot.");
149
+
150
+ const hamburgerButton = this[hamburgerButtonSymbol];
151
+ const hamburgerNav = this[hamburgerNavSymbol];
152
+ let cleanup;
153
+
154
+ if (!hamburgerButton || !hamburgerNav) return;
155
+
156
+ const showMenu = () => {
157
+ hamburgerNav.style.display = "block";
158
+ cleanup = autoUpdate(hamburgerButton, hamburgerNav, () => {
159
+ computePosition(hamburgerButton, hamburgerNav, {
160
+ placement: "bottom-end",
161
+ middleware: [offset(8), flip(), shift({ padding: 8 })],
162
+ }).then(({ x, y }) => {
163
+ Object.assign(hamburgerNav.style, {
164
+ left: `${x}px`,
165
+ top: `${y}px`,
166
+ });
167
+ });
168
+ });
169
+ setTimeout(() => document.addEventListener("click", handleOutsideClick), 0);
170
+ };
171
+
172
+ const hideMenu = () => {
173
+ hamburgerNav.style.display = "none";
174
+ if (cleanup) {
175
+ cleanup();
176
+ }
177
+ document.removeEventListener("click", handleOutsideClick);
178
+ };
179
+
180
+ const handleOutsideClick = (event) => {
181
+ if (
182
+ !hamburgerButton.contains(event.target) &&
183
+ !hamburgerNav.contains(event.target)
184
+ ) {
185
+ hideMenu();
186
+ }
187
+ };
188
+
189
+ hamburgerButton.addEventListener("click", (event) => {
190
+ event.stopPropagation();
191
+ const isVisible = hamburgerNav.style.display === "block";
192
+ if (isVisible) {
193
+ hideMenu();
194
+ } else {
195
+ showMenu();
196
+ }
197
+ });
198
198
  }
199
199
 
200
200
  /**
@@ -204,20 +204,20 @@ function initEventHandler() {
204
204
  * @returns {void}
205
205
  */
206
206
  function attachResizeObserver() {
207
- this[resizeObserverSymbol] = new ResizeObserver(() => {
208
- if (this[timerCallbackSymbol] instanceof DeadMansSwitch) {
209
- try {
210
- this[timerCallbackSymbol].touch();
211
- return;
212
- } catch (e) {
213
- delete this[timerCallbackSymbol];
214
- }
215
- }
216
- this[timerCallbackSymbol] = new DeadMansSwitch(200, () =>
217
- populateTabs.call(this),
218
- );
219
- });
220
- this[resizeObserverSymbol].observe(this[navElementSymbol]);
207
+ this[resizeObserverSymbol] = new ResizeObserver(() => {
208
+ if (this[timerCallbackSymbol] instanceof DeadMansSwitch) {
209
+ try {
210
+ this[timerCallbackSymbol].touch();
211
+ return;
212
+ } catch (e) {
213
+ delete this[timerCallbackSymbol];
214
+ }
215
+ }
216
+ this[timerCallbackSymbol] = new DeadMansSwitch(200, () =>
217
+ populateTabs.call(this),
218
+ );
219
+ });
220
+ this[resizeObserverSymbol].observe(this[navElementSymbol]);
221
221
  }
222
222
 
223
223
  /**
@@ -227,10 +227,10 @@ function attachResizeObserver() {
227
227
  * @returns {void}
228
228
  */
229
229
  function detachResizeObserver() {
230
- if (this[resizeObserverSymbol] instanceof ResizeObserver) {
231
- this[resizeObserverSymbol].disconnect();
232
- delete this[resizeObserverSymbol];
233
- }
230
+ if (this[resizeObserverSymbol] instanceof ResizeObserver) {
231
+ this[resizeObserverSymbol].disconnect();
232
+ delete this[resizeObserverSymbol];
233
+ }
234
234
  }
235
235
 
236
236
  /**
@@ -242,69 +242,69 @@ function detachResizeObserver() {
242
242
  * @returns {void}
243
243
  */
244
244
  function setupSubmenu(parentLi, context = "visible") {
245
- const submenu = parentLi.querySelector("ul");
246
- if (!submenu) return;
247
-
248
- submenu.setAttribute("part", "submenu");
249
-
250
- if (context === "visible") {
251
- const component = this;
252
- let cleanup;
253
- let hideTimeout;
254
-
255
- const immediateHide = () => {
256
- submenu.style.display = "none";
257
- if (cleanup) {
258
- cleanup();
259
- cleanup = null;
260
- }
261
- if (component[activeSubmenuHiderSymbol] === immediateHide) {
262
- component[activeSubmenuHiderSymbol] = null;
263
- }
264
- };
265
-
266
- const show = () => {
267
- clearTimeout(hideTimeout);
268
- if (
269
- component[activeSubmenuHiderSymbol] &&
270
- component[activeSubmenuHiderSymbol] !== immediateHide
271
- ) {
272
- component[activeSubmenuHiderSymbol]();
273
- }
274
- submenu.style.display = "block";
275
- if (!cleanup) {
276
- cleanup = autoUpdate(parentLi, submenu, () => {
277
- computePosition(parentLi, submenu, {
278
- placement: "bottom-start",
279
- middleware: [offset(8), flip(), shift({ padding: 8 })],
280
- }).then(({ x, y }) => {
281
- Object.assign(submenu.style, { left: `${x}px`, top: `${y}px` });
282
- });
283
- });
284
- }
285
- component[activeSubmenuHiderSymbol] = immediateHide;
286
- };
287
-
288
- const hideWithDelay = () => {
289
- hideTimeout = setTimeout(immediateHide, 200);
290
- };
291
-
292
- parentLi.addEventListener("mouseenter", show);
293
- parentLi.addEventListener("mouseleave", hideWithDelay);
294
- submenu.addEventListener("mouseenter", () => clearTimeout(hideTimeout));
295
- submenu.addEventListener("mouseleave", hideWithDelay);
296
- } else {
297
- submenu.style.display = "none";
298
- const anchor = parentLi.querySelector("a");
299
- if (anchor) {
300
- anchor.addEventListener("click", (event) => {
301
- event.preventDefault();
302
- event.stopPropagation();
303
- const isVisible = submenu.style.display === "block";
304
- submenu.style.display = isVisible ? "none" : "block";
305
- });
306
- }
307
- }
245
+ const submenu = parentLi.querySelector("ul");
246
+ if (!submenu) return;
247
+
248
+ submenu.setAttribute("part", "submenu");
249
+
250
+ if (context === "visible") {
251
+ const component = this;
252
+ let cleanup;
253
+ let hideTimeout;
254
+
255
+ const immediateHide = () => {
256
+ submenu.style.display = "none";
257
+ if (cleanup) {
258
+ cleanup();
259
+ cleanup = null;
260
+ }
261
+ if (component[activeSubmenuHiderSymbol] === immediateHide) {
262
+ component[activeSubmenuHiderSymbol] = null;
263
+ }
264
+ };
265
+
266
+ const show = () => {
267
+ clearTimeout(hideTimeout);
268
+ if (
269
+ component[activeSubmenuHiderSymbol] &&
270
+ component[activeSubmenuHiderSymbol] !== immediateHide
271
+ ) {
272
+ component[activeSubmenuHiderSymbol]();
273
+ }
274
+ submenu.style.display = "block";
275
+ if (!cleanup) {
276
+ cleanup = autoUpdate(parentLi, submenu, () => {
277
+ computePosition(parentLi, submenu, {
278
+ placement: "bottom-start",
279
+ middleware: [offset(8), flip(), shift({ padding: 8 })],
280
+ }).then(({ x, y }) => {
281
+ Object.assign(submenu.style, { left: `${x}px`, top: `${y}px` });
282
+ });
283
+ });
284
+ }
285
+ component[activeSubmenuHiderSymbol] = immediateHide;
286
+ };
287
+
288
+ const hideWithDelay = () => {
289
+ hideTimeout = setTimeout(immediateHide, 200);
290
+ };
291
+
292
+ parentLi.addEventListener("mouseenter", show);
293
+ parentLi.addEventListener("mouseleave", hideWithDelay);
294
+ submenu.addEventListener("mouseenter", () => clearTimeout(hideTimeout));
295
+ submenu.addEventListener("mouseleave", hideWithDelay);
296
+ } else {
297
+ submenu.style.display = "none";
298
+ const anchor = parentLi.querySelector("a");
299
+ if (anchor) {
300
+ anchor.addEventListener("click", (event) => {
301
+ event.preventDefault();
302
+ event.stopPropagation();
303
+ const isVisible = submenu.style.display === "block";
304
+ submenu.style.display = isVisible ? "none" : "block";
305
+ });
306
+ }
307
+ }
308
308
  }
309
309
 
310
310
  /**
@@ -315,120 +315,120 @@ function setupSubmenu(parentLi, context = "visible") {
315
315
  * @returns {void}
316
316
  */
317
317
  function populateTabs() {
318
- const visibleList = this[visibleElementsSymbol];
319
- const hiddenList = this[hiddenElementsSymbol];
320
- const hamburgerButton = this[hamburgerButtonSymbol];
321
- const hamburgerNav = this[hamburgerNavSymbol];
322
-
323
- const topLevelUl = [...getSlottedElements.call(this, "ul")].find(
324
- (ul) => ul.parentElement === this,
325
- );
326
-
327
- if (!topLevelUl) {
328
- visibleList.style.visibility = "visible";
329
- hamburgerButton.style.display = "none";
330
- return;
331
- }
332
-
333
- const sourceItems = Array.from(topLevelUl.children).filter(
334
- (item) => item.tagName === "LI",
335
- );
336
-
337
- visibleList.style.visibility = "hidden";
338
- hamburgerButton.style.display = "none";
339
- hamburgerNav.style.display = "none";
340
- visibleList.innerHTML = "";
341
- hiddenList.innerHTML = "";
342
-
343
- const originalDisplay = hamburgerButton.style.display;
344
- hamburgerButton.style.visibility = "hidden";
345
- hamburgerButton.style.display = "flex";
346
- const hamburgerWidth = hamburgerButton.offsetWidth;
347
- hamburgerButton.style.display = originalDisplay;
348
- hamburgerButton.style.visibility = "visible";
349
-
350
- const navWidth = this[navElementSymbol].clientWidth;
351
- if (navWidth === 0) {
352
- visibleList.style.visibility = "visible";
353
- return;
354
- }
355
-
356
- const measurementList = visibleList.cloneNode(true);
357
- Object.assign(measurementList.style, {
358
- position: "absolute",
359
- left: "0",
360
- top: "0",
361
- width: "auto",
362
- visibility: "hidden",
363
- });
364
- this.shadowRoot.appendChild(measurementList);
365
-
366
- const itemsToMove = [];
367
- const availableWidthForTabs = navWidth - hamburgerWidth;
368
-
369
- for (let i = 0; i < sourceItems.length; i++) {
370
- const item = sourceItems[i];
371
- const itemClone = item.cloneNode(true);
372
- const submenu = itemClone.querySelector("ul");
373
- if (submenu) submenu.style.display = "none";
374
-
375
- measurementList.appendChild(itemClone);
376
-
377
- const isLastItem = i === sourceItems.length - 1;
378
- const effectiveMaxWidth = isLastItem ? navWidth : availableWidthForTabs;
379
-
380
- if (measurementList.scrollWidth > effectiveMaxWidth) {
381
- break;
382
- } else {
383
- itemsToMove.push(item);
384
- }
385
- }
386
- this.shadowRoot.removeChild(measurementList);
387
-
388
- const visibleItems = itemsToMove;
389
- const hiddenItems = sourceItems.slice(visibleItems.length);
390
-
391
- if (visibleItems.length > 0) {
392
- const clonedVisibleItems = visibleItems.map((item) => {
393
- const liClone = item.cloneNode(true);
394
- const aClone = liClone.querySelector("a");
395
-
396
- liClone.setAttribute("part", "nav-item");
397
- if (aClone) aClone.setAttribute("part", "nav-link");
398
-
399
- if (item.classList.contains("active")) {
400
- liClone.setAttribute("part", "nav-item nav-item-active");
401
- if (aClone) aClone.setAttribute("part", "nav-link nav-link-active");
402
- }
403
- return liClone;
404
- });
405
- visibleList.append(...clonedVisibleItems);
406
- visibleList
407
- .querySelectorAll("li")
408
- .forEach((li) => setupSubmenu.call(this, li, "visible"));
409
- }
410
-
411
- if (hiddenItems.length > 0) {
412
- const clonedHiddenItems = hiddenItems.map((item) => {
413
- const liClone = item.cloneNode(true);
414
- const aClone = liClone.querySelector("a");
415
-
416
- liClone.setAttribute("part", "nav-item");
417
- if (aClone) aClone.setAttribute("part", "nav-link");
418
- if (item.classList.contains("active")) {
419
- liClone.setAttribute("part", "nav-item nav-item-active");
420
- if (aClone) aClone.setAttribute("part", "nav-link nav-link-active");
421
- }
422
- return liClone;
423
- });
424
- hiddenList.append(...clonedHiddenItems);
425
- hamburgerButton.style.display = "flex";
426
- hiddenList
427
- .querySelectorAll("li")
428
- .forEach((li) => setupSubmenu.call(this, li, "hidden"));
429
- }
430
-
431
- visibleList.style.visibility = "visible";
318
+ const visibleList = this[visibleElementsSymbol];
319
+ const hiddenList = this[hiddenElementsSymbol];
320
+ const hamburgerButton = this[hamburgerButtonSymbol];
321
+ const hamburgerNav = this[hamburgerNavSymbol];
322
+
323
+ const topLevelUl = [...getSlottedElements.call(this, "ul")].find(
324
+ (ul) => ul.parentElement === this,
325
+ );
326
+
327
+ if (!topLevelUl) {
328
+ visibleList.style.visibility = "visible";
329
+ hamburgerButton.style.display = "none";
330
+ return;
331
+ }
332
+
333
+ const sourceItems = Array.from(topLevelUl.children).filter(
334
+ (item) => item.tagName === "LI",
335
+ );
336
+
337
+ visibleList.style.visibility = "hidden";
338
+ hamburgerButton.style.display = "none";
339
+ hamburgerNav.style.display = "none";
340
+ visibleList.innerHTML = "";
341
+ hiddenList.innerHTML = "";
342
+
343
+ const originalDisplay = hamburgerButton.style.display;
344
+ hamburgerButton.style.visibility = "hidden";
345
+ hamburgerButton.style.display = "flex";
346
+ const hamburgerWidth = hamburgerButton.offsetWidth;
347
+ hamburgerButton.style.display = originalDisplay;
348
+ hamburgerButton.style.visibility = "visible";
349
+
350
+ const navWidth = this[navElementSymbol].clientWidth;
351
+ if (navWidth === 0) {
352
+ visibleList.style.visibility = "visible";
353
+ return;
354
+ }
355
+
356
+ const measurementList = visibleList.cloneNode(true);
357
+ Object.assign(measurementList.style, {
358
+ position: "absolute",
359
+ left: "0",
360
+ top: "0",
361
+ width: "auto",
362
+ visibility: "hidden",
363
+ });
364
+ this.shadowRoot.appendChild(measurementList);
365
+
366
+ const itemsToMove = [];
367
+ const availableWidthForTabs = navWidth - hamburgerWidth;
368
+
369
+ for (let i = 0; i < sourceItems.length; i++) {
370
+ const item = sourceItems[i];
371
+ const itemClone = item.cloneNode(true);
372
+ const submenu = itemClone.querySelector("ul");
373
+ if (submenu) submenu.style.display = "none";
374
+
375
+ measurementList.appendChild(itemClone);
376
+
377
+ const isLastItem = i === sourceItems.length - 1;
378
+ const effectiveMaxWidth = isLastItem ? navWidth : availableWidthForTabs;
379
+
380
+ if (measurementList.scrollWidth > effectiveMaxWidth) {
381
+ break;
382
+ } else {
383
+ itemsToMove.push(item);
384
+ }
385
+ }
386
+ this.shadowRoot.removeChild(measurementList);
387
+
388
+ const visibleItems = itemsToMove;
389
+ const hiddenItems = sourceItems.slice(visibleItems.length);
390
+
391
+ if (visibleItems.length > 0) {
392
+ const clonedVisibleItems = visibleItems.map((item) => {
393
+ const liClone = item.cloneNode(true);
394
+ const aClone = liClone.querySelector("a");
395
+
396
+ liClone.setAttribute("part", "nav-item");
397
+ if (aClone) aClone.setAttribute("part", "nav-link");
398
+
399
+ if (item.classList.contains("active")) {
400
+ liClone.setAttribute("part", "nav-item nav-item-active");
401
+ if (aClone) aClone.setAttribute("part", "nav-link nav-link-active");
402
+ }
403
+ return liClone;
404
+ });
405
+ visibleList.append(...clonedVisibleItems);
406
+ visibleList
407
+ .querySelectorAll("li")
408
+ .forEach((li) => setupSubmenu.call(this, li, "visible"));
409
+ }
410
+
411
+ if (hiddenItems.length > 0) {
412
+ const clonedHiddenItems = hiddenItems.map((item) => {
413
+ const liClone = item.cloneNode(true);
414
+ const aClone = liClone.querySelector("a");
415
+
416
+ liClone.setAttribute("part", "nav-item");
417
+ if (aClone) aClone.setAttribute("part", "nav-link");
418
+ if (item.classList.contains("active")) {
419
+ liClone.setAttribute("part", "nav-item nav-item-active");
420
+ if (aClone) aClone.setAttribute("part", "nav-link nav-link-active");
421
+ }
422
+ return liClone;
423
+ });
424
+ hiddenList.append(...clonedHiddenItems);
425
+ hamburgerButton.style.display = "flex";
426
+ hiddenList
427
+ .querySelectorAll("li")
428
+ .forEach((li) => setupSubmenu.call(this, li, "hidden"));
429
+ }
430
+
431
+ visibleList.style.visibility = "visible";
432
432
  }
433
433
 
434
434
  /**
@@ -437,7 +437,7 @@ function populateTabs() {
437
437
  * @returns {string}
438
438
  */
439
439
  function getTemplate() {
440
- return `
440
+ return `
441
441
  <div data-monster-role="control" part="control">
442
442
  <nav data-monster-role="navigation" role="navigation" part="nav">
443
443
  <ul id="visible-elements" part="visible-list"></ul>