type FocusableElement =
| HTMLAnchorElement
| HTMLButtonElement
| HTMLInputElement
| HTMLTextAreaElement
| HTMLSelectElement
| HTMLDetailsElement
export function modal() {
// variables
let modals = document.querySelectorAll(".modal")
// abort controllers for global event listeners
let trapFocusController: AbortController | undefined
let keydownController: AbortController | undefined
const getKeyboardFocusableElements = (element: HTMLElement) => {
return [
...element.querySelectorAll(
'a, button, input, textarea, select, details,[tabindex]:not([tabindex="-1"])',
),
].filter((el) => !el.hasAttribute("disabled"))
}
const trapFocus = (event: KeyboardEvent, modal: HTMLDialogElement) => {
const focusables = getKeyboardFocusableElements(modal)
// These will not be undefined as a modal always has at least one