focus-lock
Version:
DOM trap for a focus
24 lines (23 loc) • 1.06 kB
JavaScript
import { getAllAffectedNodes } from './utils/all-affected';
import { isGuard, isNotAGuard } from './utils/is';
import { getTopCommonParent } from './utils/parenting';
import { orderByTabIndex } from './utils/tabOrder';
import { getFocusables } from './utils/tabUtils';
/**
* traverses all related nodes (including groups) returning a list of all nodes(outer and internal) with meta information
* This is low-level API!
* @returns list of focusable elements inside a given top(!) node.
* @see {@link getFocusableNodes} providing a simpler API
*/
export const expandFocusableNodes = (topNode) => {
const entries = getAllAffectedNodes(topNode).filter(isNotAGuard);
const commonParent = getTopCommonParent(topNode, topNode, entries);
const outerNodes = orderByTabIndex(getFocusables([commonParent], true), true, true);
const innerElements = getFocusables(entries, false);
return outerNodes.map(({ node, index }) => ({
node,
index,
lockItem: innerElements.indexOf(node) >= 0,
guard: isGuard(node),
}));
};