UNPKG

@mskcc/carbon-react

Version:

Carbon react components for the MSKCC DSM

78 lines (66 loc) 2.6 kB
/** * MSKCC 2021, 2024 */ 'use strict'; 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;