/* eslint-disable no-inner-declarations */
((Drupal) => {
/**
* Olivero helper functions.
*
* @namespace
*/
Drupal.olivero = {};
function isDesktopNav() {
// @todo, I'm not sure we even need the .mobile-buttons container anymore.
const navButtons = document.querySelector('.mobile-buttons');
return (
window.getComputedStyle(navButtons).getPropertyValue('display') === 'none'
);
}
Drupal.olivero.isDesktopNav = isDesktopNav;
const wideNavButton = document.querySelector('.nav-primary__button');
const siteHeaderFixable = document.querySelector('.site-header__fixable');
function wideNavIsOpen() {
return wideNavButton.getAttribute('aria-expanded') === 'true';
}
function showWideNav() {
if (isDesktopNav()) {
wideNavButton.setAttribute('aria-expanded', 'true');
siteHeaderFixable.classList.add('is-expanded');
}
}
// Resets the wide nav button to be closed (its default state).
function hideWideNav() {
if (isDesktopNav()) {
wideNavButton.setAttribute('aria-expanded', 'false');
siteHeaderFixable.classList.remove('is-expanded');
}
}
// Only enable scroll effects if the browser supports Intersection Observer.
// @see https://github.com/w3c/IntersectionObserver/blob/master/polyfill/intersection-observer.js#L19-L21
if (
'IntersectionObserver' in window &&
'IntersectionObserverEntry' in window &&
'intersectionRatio' in window.IntersectionObserverEntry.prototype
) {
const fixableElements = document.querySelectorAll('.fixable');
function toggleDesktopNavVisibility(entries) {
if (!isDesktopNav()) return;
entries.forEach((entry) => {
// FF doesn't seem to support entry.isIntersecting properly,
// so we check the intersectionRatio.
if (entry.intersectionRatio < 1) {
fixableElements.forEach((el) => el.classList.add('js-fixed'));
} else {
fixableElements.forEach((el) => el.classList.remove('js-fixed'));
}
});
}
function getRootMargin() {
let rootMarginTop = 72;
const { body } = document;
if (body.classList.contains('toolbar-fixed')) {
rootMarginTop -= 39;
}
if (
body.classList.contains('toolbar-horizontal') &&
body.classList.contains('toolbar-tray-open')
) {
rootMarginTop -= 40;
}
return `${rootMarginTop}px 0px 0px 0px`;
}
function monitorNavPosition() {
const primaryNav = document.querySelector('.site-header');
const options = {
rootMargin: getRootMargin(),
threshold: [0.999, 1],
};
const observer = new IntersectionObserver(
toggleDesktopNavVisibility,
options,
);
observer.observe(primaryNav);
}
wideNavButton.addEventListener('click', () => {
if (!wideNavIsOpen()) {
showWideNav();
} else {
hideWideNav();
}
});
siteHeaderFixable
.querySelector('.site-header__inner')
.addEventListener('focusin', showWideNav);
// If skip link is clicked, ensure that the wide navigation closes so the header will not be covered up.
document.querySelector('.skip-link').addEventListener('click', hideWideNav);
monitorNavPosition();
}
document.addEventListener('keyup', (e) => {
if (e.keyCode === 27) {
// Close the search form.
if (
'toggleSearchVisibility' in Drupal.olivero &&
'searchIsVisible' in Drupal.olivero &&
Drupal.olivero.searchIsVisible()
) {
Drupal.olivero.toggleSearchVisibility(false);
}
// Close the wide nav.
else {
hideWideNav();
}
}
});
})(Drupal);