UNPKG

@ussebastian/kitdigital

Version:

Kit Digital de la Universidad San Sebastián

84 lines (75 loc) 2.71 kB
export class NavbarMobile { constructor(el) { this.mainMenu = el; this.navItems = this.mainMenu.querySelector('.uss-mainnav__menu'); this.buttonToggleNav = this.mainMenu.querySelector('[data-toggle-nav-mobile]'); this.navWrap = this.mainMenu.querySelector('.uss-mainnav__wrap'); this.iconOfButton = this.buttonToggleNav.querySelector('i'); this.itemsWithSubmenu = this.mainMenu.querySelectorAll('[data-subitem-ref]'); this.topbar = document.querySelector('.uss-topnav-wrapper').cloneNode(true); } mount() { this.#registerCloseEvents(); this.navItems.appendChild(this.topbar); if (this.buttonToggleNav) { this.buttonToggleNav.addEventListener('click', (e) => { e.preventDefault(); if (this.navItems.classList.contains('uss-mainnav__menu--open')) { this.hideNavItems(); } else { this.showNavItems(); } }); } this.itemsWithSubmenu.forEach((item) => { item.addEventListener('click', (e) => { e.preventDefault(); const subMenu = this.navItems.querySelector( `[data-subitem-target="${item.getAttribute('data-subitem-ref')}"]`, ); if (subMenu.classList.contains('uss-mainnav__submenu--open')) { item.classList.remove('active'); subMenu.classList.remove('uss-mainnav__submenu--open'); } else { this.closeAllSubmenus(); item.classList.add('active'); subMenu.classList.add('uss-mainnav__submenu--open'); } }); }); } closeAllSubmenus() { this.itemsWithSubmenu.forEach((item) => { item.classList.remove('active'); const subMenu = this.navItems.querySelector( `[data-subitem-target="${item.getAttribute('data-subitem-ref')}"]`, ); subMenu.classList.remove('uss-mainnav__submenu--open'); }); } showNavItems() { this.closeAllSubmenus(); this.navItems.classList.add('uss-mainnav__menu--open'); this.navWrap.classList.add('uss-mainnav__wrap--open'); this.iconOfButton.classList.add('ri-close-line'); this.iconOfButton.classList.remove('ri-menu-line'); } hideNavItems() { this.navItems.classList.remove('uss-mainnav__menu--open'); this.navWrap.classList.remove('uss-mainnav__wrap--open'); this.iconOfButton.classList.add('ri-menu-line'); this.iconOfButton.classList.remove('ri-close-line'); } #registerCloseEvents() { document.addEventListener('click', (e) => { if (!this.mainMenu.contains(e.target)) { this.hideNavItems(); } }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { this.hideNavItems(); } }); } }