Sha256: d1a057ce1f76ddf1e3ae2c127a99f21577bee751cc1df3236259fec02e03012b

Contents?: true

Size: 996 Bytes

Versions: 1

Compression:

Stored size: 996 Bytes

Contents

class Submenu {
	constructor(button, submenu) {
		this.button = button;
		this.submenu = submenu;
		this.init();
	}

	init() {
		this.button.addEventListener('click', () => this.toggleSubmenu());
		document.addEventListener('click', (event) =>
			this.handleClickOutside(event)
		);
		this.submenu.addEventListener('keydown', (event) =>
			this.handleKeydown(event)
		);
	}

	toggleSubmenu() {
		const isExpanded = this.button.getAttribute('aria-expanded') === 'true';
		this.button.setAttribute('aria-expanded', !isExpanded);
		this.submenu.classList.toggle('hidden', isExpanded);
	}

	handleClickOutside(event) {
		if (
			!this.button.contains(event.target) &&
			!this.submenu.contains(event.target)
		) {
			this.closeSubmenu();
		}
	}

	handleKeydown(event) {
		if (event.key === 'Escape') {
			this.closeSubmenu();
			this.button.focus();
		}
	}

	closeSubmenu() {
		this.button.setAttribute('aria-expanded', 'false');
		this.submenu.classList.add('hidden');
	}
}

export default Submenu;

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
decidim-posts-1.0.0 app/packs/src/decidim/posts/submenu.js