{"version":3,"sources":["selector-engine.js"],"names":["isDisabled","isVisible","parseSelector","getSelector","element","selector","getAttribute","hrefAttribute","includes","startsWith","concat","split","trim","map","sel","join","SelectorEngine","find","_ref","arguments","length","undefined","document","documentElement","apply","_toConsumableArray","Element","prototype","querySelectorAll","call","findOne","querySelector","children","_ref2","filter","child","matches","parents","ancestor","parentNode","closest","push","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","this","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector"],"mappings":"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","file":"selector-engine.js","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n"]}