@agnos-ui/core
Version:
Framework-agnostic headless component library.
33 lines (32 loc) • 1.15 kB
JavaScript
const isInertOrInvisible = (element) => {
let curElement = element;
while (curElement) {
const style = getComputedStyle(curElement);
if (curElement.inert || curElement.hidden || style.display === "none" || style.visibility === "hidden") {
return true;
}
curElement = curElement.parentElement;
}
return false;
};
const checkNotDisabled = (element) => {
if (element.disabled) {
return false;
}
const parentFieldset = element.parentElement?.closest("fieldset");
return parentFieldset ? checkNotDisabled(parentFieldset) : true;
};
const isFocusableOtherTags = (element) => element.isContentEditable || !!element.hasAttribute("tabindex");
const isFocusableByTagName = {
INPUT: (element) => element.type !== "hidden" && checkNotDisabled(element),
SELECT: checkNotDisabled,
TEXTAREA: checkNotDisabled,
BUTTON: checkNotDisabled,
A: (element) => !!element.href || isFocusableOtherTags(element)
};
const isFocusable = (element) => {
return document.contains(element) && !isInertOrInvisible(element) && (isFocusableByTagName[element.tagName] ?? isFocusableOtherTags)(element);
};
export {
isFocusable as i
};