@mskcc/carbon-react
Version:
Carbon react components for the MSKCC DSM
78 lines (66 loc) • 2.6 kB
JavaScript
/**
* MSKCC 2021, 2024
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var keys = require('./keys.js');
var match = require('./match.js');
/**
* Various utilities to help with a11y work
*/
/**
* A "ring buffer" function that takes an array and depending on an ArrowRight
* or ArrowLeft key input loops from last index to first or first index to last.
*
* @param {string} key - the left or right arrow keys
* @param {number} index - the current index in a given array
* @param {number} arrayLength - the total length of the array
*
* @example
* getNextIndex(keyCodes.RIGHT, 0, 4)
*/
const getNextIndex = (key, index, arrayLength) => {
if (match.match(key, keys.ArrowRight)) {
return (index + 1) % arrayLength;
}
if (match.match(key, keys.ArrowLeft)) {
return (index + arrayLength - 1) % arrayLength;
}
};
/**
* A flag `node.compareDocumentPosition(target)` returns,
* that indicates `target` is located earlier than `node` in the document or `target` contains `node`.
*/
const DOCUMENT_POSITION_BROAD_PRECEDING =
// Checks `typeof Node` for `react-docgen`
typeof Node !== 'undefined' && Node.DOCUMENT_POSITION_PRECEDING | Node.DOCUMENT_POSITION_CONTAINS;
/**
* A flag `node.compareDocumentPosition(target)` returns,
* that indicates `target` is located later than `node` in the document or `node` contains `target`.
*/
const DOCUMENT_POSITION_BROAD_FOLLOWING =
// Checks `typeof Node` for `react-docgen`
typeof Node !== 'undefined' && Node.DOCUMENT_POSITION_FOLLOWING | Node.DOCUMENT_POSITION_CONTAINED_BY;
/**
* CSS selector that selects major nodes that are sequential-focusable.
*/
const selectorTabbable = `
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']):not([disabled]), *[contenteditable=true]
`;
/**
* CSS selector that selects major nodes that are click focusable
*/
const selectorFocusable = `
a[href], area[href], input:not([disabled]),
button:not([disabled]),select:not([disabled]),
textarea:not([disabled]),
iframe, object, embed, *[tabindex]:not([disabled]), *[contenteditable=true]
`;
exports.DOCUMENT_POSITION_BROAD_FOLLOWING = DOCUMENT_POSITION_BROAD_FOLLOWING;
exports.DOCUMENT_POSITION_BROAD_PRECEDING = DOCUMENT_POSITION_BROAD_PRECEDING;
exports.getNextIndex = getNextIndex;
exports.selectorFocusable = selectorFocusable;
exports.selectorTabbable = selectorTabbable;