@hortonstudio/main 1.7.6 → 1.7.8

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.
@@ -381,17 +381,13 @@ function addDesktopArrowNavigation() {
381
381
 
382
382
  // Menu button system with modal-like functionality
383
383
  function setupMenuButton() {
384
- const menuButton = document.querySelector('[data-hs-nav="menubtn"]');
384
+ const menuButtons = document.querySelectorAll('[data-hs-nav="menubtn"]');
385
385
  const menu = document.querySelector('[data-hs-nav="menu"]');
386
386
 
387
- if (!menuButton || !menu) return;
387
+ if (!menuButtons.length || !menu) return;
388
388
 
389
389
  const menuId = `menu-${Date.now()}`;
390
390
 
391
- menuButton.setAttribute("aria-expanded", "false");
392
- menuButton.setAttribute("aria-controls", menuId);
393
- menuButton.setAttribute("aria-label", "Open navigation menu");
394
-
395
391
  menu.id = menuId;
396
392
  menu.setAttribute("role", "dialog");
397
393
  menu.setAttribute("aria-modal", "true");
@@ -453,8 +449,10 @@ function setupMenuButton() {
453
449
 
454
450
  document.body.classList.add("u-overflow-hidden");
455
451
 
456
- menuButton.setAttribute("aria-expanded", "true");
457
- menuButton.setAttribute("aria-label", "Close navigation menu");
452
+ menuButtons.forEach(btn => {
453
+ btn.setAttribute("aria-expanded", "true");
454
+ btn.setAttribute("aria-label", "Close navigation menu");
455
+ });
458
456
 
459
457
  // Create focus trap for navbar
460
458
  createFocusTrap();
@@ -472,7 +470,7 @@ function setupMenuButton() {
472
470
  cancelable: true,
473
471
  view: window,
474
472
  });
475
- menuButton.dispatchEvent(clickEvent);
473
+ menuButtons[0].dispatchEvent(clickEvent);
476
474
  }
477
475
 
478
476
  function closeMenu() {
@@ -481,11 +479,15 @@ function setupMenuButton() {
481
479
 
482
480
  document.body.classList.remove("u-overflow-hidden");
483
481
 
484
- if (menu.contains(document.activeElement)) {
485
- menuButton.focus();
482
+ const activeMenuButton = Array.from(menuButtons).find(() => menu.contains(document.activeElement));
483
+ if (activeMenuButton) {
484
+ activeMenuButton.focus();
486
485
  }
487
- menuButton.setAttribute("aria-expanded", "false");
488
- menuButton.setAttribute("aria-label", "Open navigation menu");
486
+
487
+ menuButtons.forEach(btn => {
488
+ btn.setAttribute("aria-expanded", "false");
489
+ btn.setAttribute("aria-label", "Open navigation menu");
490
+ });
489
491
 
490
492
  // Remove focus trap
491
493
  removeFocusTrap();
@@ -495,7 +497,7 @@ function setupMenuButton() {
495
497
  cancelable: true,
496
498
  view: window,
497
499
  });
498
- menuButton.dispatchEvent(clickEvent);
500
+ menuButtons[0].dispatchEvent(clickEvent);
499
501
  }
500
502
 
501
503
  function toggleMenu() {
@@ -508,16 +510,36 @@ function setupMenuButton() {
508
510
  }
509
511
  }
510
512
 
511
- menuButton.addEventListener("keydown", function (e) {
512
- if (e.key === "Enter" || e.key === " ") {
513
- e.preventDefault();
514
- toggleMenu();
515
- }
516
- });
513
+ menuButtons.forEach(menuButton => {
514
+ menuButton.setAttribute("aria-expanded", "false");
515
+ menuButton.setAttribute("aria-controls", menuId);
516
+ menuButton.setAttribute("aria-label", "Open navigation menu");
517
517
 
518
- menuButton.addEventListener("click", function (e) {
519
- if (!e.isTrusted) return;
520
- toggleMenu();
518
+ menuButton.addEventListener("keydown", function (e) {
519
+ if (e.key === "Enter" || e.key === " ") {
520
+ e.preventDefault();
521
+ const config = menuButton.getAttribute("data-hs-config");
522
+ if (config === "close" && isMenuOpen) {
523
+ closeMenu();
524
+ } else if (config === "open" && !isMenuOpen) {
525
+ openMenu();
526
+ } else if (!config) {
527
+ toggleMenu();
528
+ }
529
+ }
530
+ });
531
+
532
+ menuButton.addEventListener("click", function (e) {
533
+ if (!e.isTrusted) return;
534
+ const config = menuButton.getAttribute("data-hs-config");
535
+ if (config === "close" && isMenuOpen) {
536
+ closeMenu();
537
+ } else if (config === "open" && !isMenuOpen) {
538
+ openMenu();
539
+ } else if (!config) {
540
+ toggleMenu();
541
+ }
542
+ });
521
543
  });
522
544
 
523
545
  }
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // Version:1.7.6
1
+ // Version:1.7.8
2
2
  const API_NAME = "hsmain";
3
3
 
4
4
  const initializeHsMain = async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hortonstudio/main",
3
- "version": "1.7.6",
3
+ "version": "1.7.8",
4
4
  "description": "Animation and utility library for client websites",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/utils/slider.js CHANGED
@@ -69,7 +69,7 @@ const initPaginationInstance = (originalList) => {
69
69
  elements.counter.setAttribute('aria-label', 'Current page');
70
70
  }
71
71
 
72
- const config = originalList.getAttribute('data-hs-config') || '';
72
+ const config = elements.controls?.getAttribute('data-hs-config') || '';
73
73
  const configOptions = config.split(', ').map(opt => opt.trim());
74
74
  const isInfiniteMode = configOptions.includes('infinite');
75
75