in packages/component/src/Utils/TypeFocusSink/navigableEvent.js [5:68]
export default function navigableEvent(event) {
const {
altKey,
target,
target: { tagName }
} = event;
const autocompleteAttribute = target.getAttribute('autocomplete');
const autocomplete = autocompleteAttribute && autocompleteAttribute !== 'off';
// Generally, we allow up/down arrow keys on all elements captured here, except those handled by the user agent.
// For example, if it is on <select>, we will ignore up/down arrow keys. Also true for textbox with autocomplete.
// For some elements, user agent doesn't handle arrow keys when ALT key is held, so we can still handle ALT + UP/DOWN keys.
// For example, user agent ignores ALT + UP/DOWN on <input type="text"> with content.
// Counter-example: user agent continues to handle ALT + UP/DOWN on <input type="number">.
if (tagName === 'INPUT') {
const { list, type, value } = target;
// These are buttons, up/down arrow keys are not handled by the user agent.
if (
type === 'button' ||
type === 'checkbox' ||
type === 'file' ||
type === 'image' ||
type === 'radio' ||
type === 'reset' ||
type === 'submit'
) {
return true;
} else if (
type === 'email' ||
type === 'password' ||
type === 'search' ||
type === 'tel' ||
type === 'text' ||
type === 'url'
) {
if (autocomplete || list) {
// "autocomplete" and "list" are comboboxes. Up/down arrow keys may be handled by the user agent.
return true;
} else if (altKey || !value) {
// If the input has content, user agent will handle up/down arrow and it work similar to HOME/END keys.
// "altKey" can be used; user agent ignores ALT + UP/DOWN.
return true;
}
}
} else if (tagName === 'SELECT') {
// User agent handles up/down arrow keys for dropdown list.
return false;
} else if (tagName === 'TEXTAREA') {
if (!autocomplete && (altKey || !target.value)) {
// User agent handles up/down arrow keys for multiline text box if it has content or is auto-complete.
return true;
}
} else if (target.getAttribute('contenteditable') === 'true') {
if (altKey || !target.innerHTML) {
// "contenteditable" element works like <textarea> minus "autocomplete".
return true;
}
} else {
return true;
}
}