@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
26 lines • 4.86 kB
JavaScript
import { svgNodeFilter } from '@taiga-ui/cdk/constants';
import { tuiIsHTMLElement } from '@taiga-ui/cdk/utils/dom';
import { tuiIsNativeKeyboardFocusable } from './is-native-keyboard-focusable';
import { tuiIsNativeMouseFocusable } from './is-native-mouse-focusable';
/**
* @description:
* Finds the closest element that can be focused with a keyboard or mouse in theory
*/
export function tuiGetClosestFocusable({ initial, root, previous = false, keyboard = true, }) {
if (!root.ownerDocument) {
return null;
}
const check = keyboard ? tuiIsNativeKeyboardFocusable : tuiIsNativeMouseFocusable;
const treeWalker = root.ownerDocument.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, svgNodeFilter);
treeWalker.currentNode = initial;
do {
if (tuiIsHTMLElement(treeWalker.currentNode)) {
initial = treeWalker.currentNode;
}
if (tuiIsHTMLElement(initial) && check(initial)) {
return initial;
}
} while (previous ? treeWalker.previousNode() : treeWalker.nextNode());
return null;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWNsb3Nlc3QtZm9jdXNhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3V0aWxzL2ZvY3VzL2dldC1jbG9zZXN0LWZvY3VzYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFekQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUE0QnRFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxFQUNuQyxPQUFPLEVBQ1AsSUFBSSxFQUNKLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLFFBQVEsR0FBRyxJQUFJLEdBQ2E7SUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDckIsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO0lBQ2xGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQ2xELElBQUksRUFDSixVQUFVLENBQUMsWUFBWSxFQUN2QixhQUFhLENBQ2hCLENBQUM7SUFFRixVQUFVLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUVqQyxHQUFHO1FBQ0MsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7U0FDcEM7UUFFRCxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM3QyxPQUFPLE9BQU8sQ0FBQztTQUNsQjtLQUNKLFFBQVEsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtJQUV2RSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtzdmdOb2RlRmlsdGVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge3R1aUlzSFRNTEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcblxuaW1wb3J0IHt0dWlJc05hdGl2ZUtleWJvYXJkRm9jdXNhYmxlfSBmcm9tICcuL2lzLW5hdGl2ZS1rZXlib2FyZC1mb2N1c2FibGUnO1xuaW1wb3J0IHt0dWlJc05hdGl2ZU1vdXNlRm9jdXNhYmxlfSBmcm9tICcuL2lzLW5hdGl2ZS1tb3VzZS1mb2N1c2FibGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFR1aUdldENsb3Nlc3RGb2N1c2FibGVPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb246XG4gICAgICogY3VycmVudCBIVE1MIGVsZW1lbnRcbiAgICAgKi9cbiAgICBpbml0aWFsOiBFbGVtZW50O1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uOlxuICAgICAqIGRldGVybWluZSBpZiBvbmx5IGtleWJvYXJkIGZvY3VzIGlzIG9mIGludGVyZXN0XG4gICAgICovXG4gICAga2V5Ym9hcmQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uOlxuICAgICAqIHNob3VsZCBpdCBsb29rIGJhY2t3YXJkcyBpbnN0ZWFkIChmaW5kIGl0ZW0gdGhhdCB3aWxsIGJlIGZvY3VzZWQgd2l0aCBTaGlmdCArIFRhYilcbiAgICAgKi9cbiAgICBwcmV2aW91cz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb246XG4gICAgICogdG9wIE5vZGUgbGltaXRpbmcgdGhlIHNlYXJjaCBhcmVhXG4gICAgICovXG4gICAgcm9vdDogTm9kZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb246XG4gKiBGaW5kcyB0aGUgY2xvc2VzdCBlbGVtZW50IHRoYXQgY2FuIGJlIGZvY3VzZWQgd2l0aCBhIGtleWJvYXJkIG9yIG1vdXNlIGluIHRoZW9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHVpR2V0Q2xvc2VzdEZvY3VzYWJsZSh7XG4gICAgaW5pdGlhbCxcbiAgICByb290LFxuICAgIHByZXZpb3VzID0gZmFsc2UsXG4gICAga2V5Ym9hcmQgPSB0cnVlLFxufTogVHVpR2V0Q2xvc2VzdEZvY3VzYWJsZU9wdGlvbnMpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghcm9vdC5vd25lckRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrID0ga2V5Ym9hcmQgPyB0dWlJc05hdGl2ZUtleWJvYXJkRm9jdXNhYmxlIDogdHVpSXNOYXRpdmVNb3VzZUZvY3VzYWJsZTtcbiAgICBjb25zdCB0cmVlV2Fsa2VyID0gcm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULFxuICAgICAgICBzdmdOb2RlRmlsdGVyLFxuICAgICk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gaW5pdGlhbDtcblxuICAgIGRvIHtcbiAgICAgICAgaWYgKHR1aUlzSFRNTEVsZW1lbnQodHJlZVdhbGtlci5jdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGluaXRpYWwgPSB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR1aUlzSFRNTEVsZW1lbnQoaW5pdGlhbCkgJiYgY2hlY2soaW5pdGlhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsO1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAocHJldmlvdXMgPyB0cmVlV2Fsa2VyLnByZXZpb3VzTm9kZSgpIDogdHJlZVdhbGtlci5uZXh0Tm9kZSgpKTtcblxuICAgIHJldHVybiBudWxsO1xufVxuIl19