const STATES = { open: 'is-open', }; export default class Navigation { constructor(cfg = {}) { if (!cfg.container) return false; if (!cfg.menu) return false; this.state = 'hidden'; this.container = cfg.container; this.menu = cfg.menu; } init() { if (!this.state) return false; this.container.setAttribute('aria-hidden', true); this.attachClickEvents(); this.attachKeyEvents(); return true; } attachClickEvents() { this.container.addEventListener('click', (e) => { if (this.container === e.target) { this.closeNav(); } }); this.menu.container.addEventListener('click', () => { this.openNav(); }); this.container.querySelector('.nav__close').addEventListener('click', () => { this.closeNav(); }); } attachKeyEvents() { const first = this.container.querySelector('.nav__link'); const last = this.container.querySelector('.nav__close'); this.container.addEventListener('keydown', (e) => { if (e.keyCode === 27) { this.closeNav(); } }); first.addEventListener('keydown', (e) => { if (e.shiftKey && e.keyCode === 9) { e.preventDefault(); last.focus(); } }); last.addEventListener('keydown', (e) => { if (!e.shiftKey && e.keyCode === 9) { e.preventDefault(); first.focus(); } }); } openNav() { this.lastActiveElement = document.activeElement; this.state = 'visible'; this.menu.hideMenu(); this.container.classList.add(STATES.open); this.container.setAttribute('aria-hidden', false); this.container.querySelector('.nav__title-link').focus(); } closeNav() { this.state = 'hidden'; this.menu.showMenu(); this.container.classList.remove(STATES.open); this.container.setAttribute('aria-hidden', true); if (this.lastActiveElement) { this.lastActiveElement.focus(); } } }