UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 6.79 kB
{"version":3,"file":"aria.mjs","sources":["../../../../../packages/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])`\n\nconst isHTMLElement = (e: unknown): e is Element => {\n if (typeof Element === 'undefined') return false\n return e instanceof Element\n}\n\n/**\n * Determine if the testing element is visible on screen no matter if its on the viewport or not\n */\nexport const isVisible = (element: HTMLElement) => {\n if (process.env.NODE_ENV === 'test') return true\n const computed = getComputedStyle(element)\n // element.offsetParent won't work on fix positioned\n // WARNING: potential issue here, going to need some expert advices on this issue\n return computed.position === 'fixed' ? false : element.offsetParent !== null\n}\n\nexport const obtainAllFocusableElements = (\n element: HTMLElement\n): HTMLElement[] => {\n return Array.from(\n element.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENT_SELECTORS)\n ).filter((item: HTMLElement) => isFocusable(item) && isVisible(item))\n}\n\n/**\n * @desc Determine if target element is focusable\n * @param element {HTMLElement}\n * @returns {Boolean} true if it is focusable\n */\nexport const isFocusable = (element: HTMLElement): boolean => {\n if (\n element.tabIndex > 0 ||\n (element.tabIndex === 0 && element.getAttribute('tabIndex') !== null)\n ) {\n return true\n }\n if (\n element.tabIndex < 0 ||\n element.hasAttribute('disabled') ||\n element.getAttribute('aria-disabled') === 'true'\n ) {\n return false\n }\n\n switch (element.nodeName) {\n case 'A': {\n // casting current element to Specific HTMLElement in order to be more type precise\n return (\n !!(element as HTMLAnchorElement).href &&\n (element as HTMLAnchorElement).rel !== 'ignore'\n )\n }\n case 'INPUT': {\n return !(\n (element as HTMLInputElement).type === 'hidden' ||\n (element as HTMLInputElement).type === 'file'\n )\n }\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA': {\n return true\n }\n default: {\n return false\n }\n }\n}\n\n/**\n * Trigger an event\n * mouseenter, mouseleave, mouseover, keyup, change, click, etc.\n * @param {HTMLElement} elm\n * @param {String} name\n * @param {*} opts\n */\nexport const triggerEvent = function (\n elm: HTMLElement,\n name: string,\n ...opts: Array<boolean>\n): HTMLElement {\n let eventName: string\n\n if (name.includes('mouse') || name.includes('click')) {\n eventName = 'MouseEvents'\n } else if (name.includes('key')) {\n eventName = 'KeyboardEvent'\n } else {\n eventName = 'HTMLEvents'\n }\n const evt = document.createEvent(eventName)\n\n evt.initEvent(name, ...opts)\n elm.dispatchEvent(evt)\n return elm\n}\n\nexport const isLeaf = (el: HTMLElement) => !el.getAttribute('aria-owns')\n\nexport const getSibling = (\n el: HTMLElement,\n distance: number,\n elClass: string\n) => {\n const { parentNode } = el\n if (!parentNode) return null\n const siblings = parentNode.querySelectorAll(elClass)\n const index = Array.prototype.indexOf.call(siblings, el)\n return siblings[index + distance] || null\n}\n\nexport const focusElement = (\n el?: HTMLElement | { focus: () => void } | null,\n options?: FocusOptions\n) => {\n if (!el || !el.focus) return\n let cleanup: boolean = false\n\n if (isHTMLElement(el) && !isFocusable(el) && !el.getAttribute('tabindex')) {\n el.setAttribute('tabindex', '-1')\n cleanup = true\n }\n\n el.focus(options)\n\n if (isHTMLElement(el) && cleanup) {\n el.removeAttribute('tabindex')\n }\n}\n\nexport const focusNode = (el: HTMLElement) => {\n if (!el) return\n focusElement(el)\n !isLeaf(el) && el.click()\n}\n"],"names":[],"mappings":"AAAA,MAAM,2BAAA,GAA8B,CAAA,0KAAA,CAAA;AAEpC,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA6B;AAClD,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,KAAA;AAC3C,EAAA,OAAO,CAAA,YAAa,OAAA;AACtB,CAAA;AAKO,MAAM,SAAA,GAAY,CAAC,OAAA,KAAyB;AACjD,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,MAAA,EAAQ,OAAO,IAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AAGzC,EAAA,OAAO,QAAA,CAAS,QAAA,KAAa,OAAA,GAAU,KAAA,GAAQ,QAAQ,YAAA,KAAiB,IAAA;AAC1E;AAEO,MAAM,0BAAA,GAA6B,CACxC,OAAA,KACkB;AAClB,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,OAAA,CAAQ,iBAA8B,2BAA2B;AAAA,GACnE,CAAE,OAAO,CAAC,IAAA,KAAsB,YAAY,IAAI,CAAA,IAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AACtE;AAOO,MAAM,WAAA,GAAc,CAAC,OAAA,KAAkC;AAC5D,EAAA,IACE,OAAA,CAAQ,QAAA,GAAW,CAAA,IAClB,OAAA,CAAQ,QAAA,KAAa,KAAK,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA,KAAM,IAAA,EAChE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IACE,OAAA,CAAQ,QAAA,GAAW,CAAA,IACnB,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA,IAC/B,OAAA,CAAQ,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA,EAC1C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,QAAQ,QAAQ,QAAA;AAAU,IACxB,KAAK,GAAA,EAAK;AAER,MAAA,OACE,CAAC,CAAE,OAAA,CAA8B,IAAA,IAChC,QAA8B,GAAA,KAAQ,QAAA;AAAA,IAE3C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,OAAO,EACJ,OAAA,CAA6B,IAAA,KAAS,QAAA,IACtC,QAA6B,IAAA,KAAS,MAAA,CAAA;AAAA,IAE3C;AAAA,IACA,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,IACA,SAAS;AACP,MAAA,OAAO,KAAA;AAAA,IACT;AAAA;AAEJ;AASO,MAAM,YAAA,GAAe,SAC1B,GAAA,EACA,IAAA,EAAA,GACG,IAAA,EACU;AACb,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,KAAK,QAAA,CAAS,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AACpD,IAAA,SAAA,GAAY,aAAA;AAAA,EACd,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/B,IAAA,SAAA,GAAY,eAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,SAAA,GAAY,YAAA;AAAA,EACd;AACA,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,SAAS,CAAA;AAE1C,EAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,GAAG,IAAI,CAAA;AAC3B,EAAA,GAAA,CAAI,cAAc,GAAG,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;AAEO,MAAM,SAAS,CAAC,EAAA,KAAoB,CAAC,EAAA,CAAG,aAAa,WAAW;AAEhE,MAAM,UAAA,GAAa,CACxB,EAAA,EACA,QAAA,EACA,OAAA,KACG;AACH,EAAA,MAAM,EAAE,YAAW,GAAI,EAAA;AACvB,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAA;AACpD,EAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,UAAU,EAAE,CAAA;AACvD,EAAA,OAAO,QAAA,CAAS,KAAA,GAAQ,QAAQ,CAAA,IAAK,IAAA;AACvC;AAEO,MAAM,YAAA,GAAe,CAC1B,EAAA,EACA,OAAA,KACG;AACH,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,KAAA,EAAO;AACtB,EAAA,IAAI,OAAA,GAAmB,KAAA;AAEvB,EAAA,IAAI,aAAA,CAAc,EAAE,CAAA,IAAK,CAAC,WAAA,CAAY,EAAE,CAAA,IAAK,CAAC,EAAA,CAAG,YAAA,CAAa,UAAU,CAAA,EAAG;AACzE,IAAA,EAAA,CAAG,YAAA,CAAa,YAAY,IAAI,CAAA;AAChC,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAEA,EAAA,EAAA,CAAG,MAAM,OAAO,CAAA;AAEhB,EAAA,IAAI,aAAA,CAAc,EAAE,CAAA,IAAK,OAAA,EAAS;AAChC,IAAA,EAAA,CAAG,gBAAgB,UAAU,CAAA;AAAA,EAC/B;AACF;AAEO,MAAM,SAAA,GAAY,CAAC,EAAA,KAAoB;AAC5C,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,YAAA,CAAa,EAAE,CAAA;AACf,EAAA,CAAC,MAAA,CAAO,EAAE,CAAA,IAAK,EAAA,CAAG,KAAA,EAAM;AAC1B;;;;"}