carbon-components-angular
Version:
Next generation components
65 lines • 8.47 kB
JavaScript
export let tabbableSelector = "a[href], area[href], input:not([disabled]):not([tabindex=\'-1\']), " +
"button:not([disabled]):not([tabindex=\'-1\']),select:not([disabled]):not([tabindex=\'-1\']), " +
"textarea:not([disabled]):not([tabindex=\'-1\']), " +
"iframe, object, embed, *[tabindex]:not([tabindex=\'-1\']), *[contenteditable=true]";
export let tabbableSelectorIgnoreTabIndex = "a[href], area[href], input:not([disabled]), " +
"button:not([disabled]),select:not([disabled]), " +
"textarea:not([disabled]), " +
"iframe, object, embed, *[tabindex], *[contenteditable=true]";
export function getFocusElementList(element, selector = tabbableSelector) {
let elements = element.querySelectorAll(selector);
return elements ? Array.prototype.filter.call(elements, el => isVisible(el)) : elements;
}
export function isFocusInFirstItem(event, list) {
if (list.length > 0) {
return (event.target || event.srcElement) === list[0];
}
return false;
}
export function isFocusInLastItem(event, list) {
if (list.length > 0) {
return (event.target || event.srcElement) === list[list.length - 1];
}
return false;
}
export function isElementFocused(event, element) {
return (event.target || event.srcElement) === element;
}
export function focusFirstFocusableElement(list) {
if (list.length > 0) {
list[0].focus();
return true;
}
return false;
}
export function focusLastFocusableElement(list) {
if (list.length > 0) {
list[list.length - 1].focus();
return true;
}
return false;
}
export function isVisible(element) {
return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);
}
export function cycleTabs(event, element) {
if (event.key === "Tab") {
let list = getFocusElementList(element);
let focusChanged = false;
if (event.shiftKey) {
if (isFocusInFirstItem(event, list) || isElementFocused(event, element)) {
focusChanged = focusLastFocusableElement(list);
}
}
else {
if (isFocusInLastItem(event, list)) {
focusChanged = focusFirstFocusableElement(list);
}
}
if (focusChanged) {
event.preventDefault();
event.stopPropagation();
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL3RhYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxJQUFJLGdCQUFnQixHQUFHLHFFQUFxRTtJQUNqRywrRkFBK0Y7SUFDL0YsbURBQW1EO0lBQ25ELG9GQUFvRixDQUFDO0FBRXZGLE1BQU0sQ0FBQyxJQUFJLDhCQUE4QixHQUFHLDhDQUE4QztJQUN4RixpREFBaUQ7SUFDakQsNEJBQTRCO0lBQzVCLDZEQUE2RCxDQUFDO0FBRWhFLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxHQUFHLGdCQUFnQjtJQUN2RSxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3pGLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLElBQUk7SUFDN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3REO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJO0lBQzVDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPO0lBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxPQUFPLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxJQUFJO0lBQzlDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0tBQ1o7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNkLENBQUM7QUFFRCxNQUFNLFVBQVUseUJBQXlCLENBQUMsSUFBSTtJQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0tBQ1o7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNkLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLE9BQU87SUFDaEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPO0lBQ3ZDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxLQUFLLEVBQUU7UUFDeEIsSUFBSSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXpCLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNuQixJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ3hFLFlBQVksR0FBRyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQztTQUNEO2FBQU07WUFDTixJQUFJLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDbkMsWUFBWSxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Q7UUFFRCxJQUFJLFlBQVksRUFBRTtZQUNqQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0tBQ0Q7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGxldCB0YWJiYWJsZVNlbGVjdG9yID0gXCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpbnB1dDpub3QoW2Rpc2FibGVkXSk6bm90KFt0YWJpbmRleD1cXCctMVxcJ10pLCBcIiArXG5cdFx0XCJidXR0b246bm90KFtkaXNhYmxlZF0pOm5vdChbdGFiaW5kZXg9XFwnLTFcXCddKSxzZWxlY3Q6bm90KFtkaXNhYmxlZF0pOm5vdChbdGFiaW5kZXg9XFwnLTFcXCddKSwgXCIgK1xuXHRcdFwidGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pOm5vdChbdGFiaW5kZXg9XFwnLTFcXCddKSwgXCIgK1xuXHRcdFwiaWZyYW1lLCBvYmplY3QsIGVtYmVkLCAqW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVxcJy0xXFwnXSksICpbY29udGVudGVkaXRhYmxlPXRydWVdXCI7XG5cbmV4cG9ydCBsZXQgdGFiYmFibGVTZWxlY3Rvcklnbm9yZVRhYkluZGV4ID0gXCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpbnB1dDpub3QoW2Rpc2FibGVkXSksIFwiICtcblx0XHRcImJ1dHRvbjpub3QoW2Rpc2FibGVkXSksc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgXCIgK1xuXHRcdFwidGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBcIiArXG5cdFx0XCJpZnJhbWUsIG9iamVjdCwgZW1iZWQsICpbdGFiaW5kZXhdLCAqW2NvbnRlbnRlZGl0YWJsZT10cnVlXVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9jdXNFbGVtZW50TGlzdChlbGVtZW50LCBzZWxlY3RvciA9IHRhYmJhYmxlU2VsZWN0b3IpIHtcblx0bGV0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcblx0cmV0dXJuIGVsZW1lbnRzID8gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGVsZW1lbnRzLCBlbCA9PiBpc1Zpc2libGUoZWwpKSA6IGVsZW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGb2N1c0luRmlyc3RJdGVtKGV2ZW50LCBsaXN0KSB7XG5cdGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gKGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50KSA9PT0gbGlzdFswXTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZvY3VzSW5MYXN0SXRlbShldmVudCwgbGlzdCkge1xuXHRpZiAobGlzdC5sZW5ndGggPiAwKSB7XG5cdFx0cmV0dXJuIChldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudCkgPT09IGxpc3RbbGlzdC5sZW5ndGggLSAxXTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnRGb2N1c2VkKGV2ZW50LCBlbGVtZW50KSB7XG5cdHJldHVybiAoZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQpID09PSBlbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9jdXNGaXJzdEZvY3VzYWJsZUVsZW1lbnQobGlzdCkge1xuXHRpZiAobGlzdC5sZW5ndGggPiAwKSB7XG5cdFx0bGlzdFswXS5mb2N1cygpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvY3VzTGFzdEZvY3VzYWJsZUVsZW1lbnQobGlzdCkge1xuXHRpZiAobGlzdC5sZW5ndGggPiAwKSB7XG5cdFx0bGlzdFtsaXN0Lmxlbmd0aCAtIDFdLmZvY3VzKCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWaXNpYmxlKGVsZW1lbnQpIHtcblx0cmV0dXJuICEhKGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjeWNsZVRhYnMoZXZlbnQsIGVsZW1lbnQpIHtcblx0aWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIikge1xuXHRcdGxldCBsaXN0ID0gZ2V0Rm9jdXNFbGVtZW50TGlzdChlbGVtZW50KTtcblx0XHRsZXQgZm9jdXNDaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRpZiAoZXZlbnQuc2hpZnRLZXkpIHtcblx0XHRcdGlmIChpc0ZvY3VzSW5GaXJzdEl0ZW0oZXZlbnQsIGxpc3QpIHx8IGlzRWxlbWVudEZvY3VzZWQoZXZlbnQsIGVsZW1lbnQpKSB7XG5cdFx0XHRcdGZvY3VzQ2hhbmdlZCA9IGZvY3VzTGFzdEZvY3VzYWJsZUVsZW1lbnQobGlzdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChpc0ZvY3VzSW5MYXN0SXRlbShldmVudCwgbGlzdCkpIHtcblx0XHRcdFx0Zm9jdXNDaGFuZ2VkID0gZm9jdXNGaXJzdEZvY3VzYWJsZUVsZW1lbnQobGlzdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGZvY3VzQ2hhbmdlZCkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fVxufVxuIl19