second-level-navigation.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * DO NOT EDIT THIS FILE.
  3. * See the following change record for more information,
  4. * https://www.drupal.org/node/2815083
  5. * @preserve
  6. **/
  7. (function (Drupal) {
  8. var isDesktopNav = Drupal.olivero.isDesktopNav;
  9. var secondLevelNavMenus = document.querySelectorAll('[data-drupal-selector="primary-nav-menu-item-has-children"]');
  10. function toggleSubNav(topLevelMenuItem, toState) {
  11. var buttonSelector = '[data-drupal-selector="primary-nav-submenu-toggle-button"]';
  12. var button = topLevelMenuItem.querySelector(buttonSelector);
  13. var state = toState !== undefined ? toState : button.getAttribute('aria-expanded') !== 'true';
  14. if (state) {
  15. if (isDesktopNav()) {
  16. secondLevelNavMenus.forEach(function (el) {
  17. el.querySelector(buttonSelector).setAttribute('aria-expanded', 'false');
  18. el.querySelector('[data-drupal-selector="primary-nav-menu--level-2"]').classList.remove('is-active-menu-parent');
  19. el.querySelector('[data-drupal-selector="primary-nav-menu-🥕"]').classList.remove('is-active-menu-parent');
  20. });
  21. }
  22. button.setAttribute('aria-expanded', 'true');
  23. topLevelMenuItem.querySelector('[data-drupal-selector="primary-nav-menu--level-2"]').classList.add('is-active-menu-parent');
  24. topLevelMenuItem.querySelector('[data-drupal-selector="primary-nav-menu-🥕"]').classList.add('is-active-menu-parent');
  25. } else {
  26. button.setAttribute('aria-expanded', 'false');
  27. topLevelMenuItem.classList.remove('is-touch-event');
  28. topLevelMenuItem.querySelector('[data-drupal-selector="primary-nav-menu--level-2"]').classList.remove('is-active-menu-parent');
  29. topLevelMenuItem.querySelector('[data-drupal-selector="primary-nav-menu-🥕"]').classList.remove('is-active-menu-parent');
  30. }
  31. }
  32. Drupal.olivero.toggleSubNav = toggleSubNav;
  33. function handleBlur(e) {
  34. if (!Drupal.olivero.isDesktopNav()) return;
  35. setTimeout(function () {
  36. var menuParentItem = e.target.closest('[data-drupal-selector="primary-nav-menu-item-has-children"]');
  37. if (!menuParentItem.contains(document.activeElement)) {
  38. toggleSubNav(menuParentItem, false);
  39. }
  40. }, 200);
  41. }
  42. secondLevelNavMenus.forEach(function (el) {
  43. var button = el.querySelector('[data-drupal-selector="primary-nav-submenu-toggle-button"]');
  44. button.removeAttribute('aria-hidden');
  45. button.removeAttribute('tabindex');
  46. el.addEventListener('touchstart', function () {
  47. el.classList.add('is-touch-event');
  48. }, {
  49. passive: true
  50. });
  51. el.addEventListener('mouseover', function () {
  52. if (isDesktopNav() && !el.classList.contains('is-touch-event')) {
  53. el.classList.add('is-active-mouseover-event');
  54. toggleSubNav(el, true);
  55. setTimeout(function () {
  56. el.classList.remove('is-active-mouseover-event');
  57. }, 500);
  58. }
  59. });
  60. button.addEventListener('click', function () {
  61. if (!el.classList.contains('is-active-mouseover-event')) {
  62. toggleSubNav(el);
  63. }
  64. });
  65. el.addEventListener('mouseout', function () {
  66. if (isDesktopNav() && !document.activeElement.matches('[aria-expanded="true"], .is-active-menu-parent *')) {
  67. toggleSubNav(el, false);
  68. }
  69. });
  70. el.addEventListener('blur', handleBlur, true);
  71. });
  72. function closeAllSubNav() {
  73. secondLevelNavMenus.forEach(function (el) {
  74. if (el.contains(document.activeElement)) {
  75. el.querySelector('[data-drupal-selector="primary-nav-submenu-toggle-button"]').focus();
  76. }
  77. toggleSubNav(el, false);
  78. });
  79. }
  80. Drupal.olivero.closeAllSubNav = closeAllSubNav;
  81. function areAnySubNavsOpen() {
  82. var subNavsAreOpen = false;
  83. secondLevelNavMenus.forEach(function (el) {
  84. var button = el.querySelector('[data-drupal-selector="primary-nav-submenu-toggle-button"]');
  85. var state = button.getAttribute('aria-expanded') === 'true';
  86. if (state) {
  87. subNavsAreOpen = true;
  88. }
  89. });
  90. return subNavsAreOpen;
  91. }
  92. Drupal.olivero.areAnySubNavsOpen = areAnySubNavsOpen;
  93. document.addEventListener('keyup', function (e) {
  94. if (e.key === 'Escape' || e.key === 'Esc') {
  95. if (isDesktopNav()) closeAllSubNav();
  96. }
  97. });
  98. document.addEventListener('touchstart', function (e) {
  99. if (areAnySubNavsOpen() && !e.target.matches('[data-drupal-selector="header-nav"], [data-drupal-selector="header-nav"] *')) {
  100. closeAllSubNav();
  101. }
  102. }, {
  103. passive: true
  104. });
  105. })(Drupal);