,
+ )
+
+ await user.keyboard('{arrowdown}')
+ expect(document.activeElement).toEqual(thirdButton)
+
+ controller.abort()
+})
diff --git a/src/focus-zone.ts b/src/focus-zone.ts
index 157c42d..1ee75c0 100644
--- a/src/focus-zone.ts
+++ b/src/focus-zone.ts
@@ -527,6 +527,12 @@ export function focusZone(container: HTMLElement, settings?: FocusZoneSettings):
endFocusManagement(...iterateFocusableElements(removedNode, iterateFocusableElementsOptions))
}
}
+ // If an element is hidden or disabled, remove it from the list of focusable elements
+ if (mutation.type === 'attributes' && mutation.oldValue === null) {
+ if (mutation.target instanceof HTMLElement) {
+ endFocusManagement(mutation.target)
+ }
+ }
}
for (const mutation of mutations) {
for (const addedNode of mutation.addedNodes) {
@@ -534,12 +540,22 @@ export function focusZone(container: HTMLElement, settings?: FocusZoneSettings):
beginFocusManagement(...iterateFocusableElements(addedNode, iterateFocusableElementsOptions))
}
}
+
+ // Similarly, if an element is unhidden or "enabled", add it to the list of focusable elements
+ // If `mutation.oldValue` is not null, then we may assume that the element was previously hidden or disabled
+ if (mutation.type === 'attributes' && mutation.oldValue !== null) {
+ if (mutation.target instanceof HTMLElement) {
+ beginFocusManagement(mutation.target)
+ }
+ }
}
})
observer.observe(container, {
subtree: true,
childList: true,
+ attributeFilter: ['hidden', 'disabled'],
+ attributeOldValue: true,
})
const controller = new AbortController()