@ussebastian/kitdigital
Version:
Kit Digital de la Universidad San Sebastián
96 lines (80 loc) • 2.32 kB
JavaScript
import { createPopper } from '@popperjs/core/dist/esm/popper';
export class Navbar {
constructor(el) {
this.mainMenu = el;
this.boundary = document.querySelector('.uss-mainnav__wrap');
}
mount() {
const elements = this.mainMenu.querySelectorAll('.uss-mainnav__item-link[data-subitem-ref]');
const { boundary } = this;
if (!boundary || boundary.dataset.init) return;
boundary.dataset.init = true;
elements.forEach((el) => {
const button = el;
const idRef = button.dataset.subitemRef;
const submenu = this.mainMenu.querySelector(
`.uss-mainnav__subitems-wrapper[data-subitem-target="${idRef}"]`,
);
let popperInstance = null;
function create() {
popperInstance = createPopper(button, submenu, {
placement: 'bottom',
modifiers: [
{
name: 'preventOverflow',
options: {
boundary,
},
},
{
name: 'flip',
enabled: false,
},
{
name: 'offset',
options: {
offset: [0, 15],
},
},
],
});
}
const destroy = () => {
if (popperInstance) {
popperInstance.destroy();
popperInstance = null;
}
};
const show = () => {
submenu.setAttribute('data-show', 'true');
button.classList.add('active');
create();
};
const hide = () => {
submenu.removeAttribute('data-show');
button.classList.remove('active');
destroy();
};
submenu.addEventListener('focusout', (e) => {
if (!submenu.contains(e.relatedTarget)) {
hide();
}
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
hide();
}
});
document.addEventListener('click', (e) => {
if (!submenu.contains(e.target) && !button.contains(e.target)) {
hide();
}
});
button.addEventListener('click', (e) => {
e.preventDefault();
// eslint-disable-next-line no-unused-expressions
submenu.getAttribute('data-show') ? hide() : show();
});
});
}
}