{"version":3,"file":"aria.mjs","sources":["../../../src/utils/dom/aria.ts"],"sourcesContent":["const FOCUSABLE_ELEMENT_SELECTORS = `a[href],button:not([disabled]),button:not([hidden]),:not([tabindex=\"-1\"]),input:not([disabled]),input:not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled])`;\r\n\r\n/**\r\n * Determine if the testing element is visible on screen no matter if its on the viewport or not\r\n */\r\nexport const isVisible = (element: HTMLElement) => {\r\n  if (process.env.NODE_ENV === 'test') return true;\r\n  const computed = getComputedStyle(element);\r\n  // element.offsetParent won't work on fix positioned\r\n  // WARNING: potential issue here, going to need some expert advices on this issue\r\n  return computed.position === 'fixed' ? false : element.offsetParent !== null;\r\n};\r\n\r\nexport const obtainAllFocusableElements = (element: HTMLElement): HTMLElement[] => {\r\n  return Array.from(element.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENT_SELECTORS)).filter(\r\n    (item: HTMLElement) => isFocusable(item) && isVisible(item),\r\n  );\r\n};\r\n\r\n/**\r\n * @desc Determine if target element is focusable\r\n * @param element {HTMLElement}\r\n * @returns {Boolean} true if it is focusable\r\n */\r\nexport const isFocusable = (element: HTMLElement): boolean => {\r\n  if (\r\n    element.tabIndex > 0 ||\r\n    (element.tabIndex === 0 && element.getAttribute('tabIndex') !== null)\r\n  ) {\r\n    return true;\r\n  }\r\n  // HTMLButtonElement has disabled\r\n  if ((element as HTMLButtonElement).disabled) {\r\n    return false;\r\n  }\r\n\r\n  switch (element.nodeName) {\r\n    case 'A': {\r\n      // casting current element to Specific HTMLElement in order to be more type precise\r\n      return (\r\n        !!(element as HTMLAnchorElement).href && (element as HTMLAnchorElement).rel !== 'ignore'\r\n      );\r\n    }\r\n    case 'INPUT': {\r\n      return !(\r\n        (element as HTMLInputElement).type === 'hidden' ||\r\n        (element as HTMLInputElement).type === 'file'\r\n      );\r\n    }\r\n    case 'BUTTON':\r\n    case 'SELECT':\r\n    case 'TEXTAREA': {\r\n      return true;\r\n    }\r\n    default: {\r\n      return false;\r\n    }\r\n  }\r\n};\r\n\r\n/**\r\n * @desc Set Attempt to set focus on the current node.\r\n * @param element\r\n *          The node to attempt to focus on.\r\n * @returns\r\n *  true if element is focused.\r\n */\r\nexport const attemptFocus = (element: HTMLElement): boolean => {\r\n  if (!isFocusable(element)) {\r\n    return false;\r\n  }\r\n  // Remove the old try catch block since there will be no error to be thrown\r\n  element.focus?.();\r\n  return document.activeElement === element;\r\n};\r\n\r\n/**\r\n * Trigger an event\r\n * mouseenter, mouseleave, mouseover, keyup, change, click, etc.\r\n * @param  {HTMLElement} elm\r\n * @param  {String} name\r\n * @param  {*} opts\r\n */\r\nexport const triggerEvent = function (\r\n  elm: HTMLElement,\r\n  name: string,\r\n  ...opts: Array<boolean>\r\n): HTMLElement {\r\n  let eventName: string;\r\n\r\n  if (name.includes('mouse') || name.includes('click')) {\r\n    eventName = 'MouseEvents';\r\n  } else if (name.includes('key')) {\r\n    eventName = 'KeyboardEvent';\r\n  } else {\r\n    eventName = 'HTMLEvents';\r\n  }\r\n  const evt = document.createEvent(eventName);\r\n\r\n  evt.initEvent(name, ...opts);\r\n  elm.dispatchEvent(evt);\r\n  return elm;\r\n};\r\n\r\nexport const isLeaf = (el: HTMLElement) => !el.getAttribute('aria-owns');\r\n\r\nexport const getSibling = (el: HTMLElement, distance: number, elClass: string) => {\r\n  const { parentNode } = el;\r\n  if (!parentNode) return null;\r\n  const siblings = parentNode.querySelectorAll(elClass);\r\n  const index = Array.prototype.indexOf.call(siblings, el);\r\n  return siblings[index + distance] || null;\r\n};\r\n\r\nexport const focusNode = (el: HTMLElement) => {\r\n  if (!el) return;\r\n  el.focus();\r\n  !isLeaf(el) && el.click();\r\n};\r\n"],"names":[],"mappings":"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"}