{"version":3,"file":"274.js","mappings":"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","sources":["webpack://cornell-engineering/./static/js/components/algolia/templates/hits.js","webpack://cornell-engineering/./static/js/components/algolia/global-search.js","webpack://cornell-engineering/./static/js/components/algolia/search-client.js","webpack://cornell-engineering/./static/js/components/algolia/vendor/dropdown.js","webpack://cornell-engineering/./static/js/components/algolia/vendor/utils.js"],"sourcesContent":["class Hit {\n constructor(hitType, hit) {\n this.hitType = hitType;\n this.hit = hit;\n }\n\n /**\n * Convert a string to a safe HTML free string with decoded entities.\n *\n * @param {String} html\n * @returns {String}\n */\n decodeHtml(html) {\n const txt = document.createElement('textarea');\n txt.innerHTML = html;\n return txt.value;\n }\n\n /**\n * Return the template depending on the post type of the hit.\n */\n template(html) {\n switch (this.hitType) {\n case 'person':\n return this.personHit(html);\n case 'post':\n return this.newsHit(html);\n case 'page':\n return this.pageHit(html);\n case 'event':\n return this.eventHit(html);\n case 'degree':\n return this.degreeHit(html);\n default:\n return `I am a ${this.hitType} that needs a hit template.`;\n }\n }\n\n /**\n * Person hit.\n */\n personHit(html) {\n const { departments, email, location, phone, title, titles, thumbnail, url, link, website } =\n this.hit;\n const profileLink = link || url;\n return html` <div\n class=\"person-hit ${thumbnail && thumbnail.src ? 'person-hit--has-image' : ''}\">\n ${thumbnail && thumbnail.src\n ? html` <div class=\"person-hit__art\">\n <a class=\"person-hit__link\" href=\"${profileLink}\" aria-hidden=\"true\" tabindex=\"-1\">\n <figure class=\"person-hit__figure\">\n <img src=\"${thumbnail.src}\" alt=\"${thumbnail.alt}\" class=\"person-hit__img\" />\n </figure>\n </a>\n </div>`\n : ''}\n <div class=\"person-hit__titles\">\n <h3 class=\"person-hit__name\">\n <a class=\"person-hit__link\" href=\"${profileLink}\">${title}</a>\n </h3>\n ${titles\n ? html`<p class=\"person-hit__title\">\n ${titles.map(title => html`<span>${title}</span>`)}\n </p>`\n : ''}\n ${departments\n ? html` <ul class=\"person-hit__departments\">\n ${departments.map(\n department => html` <li class=\"person-hit__departments-item\">\n <a class=\"person-hit__departments-text\" href=${department.link}\n >${department.name}</a\n >\n </li>`,\n )}\n </ul>`\n : ''}\n </div>\n <div class=\"person-hit__contact\">\n <ul class=\"person-hit__contact-list\">\n ${email\n ? html`<li class=\"person-hit__contact-info\">\n <a href=\"mailto:${email}\">${email}</a>\n </li>`\n : ''}\n ${website\n ? html`<li class=\"person-hit__contact-info\">\n <a href=\"${website.url}\">${website.title || website.url}</a>\n </li>`\n : ''}\n ${phone ? html`<li class=\"person-hit__contact-info\">${phone}</li>` : ''}\n ${location ? html`<li class=\"person-hit__contact-info\">${location}</li>` : ''}\n </ul>\n </div>\n <div class=\"person-hit__button\">\n <a class=\"person-hit__button-link\" href=\"${profileLink}\" aria-hidden=\"true\" tabindex=\"-1\"\n >View profile</a\n >\n </div>\n </div>`;\n }\n\n /**\n * News hit.\n */\n newsHit(html) {\n const { description, link, title, thumbnail, blogname, blogID } = this.hit;\n return html` <div class=\"hit ${thumbnail && thumbnail.src ? 'hit--has-image' : ''}\">\n ${thumbnail && thumbnail.src\n ? html` <div class=\"hit__art\">\n <a class=\"hit__link\" href=\"${link}\" aria-hidden=\"true\" tabindex=\"-1\">\n <figure class=\"hit__figure\">\n <img src=\"${thumbnail.src}\" alt=\"${thumbnail.alt}\" class=\"hit__img\" />\n </figure>\n </a>\n </div>`\n : ''}\n <div class=\"hit__text\">\n <h3 class=\"hit__name\">\n <a class=\"hit__link\" href=\"${link}\">${title}</a>\n </h3>\n ${blogID !== 1 && html`<p class=\"hit__source\">${blogname}</p>`}\n\n <p class=\"hit__excerpt\">${this.decodeHtml(description)}</p>\n </div>\n <div class=\"hit__button\">\n <a class=\"hit__button-link\" href=\"${link}\" aria-hidden=\"true\" tabindex=\"-1\">View article</a>\n </div>\n </div>`;\n }\n\n /**\n * Page hit.\n */\n pageHit(html) {\n const { link, title, thumbnail, blogname, description } = this.hit;\n return html` <div class=\"hit ${thumbnail && thumbnail.src ? 'hit--has-image' : ''}\">\n ${thumbnail && thumbnail.src\n ? html` <div class=\"hit__art\">\n <a class=\"hit__link\" href=\"${link}\" aria-hidden=\"true\" tabindex=\"-1\">\n <figure class=\"hit__figure\">\n <img src=\"${thumbnail.src}\" alt=\"${thumbnail.alt}\" class=\"hit__img\" />\n </figure>\n </a>\n </div>`\n : ''}\n <div class=\"hit__text\">\n <h3 class=\"hit__name\">\n <a class=\"hit__link\" href=\"${link}\">${title}</a>\n </h3>\n <p class=\"hit__source\">${blogname}</p>\n\n <p class=\"hit__excerpt\">${this.decodeHtml(description)}</p>\n </div>\n <div class=\"hit__button\">\n <a class=\"hit__button-link\" href=\"${link}\" aria-hidden=\"true\" tabindex=\"-1\">View page</a>\n </div>\n </div>`;\n }\n\n /**\n * Event hit.\n */\n eventHit(html) {\n const { date_time, link, title, thumbnail } = this.hit;\n return html` <div class=\"hit ${thumbnail && thumbnail.src ? 'hit--has-image' : ''}\">\n ${thumbnail && thumbnail.src\n ? html` <div class=\"hit__art\">\n <a class=\"hit__link\" href=\"${link}\" aria-hidden=\"true\" tabindex=\"-1\">\n <figure class=\"hit__figure\">\n <img src=\"${thumbnail.src}\" alt=\"${thumbnail.alt}\" class=\"hit__img\" />\n </figure>\n </a>\n </div>`\n : ''}\n <div class=\"hit__text\">\n <h3 class=\"hit__name\">\n <a class=\"hit__link\" href=\"${link}\">${title}</a>\n </h3>\n <p class=\"event-topper__detail-info\">\n <time\n >${date_time.date}${date_time.time ? html`<span>${date_time.time}</span>` : ''}</time\n >\n </p>\n </div>\n <div class=\"hit__button\">\n <a class=\"hit__button-link\" href=\"${link}\" aria-hidden=\"true\" tabindex=\"-1\">View event</a>\n </div>\n </div>`;\n }\n\n /**\n * Degree hit.\n */\n degreeHit(html) {\n const { description, title, thumbnail, url, blogname, degree_type } = this.hit;\n return html` <div class=\"hit ${thumbnail && thumbnail.src ? 'hit--has-image' : ''}\">\n ${thumbnail && thumbnail.src\n ? html` <div class=\"hit__art\">\n <a class=\"hit__link\" href=\"${url}\" aria-hidden=\"true\" tabindex=\"-1\">\n <figure class=\"hit__figure\">\n <img src=\"${thumbnail.src}\" alt=\"${thumbnail.alt}\" class=\"hit__img\" />\n </figure>\n </a>\n </div>`\n : ''}\n <div class=\"hit__text\">\n <h3 class=\"hit__name\">\n <a class=\"hit__link\" href=\"${url}\">${title}</a>\n </h3>\n <p class=\"hit__source\">${blogname}</p>\n\n ${degree_type?.abbrev ? html`<p class=\"degee-hit__type\">${degree_type.abbrev}</p>` : ''}\n <p class=\"hit__excerpt\">${this.decodeHtml(description)}</p>\n </div>\n <div class=\"hit__button\">\n <a class=\"hit__button-link\" href=\"${url}\" aria-hidden=\"true\" tabindex=\"-1\">View degree</a>\n </div>\n </div>`;\n }\n}\n\nexport default Hit;\n","import instantsearch from 'instantsearch.js';\nimport {\n configure,\n searchBox,\n hits,\n clearRefinements,\n refinementList,\n stats,\n pagination,\n} from 'instantsearch.js/es/widgets';\n\nimport searchClient from './search-client';\nimport { createDropdown } from './vendor/dropdown';\nimport Hit from './templates/hits';\n\n/**\n * GlobalSearch\n */\nclass GlobalSearch {\n constructor(rootEl) {\n this.rootEl = rootEl;\n if (!this.rootEl) {\n throw new Error('Root search element not found.');\n }\n\n this.hitsPerPage = 20;\n\n this.indexName = this.rootEl.dataset['algoliaIndex'];\n\n this.resultsLabel = {\n singular: 'result',\n plural: 'results',\n };\n\n this.searchParams = {\n hitsPerPage: this.hitsPerPage,\n distinct: true,\n // Force faceting to be applied after de-duplication (via the Distinct setting)\n facetingAfterDistinct: true,\n };\n\n this.search = instantsearch({\n indexName: this.indexName,\n searchClient: searchClient,\n routing: true,\n });\n }\n\n /**\n * Initialize the search\n */\n init() {\n this.configureWidgets();\n this.setWidgets();\n this.addWidgets();\n this.search.start();\n }\n\n /**\n * Configure search widgets and add them as instance variables\n */\n configureWidgets() {\n this.configureSearchParams();\n this.configureSearchBox();\n this.configureStats();\n this.configureClearRefinements();\n this.configureDepartmentRefinementDropdown();\n this.configureImpactAreaRefinementDropdown();\n this.configureContentTypeRefinementDropdown();\n this.configureResultsList();\n this.configurePagination();\n }\n\n /**\n * Set widgets array\n */\n setWidgets() {\n this.widgets = [\n this.configureSearch,\n this.searchBox,\n this.stats,\n this.clearRefinements,\n this.resultsList,\n this.pagination,\n ];\n\n if (this.departmentRefinementDropdown) {\n this.widgets.push(this.departmentRefinementDropdown);\n }\n\n if (this.impactAreaRefinementDropdown) {\n this.widgets.push(this.impactAreaRefinementDropdown);\n }\n\n if (this.contentTypeRefinementDropdown) {\n this.widgets.push(this.contentTypeRefinementDropdown);\n }\n }\n\n /**\n * Add widgets to the search instance\n */\n addWidgets() {\n this.search.addWidgets(this.widgets);\n }\n\n /**\n * Configure search parameters\n */\n configureSearchParams() {\n this.configureSearch = configure(this.searchParams);\n }\n\n /**\n * Configure the search box\n */\n configureSearchBox() {\n this.searchBox = searchBox({\n container: '.js-search-input',\n placeholder: 'Search',\n showSubmit: false,\n });\n }\n\n /**\n * Configure the search stats widget\n */\n configureStats() {\n this.stats = stats({\n container: '.js-search-stats',\n templates: {\n text: ({ nbHits }) => {\n const { singular, plural } = this.resultsLabel;\n return `Showing ${nbHits} ${nbHits === 1 ? singular : plural} ${\n this.department ? ` in ${this.department}` : ''\n }`;\n },\n },\n });\n }\n\n /**\n * Configure the clear refinements widget\n */\n configureClearRefinements() {\n this.clearRefinements = clearRefinements({\n container: '.js-search-clear',\n templates: {\n resetLabel(_options, { html }) {\n return html`Reset filters`;\n },\n },\n });\n }\n\n /**\n * Configure the department refinement dropdown\n */\n configureDepartmentRefinementDropdown() {\n if (!document.querySelector('.js-search-departments-input')) {\n return;\n }\n\n const departmentDropdown = createDropdown(refinementList, {\n cssClasses: { root: 'ais-Dropdown-departments' },\n buttonText: 'All Departments',\n });\n\n this.departmentRefinementDropdown = departmentDropdown({\n container: '.js-search-departments-input',\n attribute: 'departments.name',\n limit: 15,\n showMore: true,\n showMoreLimit: 100,\n sortBy: ['name:asc'],\n });\n }\n\n /**\n * Configure the impact area refinement dropdown\n */\n configureImpactAreaRefinementDropdown() {\n if (!document.querySelector('.js-search-impact-area-input')) {\n return;\n }\n\n const impactAreaDropdown = createDropdown(refinementList, {\n cssClasses: { root: 'ais-Dropdown-impact-area' },\n buttonText: 'All Impact Areas',\n });\n\n this.impactAreaRefinementDropdown = impactAreaDropdown({\n container: '.js-search-impact-area-input',\n attribute: 'impact_areas',\n limit: 10,\n showMore: true,\n showMoreLimit: 100,\n sortBy: ['name:asc'],\n });\n }\n\n /**\n * Configure the content type refinement dropdown\n */\n configureContentTypeRefinementDropdown() {\n if (!document.querySelector('.js-search-content-type-input')) {\n return;\n }\n\n const contentTypeDropdown = createDropdown(refinementList, {\n cssClasses: { root: 'ais-Dropdown-content-type' },\n buttonText: 'All Content Types',\n });\n\n this.contentTypeRefinementDropdown = contentTypeDropdown({\n container: '.js-search-content-type-input',\n attribute: 'type',\n limit: 10,\n showMoreLimit: 100,\n sortBy: ['name:asc'],\n templates: {\n item(item, { html }) {\n const { count, label, value, isRefined } = item;\n\n return html` <label class=\"ais-RefinementList-label\">\n <input\n type=\"checkbox\"\n class=\"ais-RefinementList-checkbox\"\n value=\"${value}\"\n checked=\"${isRefined}\" />\n <span class=\"ais-RefinementList-labelText\">${label}</span>\n <span class=\"ais-RefinementList-count\">${count}</span>\n </label>`;\n },\n },\n transformItems: items =>\n items.map(item => {\n if (item.value === 'post') {\n item.label = 'News';\n } else {\n item.label = item.label.replace(/^./, item.label[0].toUpperCase());\n }\n return item;\n }),\n });\n }\n\n /**\n * Configure the results list\n */\n configureResultsList() {\n this.resultsList = hits({\n container: '.js-search-hits',\n templates: {\n /* eslint-disable */\n item: (hit, { html }) => {\n const newHit = new Hit(hit.type, hit);\n return newHit.template(html);\n },\n\n empty(results, { html }) {\n return html`<p role=\"alert\">No results</p>`;\n },\n /* eslint-enable */\n },\n });\n }\n\n /**\n * Configure the pagination\n */\n configurePagination() {\n this.pagination = pagination({\n container: '.js-search-pagination',\n showFirst: false,\n showLast: false,\n padding: 2,\n scrollTo: '.js-search-hits',\n templates: {\n /* eslint-disable */\n previous({}, { html }) {\n return html` <span>Previous</span> `;\n },\n next({}, { html }) {\n return html` <span>Next</span> `;\n },\n /* eslint-enable */\n },\n });\n }\n}\n\nexport default GlobalSearch;\n","import algoliasearch from 'algoliasearch/lite';\n\nconst { ALGOLIA_APPLICATION_ID, ALGOLIA_SEARCH_API_KEY } = window.cornellengineering.env || {};\n\nlet searchClient = null;\n\ntry {\n searchClient = algoliasearch(ALGOLIA_APPLICATION_ID, ALGOLIA_SEARCH_API_KEY);\n} catch (e) {\n console.error(e);\n}\n\nexport default searchClient;\n","// From https://www.algolia.com/doc/guides/building-search-ui/ui-and-ux-patterns/facet-dropdown/js/#quick-start\nimport { panel } from 'instantsearch.js/es/widgets';\n\nimport { hasClassName, addClassName, removeClassName, capitalize } from './utils';\n\nconst CLASS_OPENED = 'ais-Dropdown--opened';\nconst CLASS_BUTTON = 'ais-Dropdown-button';\nconst CLASS_CLOSE_BUTTON = 'ais-Dropdown-close';\n\nconst cx = (...args) => args.filter(Boolean).join(' ');\n\nexport function createDropdown(\n baseWidget,\n { cssClasses: userCssClasses = {}, buttonText, buttonClassName, closeOnChange } = {},\n) {\n // Merge class names with the default ones and the ones from user\n const cssClasses = {\n root: cx('ais-Dropdown', userCssClasses.root),\n button: cx(CLASS_BUTTON, userCssClasses.button),\n buttonRefined: cx('ais-Dropdown-button--refined', userCssClasses.buttonRefined),\n closeButton: cx(CLASS_CLOSE_BUTTON, userCssClasses.closeButton),\n };\n const makeWidget = panel({\n cssClasses,\n templates: {\n header(options, { html }) {\n const { widgetParams } = options;\n\n let text;\n if (typeof buttonText === 'string') {\n text = buttonText;\n } else if (typeof buttonText === 'function') {\n text = buttonText(options);\n } else {\n // See if the widget has `attribute`\n const attribute =\n widgetParams && widgetParams.attribute ? capitalize(widgetParams.attribute) : '';\n // Get the number of refinements if the widget has `items`\n const nbRefinements = (options.items || []).filter(item => item.isRefined).length;\n // Format the button text\n text = nbRefinements > 0 ? `${attribute} (${nbRefinements})` : attribute;\n }\n\n const classNames = [cssClasses.button];\n if (typeof buttonClassName === 'string') {\n classNames.push(buttonClassName);\n } else if (typeof buttonClassName === 'function') {\n classNames.push(buttonClassName(options));\n } else if ((options.items || []).find(item => item.isRefined)) {\n classNames.push(cssClasses.buttonRefined);\n }\n\n return html`\n <button\n type=\"button\"\n class=\"${cx(...classNames)}\"\n aria-expanded=\"false\"\n aria-haspopup=\"true\">\n ${text}\n </button>\n `;\n },\n footer(_options, { html }) {\n return html`<button type=\"button\" class=\"${cssClasses.closeButton}\">Apply</button>`;\n },\n },\n })(baseWidget);\n\n return widgetParams => {\n const widget = makeWidget(widgetParams);\n const state = {};\n let rootElem;\n let headerElem;\n let closeButtonElem;\n\n const close = button => {\n removeClassName(rootElem, CLASS_OPENED);\n button.setAttribute('aria-expanded', 'false');\n\n // Remove the event listener when the panel is closed\n window.removeEventListener('click', state.windowClickListener);\n delete state.windowClickListener;\n };\n\n const open = button => {\n addClassName(rootElem, CLASS_OPENED);\n button.setAttribute('aria-expanded', 'true');\n\n const closeOnFocusOut = e => {\n const showMoreBtn = rootElem.querySelector('.ais-RefinementList-showMore');\n if (e.relatedTarget && !rootElem.contains(e.relatedTarget) && e.target !== showMoreBtn) {\n close(button);\n document.removeEventListener('focusout', closeOnFocusOut);\n }\n };\n\n // Close the dropdown when focusing outside dropdown\n rootElem.querySelector('.ais-Panel-body')?.addEventListener('focusout', closeOnFocusOut);\n\n // This 'click' event is still being propagated,\n // so we add this event listener in the next tick.\n // Otherwise, it will immediately close the panel again.\n setTimeout(() => {\n state.windowClickListener = event => {\n // Close if the outside is clicked\n if (!event.composedPath().includes(rootElem)) {\n close();\n }\n };\n // Add an event listener when the panel is opened\n window.addEventListener('click', state.windowClickListener);\n }, 0);\n };\n\n const isOpened = () => hasClassName(rootElem, CLASS_OPENED);\n\n const toggle = button => {\n if (isOpened()) {\n close(button);\n } else {\n open(button);\n }\n };\n\n // Add a click listener to the header (button)\n const buttonListener = event => {\n if (!event.target.matches(`.${CLASS_BUTTON}`)) {\n return;\n }\n toggle(event.target);\n };\n\n // Setup a clean-up function, which will be called in `dispose`.\n const cleanUp = () => {\n headerElem.removeEventListener('click', buttonListener);\n if (state.windowClickListener) {\n window.removeEventListener('click', state.windowClickListener);\n }\n };\n\n // Return a modified version of the widget\n return {\n ...widget,\n $$widgetType: 'cmty.facetDropdown',\n render: options => {\n if (!rootElem) {\n rootElem = document.querySelector(widgetParams.container).querySelector('.ais-Panel');\n }\n\n if (!headerElem) {\n headerElem = rootElem.querySelector('.ais-Panel-header');\n\n headerElem.addEventListener('click', buttonListener);\n }\n\n if (!closeButtonElem) {\n closeButtonElem = rootElem.querySelector(`.${CLASS_CLOSE_BUTTON}`);\n\n closeButtonElem.addEventListener('click', close);\n }\n\n // Whenever uiState changes, it closes the panel.\n options.instantSearchInstance.use(() => ({\n subscribe() {},\n unsubscribe() {},\n onStateChange() {\n if (\n isOpened() &&\n (closeOnChange === true ||\n (typeof closeOnChange === 'function' && closeOnChange() === true))\n ) {\n close();\n }\n },\n }));\n\n return widget.render.call(widget, options);\n },\n dispose: options => {\n if (typeof cleanUp === 'function') {\n cleanUp();\n }\n\n return widget.dispose.call(widget, options);\n },\n };\n };\n}\n","export function hasClassName(elem, className) {\n return elem.className.split(' ').indexOf(className) >= 0;\n}\n\nexport function addClassName(elem, className) {\n elem.className = [...elem.className.split(' '), className].join(' ');\n}\n\nexport function removeClassName(elem, className) {\n elem.className = elem.className\n .split(' ')\n .filter(name => name !== className)\n .join(' ');\n}\n\nexport function capitalize(str) {\n if (typeof str !== 'string') {\n return '';\n }\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n"],"names":["Hit","hitType","hit","_classCallCheck","this","key","value","html","txt","document","createElement","innerHTML","personHit","newsHit","pageHit","eventHit","degreeHit","concat","_this$hit","departments","email","location","phone","title","titles","thumbnail","url","link","website","profileLink","_templateObject","_taggedTemplateLiteral","src","_templateObject2","alt","_templateObject3","map","_templateObject4","_templateObject5","department","_templateObject6","name","_templateObject7","_templateObject8","_templateObject9","_templateObject10","_this$hit2","description","blogname","blogID","_templateObject11","_templateObject12","_templateObject13","decodeHtml","_this$hit3","_templateObject14","_templateObject15","_this$hit4","date_time","_templateObject16","_templateObject17","date","time","_templateObject18","_this$hit5","degree_type","_templateObject19","_templateObject20","abbrev","_templateObject21","GlobalSearch","rootEl","Error","hitsPerPage","indexName","dataset","resultsLabel","singular","plural","searchParams","distinct","facetingAfterDistinct","search","instantsearch","searchClient","routing","configureWidgets","setWidgets","addWidgets","start","configureSearchParams","configureSearchBox","configureStats","configureClearRefinements","configureDepartmentRefinementDropdown","configureImpactAreaRefinementDropdown","configureContentTypeRefinementDropdown","configureResultsList","configurePagination","widgets","configureSearch","searchBox","stats","clearRefinements","resultsList","pagination","departmentRefinementDropdown","push","impactAreaRefinementDropdown","contentTypeRefinementDropdown","configure","container","placeholder","showSubmit","_this","templates","text","_ref","nbHits","_this$resultsLabel","resetLabel","_options","_ref2","querySelector","departmentDropdown","createDropdown","refinementList","cssClasses","root","buttonText","attribute","limit","showMore","showMoreLimit","sortBy","impactAreaDropdown","contentTypeDropdown","item","_ref3","count","label","isRefined","transformItems","items","replace","toUpperCase","hits","_ref4","type","template","empty","results","_ref5","showFirst","showLast","padding","scrollTo","previous","_ref6","_ref7","_objectDestructuringEmpty","next","_ref8","_ref9","window","cornellengineering","env","ALGOLIA_APPLICATION_ID","ALGOLIA_SEARCH_API_KEY","algoliasearch","e","console","error","CLASS_OPENED","CLASS_BUTTON","CLASS_CLOSE_BUTTON","cx","_len","arguments","length","args","Array","_key","filter","Boolean","join","baseWidget","undefined","_ref$cssClasses","userCssClasses","buttonClassName","closeOnChange","button","buttonRefined","closeButton","makeWidget","panel","header","options","str","widgetParams","charAt","slice","nbRefinements","classNames","find","apply","footer","rootElem","headerElem","closeButtonElem","widget","state","close","elem","className","split","setAttribute","removeEventListener","windowClickListener","open","_rootElem$querySelect","addEventListener","closeOnFocusOut","showMoreBtn","relatedTarget","contains","target","setTimeout","event","composedPath","includes","isOpened","indexOf","buttonListener","matches","_objectSpread","$$widgetType","render","instantSearchInstance","use","subscribe","unsubscribe","onStateChange","call","dispose"],"sourceRoot":""}