diff --git a/core/themes/olivero/js/search.es6.js b/core/themes/olivero/js/search.es6.js index 6c17e8871f..0adff64415 100644 --- a/core/themes/olivero/js/search.es6.js +++ b/core/themes/olivero/js/search.es6.js @@ -22,6 +22,7 @@ }); if (visibility === true) { + Drupal.olivero.closeAllSubNav(); searchWideWrapper.classList.add('is-active'); } else { searchWideWrapper.classList.remove('is-active'); diff --git a/core/themes/olivero/js/search.js b/core/themes/olivero/js/search.js index 94bd72d6fd..9ad55f47d0 100644 --- a/core/themes/olivero/js/search.js +++ b/core/themes/olivero/js/search.js @@ -30,6 +30,7 @@ }); if (visibility === true) { + Drupal.olivero.closeAllSubNav(); searchWideWrapper.classList.add('is-active'); } else { searchWideWrapper.classList.remove('is-active'); diff --git a/core/themes/olivero/js/second-level-navigation.es6.js b/core/themes/olivero/js/second-level-navigation.es6.js index 8653189baf..296cf31510 100644 --- a/core/themes/olivero/js/second-level-navigation.es6.js +++ b/core/themes/olivero/js/second-level-navigation.es6.js @@ -46,8 +46,7 @@ Drupal.olivero.toggleSubNav = toggleSubNav; - // Add hover and click event listeners onto each sub navigation parent and its - // button. + // Add event listeners onto each sub navigation parent and button. secondLevelNavMenus.forEach((el) => { const button = el.querySelector( '.primary-nav__button-toggle, .primary-nav__menu-link--button', @@ -56,11 +55,13 @@ button.removeAttribute('aria-hidden'); button.removeAttribute('tabindex'); - button.addEventListener('click', (e) => { - const topLevelMenuITem = e.currentTarget.parentNode; - toggleSubNav(topLevelMenuITem); + button.addEventListener('touchstart', (e) => { + e.preventDefault(); + toggleSubNav(el); }); + button.addEventListener('click', () => toggleSubNav(el)); + el.addEventListener('mouseover', (e) => { if (isDesktopNav()) { toggleSubNav(e.currentTarget, true); @@ -93,7 +94,9 @@ let subNavsAreOpen = false; secondLevelNavMenus.forEach((el) => { - const button = el.querySelector('.primary-nav__button-toggle'); + const button = el.querySelector( + '.primary-nav__button-toggle, .primary-nav__menu-link--button', + ); const state = button.getAttribute('aria-expanded') === 'true'; if (state) { @@ -108,8 +111,24 @@ // Ensure that desktop submenus close when ESC key is pressed. document.addEventListener('keyup', (e) => { - if (e.keyCode === 27 && isDesktopNav()) { + if (e.key === 'Escape' && isDesktopNav()) { closeAllSubNav(); } }); + + // If user taps outside of menu, close all menus. + document.addEventListener( + 'touchstart', + (e) => { + if ( + areAnySubNavsOpen() && + !e.target.matches( + '.primary-nav__menu-item--has-children, .primary-nav__menu-item--has-children *', + ) + ) { + closeAllSubNav(); + } + }, + { passive: true }, + ); })(Drupal); diff --git a/core/themes/olivero/js/second-level-navigation.js b/core/themes/olivero/js/second-level-navigation.js index 9a10dbb7d8..5de44ceaea 100644 --- a/core/themes/olivero/js/second-level-navigation.js +++ b/core/themes/olivero/js/second-level-navigation.js @@ -35,9 +35,12 @@ var button = el.querySelector('.primary-nav__button-toggle, .primary-nav__menu-link--button'); button.removeAttribute('aria-hidden'); button.removeAttribute('tabindex'); - button.addEventListener('click', function (e) { - var topLevelMenuITem = e.currentTarget.parentNode; - toggleSubNav(topLevelMenuITem); + button.addEventListener('touchstart', function (e) { + e.preventDefault(); + toggleSubNav(el); + }); + button.addEventListener('click', function () { + return toggleSubNav(el); }); el.addEventListener('mouseover', function (e) { if (isDesktopNav()) { @@ -62,7 +65,7 @@ function areAnySubNavsOpen() { var subNavsAreOpen = false; secondLevelNavMenus.forEach(function (el) { - var button = el.querySelector('.primary-nav__button-toggle'); + var button = el.querySelector('.primary-nav__button-toggle, .primary-nav__menu-link--button'); var state = button.getAttribute('aria-expanded') === 'true'; if (state) { @@ -74,8 +77,15 @@ Drupal.olivero.areAnySubNavsOpen = areAnySubNavsOpen; document.addEventListener('keyup', function (e) { - if (e.keyCode === 27 && isDesktopNav()) { + if (e.key === 'Escape' && isDesktopNav()) { + closeAllSubNav(); + } + }); + document.addEventListener('touchstart', function (e) { + if (areAnySubNavsOpen() && !e.target.matches('.primary-nav__menu-item--has-children, .primary-nav__menu-item--has-children *')) { closeAllSubNav(); } + }, { + passive: true }); })(Drupal); \ No newline at end of file