import { Controller } from "@hotwired/stimulus" export default class extends Controller { static targets = ["button", "menu"] connect() { this.boundClickOutside = this.clickOutside.bind(this) this.boundKeydown = this.keydown.bind(this) } disconnect() { this.stopListening() } toggle(event) { event.preventDefault() this.isOpen ? this.close() : this.open() } open() { this.buttonTarget.setAttribute("aria-expanded", "true") this.menuTarget.hidden = false document.addEventListener("mousedown", this.boundClickOutside) document.addEventListener("keydown", this.boundKeydown) } close() { this.buttonTarget.setAttribute("aria-expanded", "false") this.menuTarget.hidden = true this.stopListening() } stopListening() { document.removeEventListener("mousedown", this.boundClickOutside) document.removeEventListener("keydown", this.boundKeydown) } get isOpen() { return this.buttonTarget.getAttribute("aria-expanded") === "true" } clickOutside(event) { if (this.element.contains(event.target)) return this.close() } keydown(event) { if (event.key === "Escape") { this.close() this.buttonTarget.focus() } } }