@shopify/polaris
Version:
Shopify’s product component library
105 lines (84 loc) • 3.71 kB
JavaScript
import { isElementInViewport as isElementInViewport$1 } from './is-element-in-viewport.js';
var FOCUSABLE_SELECTOR = 'a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]';
var KEYBOARD_FOCUSABLE_SELECTORS = 'a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]:not([tabindex="-1"])';
function handleMouseUpByBlurring({
currentTarget
}) {
currentTarget.blur();
}
function nextFocusableNode(node, filter) {
var allFocusableElements = [...document.querySelectorAll(FOCUSABLE_SELECTOR)];
var sliceLocation = allFocusableElements.indexOf(node) + 1;
var focusableElementsAfterNode = allFocusableElements.slice(sliceLocation);
for (var focusableElement of focusableElementsAfterNode) {
if (isElementInViewport$1(focusableElement) && (!filter || filter && filter(focusableElement))) {
return focusableElement;
}
}
return null;
}
function findFirstFocusableNode(element, onlyDescendants = true) {
if (!onlyDescendants && matches(element, FOCUSABLE_SELECTOR)) {
return element;
}
return element.querySelector(FOCUSABLE_SELECTOR);
} // Popover needs to be able to find its activator even if it is disabled, which FOCUSABLE_SELECTOR doesn't support.
function findFirstFocusableNodeIncludingDisabled(element) {
var focusableSelector = "a,button,frame,iframe,input:not([type=hidden]),select,textarea,*[tabindex]";
if (matches(element, focusableSelector)) {
return element;
}
return element.querySelector(focusableSelector);
}
function focusFirstFocusableNode(element, onlyDescendants = true) {
var _findFirstFocusableNo;
(_findFirstFocusableNo = findFirstFocusableNode(element, onlyDescendants)) == null ? void 0 : _findFirstFocusableNo.focus();
}
function focusNextFocusableNode(node, filter) {
var nextFocusable = nextFocusableNode(node, filter);
if (nextFocusable && nextFocusable instanceof HTMLElement) {
nextFocusable.focus();
return true;
}
return false;
}
function findFirstKeyboardFocusableNode(element, onlyDescendants = true) {
if (!onlyDescendants && matches(element, KEYBOARD_FOCUSABLE_SELECTORS)) {
return element;
}
return element.querySelector(KEYBOARD_FOCUSABLE_SELECTORS);
}
function focusFirstKeyboardFocusableNode(element, onlyDescendants = true) {
var firstFocusable = findFirstKeyboardFocusableNode(element, onlyDescendants);
if (firstFocusable) {
firstFocusable.focus();
return true;
}
return false;
}
function findLastKeyboardFocusableNode(element, onlyDescendants = true) {
if (!onlyDescendants && matches(element, KEYBOARD_FOCUSABLE_SELECTORS)) {
return element;
}
var allFocusable = element.querySelectorAll(KEYBOARD_FOCUSABLE_SELECTORS);
return allFocusable[allFocusable.length - 1];
}
function focusLastKeyboardFocusableNode(element, onlyDescendants = true) {
var lastFocusable = findLastKeyboardFocusableNode(element, onlyDescendants);
if (lastFocusable) {
lastFocusable.focus();
return true;
}
return false;
}
function matches(node, selector) {
if (node.matches) {
return node.matches(selector);
}
var matches = (node.ownerDocument || document).querySelectorAll(selector);
var i = matches.length;
while (--i >= 0 && matches.item(i) !== node) {
return i > -1;
}
}
export { findFirstFocusableNode, findFirstFocusableNodeIncludingDisabled, findFirstKeyboardFocusableNode, findLastKeyboardFocusableNode, focusFirstFocusableNode, focusFirstKeyboardFocusableNode, focusLastKeyboardFocusableNode, focusNextFocusableNode, handleMouseUpByBlurring, nextFocusableNode };