UNPKG

@shopify/polaris

Version:

Shopify’s product component library

105 lines (84 loc) 3.71 kB
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 };