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