vue-instantsearch 4.13.7 → 4.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/package.json +8 -6
  2. package/src/components/Highlight.vue +1 -2
  3. package/src/components/Highlighter.js +69 -0
  4. package/src/components/Hits.js +113 -0
  5. package/src/components/Snippet.vue +1 -2
  6. package/src/components/__tests__/Hits.js +1 -1
  7. package/src/util/pragma.js +22 -0
  8. package/src/{components/Highlighter.vue → util/vue-compat/Highlighter/Highlighter-vue2.vue} +6 -9
  9. package/src/util/vue-compat/Highlighter/index-vue2.js +1 -0
  10. package/src/util/vue-compat/Highlighter/index-vue3.js +1 -0
  11. package/src/util/vue-compat/Highlighter/index.js +1 -0
  12. package/src/util/vue-compat/index-vue2.js +26 -1
  13. package/src/util/vue-compat/index-vue3.js +7 -0
  14. package/src/widgets.js +1 -1
  15. package/vue2/cjs/index.js +1 -1
  16. package/vue2/cjs/index.js.map +1 -1
  17. package/vue2/es/package.json.js +1 -1
  18. package/vue2/es/src/components/Highlight.vue_rollup-plugin-vue=script.js +1 -1
  19. package/vue2/es/src/components/Hits.js +2 -0
  20. package/vue2/es/src/components/Hits.js.map +1 -0
  21. package/vue2/es/src/components/Snippet.vue_rollup-plugin-vue=script.js +1 -1
  22. package/vue2/es/src/instantsearch.js +1 -1
  23. package/vue2/es/src/util/vue-compat/Highlighter/Highlighter-vue2.vue.js +2 -0
  24. package/vue2/es/src/util/vue-compat/Highlighter/Highlighter-vue2.vue.js.map +1 -0
  25. package/vue2/es/src/util/vue-compat/Highlighter/Highlighter-vue2.vue_rollup-plugin-vue=script.js +2 -0
  26. package/vue2/es/src/util/vue-compat/Highlighter/Highlighter-vue2.vue_rollup-plugin-vue=script.js.map +1 -0
  27. package/vue2/es/src/util/vue-compat/index-vue2.js +1 -1
  28. package/vue2/es/src/util/vue-compat/index-vue2.js.map +1 -1
  29. package/vue2/es/src/widgets.js +1 -1
  30. package/vue2/umd/index.js +1 -1
  31. package/vue2/umd/index.js.map +1 -1
  32. package/vue3/cjs/index.js +1 -1
  33. package/vue3/cjs/index.js.map +1 -1
  34. package/vue3/es/package.json.js +1 -1
  35. package/vue3/es/src/components/Highlight.vue.js +1 -1
  36. package/vue3/es/src/components/Highlight.vue_vue&type=script&lang.js +1 -1
  37. package/vue3/es/src/components/Highlight.vue_vue&type=script&lang.js.map +1 -1
  38. package/vue3/es/src/components/{Highlight.vue_vue&type=template&id=1d5c1fda&lang.js → Highlight.vue_vue&type=template&id=214ecb36&lang.js} +1 -1
  39. package/vue3/es/src/components/Highlight.vue_vue&type=template&id=214ecb36&lang.js.map +1 -0
  40. package/vue3/es/src/components/Highlighter.js +2 -0
  41. package/vue3/es/src/components/Highlighter.js.map +1 -0
  42. package/vue3/es/src/components/Hits.js +2 -0
  43. package/vue3/es/src/components/Hits.js.map +1 -0
  44. package/vue3/es/src/components/Snippet.vue.js +1 -1
  45. package/vue3/es/src/components/Snippet.vue_vue&type=script&lang.js +1 -1
  46. package/vue3/es/src/components/Snippet.vue_vue&type=script&lang.js.map +1 -1
  47. package/vue3/es/src/components/{Snippet.vue_vue&type=template&id=1e214b4c&lang.js → Snippet.vue_vue&type=template&id=edc35952&lang.js} +1 -1
  48. package/vue3/es/src/components/Snippet.vue_vue&type=template&id=edc35952&lang.js.map +1 -0
  49. package/vue3/es/src/instantsearch.js +1 -1
  50. package/vue3/es/src/util/pragma.js +2 -0
  51. package/vue3/es/src/util/pragma.js.map +1 -0
  52. package/vue3/es/src/util/vue-compat/index-vue3.js +1 -1
  53. package/vue3/es/src/util/vue-compat/index-vue3.js.map +1 -1
  54. package/vue3/es/src/widgets.js +1 -1
  55. package/vue3/umd/index.js +1 -1
  56. package/vue3/umd/index.js.map +1 -1
  57. package/src/components/Hits.vue +0 -72
  58. package/vue2/es/src/components/Highlighter.vue.js +0 -2
  59. package/vue2/es/src/components/Highlighter.vue.js.map +0 -1
  60. package/vue2/es/src/components/Highlighter.vue_rollup-plugin-vue=script.js +0 -2
  61. package/vue2/es/src/components/Highlighter.vue_rollup-plugin-vue=script.js.map +0 -1
  62. package/vue2/es/src/components/Hits.vue.js +0 -2
  63. package/vue2/es/src/components/Hits.vue.js.map +0 -1
  64. package/vue2/es/src/components/Hits.vue_rollup-plugin-vue=script.js +0 -2
  65. package/vue2/es/src/components/Hits.vue_rollup-plugin-vue=script.js.map +0 -1
  66. package/vue3/es/src/components/Highlight.vue_vue&type=template&id=1d5c1fda&lang.js.map +0 -1
  67. package/vue3/es/src/components/Highlighter.vue.js +0 -2
  68. package/vue3/es/src/components/Highlighter.vue.js.map +0 -1
  69. package/vue3/es/src/components/Highlighter.vue_vue&type=script&lang.js +0 -2
  70. package/vue3/es/src/components/Highlighter.vue_vue&type=script&lang.js.map +0 -1
  71. package/vue3/es/src/components/Highlighter.vue_vue&type=template&id=f822f802&lang.js +0 -2
  72. package/vue3/es/src/components/Highlighter.vue_vue&type=template&id=f822f802&lang.js.map +0 -1
  73. package/vue3/es/src/components/Hits.vue.js +0 -2
  74. package/vue3/es/src/components/Hits.vue.js.map +0 -1
  75. package/vue3/es/src/components/Hits.vue_vue&type=script&lang.js +0 -2
  76. package/vue3/es/src/components/Hits.vue_vue&type=script&lang.js.map +0 -1
  77. package/vue3/es/src/components/Hits.vue_vue&type=template&id=026646d2&lang.js +0 -2
  78. package/vue3/es/src/components/Hits.vue_vue&type=template&id=026646d2&lang.js.map +0 -1
  79. package/vue3/es/src/components/Snippet.vue_vue&type=template&id=1e214b4c&lang.js.map +0 -1
  80. package/vue3/es/src/util/parseAlgoliaHit.js +0 -2
  81. package/vue3/es/src/util/parseAlgoliaHit.js.map +0 -1
  82. package/vue3/es/src/util/unescape.js +0 -2
  83. package/vue3/es/src/util/unescape.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/util/suit.js","../../src/mixins/suit.js","../../src/util/polyfills.js","../../src/util/vue-compat/index-vue3.js","../../src/util/warn.js","../../src/mixins/widget.js","../../src/components/Autocomplete.vue","../../src/components/Autocomplete.vue?vue&type=template&id=52a2a414&lang.js","../../src/mixins/panel.js","../../src/components/Breadcrumb.vue","../../src/components/Breadcrumb.vue?vue&type=template&id=ea18edbe&lang.js","../../src/components/ClearRefinements.vue","../../src/components/ClearRefinements.vue?vue&type=template&id=41d81b11&lang.js","../../src/components/Configure.js","../../src/components/ConfigureRelatedItems.js","../../src/components/CurrentRefinements.vue","../../src/components/CurrentRefinements.vue?vue&type=template&id=5584328f&lang.js","../../src/components/HierarchicalMenuList.vue","../../src/components/HierarchicalMenuList.vue?vue&type=template&id=420e1cd4&lang.js","../../src/components/HierarchicalMenu.vue","../../src/components/HierarchicalMenu.vue?vue&type=template&id=15099ac6&lang.js","../../src/util/unescape.js","../../src/util/parseAlgoliaHit.js","../../src/components/Highlighter.vue","../../src/components/Highlighter.vue?vue&type=template&id=f822f802&lang.js","../../src/components/Highlight.vue","../../src/components/Highlight.vue?vue&type=template&id=1d5c1fda&lang.js","../../src/components/Hits.vue","../../src/components/Hits.vue?vue&type=template&id=026646d2&lang.js","../../src/components/HitsPerPage.vue","../../src/components/HitsPerPage.vue?vue&type=template&id=5d43db9c&lang.js","../../src/components/Index.js","../../src/util/createInstantSearchComponent.js","../../src/components/InstantSearch.js","../../src/components/InstantSearchSsr.js","../../src/components/InfiniteHits.vue","../../src/components/InfiniteHits.vue?vue&type=template&id=39939af3&lang.js","../../src/components/Menu.vue","../../src/components/Menu.vue?vue&type=template&id=55b32cf6&lang.js","../../src/components/MenuSelect.vue","../../src/components/MenuSelect.vue?vue&type=template&id=11a03a77&lang.js","../../src/components/NumericMenu.vue","../../src/components/NumericMenu.vue?vue&type=template&id=583b28d4&lang.js","../../src/components/Pagination.vue","../../src/components/Pagination.vue?vue&type=template&id=5b708f87&lang.js","../../src/components/Panel.vue","../../src/components/Panel.vue?vue&type=template&id=7fcc1827&lang.js","../../src/components/PoweredBy.vue","../../src/components/PoweredBy.vue?vue&type=template&id=85db7eac&lang.js","../../src/components/QueryRuleContext.js","../../src/components/QueryRuleCustomData.vue","../../src/components/QueryRuleCustomData.vue?vue&type=template&id=1e550962&lang.js","../../src/components/RangeInput.vue","../../src/components/RangeInput.vue?vue&type=template&id=3e30e816&lang.js","../../src/components/RatingMenu.vue","../../src/components/RatingMenu.vue?vue&type=template&id=6effe1ff&lang.js","../../src/components/SearchInput.vue","../../src/components/SearchInput.vue?vue&type=template&id=02fb82e2&lang.js","../../src/components/RefinementList.vue","../../src/components/RefinementList.vue?vue&type=template&id=80c1baee&lang.js","../../src/components/StateResults.vue","../../src/components/StateResults.vue?vue&type=template&id=f5047700&lang.js","../../src/components/SearchBox.vue","../../src/components/SearchBox.vue?vue&type=template&id=b43316e4&lang.js","../../src/components/Snippet.vue","../../src/components/Snippet.vue?vue&type=template&id=1e214b4c&lang.js","../../src/components/SortBy.vue","../../src/components/SortBy.vue?vue&type=template&id=78751313&lang.js","../../src/components/Stats.vue","../../src/components/Stats.vue?vue&type=template&id=67854642&lang.js","../../src/components/ToggleRefinement.vue","../../src/components/ToggleRefinement.vue?vue&type=template&id=fc27238e&lang.js","../../src/components/VoiceSearch.vue","../../src/components/VoiceSearch.vue?vue&type=template&id=c25adbd0&lang.js","../../src/components/RelevantSort.vue","../../src/components/RelevantSort.vue?vue&type=template&id=d83cf556&lang.js","../../src/components/DynamicWidgets.js","../../src/components/ExperimentalDynamicWidgets.js","../../src/plugin.js","../../src/util/createServerRootMixin.js"],"sourcesContent":["/**\n * Create class names like ais-widgetName-element--modifier\n *\n * @param {string} widgetName first part\n * @param {string} element part separated by -\n * @param {string} modifier final part, separated by --\n *\n * @returns {string} the composed class name\n */\nexport default function suit(widgetName, element, modifier) {\n if (!widgetName) {\n throw new Error('You need to provide `widgetName` in your data');\n }\n\n const elements = [`ais-${widgetName}`];\n\n if (element) {\n elements.push(`-${element}`);\n }\n\n if (modifier) {\n elements.push(`--${modifier}`);\n }\n\n return elements.join('');\n}\n","import suit from '../util/suit';\n\nexport const createSuitMixin = ({ name }) => ({\n props: {\n classNames: {\n type: Object,\n default: undefined,\n },\n },\n methods: {\n suit(element, modifier) {\n const className = suit(name, element, modifier);\n const userClassName = this.classNames && this.classNames[className];\n if (userClassName) {\n return [className, userClassName].join(' ');\n }\n return className;\n },\n },\n});\n","/* eslint-disable eslint-comments/no-unlimited-disable */\n/* eslint-disable */\n\n// source: @babel/plugin-proposal-object-rest-spread@7.2.0\n// prettier-ignore\nexport function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\n// source: @babel/plugin-proposal-object-rest-spread@7.2.0\n// prettier-ignore\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n","import * as Vue from 'vue';\n\nconst isVue2 = false;\nconst isVue3 = true;\nconst Vue2 = undefined;\n\nexport { createApp, createSSRApp, h, version, nextTick } from 'vue';\nexport { Vue, Vue2, isVue2, isVue3 };\n\nexport function renderCompat(fn) {\n function h(tag, props, children) {\n if (\n typeof props === 'object' &&\n (props.attrs || props.props || props.scopedSlots || props.on)\n ) {\n // In vue 3, we no longer wrap with `attrs` or `props` key.\n const onPropKeys = Object.keys(props.on || {});\n const flatProps = Object.assign(\n {},\n props,\n props.attrs,\n props.props,\n onPropKeys.reduce((acc, key) => {\n // eslint-disable-next-line no-param-reassign\n acc[`on${key[0].toUpperCase()}${key.slice(1)}`] = props.on[key];\n return acc;\n }, {})\n );\n delete flatProps.attrs;\n delete flatProps.props;\n delete flatProps.scopedSlots;\n onPropKeys.forEach((key) => delete flatProps.on[key]);\n\n return Vue.h(\n tag,\n flatProps,\n props.scopedSlots\n ? Object.assign({ default: () => children }, props.scopedSlots)\n : children\n );\n }\n\n return Vue.h(tag, props, children);\n }\n\n return function () {\n return fn.call(this, h);\n };\n}\n\nexport function getDefaultSlot(component) {\n const $slots = component.$slots || component.slots;\n\n if (typeof $slots.default === 'function') {\n // Vue 3\n return $slots.default();\n }\n\n // Vue 3 with @vue/compat\n return $slots.default;\n}\n","const cache = new Set();\n\nexport function warn(message) {\n if (cache.has(message)) return;\n cache.add(message);\n // eslint-disable-next-line no-console\n console.warn(message);\n}\n","import { _objectSpread } from '../util/polyfills';\nimport { isVue3 } from '../util/vue-compat';\nimport { warn } from '../util/warn';\n\nexport const createWidgetMixin = (\n { connector } = {},\n additionalProperties = {}\n) => ({\n inject: {\n instantSearchInstance: {\n from: '$_ais_instantSearchInstance',\n default() {\n const tag = this.$options._componentTag;\n throw new TypeError(\n `It looks like you forgot to wrap your Algolia search component \"<${tag}>\" inside of an \"<ais-instant-search>\" component.`\n );\n },\n },\n getParentIndex: {\n from: '$_ais_getParentIndex',\n default() {\n return () => this.instantSearchInstance.mainIndex;\n },\n },\n },\n data() {\n return {\n state: null,\n };\n },\n created() {\n if (typeof connector === 'function') {\n this.factory = connector(this.updateState, () => {});\n this.widget = _objectSpread(\n this.factory(this.widgetParams),\n additionalProperties\n );\n this.getParentIndex().addWidgets([this.widget]);\n\n if (\n this.instantSearchInstance._initialResults &&\n !this.instantSearchInstance.started\n ) {\n if (typeof this.instantSearchInstance.__forceRender !== 'function') {\n throw new Error(\n 'You are using server side rendering with <ais-instant-search> instead of <ais-instant-search-ssr>.'\n );\n }\n this.instantSearchInstance.__forceRender(\n this.widget,\n this.getParentIndex()\n );\n }\n } else if (connector !== true) {\n warn(\n `You are using the InstantSearch widget mixin, but didn't provide a connector.\nWhile this is technically possible, and will give you access to the Helper,\nit's not the recommended way of making custom components.\n\nIf you want to disable this message, pass { connector: true } to the mixin.\n\nRead more on using connectors: https://alg.li/vue-custom`\n );\n }\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.getParentIndex().removeWidgets([this.widget]);\n }\n },\n watch: {\n widgetParams: {\n handler(nextWidgetParams) {\n this.state = null;\n this.getParentIndex().removeWidgets([this.widget]);\n this.widget = _objectSpread(\n this.factory(nextWidgetParams),\n additionalProperties\n );\n this.getParentIndex().addWidgets([this.widget]);\n },\n deep: true,\n },\n },\n methods: {\n updateState(state = {}, isFirstRender) {\n if (!isFirstRender) {\n // Avoid updating the state on first render\n // otherwise there will be a flash of placeholder data\n this.state = state;\n }\n },\n },\n});\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>\n This widget doesn't render anything without a filled in default slot.\n </p>\n <p>query, function to refine and results are provided.</p>\n <pre>refine: Function</pre>\n <pre>currentRefinement: \"{{ state.currentRefinement }}\"</pre>\n <details>\n <summary><code>indices</code>:</summary>\n <pre>{{ state.indices }}</pre>\n </details>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisAutocomplete',\n mixins: [\n createWidgetMixin(\n {\n connector: connectAutocomplete,\n },\n {\n $$widgetType: 'ais.autocomplete',\n }\n ),\n createSuitMixin({ name: 'Autocomplete' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n };\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>\n This widget doesn't render anything without a filled in default slot.\n </p>\n <p>query, function to refine and results are provided.</p>\n <pre>refine: Function</pre>\n <pre>currentRefinement: \"{{ state.currentRefinement }}\"</pre>\n <details>\n <summary><code>indices</code>:</summary>\n <pre>{{ state.indices }}</pre>\n </details>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisAutocomplete',\n mixins: [\n createWidgetMixin(\n {\n connector: connectAutocomplete,\n },\n {\n $$widgetType: 'ais.autocomplete',\n }\n ),\n createSuitMixin({ name: 'Autocomplete' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n };\n },\n },\n};\n</script>\n","import mitt from 'mitt';\n\nimport { isVue3 } from '../util/vue-compat';\n\nexport const PANEL_EMITTER_NAMESPACE = 'instantSearchPanelEmitter';\nexport const PANEL_CHANGE_EVENT = 'PANEL_CHANGE_EVENT';\n\nexport const createPanelProviderMixin = () => ({\n props: {\n emitter: {\n type: Object,\n required: false,\n default() {\n return mitt();\n },\n },\n },\n provide() {\n return {\n [PANEL_EMITTER_NAMESPACE]: this.emitter,\n };\n },\n data() {\n return {\n canRefine: true,\n };\n },\n created() {\n this.emitter.on(PANEL_CHANGE_EVENT, (value) => {\n this.updateCanRefine(value);\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n this.emitter.all.clear();\n },\n methods: {\n updateCanRefine(value) {\n this.canRefine = value;\n },\n },\n});\n\nexport const createPanelConsumerMixin = ({\n mapStateToCanRefine = (state) => Boolean(state.canRefine),\n} = {}) => ({\n inject: {\n emitter: {\n from: PANEL_EMITTER_NAMESPACE,\n default() {\n return {\n emit: () => {},\n };\n },\n },\n },\n data() {\n return {\n state: null,\n hasAlreadyEmitted: false,\n };\n },\n watch: {\n state: {\n immediate: true,\n handler(nextState, previousState) {\n if (!nextState) {\n return;\n }\n\n const previousCanRefine = mapStateToCanRefine(previousState || {});\n const nextCanRefine = mapStateToCanRefine(nextState);\n\n if (!this.hasAlreadyEmitted || previousCanRefine !== nextCanRefine) {\n this.emitter.emit(PANEL_CHANGE_EVENT, nextCanRefine);\n this.hasAlreadyEmitted = true;\n }\n },\n },\n },\n});\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"[\n suit('item'),\n !state.items.length && suit('item', 'selected'),\n ]\"\n >\n <a\n v-if=\"Boolean(state.items.length)\"\n :href=\"state.createURL()\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine()\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n <a\n v-else\n :href=\"state.createURL(null)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(null)\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n </li>\n <li\n v-for=\"(item, index) in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), isLastItem(index) && suit('item', 'selected')]\"\n >\n <span :class=\"suit('separator')\" aria-hidden=\"true\">\n <slot name=\"separator\">></slot> </span\n ><a\n v-if=\"!isLastItem(index)\"\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >{{ item.label }}</a\n >\n <template v-else>{{ item.label }}</template>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisBreadcrumb',\n mixins: [\n createWidgetMixin(\n {\n connector: connectBreadcrumb,\n },\n {\n $$widgetType: 'ais.breadcrumb',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'Breadcrumb' }),\n ],\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n separator: this.separator,\n rootPath: this.rootPath,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n isLastItem(index) {\n return this.state.items.length - 1 === index;\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"[\n suit('item'),\n !state.items.length && suit('item', 'selected'),\n ]\"\n >\n <a\n v-if=\"Boolean(state.items.length)\"\n :href=\"state.createURL()\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine()\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n <a\n v-else\n :href=\"state.createURL(null)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(null)\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n </li>\n <li\n v-for=\"(item, index) in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), isLastItem(index) && suit('item', 'selected')]\"\n >\n <span :class=\"suit('separator')\" aria-hidden=\"true\">\n <slot name=\"separator\">></slot> </span\n ><a\n v-if=\"!isLastItem(index)\"\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >{{ item.label }}</a\n >\n <template v-else>{{ item.label }}</template>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisBreadcrumb',\n mixins: [\n createWidgetMixin(\n {\n connector: connectBreadcrumb,\n },\n {\n $$widgetType: 'ais.breadcrumb',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'Breadcrumb' }),\n ],\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n separator: this.separator,\n rootPath: this.rootPath,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n isLastItem(index) {\n return this.state.items.length - 1 === index;\n },\n },\n};\n</script>\n","<!-- @MAJOR remove `type=\"reset\"` -->\n<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :can-refine=\"canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <button\n type=\"reset\"\n :class=\"[suit('button'), !canRefine && suit('button', 'disabled')]\"\n :disabled=\"!canRefine\"\n @click.prevent=\"state.refine\"\n >\n <slot name=\"resetLabel\"> Clear refinements </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectClearRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisClearRefinements',\n mixins: [\n createWidgetMixin(\n {\n connector: connectClearRefinements,\n },\n {\n $$widgetType: 'ais.clearRefinements',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'ClearRefinements' }),\n ],\n props: {\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n canRefine() {\n return this.state.hasRefinements;\n },\n },\n};\n</script>\n","<!-- @MAJOR remove `type=\"reset\"` -->\n<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :can-refine=\"canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <button\n type=\"reset\"\n :class=\"[suit('button'), !canRefine && suit('button', 'disabled')]\"\n :disabled=\"!canRefine\"\n @click.prevent=\"state.refine\"\n >\n <slot name=\"resetLabel\"> Clear refinements </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectClearRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisClearRefinements',\n mixins: [\n createWidgetMixin(\n {\n connector: connectClearRefinements,\n },\n {\n $$widgetType: 'ais.clearRefinements',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'ClearRefinements' }),\n ],\n props: {\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n canRefine() {\n return this.state.hasRefinements;\n },\n },\n};\n</script>\n","import { connectConfigure } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, renderCompat } from '../util/vue-compat';\n\nexport default {\n inheritAttrs: false,\n name: 'AisConfigure',\n mixins: [\n createSuitMixin({ name: 'Configure' }),\n createWidgetMixin(\n {\n connector: connectConfigure,\n },\n {\n $$widgetType: 'ais.configure',\n }\n ),\n ],\n computed: {\n widgetParams() {\n return {\n searchParameters: this.$attrs,\n };\n },\n },\n render: renderCompat(function (h) {\n const slot = isVue3 ? this.$slots.default : this.$scopedSlots.default;\n\n if (!this.state || !slot) {\n return null;\n }\n\n return h(\n 'div',\n {\n class: this.suit(),\n },\n [\n slot({\n refine: this.state.refine,\n searchParameters: this.state.widgetParams.searchParameters,\n }),\n ]\n );\n }),\n};\n","import { EXPERIMENTAL_connectConfigureRelatedItems } from 'instantsearch.js/es/connectors';\n\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n inheritAttrs: false,\n name: 'AisExperimentalConfigureRelatedItems',\n mixins: [\n createWidgetMixin(\n {\n connector: EXPERIMENTAL_connectConfigureRelatedItems,\n },\n {\n $$widgetType: 'ais.configureRelatedItems',\n }\n ),\n ],\n props: {\n hit: {\n type: Object,\n required: true,\n },\n matchingPatterns: {\n type: Object,\n required: true,\n },\n transformSearchParameters: {\n type: Function,\n required: false,\n },\n },\n computed: {\n widgetParams() {\n return {\n hit: this.hit,\n matchingPatterns: this.matchingPatterns,\n transformSearchParameters: this.transformSearchParameters,\n };\n },\n },\n render() {\n return null;\n },\n};\n","<template>\n <div :class=\"[suit(), noRefinement && suit('', 'noRefinement')]\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :items=\"state.items\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.attribute\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :refine=\"item.refine\"\n :item=\"item\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('label')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{\n refinement.label\n }}</q>\n <template v-else>{{ refinement.label }}</template> </span\n ><button\n :class=\"suit('delete')\"\n type=\"button\"\n @click.left.exact=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin(\n {\n connector: connectCurrentRefinements,\n },\n {\n $$widgetType: 'ais.currentRefinements',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n noRefinement() {\n return this.state && this.state.items.length === 0;\n },\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n createItemKey({ attribute, value, type, operator }) {\n return [attribute, type, value, operator].join(':');\n },\n capitalize(value) {\n if (!value) return '';\n return (\n value.toString().charAt(0).toLocaleUpperCase() +\n value.toString().slice(1)\n );\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), noRefinement && suit('', 'noRefinement')]\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :items=\"state.items\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.attribute\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :refine=\"item.refine\"\n :item=\"item\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('label')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{\n refinement.label\n }}</q>\n <template v-else>{{ refinement.label }}</template> </span\n ><button\n :class=\"suit('delete')\"\n type=\"button\"\n @click.left.exact=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin(\n {\n connector: connectCurrentRefinements,\n },\n {\n $$widgetType: 'ais.currentRefinements',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n noRefinement() {\n return this.state && this.state.items.length === 0;\n },\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n createItemKey({ attribute, value, type, operator }) {\n return [attribute, type, value, operator].join(':');\n },\n capitalize(value) {\n if (!value) return '';\n return (\n value.toString().charAt(0).toLocaleUpperCase() +\n value.toString().slice(1)\n );\n },\n },\n};\n</script>\n","<template>\n <ul\n v-if=\"items.length > 0\"\n :class=\"[\n suit('list'),\n level > 0 && suit('list', 'child'),\n suit('list', `lvl${level}`),\n ]\"\n >\n <li\n v-for=\"item in items\"\n :key=\"item.value\"\n :class=\"[\n suit('item'),\n item.isRefined && suit('item', 'selected'),\n item.data && item.data.length > 0 && suit('item', 'parent'),\n ]\"\n >\n <a\n :href=\"createURL(item.value)\"\n :class=\"[suit('link'), item.isRefined && suit('link', 'selected')]\"\n @click.prevent=\"refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n <hierarchical-menu-list\n v-if=\"item.data\"\n :items=\"item.data\"\n :level=\"level + 1\"\n :refine=\"refine\"\n :createURL=\"createURL\"\n :suit=\"suit\"\n />\n </li>\n </ul>\n</template>\n\n<script>\nexport default {\n name: 'HierarchicalMenuList',\n props: {\n items: {\n type: Array,\n required: true,\n },\n level: {\n type: Number,\n required: true,\n },\n refine: {\n type: Function,\n required: true,\n },\n createURL: {\n type: Function,\n required: true,\n },\n suit: {\n type: Function,\n required: true,\n },\n },\n};\n</script>\n","<template>\n <ul\n v-if=\"items.length > 0\"\n :class=\"[\n suit('list'),\n level > 0 && suit('list', 'child'),\n suit('list', `lvl${level}`),\n ]\"\n >\n <li\n v-for=\"item in items\"\n :key=\"item.value\"\n :class=\"[\n suit('item'),\n item.isRefined && suit('item', 'selected'),\n item.data && item.data.length > 0 && suit('item', 'parent'),\n ]\"\n >\n <a\n :href=\"createURL(item.value)\"\n :class=\"[suit('link'), item.isRefined && suit('link', 'selected')]\"\n @click.prevent=\"refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n <hierarchical-menu-list\n v-if=\"item.data\"\n :items=\"item.data\"\n :level=\"level + 1\"\n :refine=\"refine\"\n :createURL=\"createURL\"\n :suit=\"suit\"\n />\n </li>\n </ul>\n</template>\n\n<script>\nexport default {\n name: 'HierarchicalMenuList',\n props: {\n items: {\n type: Array,\n required: true,\n },\n level: {\n type: Number,\n required: true,\n },\n refine: {\n type: Function,\n required: true,\n },\n createURL: {\n type: Function,\n required: true,\n },\n suit: {\n type: Function,\n required: true,\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <hierarchical-menu-list\n :items=\"state.items\"\n :level=\"0\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :suit=\"suit\"\n />\n\n <button\n v-if=\"showMore\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n {{ state.isShowingMore ? 'Show less' : 'Show more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHierarchicalMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport HierarchicalMenuList from './HierarchicalMenuList.vue';\n\nexport default {\n name: 'AisHierarchicalMenu',\n mixins: [\n createSuitMixin({ name: 'HierarchicalMenu' }),\n createWidgetMixin(\n {\n connector: connectHierarchicalMenu,\n },\n {\n $$widgetType: 'ais.hierarchicalMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n components: {\n HierarchicalMenuList,\n },\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n showParentLevel: {\n type: Boolean,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n separator: this.separator,\n rootPath: this.rootPath,\n showParentLevel: this.showParentLevel,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <hierarchical-menu-list\n :items=\"state.items\"\n :level=\"0\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :suit=\"suit\"\n />\n\n <button\n v-if=\"showMore\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n {{ state.isShowingMore ? 'Show less' : 'Show more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHierarchicalMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport HierarchicalMenuList from './HierarchicalMenuList.vue';\n\nexport default {\n name: 'AisHierarchicalMenu',\n mixins: [\n createSuitMixin({ name: 'HierarchicalMenu' }),\n createWidgetMixin(\n {\n connector: connectHierarchicalMenu,\n },\n {\n $$widgetType: 'ais.hierarchicalMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n components: {\n HierarchicalMenuList,\n },\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n showParentLevel: {\n type: Boolean,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n separator: this.separator,\n rootPath: this.rootPath,\n showParentLevel: this.showParentLevel,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","/**\n * This implementation is taken from Lodash implementation.\n * See: https://github.com/lodash/lodash/blob/4.17.11-npm/unescape.js\n */\n\n/** Used to map HTML entities to characters. */\nconst htmlUnescapes = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n};\n\n/** Used to match HTML entities and HTML characters. */\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */\nexport function unescape(string) {\n return string && reHasEscapedHtml.test(string)\n ? string.replace(reEscapedHtml, (character) => htmlUnescapes[character])\n : string;\n}\n","// copied from React InstantSearch\nimport { getPropertyByPath } from 'instantsearch.js/es/lib/utils';\n\nimport { unescape } from '../util/unescape';\n\nconst TAG_PLACEHOLDER = {\n highlightPreTag: '__ais-highlight__',\n highlightPostTag: '__/ais-highlight__',\n};\n\n/**\n * Parses an highlighted attribute into an array of objects with the string value, and\n * a boolean that indicated if this part is highlighted.\n *\n * @param {string} preTag - string used to identify the start of an highlighted value\n * @param {string} postTag - string used to identify the end of an highlighted value\n * @param {string} highlightedValue - highlighted attribute as returned by Algolia highlight feature\n * @return {object[]} - An array of {value: string, isHighlighted: boolean}.\n */\nfunction parseHighlightedAttribute({ preTag, postTag, highlightedValue = '' }) {\n const splitByPreTag = highlightedValue.split(preTag);\n const firstValue = splitByPreTag.shift();\n const elements =\n firstValue === '' ? [] : [{ value: firstValue, isHighlighted: false }];\n\n if (postTag === preTag) {\n let isHighlighted = true;\n splitByPreTag.forEach((split) => {\n elements.push({ value: split, isHighlighted });\n isHighlighted = !isHighlighted;\n });\n } else {\n splitByPreTag.forEach((split) => {\n const splitByPostTag = split.split(postTag);\n\n elements.push({\n value: splitByPostTag[0],\n isHighlighted: true,\n });\n\n if (splitByPostTag[1] !== '') {\n elements.push({\n // Vue removes nodes which are just a single space (vuejs/vue#9208),\n // we replace this by two spaces, which does not have an impact,\n // unless someone would have `white-space: pre` on the highlights\n value: splitByPostTag[1] === ' ' ? ' ' : splitByPostTag[1],\n isHighlighted: false,\n });\n }\n });\n }\n\n return elements;\n}\n\n/**\n * Find an highlighted attribute given an `attribute` and an `highlightProperty`, parses it,\n * and provided an array of objects with the string value and a boolean if this\n * value is highlighted.\n *\n * In order to use this feature, highlight must be activated in the configuration of\n * the index. The `preTag` and `postTag` attributes are respectively highlightPreTag and\n * highlightPostTag in Algolia configuration.\n *\n * @param {string} preTag - string used to identify the start of an highlighted value\n * @param {string} postTag - string used to identify the end of an highlighted value\n * @param {string} highlightProperty - the property that contains the highlight structure in the results\n * @param {string} attribute - the highlighted attribute to look for\n * @param {object} hit - the actual hit returned by Algolia.\n * @return {object[]} - An array of {value: string, isHighlighted: boolean}.\n */\nexport function parseAlgoliaHit({\n preTag = TAG_PLACEHOLDER.highlightPreTag,\n postTag = TAG_PLACEHOLDER.highlightPostTag,\n highlightProperty,\n attribute,\n hit,\n}) {\n if (!hit) throw new Error('`hit`, the matching record, must be provided');\n\n const highlightObject =\n getPropertyByPath(hit[highlightProperty], attribute) || {};\n\n if (Array.isArray(highlightObject)) {\n return highlightObject.map((item) =>\n parseHighlightedAttribute({\n preTag,\n postTag,\n highlightedValue: unescape(item.value),\n })\n );\n }\n\n return parseHighlightedAttribute({\n preTag,\n postTag,\n highlightedValue: unescape(highlightObject.value),\n });\n}\n","<template>\n <span :class=\"suit()\">\n <component\n v-for=\"({ value, isHighlighted }, index) in parsedHighlights\"\n :class=\"[isHighlighted && suit('highlighted')]\"\n :key=\"index\"\n :is=\"isHighlighted ? highlightedTagName : TextNode\"\n >{{ value }}</component\n >\n </span>\n</template>\n\n<script>\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\nimport { getDefaultSlot, renderCompat, isVue3 } from '../util/vue-compat';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n render: renderCompat(function () {\n return getDefaultSlot(this);\n }),\n };\n\nexport default {\n name: 'AisHighlighter',\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n suit: {\n type: Function,\n required: true,\n },\n highlightProperty: {\n type: String,\n required: true,\n },\n preTag: {\n type: String,\n required: true,\n },\n postTag: {\n type: String,\n required: true,\n },\n },\n data() {\n return { TextNode };\n },\n computed: {\n parsedHighlights() {\n return parseAlgoliaHit({\n attribute: this.attribute,\n hit: this.hit,\n highlightProperty: this.highlightProperty,\n preTag: this.preTag,\n postTag: this.postTag,\n });\n },\n },\n};\n</script>\n","<template>\n <span :class=\"suit()\">\n <component\n v-for=\"({ value, isHighlighted }, index) in parsedHighlights\"\n :class=\"[isHighlighted && suit('highlighted')]\"\n :key=\"index\"\n :is=\"isHighlighted ? highlightedTagName : TextNode\"\n >{{ value }}</component\n >\n </span>\n</template>\n\n<script>\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\nimport { getDefaultSlot, renderCompat, isVue3 } from '../util/vue-compat';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n render: renderCompat(function () {\n return getDefaultSlot(this);\n }),\n };\n\nexport default {\n name: 'AisHighlighter',\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n suit: {\n type: Function,\n required: true,\n },\n highlightProperty: {\n type: String,\n required: true,\n },\n preTag: {\n type: String,\n required: true,\n },\n postTag: {\n type: String,\n required: true,\n },\n },\n data() {\n return { TextNode };\n },\n computed: {\n parsedHighlights() {\n return parseAlgoliaHit({\n attribute: this.attribute,\n hit: this.hit,\n highlightProperty: this.highlightProperty,\n preTag: this.preTag,\n postTag: this.postTag,\n });\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_highlightResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisHighlight',\n mixins: [createSuitMixin({ name: 'Highlight' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_highlightResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisHighlight',\n mixins: [createSuitMixin({ name: 'Highlight' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"items\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, itemIndex) in items\"\n :key=\"item.objectID\"\n :class=\"suit('item')\"\n @click=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n @auxclick=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"itemIndex\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n objectID: {{ item.objectID }}, index: {{ itemIndex }}\n </slot>\n </li>\n </ol>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsWithInsights } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectHitsWithInsights,\n },\n {\n $$widgetType: 'ais.hits',\n }\n ),\n createSuitMixin({ name: 'Hits' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n items() {\n return this.state.hits;\n },\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"items\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, itemIndex) in items\"\n :key=\"item.objectID\"\n :class=\"suit('item')\"\n @click=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n @auxclick=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"itemIndex\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n objectID: {{ item.objectID }}, index: {{ itemIndex }}\n </slot>\n </li>\n </ol>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsWithInsights } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectHitsWithInsights,\n },\n {\n $$widgetType: 'ais.hits',\n }\n ),\n createSuitMixin({ name: 'Hits' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n items() {\n return this.state.hits;\n },\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :has-no-results=\"state.hasNoResults\"\n :can-refine=\"state.canRefine\"\n :createURL=\"state.createURL\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine(Number($event.currentTarget.value))\"\n >\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsPerPage } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisHitsPerPage',\n mixins: [\n createSuitMixin({ name: 'HitsPerPage' }),\n createWidgetMixin(\n {\n connector: connectHitsPerPage,\n },\n {\n $$widgetType: 'ais.hitsPerPage',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :has-no-results=\"state.hasNoResults\"\n :can-refine=\"state.canRefine\"\n :createURL=\"state.createURL\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine(Number($event.currentTarget.value))\"\n >\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsPerPage } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisHitsPerPage',\n mixins: [\n createSuitMixin({ name: 'HitsPerPage' }),\n createWidgetMixin(\n {\n connector: connectHitsPerPage,\n },\n {\n $$widgetType: 'ais.hitsPerPage',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","import indexWidget from 'instantsearch.js/es/widgets/index/index';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\n// wrapped in a dummy function, since indexWidget doesn't render\nconst connectIndex = () => indexWidget;\n\nexport default {\n name: 'AisIndex',\n mixins: [\n createSuitMixin({ name: 'Index' }),\n createWidgetMixin(\n { connector: connectIndex },\n {\n $$widgetType: 'ais.index',\n }\n ),\n ],\n provide() {\n return {\n // The widget is created & registered by widgetMixin, accessor is needed\n // because provide is not reactive.\n $_ais_getParentIndex: () => this.widget,\n };\n },\n props: {\n indexName: {\n type: String,\n required: true,\n },\n indexId: {\n type: String,\n required: false,\n },\n },\n render: renderCompat(function (h) {\n return h('div', {}, getDefaultSlot(this));\n }),\n computed: {\n widgetParams() {\n return {\n indexName: this.indexName,\n indexId: this.indexId,\n };\n },\n },\n};\n","import { INSTANTSEARCH_FUTURE_DEFAULTS } from 'instantsearch.js/es/lib/InstantSearch';\n\nimport { version } from '../../package.json'; // rollup does pick only what needed from json\nimport { createSuitMixin } from '../mixins/suit';\n\nimport { _objectSpread } from './polyfills';\nimport { isVue3, version as vueVersion } from './vue-compat';\nimport { warn } from './warn';\n\nexport const createInstantSearchComponent = (component) =>\n _objectSpread(\n {\n mixins: [createSuitMixin({ name: 'InstantSearch' })],\n provide() {\n return {\n $_ais_instantSearchInstance: this.instantSearchInstance,\n };\n },\n watch: {\n searchClient(searchClient) {\n warn(\n false,\n 'The `search-client` prop of `<ais-instant-search>` changed between renders, which may cause more search requests than necessary. If this is an unwanted behavior, please provide a stable reference: https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-search-client'\n );\n\n this.instantSearchInstance.helper.setClient(searchClient).search();\n },\n indexName(indexName) {\n this.instantSearchInstance.helper.setIndex(indexName || '').search();\n },\n stalledSearchDelay(stalledSearchDelay) {\n // private InstantSearch.js API:\n this.instantSearchInstance._stalledSearchDelay = stalledSearchDelay;\n },\n routing() {\n throw new Error(\n 'routing configuration can not be changed dynamically at this point.' +\n '\\n\\n' +\n 'Please open a new issue: https://github.com/algolia/instantsearch/discussions/new?category=ideas&labels=triage%2cLibrary%3A+Vue+InstantSearch&title=Feature%20request%3A%20dynamic%20props'\n );\n },\n onStateChange() {\n throw new Error(\n 'onStateChange configuration can not be changed dynamically at this point.' +\n '\\n\\n' +\n 'Please open a new issue: https://github.com/algolia/instantsearch/discussions/new?category=ideas&labels=triage%2cLibrary%3A+Vue+InstantSearch&title=Feature%20request%3A%20dynamic%20props'\n );\n },\n searchFunction(searchFunction) {\n // private InstantSearch.js API:\n this.instantSearchInstance._searchFunction = searchFunction;\n },\n middlewares: {\n immediate: true,\n handler(next, prev) {\n (prev || [])\n .filter((middleware) => (next || []).indexOf(middleware) === -1)\n .forEach((middlewareToRemove) => {\n this.instantSearchInstance.unuse(middlewareToRemove);\n });\n\n (next || [])\n .filter((middleware) => (prev || []).indexOf(middleware) === -1)\n .forEach((middlewareToAdd) => {\n this.instantSearchInstance.use(middlewareToAdd);\n });\n },\n },\n future(future) {\n this.instantSearchInstance.future = Object.assign(\n INSTANTSEARCH_FUTURE_DEFAULTS,\n future\n );\n },\n },\n created() {\n const searchClient = this.instantSearchInstance.client;\n if (typeof searchClient.addAlgoliaAgent === 'function') {\n searchClient.addAlgoliaAgent(`Vue (${vueVersion})`);\n searchClient.addAlgoliaAgent(`Vue InstantSearch (${version})`);\n }\n },\n mounted() {\n // from the documentation: https://vuejs.org/v2/api/#mounted\n // \"Note that mounted does not guarantee that all child components have also been mounted. If you want to\n // wait until the entire view has been rendered, you can use vm.$nextTick inside of mounted\"\n this.$nextTick(() => {\n if (!this.instantSearchInstance.started) {\n this.instantSearchInstance.start();\n }\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.instantSearchInstance.started) {\n this.instantSearchInstance.dispose();\n }\n\n // a hydrated instance will no longer be hydrated once disposed, and starts from scratch\n this.instantSearchInstance.__initialSearchResults = undefined;\n },\n },\n component\n );\n","import instantsearch from 'instantsearch.js/es';\n\nimport { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\nimport { warn } from '../util/warn';\n\nconst oldApiWarning = `Vue InstantSearch: You used the prop api-key or app-id.\nThese have been replaced by search-client.\n\nSee more info here: https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-search-client`;\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearch',\n props: {\n searchClient: {\n type: Object,\n required: true,\n },\n insightsClient: {\n type: Function,\n default: undefined,\n },\n indexName: {\n type: String,\n required: true,\n },\n routing: {\n default: undefined,\n validator(value) {\n if (\n typeof value === 'boolean' ||\n (!value.router && !value.stateMapping)\n ) {\n warn(\n 'The `routing` option expects an object with `router` and/or `stateMapping`.\\n\\nSee https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-routing'\n );\n return false;\n }\n return true;\n },\n },\n insights: {\n default: undefined,\n validator(value) {\n return (\n typeof value === 'undefined' ||\n typeof value === 'boolean' ||\n typeof value === 'object'\n );\n },\n },\n stalledSearchDelay: {\n type: Number,\n default: undefined,\n },\n searchFunction: {\n type: Function,\n default: undefined,\n },\n onStateChange: {\n type: Function,\n default: undefined,\n },\n initialUiState: {\n type: Object,\n default: undefined,\n },\n apiKey: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n appId: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n middlewares: {\n type: Array,\n default: null,\n },\n future: {\n type: Object,\n default: undefined,\n },\n },\n data() {\n return {\n instantSearchInstance: instantsearch({\n searchClient: this.searchClient,\n insightsClient: this.insightsClient,\n insights: this.insights,\n indexName: this.indexName,\n routing: this.routing,\n stalledSearchDelay: this.stalledSearchDelay,\n searchFunction: this.searchFunction,\n onStateChange: this.onStateChange,\n initialUiState: this.initialUiState,\n future: this.future,\n }),\n };\n },\n render: renderCompat(function (h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: false,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","import { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearchSsr',\n inject: {\n $_ais_ssrInstantSearchInstance: {\n default() {\n throw new Error('`createServerRootMixin` is required when using SSR.');\n },\n },\n },\n data() {\n return {\n instantSearchInstance: this.$_ais_ssrInstantSearchInstance,\n };\n },\n render: renderCompat(function (h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: true,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-if=\"showPrevious\"\n name=\"loadPrevious\"\n :refine-previous=\"refinePrevious\"\n :page=\"state.results.page\"\n :is-first-page=\"state.isFirstPage\"\n >\n <button\n :class=\"[\n suit('loadPrevious'),\n state.isFirstPage && suit('loadPrevious', 'disabled'),\n ]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >\n Show previous results\n </button>\n </slot>\n\n <slot\n :items=\"items\"\n :results=\"state.results\"\n :is-last-page=\"state.isLastPage\"\n :refine-previous=\"refinePrevious\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, index) in items\"\n :class=\"suit('item')\"\n :key=\"item.objectID\"\n @click=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n @auxclick=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n objectID: {{ item.objectID }}, index: {{ index }}\n </slot>\n </li>\n </ol>\n\n <slot\n name=\"loadMore\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :page=\"state.results.page\"\n :is-last-page=\"state.isLastPage\"\n >\n <button\n :class=\"[\n suit('loadMore'),\n state.isLastPage && suit('loadMore', 'disabled'),\n ]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >\n Show more results\n </button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisInfiniteHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectInfiniteHitsWithInsights,\n },\n {\n $$widgetType: 'ais.infiniteHits',\n }\n ),\n createSuitMixin({ name: 'InfiniteHits' }),\n ],\n props: {\n showPrevious: {\n type: Boolean,\n default: false,\n },\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n cache: {\n type: Object,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n showPrevious: this.showPrevious,\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n cache: this.cache,\n };\n },\n items() {\n // Fixes InstantSearch.js connectors API: every list\n // of things must be called `items`\n return this.state.hits;\n },\n },\n methods: {\n refinePrevious() {\n this.state.showPrevious();\n },\n refineNext() {\n this.state.showMore();\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-if=\"showPrevious\"\n name=\"loadPrevious\"\n :refine-previous=\"refinePrevious\"\n :page=\"state.results.page\"\n :is-first-page=\"state.isFirstPage\"\n >\n <button\n :class=\"[\n suit('loadPrevious'),\n state.isFirstPage && suit('loadPrevious', 'disabled'),\n ]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >\n Show previous results\n </button>\n </slot>\n\n <slot\n :items=\"items\"\n :results=\"state.results\"\n :is-last-page=\"state.isLastPage\"\n :refine-previous=\"refinePrevious\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, index) in items\"\n :class=\"suit('item')\"\n :key=\"item.objectID\"\n @click=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n @auxclick=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n objectID: {{ item.objectID }}, index: {{ index }}\n </slot>\n </li>\n </ol>\n\n <slot\n name=\"loadMore\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :page=\"state.results.page\"\n :is-last-page=\"state.isLastPage\"\n >\n <button\n :class=\"[\n suit('loadMore'),\n state.isLastPage && suit('loadMore', 'disabled'),\n ]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >\n Show more results\n </button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisInfiniteHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectInfiniteHitsWithInsights,\n },\n {\n $$widgetType: 'ais.infiniteHits',\n }\n ),\n createSuitMixin({ name: 'InfiniteHits' }),\n ],\n props: {\n showPrevious: {\n type: Boolean,\n default: false,\n },\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n cache: {\n type: Object,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n showPrevious: this.showPrevious,\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n cache: this.cache,\n };\n },\n items() {\n // Fixes InstantSearch.js connectors API: every list\n // of things must be called `items`\n return this.state.hits;\n },\n },\n methods: {\n refinePrevious() {\n this.state.showPrevious();\n },\n refineNext() {\n this.state.showMore();\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n\n <button\n v-if=\"showShowMoreButton\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">{{\n state.isShowingMore ? 'Show less' : 'Show more'\n }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenu',\n mixins: [\n createSuitMixin({ name: 'Menu' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n // TODO: implement searchable in connector\n // searchable: {\n // type: Boolean,\n // default: false,\n // },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n showShowMoreButton() {\n return this.state.canRefine && this.showMore;\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n\n <button\n v-if=\"showShowMoreButton\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">{{\n state.isShowingMore ? 'Show less' : 'Show more'\n }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenu',\n mixins: [\n createSuitMixin({ name: 'Menu' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n // TODO: implement searchable in connector\n // searchable: {\n // type: Boolean,\n // default: false,\n // },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n showShowMoreButton() {\n return this.state.canRefine && this.showMore;\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"refine($event.currentTarget.value)\"\n >\n <option :class=\"suit('option')\" value=\"\">\n <slot name=\"defaultOption\"> See all </slot>\n </option>\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n <slot name=\"item\" :item=\"item\">\n {{ item.label }} ({{ item.count }})\n </slot>\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenuSelect',\n mixins: [\n createSuitMixin({ name: 'MenuSelect' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menuSelect',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n limit: {\n type: Number,\n default: 10,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"refine($event.currentTarget.value)\"\n >\n <option :class=\"suit('option')\" value=\"\">\n <slot name=\"defaultOption\"> See all </slot>\n </option>\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n <slot name=\"item\" :item=\"item\">\n {{ item.label }} ({{ item.count }})\n </slot>\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenuSelect',\n mixins: [\n createSuitMixin({ name: 'MenuSelect' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menuSelect',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n limit: {\n type: Number,\n default: 10,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"[suit('list')]\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <label :class=\"suit('label')\">\n <input\n type=\"radio\"\n :class=\"suit('radio')\"\n :name=\"attribute\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"state.refine($event.target.value)\"\n />\n <span :class=\"suit('labelText')\">{{ item.label }}</span>\n </label>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectNumericMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisNumericMenu',\n mixins: [\n createWidgetMixin(\n {\n connector: connectNumericMenu,\n },\n {\n $$widgetType: 'ais.numericMenu',\n }\n ),\n createSuitMixin({ name: 'NumericMenu' }),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n transformItems: this.transformItems,\n items: this.items,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"[suit('list')]\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <label :class=\"suit('label')\">\n <input\n type=\"radio\"\n :class=\"suit('radio')\"\n :name=\"attribute\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"state.refine($event.target.value)\"\n />\n <span :class=\"suit('labelText')\">{{ item.label }}</span>\n </label>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectNumericMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisNumericMenu',\n mixins: [\n createWidgetMixin(\n {\n connector: connectNumericMenu,\n },\n {\n $$widgetType: 'ais.numericMenu',\n }\n ),\n createSuitMixin({ name: 'NumericMenu' }),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n transformItems: this.transformItems,\n items: this.items,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"{ [suit()]: true, [suit('', 'noRefinement')]: state.nbPages <= 1 }\"\n >\n <slot\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :current-refinement=\"state.currentRefinement\"\n :nb-hits=\"state.nbHits\"\n :nb-pages=\"state.nbPages\"\n :pages=\"state.pages\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'firstPage')]: true,\n }\"\n v-if=\"showFirst\"\n >\n <slot\n name=\"first\"\n :createURL=\"() => state.createURL(0)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(0)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"First Page\"\n :href=\"state.createURL(0)\"\n @click.exact.left.prevent=\"refine(0)\"\n >‹‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"First Page\">‹‹</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'previousPage')]: true,\n }\"\n v-if=\"showPrevious\"\n >\n <slot\n name=\"previous\"\n :createURL=\"() => state.createURL(state.currentRefinement - 1)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(state.currentRefinement - 1)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Previous Page\"\n :href=\"state.createURL(state.currentRefinement - 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement - 1)\"\n >‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Previous Page\">‹</span>\n </template>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'page')]: true,\n [suit('item', 'selected')]: state.currentRefinement === page,\n }\"\n v-for=\"page in state.pages\"\n :key=\"page\"\n >\n <slot\n name=\"item\"\n :page=\"page\"\n :createURL=\"() => state.createURL(page)\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(page)\"\n >\n <a\n :class=\"suit('link')\"\n :href=\"state.createURL(page)\"\n :aria-label=\"`Page ${page + 1}`\"\n @click.exact.left.prevent=\"refine(page)\"\n >{{ page + 1 }}</a\n >\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'nextPage')]: true,\n }\"\n v-if=\"showNext\"\n >\n <slot\n name=\"next\"\n :createURL=\"() => state.createURL(state.currentRefinement + 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.currentRefinement + 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Next Page\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Next Page\">›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'lastPage')]: true,\n }\"\n v-if=\"showLast\"\n >\n <slot\n name=\"last\"\n :createURL=\"() => state.createURL(state.nbPages - 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.nbPages - 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.exact.left.prevent=\"refine(state.nbPages - 1)\"\n >››</a\n >\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n >\n ››\n </span>\n </template>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectPagination } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisPagination',\n mixins: [\n createSuitMixin({ name: 'Pagination' }),\n createWidgetMixin(\n {\n connector: connectPagination,\n },\n {\n $$widgetType: 'ais.pagination',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n padding: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n totalPages: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n showFirst: {\n type: Boolean,\n default: true,\n },\n showLast: {\n type: Boolean,\n default: true,\n },\n showNext: {\n type: Boolean,\n default: true,\n },\n showPrevious: {\n type: Boolean,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n padding: this.padding,\n totalPages: this.totalPages,\n };\n },\n },\n emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"{ [suit()]: true, [suit('', 'noRefinement')]: state.nbPages <= 1 }\"\n >\n <slot\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :current-refinement=\"state.currentRefinement\"\n :nb-hits=\"state.nbHits\"\n :nb-pages=\"state.nbPages\"\n :pages=\"state.pages\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'firstPage')]: true,\n }\"\n v-if=\"showFirst\"\n >\n <slot\n name=\"first\"\n :createURL=\"() => state.createURL(0)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(0)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"First Page\"\n :href=\"state.createURL(0)\"\n @click.exact.left.prevent=\"refine(0)\"\n >‹‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"First Page\">‹‹</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'previousPage')]: true,\n }\"\n v-if=\"showPrevious\"\n >\n <slot\n name=\"previous\"\n :createURL=\"() => state.createURL(state.currentRefinement - 1)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(state.currentRefinement - 1)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Previous Page\"\n :href=\"state.createURL(state.currentRefinement - 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement - 1)\"\n >‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Previous Page\">‹</span>\n </template>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'page')]: true,\n [suit('item', 'selected')]: state.currentRefinement === page,\n }\"\n v-for=\"page in state.pages\"\n :key=\"page\"\n >\n <slot\n name=\"item\"\n :page=\"page\"\n :createURL=\"() => state.createURL(page)\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(page)\"\n >\n <a\n :class=\"suit('link')\"\n :href=\"state.createURL(page)\"\n :aria-label=\"`Page ${page + 1}`\"\n @click.exact.left.prevent=\"refine(page)\"\n >{{ page + 1 }}</a\n >\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'nextPage')]: true,\n }\"\n v-if=\"showNext\"\n >\n <slot\n name=\"next\"\n :createURL=\"() => state.createURL(state.currentRefinement + 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.currentRefinement + 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Next Page\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Next Page\">›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'lastPage')]: true,\n }\"\n v-if=\"showLast\"\n >\n <slot\n name=\"last\"\n :createURL=\"() => state.createURL(state.nbPages - 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.nbPages - 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.exact.left.prevent=\"refine(state.nbPages - 1)\"\n >››</a\n >\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n >\n ››\n </span>\n </template>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectPagination } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisPagination',\n mixins: [\n createSuitMixin({ name: 'Pagination' }),\n createWidgetMixin(\n {\n connector: connectPagination,\n },\n {\n $$widgetType: 'ais.pagination',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n padding: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n totalPages: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n showFirst: {\n type: Boolean,\n default: true,\n },\n showLast: {\n type: Boolean,\n default: true,\n },\n showNext: {\n type: Boolean,\n default: true,\n },\n showPrevious: {\n type: Boolean,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n padding: this.padding,\n totalPages: this.totalPages,\n };\n },\n },\n emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div v-if=\"getSlot('header')\" :class=\"suit('header')\">\n <slot name=\"header\" :has-refinements=\"canRefine\" />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div v-if=\"getSlot('footer')\" :class=\"suit('footer')\">\n <slot name=\"footer\" :has-refinements=\"canRefine\" />\n </div>\n </div>\n</template>\n\n<script>\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div v-if=\"getSlot('header')\" :class=\"suit('header')\">\n <slot name=\"header\" :has-refinements=\"canRefine\" />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div v-if=\"getSlot('footer')\" :class=\"suit('footer')\">\n <slot name=\"footer\" :has-refinements=\"canRefine\" />\n </div>\n </div>\n</template>\n\n<script>\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\">\n <a\n :class=\"suit('link')\"\n :href=\"algoliaUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"search by Algolia\"\n >\n <svg\n style=\"height: 1.2em; width: auto\"\n :class=\"[suit('logo'), suit('', theme)]\"\n viewBox=\"0 0 572 64\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#36395a'\"\n d=\"M16 48.3c-3.4 0-6.3-.6-8.7-1.7A12.4 12.4 0 0 1 1.9 42C.6 40 0 38 0 35.4h6.5a6.7 6.7 0 0 0 3.9 6c1.4.7 3.3 1.1 5.6 1.1 2.2 0 4-.3 5.4-1a7 7 0 0 0 3-2.4 6 6 0 0 0 1-3.4c0-1.5-.6-2.8-1.9-3.7-1.3-1-3.3-1.6-5.9-1.8l-4-.4c-3.7-.3-6.6-1.4-8.8-3.4a10 10 0 0 1-3.3-7.9c0-2.4.6-4.6 1.8-6.4a12 12 0 0 1 5-4.3c2.2-1 4.7-1.6 7.5-1.6s5.5.5 7.6 1.6a12 12 0 0 1 5 4.4c1.2 1.8 1.8 4 1.8 6.7h-6.5a6.4 6.4 0 0 0-3.5-5.9c-1-.6-2.6-1-4.4-1s-3.2.3-4.4 1c-1.1.6-2 1.4-2.6 2.4-.5 1-.8 2-.8 3.1a5 5 0 0 0 1.5 3.6c1 1 2.6 1.7 4.7 1.9l4 .3c2.8.2 5.2.8 7.2 1.8 2.1 1 3.7 2.2 4.9 3.8a9.7 9.7 0 0 1 1.7 5.8c0 2.5-.7 4.7-2 6.6a13 13 0 0 1-5.6 4.4c-2.4 1-5.2 1.6-8.4 1.6Zm35.6 0c-2.6 0-4.8-.4-6.7-1.3a13 13 0 0 1-4.7-3.5 17.1 17.1 0 0 1-3.6-10.4v-1c0-2 .3-3.8 1-5.6a13 13 0 0 1 7.3-8.3 15 15 0 0 1 6.3-1.4A13.2 13.2 0 0 1 64 24.3c1 2.2 1.6 4.6 1.6 7.2V34H39.4v-4.3h21.8l-1.8 2.2c0-2-.3-3.7-.9-5.1a7.3 7.3 0 0 0-2.7-3.4c-1.2-.7-2.7-1.1-4.6-1.1s-3.4.4-4.7 1.3a8 8 0 0 0-2.9 3.6c-.6 1.5-.9 3.3-.9 5.4 0 2 .3 3.7 1 5.3a7.9 7.9 0 0 0 2.8 3.7c1.3.8 3 1.3 5 1.3s3.8-.5 5.1-1.3c1.3-1 2.1-2 2.4-3.2h6a11.8 11.8 0 0 1-7 8.7 16 16 0 0 1-6.4 1.2ZM80 48c-2.2 0-4-.3-5.7-1a8.4 8.4 0 0 1-3.7-3.3 9.7 9.7 0 0 1-1.3-5.2c0-2 .5-3.8 1.5-5.2a9 9 0 0 1 4.3-3.1c1.8-.7 4-1 6.7-1H89v4.1h-7.5c-2 0-3.4.5-4.4 1.4-1 1-1.6 2.1-1.6 3.6s.5 2.7 1.6 3.6c1 1 2.5 1.4 4.4 1.4 1.1 0 2.2-.2 3.2-.7 1-.4 1.9-1 2.6-2 .6-1 1-2.4 1-4.2l1.7 2.1c-.2 2-.7 3.8-1.5 5.2a9 9 0 0 1-3.4 3.3 12 12 0 0 1-5.3 1Zm9.5-.7v-8.8h-1v-10c0-1.8-.5-3.2-1.4-4.1-1-1-2.4-1.4-4.2-1.4a142.9 142.9 0 0 0-10.2.4v-5.6a74.8 74.8 0 0 1 8.6-.4c3 0 5.5.4 7.5 1.2s3.4 2 4.4 3.6c1 1.7 1.4 4 1.4 6.7v18.4h-5Zm12.9 0V17.8h5v12.3h-.2c0-4.2 1-7.4 2.8-9.5a11 11 0 0 1 8.3-3.1h1v5.6h-2a9 9 0 0 0-6.3 2.2c-1.5 1.5-2.2 3.6-2.2 6.4v15.6h-6.4Zm34.4 1a15 15 0 0 1-6.6-1.3c-1.9-.9-3.4-2-4.7-3.5a15.5 15.5 0 0 1-2.7-5c-.6-1.7-1-3.6-1-5.4v-1c0-2 .4-3.8 1-5.6a15 15 0 0 1 2.8-4.9c1.3-1.5 2.8-2.6 4.6-3.5a16.4 16.4 0 0 1 13.3.2c2 1 3.5 2.3 4.8 4a12 12 0 0 1 2 6H144c-.2-1.6-1-3-2.2-4.1a7.5 7.5 0 0 0-5.2-1.7 8 8 0 0 0-4.7 1.3 8 8 0 0 0-2.8 3.6 13.8 13.8 0 0 0 0 10.3c.6 1.5 1.5 2.7 2.8 3.6s2.8 1.3 4.8 1.3c1.5 0 2.7-.2 3.8-.8a7 7 0 0 0 2.6-2c.7-1 1-2 1.2-3.2h6.2a11 11 0 0 1-2 6.2 15.1 15.1 0 0 1-11.8 5.5Zm19.7-1v-40h6.4V31h-1.3c0-3 .4-5.5 1.1-7.6a9.7 9.7 0 0 1 3.5-4.8A9.9 9.9 0 0 1 172 17h.3c3.5 0 6 1.1 7.9 3.5 1.7 2.3 2.6 5.7 2.6 10v16.8h-6.4V29.6c0-2.1-.6-3.8-1.8-5a6.4 6.4 0 0 0-4.8-1.8c-2 0-3.7.7-5 2a7.8 7.8 0 0 0-1.9 5.5v17h-6.4Zm63.8 1a12.2 12.2 0 0 1-10.9-6.2 19 19 0 0 1-1.8-7.3h1.4v12.5h-5.1v-40h6.4v19.8l-2 3.5c.2-3.1.8-5.7 1.9-7.7a11 11 0 0 1 4.4-4.5c1.8-1 3.9-1.5 6.1-1.5a13.4 13.4 0 0 1 12.8 9.1c.7 1.9 1 3.8 1 6v1c0 2.2-.3 4.1-1 6a13.6 13.6 0 0 1-13.2 9.4Zm-1.2-5.5a8.4 8.4 0 0 0 7.9-5c.7-1.5 1.1-3.3 1.1-5.3s-.4-3.8-1.1-5.3a8.7 8.7 0 0 0-3.2-3.6 9.6 9.6 0 0 0-9.2-.2 8.5 8.5 0 0 0-3.3 3.2c-.8 1.4-1.3 3-1.3 5v2.3a9 9 0 0 0 1.3 4.8 9 9 0 0 0 3.4 3c1.4.7 2.8 1 4.4 1Zm27.3 3.9-10-28.9h6.5l9.5 28.9h-6Zm-7.5 12.2v-5.7h4.9c1 0 2-.1 2.9-.4a4 4 0 0 0 2-1.4c.4-.7.9-1.6 1.2-2.7l8.6-30.9h6.2l-9.3 32.4a14 14 0 0 1-2.5 5 8.9 8.9 0 0 1-4 2.8c-1.5.6-3.4.9-5.6.9h-4.4Zm9-12.2v-5.2h6.4v5.2H248Z\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#003DFF'\"\n d=\"M534.4 9.1H528a.8.8 0 0 1-.7-.7V1.8c0-.4.2-.7.6-.8l6.5-1c.4 0 .8.2.9.6v7.8c0 .4-.4.7-.8.7zM428 35.2V.8c0-.5-.3-.8-.7-.8h-.2l-6.4 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.5 0 .8-.4.8-.8V43c0-.4-.3-.7-.6-.8-4.5-.5-4.5-6-4.5-7zm106.5-21.8H528c-.4 0-.7.4-.7.8v34c0 .4.3.8.7.8h6.5c.4 0 .8-.4.8-.8v-34c0-.5-.4-.8-.8-.8zm-17.7 21.8V.8c0-.5-.3-.8-.8-.8l-6.5 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.4 0 .8-.4.8-.8V43c0-.4-.3-.7-.7-.8-4.4-.5-4.4-6-4.4-7zm-22.2-20.6a16.5 16.5 0 0 1 8.6 9.3c.8 2.2 1.3 4.8 1.3 7.5a19.4 19.4 0 0 1-4.6 12.6 14.8 14.8 0 0 1-5.2 3.6c-2 .9-5.2 1.4-6.8 1.4a21 21 0 0 1-6.7-1.4 15.4 15.4 0 0 1-8.6-9.3 21.3 21.3 0 0 1 0-14.4 15.2 15.2 0 0 1 8.6-9.3c2-.8 4.3-1.2 6.7-1.2s4.6.4 6.7 1.2zm-6.7 27.6c2.7 0 4.7-1 6.2-3s2.2-4.3 2.2-7.8-.7-6.3-2.2-8.3-3.5-3-6.2-3-4.7 1-6.1 3c-1.5 2-2.2 4.8-2.2 8.3s.7 5.8 2.2 7.8 3.5 3 6.2 3zm-88.8-28.8c-6.2 0-11.7 3.3-14.8 8.2a18.6 18.6 0 0 0 4.8 25.2c1.8 1.2 4 1.8 6.2 1.7s.1 0 .1 0h.9c4.2-.7 8-4 9.1-8.1v7.4c0 .4.3.7.8.7h6.4a.7.7 0 0 0 .7-.7V14.2c0-.5-.3-.8-.7-.8h-13.5zm6.3 26.5a9.8 9.8 0 0 1-5.7 2h-.5a10 10 0 0 1-9.2-14c1.4-3.7 5-6.3 9-6.3h6.4v18.3zm152.3-26.5h13.5c.5 0 .8.3.8.7v33.7c0 .4-.3.7-.8.7h-6.4a.7.7 0 0 1-.8-.7v-7.4c-1.2 4-4.8 7.4-9 8h-.1a4.2 4.2 0 0 1-.5.1h-.9a10.3 10.3 0 0 1-7-2.6c-4-3.3-6.5-8.4-6.5-14.2 0-3.7 1-7.2 3-10 3-5 8.5-8.3 14.7-8.3zm.6 28.4c2.2-.1 4.2-.6 5.7-2V21.7h-6.3a9.8 9.8 0 0 0-9 6.4 10.2 10.2 0 0 0 9.1 13.9h.5zM452.8 13.4c-6.2 0-11.7 3.3-14.8 8.2a18.5 18.5 0 0 0 3.6 24.3 10.4 10.4 0 0 0 13 .6c2.2-1.5 3.8-3.7 4.5-6.1v7.8c0 2.8-.8 5-2.2 6.3-1.5 1.5-4 2.2-7.5 2.2l-6-.3c-.3 0-.7.2-.8.5l-1.6 5.5c-.1.4.1.8.5 1h.1c2.8.4 5.5.6 7 .6 6.3 0 11-1.4 14-4.1 2.7-2.5 4.2-6.3 4.5-11.4V14.2c0-.5-.4-.8-.8-.8h-13.5zm6.3 8.2v18.3a9.6 9.6 0 0 1-5.6 2h-1a10.3 10.3 0 0 1-8.8-14c1.4-3.7 5-6.3 9-6.3h6.4zM291 31.5A32 32 0 0 1 322.8 0h30.8c.6 0 1.2.5 1.2 1.2v61.5c0 1.1-1.3 1.7-2.2 1l-19.2-17a18 18 0 0 1-11 3.4 18.1 18.1 0 1 1 18.2-14.8c-.1.4-.5.7-.9.6-.1 0-.3 0-.4-.2l-3.8-3.4c-.4-.3-.6-.8-.7-1.4a12 12 0 1 0-2.4 8.3c.4-.4 1-.5 1.6-.2l14.7 13.1v-46H323a26 26 0 1 0 10 49.7c.8-.4 1.6-.2 2.3.3l3 2.7c.3.2.3.7 0 1l-.2.2a32 32 0 0 1-47.2-28.6z\"\n />\n </svg>\n </a>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPoweredBy',\n mixins: [createSuitMixin({ name: 'PoweredBy' })],\n props: {\n theme: {\n default: 'light',\n validator(value) {\n return ['light', 'dark'].indexOf(value) !== -1;\n },\n },\n },\n computed: {\n algoliaUrl() {\n return (\n 'https://www.algolia.com/?' +\n 'utm_source=vue-instantsearch&' +\n 'utm_medium=website&' +\n `utm_content=${location ? location.hostname : ''}&` +\n 'utm_campaign=poweredby'\n );\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\">\n <a\n :class=\"suit('link')\"\n :href=\"algoliaUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"search by Algolia\"\n >\n <svg\n style=\"height: 1.2em; width: auto\"\n :class=\"[suit('logo'), suit('', theme)]\"\n viewBox=\"0 0 572 64\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#36395a'\"\n d=\"M16 48.3c-3.4 0-6.3-.6-8.7-1.7A12.4 12.4 0 0 1 1.9 42C.6 40 0 38 0 35.4h6.5a6.7 6.7 0 0 0 3.9 6c1.4.7 3.3 1.1 5.6 1.1 2.2 0 4-.3 5.4-1a7 7 0 0 0 3-2.4 6 6 0 0 0 1-3.4c0-1.5-.6-2.8-1.9-3.7-1.3-1-3.3-1.6-5.9-1.8l-4-.4c-3.7-.3-6.6-1.4-8.8-3.4a10 10 0 0 1-3.3-7.9c0-2.4.6-4.6 1.8-6.4a12 12 0 0 1 5-4.3c2.2-1 4.7-1.6 7.5-1.6s5.5.5 7.6 1.6a12 12 0 0 1 5 4.4c1.2 1.8 1.8 4 1.8 6.7h-6.5a6.4 6.4 0 0 0-3.5-5.9c-1-.6-2.6-1-4.4-1s-3.2.3-4.4 1c-1.1.6-2 1.4-2.6 2.4-.5 1-.8 2-.8 3.1a5 5 0 0 0 1.5 3.6c1 1 2.6 1.7 4.7 1.9l4 .3c2.8.2 5.2.8 7.2 1.8 2.1 1 3.7 2.2 4.9 3.8a9.7 9.7 0 0 1 1.7 5.8c0 2.5-.7 4.7-2 6.6a13 13 0 0 1-5.6 4.4c-2.4 1-5.2 1.6-8.4 1.6Zm35.6 0c-2.6 0-4.8-.4-6.7-1.3a13 13 0 0 1-4.7-3.5 17.1 17.1 0 0 1-3.6-10.4v-1c0-2 .3-3.8 1-5.6a13 13 0 0 1 7.3-8.3 15 15 0 0 1 6.3-1.4A13.2 13.2 0 0 1 64 24.3c1 2.2 1.6 4.6 1.6 7.2V34H39.4v-4.3h21.8l-1.8 2.2c0-2-.3-3.7-.9-5.1a7.3 7.3 0 0 0-2.7-3.4c-1.2-.7-2.7-1.1-4.6-1.1s-3.4.4-4.7 1.3a8 8 0 0 0-2.9 3.6c-.6 1.5-.9 3.3-.9 5.4 0 2 .3 3.7 1 5.3a7.9 7.9 0 0 0 2.8 3.7c1.3.8 3 1.3 5 1.3s3.8-.5 5.1-1.3c1.3-1 2.1-2 2.4-3.2h6a11.8 11.8 0 0 1-7 8.7 16 16 0 0 1-6.4 1.2ZM80 48c-2.2 0-4-.3-5.7-1a8.4 8.4 0 0 1-3.7-3.3 9.7 9.7 0 0 1-1.3-5.2c0-2 .5-3.8 1.5-5.2a9 9 0 0 1 4.3-3.1c1.8-.7 4-1 6.7-1H89v4.1h-7.5c-2 0-3.4.5-4.4 1.4-1 1-1.6 2.1-1.6 3.6s.5 2.7 1.6 3.6c1 1 2.5 1.4 4.4 1.4 1.1 0 2.2-.2 3.2-.7 1-.4 1.9-1 2.6-2 .6-1 1-2.4 1-4.2l1.7 2.1c-.2 2-.7 3.8-1.5 5.2a9 9 0 0 1-3.4 3.3 12 12 0 0 1-5.3 1Zm9.5-.7v-8.8h-1v-10c0-1.8-.5-3.2-1.4-4.1-1-1-2.4-1.4-4.2-1.4a142.9 142.9 0 0 0-10.2.4v-5.6a74.8 74.8 0 0 1 8.6-.4c3 0 5.5.4 7.5 1.2s3.4 2 4.4 3.6c1 1.7 1.4 4 1.4 6.7v18.4h-5Zm12.9 0V17.8h5v12.3h-.2c0-4.2 1-7.4 2.8-9.5a11 11 0 0 1 8.3-3.1h1v5.6h-2a9 9 0 0 0-6.3 2.2c-1.5 1.5-2.2 3.6-2.2 6.4v15.6h-6.4Zm34.4 1a15 15 0 0 1-6.6-1.3c-1.9-.9-3.4-2-4.7-3.5a15.5 15.5 0 0 1-2.7-5c-.6-1.7-1-3.6-1-5.4v-1c0-2 .4-3.8 1-5.6a15 15 0 0 1 2.8-4.9c1.3-1.5 2.8-2.6 4.6-3.5a16.4 16.4 0 0 1 13.3.2c2 1 3.5 2.3 4.8 4a12 12 0 0 1 2 6H144c-.2-1.6-1-3-2.2-4.1a7.5 7.5 0 0 0-5.2-1.7 8 8 0 0 0-4.7 1.3 8 8 0 0 0-2.8 3.6 13.8 13.8 0 0 0 0 10.3c.6 1.5 1.5 2.7 2.8 3.6s2.8 1.3 4.8 1.3c1.5 0 2.7-.2 3.8-.8a7 7 0 0 0 2.6-2c.7-1 1-2 1.2-3.2h6.2a11 11 0 0 1-2 6.2 15.1 15.1 0 0 1-11.8 5.5Zm19.7-1v-40h6.4V31h-1.3c0-3 .4-5.5 1.1-7.6a9.7 9.7 0 0 1 3.5-4.8A9.9 9.9 0 0 1 172 17h.3c3.5 0 6 1.1 7.9 3.5 1.7 2.3 2.6 5.7 2.6 10v16.8h-6.4V29.6c0-2.1-.6-3.8-1.8-5a6.4 6.4 0 0 0-4.8-1.8c-2 0-3.7.7-5 2a7.8 7.8 0 0 0-1.9 5.5v17h-6.4Zm63.8 1a12.2 12.2 0 0 1-10.9-6.2 19 19 0 0 1-1.8-7.3h1.4v12.5h-5.1v-40h6.4v19.8l-2 3.5c.2-3.1.8-5.7 1.9-7.7a11 11 0 0 1 4.4-4.5c1.8-1 3.9-1.5 6.1-1.5a13.4 13.4 0 0 1 12.8 9.1c.7 1.9 1 3.8 1 6v1c0 2.2-.3 4.1-1 6a13.6 13.6 0 0 1-13.2 9.4Zm-1.2-5.5a8.4 8.4 0 0 0 7.9-5c.7-1.5 1.1-3.3 1.1-5.3s-.4-3.8-1.1-5.3a8.7 8.7 0 0 0-3.2-3.6 9.6 9.6 0 0 0-9.2-.2 8.5 8.5 0 0 0-3.3 3.2c-.8 1.4-1.3 3-1.3 5v2.3a9 9 0 0 0 1.3 4.8 9 9 0 0 0 3.4 3c1.4.7 2.8 1 4.4 1Zm27.3 3.9-10-28.9h6.5l9.5 28.9h-6Zm-7.5 12.2v-5.7h4.9c1 0 2-.1 2.9-.4a4 4 0 0 0 2-1.4c.4-.7.9-1.6 1.2-2.7l8.6-30.9h6.2l-9.3 32.4a14 14 0 0 1-2.5 5 8.9 8.9 0 0 1-4 2.8c-1.5.6-3.4.9-5.6.9h-4.4Zm9-12.2v-5.2h6.4v5.2H248Z\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#003DFF'\"\n d=\"M534.4 9.1H528a.8.8 0 0 1-.7-.7V1.8c0-.4.2-.7.6-.8l6.5-1c.4 0 .8.2.9.6v7.8c0 .4-.4.7-.8.7zM428 35.2V.8c0-.5-.3-.8-.7-.8h-.2l-6.4 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.5 0 .8-.4.8-.8V43c0-.4-.3-.7-.6-.8-4.5-.5-4.5-6-4.5-7zm106.5-21.8H528c-.4 0-.7.4-.7.8v34c0 .4.3.8.7.8h6.5c.4 0 .8-.4.8-.8v-34c0-.5-.4-.8-.8-.8zm-17.7 21.8V.8c0-.5-.3-.8-.8-.8l-6.5 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.4 0 .8-.4.8-.8V43c0-.4-.3-.7-.7-.8-4.4-.5-4.4-6-4.4-7zm-22.2-20.6a16.5 16.5 0 0 1 8.6 9.3c.8 2.2 1.3 4.8 1.3 7.5a19.4 19.4 0 0 1-4.6 12.6 14.8 14.8 0 0 1-5.2 3.6c-2 .9-5.2 1.4-6.8 1.4a21 21 0 0 1-6.7-1.4 15.4 15.4 0 0 1-8.6-9.3 21.3 21.3 0 0 1 0-14.4 15.2 15.2 0 0 1 8.6-9.3c2-.8 4.3-1.2 6.7-1.2s4.6.4 6.7 1.2zm-6.7 27.6c2.7 0 4.7-1 6.2-3s2.2-4.3 2.2-7.8-.7-6.3-2.2-8.3-3.5-3-6.2-3-4.7 1-6.1 3c-1.5 2-2.2 4.8-2.2 8.3s.7 5.8 2.2 7.8 3.5 3 6.2 3zm-88.8-28.8c-6.2 0-11.7 3.3-14.8 8.2a18.6 18.6 0 0 0 4.8 25.2c1.8 1.2 4 1.8 6.2 1.7s.1 0 .1 0h.9c4.2-.7 8-4 9.1-8.1v7.4c0 .4.3.7.8.7h6.4a.7.7 0 0 0 .7-.7V14.2c0-.5-.3-.8-.7-.8h-13.5zm6.3 26.5a9.8 9.8 0 0 1-5.7 2h-.5a10 10 0 0 1-9.2-14c1.4-3.7 5-6.3 9-6.3h6.4v18.3zm152.3-26.5h13.5c.5 0 .8.3.8.7v33.7c0 .4-.3.7-.8.7h-6.4a.7.7 0 0 1-.8-.7v-7.4c-1.2 4-4.8 7.4-9 8h-.1a4.2 4.2 0 0 1-.5.1h-.9a10.3 10.3 0 0 1-7-2.6c-4-3.3-6.5-8.4-6.5-14.2 0-3.7 1-7.2 3-10 3-5 8.5-8.3 14.7-8.3zm.6 28.4c2.2-.1 4.2-.6 5.7-2V21.7h-6.3a9.8 9.8 0 0 0-9 6.4 10.2 10.2 0 0 0 9.1 13.9h.5zM452.8 13.4c-6.2 0-11.7 3.3-14.8 8.2a18.5 18.5 0 0 0 3.6 24.3 10.4 10.4 0 0 0 13 .6c2.2-1.5 3.8-3.7 4.5-6.1v7.8c0 2.8-.8 5-2.2 6.3-1.5 1.5-4 2.2-7.5 2.2l-6-.3c-.3 0-.7.2-.8.5l-1.6 5.5c-.1.4.1.8.5 1h.1c2.8.4 5.5.6 7 .6 6.3 0 11-1.4 14-4.1 2.7-2.5 4.2-6.3 4.5-11.4V14.2c0-.5-.4-.8-.8-.8h-13.5zm6.3 8.2v18.3a9.6 9.6 0 0 1-5.6 2h-1a10.3 10.3 0 0 1-8.8-14c1.4-3.7 5-6.3 9-6.3h6.4zM291 31.5A32 32 0 0 1 322.8 0h30.8c.6 0 1.2.5 1.2 1.2v61.5c0 1.1-1.3 1.7-2.2 1l-19.2-17a18 18 0 0 1-11 3.4 18.1 18.1 0 1 1 18.2-14.8c-.1.4-.5.7-.9.6-.1 0-.3 0-.4-.2l-3.8-3.4c-.4-.3-.6-.8-.7-1.4a12 12 0 1 0-2.4 8.3c.4-.4 1-.5 1.6-.2l14.7 13.1v-46H323a26 26 0 1 0 10 49.7c.8-.4 1.6-.2 2.3.3l3 2.7c.3.2.3.7 0 1l-.2.2a32 32 0 0 1-47.2-28.6z\"\n />\n </svg>\n </a>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPoweredBy',\n mixins: [createSuitMixin({ name: 'PoweredBy' })],\n props: {\n theme: {\n default: 'light',\n validator(value) {\n return ['light', 'dark'].indexOf(value) !== -1;\n },\n },\n },\n computed: {\n algoliaUrl() {\n return (\n 'https://www.algolia.com/?' +\n 'utm_source=vue-instantsearch&' +\n 'utm_medium=website&' +\n `utm_content=${location ? location.hostname : ''}&` +\n 'utm_campaign=poweredby'\n );\n },\n },\n};\n</script>\n","import { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisQueryRuleContext',\n mixins: [\n createSuitMixin({ name: 'QueryRuleContext' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleContext',\n }\n ),\n ],\n props: {\n trackedFilters: {\n type: Object,\n required: true,\n },\n transformRuleContexts: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n trackedFilters: this.trackedFilters,\n transformRuleContexts: this.transformRuleContexts,\n };\n },\n },\n render() {\n return null;\n },\n};\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot :items=\"state.items\">\n <div v-for=\"(item, key) in state.items\" :key=\"key\">\n <slot name=\"item\" :item=\"item\">\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisQueryRuleCustomData',\n mixins: [\n createSuitMixin({ name: 'QueryRuleCustomData' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleCustomData',\n }\n ),\n ],\n props: {\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot :items=\"state.items\">\n <div v-for=\"(item, key) in state.items\" :key=\"key\">\n <slot name=\"item\" :item=\"item\">\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisQueryRuleCustomData',\n mixins: [\n createSuitMixin({ name: 'QueryRuleCustomData' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleCustomData',\n }\n ),\n ],\n props: {\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :current-refinement=\"values\"\n :refine=\"refine\"\n :can-refine=\"state.canRefine\"\n :range=\"state.range\"\n :send-event=\"state.sendEvent\"\n >\n <form\n :class=\"suit('form')\"\n @submit.prevent=\"\n refine({\n min: pick(minInput, values.min),\n max: pick(maxInput, values.max),\n })\n \"\n >\n <label :class=\"suit('label')\">\n <slot name=\"minLabel\" />\n <input\n type=\"number\"\n :class=\"[suit('input'), suit('input', 'min')]\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.min\"\n :value=\"values.min\"\n @change=\"minInput = $event.currentTarget.value\"\n />\n </label>\n <span :class=\"suit('separator')\">\n <slot name=\"separator\">to</slot>\n </span>\n <label :class=\"suit('label')\">\n <slot name=\"maxLabel\" />\n <input\n :class=\"[suit('input'), suit('input', 'max')]\"\n type=\"number\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.max\"\n :value=\"values.max\"\n @change=\"maxInput = $event.currentTarget.value\"\n />\n </label>\n <button :class=\"suit('submit')\" type=\"submit\">\n <slot name=\"submitLabel\"> Go </slot>\n </button>\n </form>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRange } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRangeInput',\n mixins: [\n createSuitMixin({ name: 'RangeInput' }),\n createWidgetMixin(\n {\n connector: connectRange,\n },\n {\n $$widgetType: 'ais.rangeInput',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n min: {\n type: Number,\n required: false,\n default: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n step() {\n return 1 / Math.pow(10, this.precision);\n },\n values() {\n const [minValue, maxValue] = this.state.start;\n const { min: minRange, max: maxRange } = this.state.range;\n\n return {\n min:\n minValue !== -Infinity && minValue !== minRange\n ? minValue\n : undefined,\n max:\n maxValue !== Infinity && maxValue !== maxRange ? maxValue : undefined,\n };\n },\n },\n methods: {\n pick(first, second) {\n if (first !== null && first !== undefined) {\n return first;\n } else {\n return second;\n }\n },\n refine({ min, max }) {\n this.state.refine([min, max]);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :current-refinement=\"values\"\n :refine=\"refine\"\n :can-refine=\"state.canRefine\"\n :range=\"state.range\"\n :send-event=\"state.sendEvent\"\n >\n <form\n :class=\"suit('form')\"\n @submit.prevent=\"\n refine({\n min: pick(minInput, values.min),\n max: pick(maxInput, values.max),\n })\n \"\n >\n <label :class=\"suit('label')\">\n <slot name=\"minLabel\" />\n <input\n type=\"number\"\n :class=\"[suit('input'), suit('input', 'min')]\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.min\"\n :value=\"values.min\"\n @change=\"minInput = $event.currentTarget.value\"\n />\n </label>\n <span :class=\"suit('separator')\">\n <slot name=\"separator\">to</slot>\n </span>\n <label :class=\"suit('label')\">\n <slot name=\"maxLabel\" />\n <input\n :class=\"[suit('input'), suit('input', 'max')]\"\n type=\"number\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.max\"\n :value=\"values.max\"\n @change=\"maxInput = $event.currentTarget.value\"\n />\n </label>\n <button :class=\"suit('submit')\" type=\"submit\">\n <slot name=\"submitLabel\"> Go </slot>\n </button>\n </form>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRange } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRangeInput',\n mixins: [\n createSuitMixin({ name: 'RangeInput' }),\n createWidgetMixin(\n {\n connector: connectRange,\n },\n {\n $$widgetType: 'ais.rangeInput',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n min: {\n type: Number,\n required: false,\n default: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n step() {\n return 1 / Math.pow(10, this.precision);\n },\n values() {\n const [minValue, maxValue] = this.state.start;\n const { min: minRange, max: maxRange } = this.state.range;\n\n return {\n min:\n minValue !== -Infinity && minValue !== minRange\n ? minValue\n : undefined,\n max:\n maxValue !== Infinity && maxValue !== maxRange ? maxValue : undefined,\n };\n },\n },\n methods: {\n pick(first, second) {\n if (first !== null && first !== undefined) {\n return first;\n } else {\n return second;\n }\n },\n refine({ min, max }) {\n this.state.refine([min, max]);\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n :can-refine=\"state.canRefine\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: none\">\n <symbol id=\"ais-RatingMenu-starSymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 .288l2.833 8.718h9.167l-7.417 5.389 2.833 8.718-7.416-5.388-7.417 5.388 2.833-8.718-7.416-5.389h9.167z\"\n />\n </symbol>\n <symbol id=\"ais-RatingMenu-starEmptySymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 6.76l1.379 4.246h4.465l-3.612 2.625 1.379 4.246-3.611-2.625-3.612 2.625 1.379-4.246-3.612-2.625h4.465l1.38-4.246zm0-6.472l-2.833 8.718h-9.167l7.416 5.389-2.833 8.718 7.417-5.388 7.416 5.388-2.833-8.718 7.417-5.389h-9.167l-2.833-8.718z\"\n />\n </symbol>\n </svg>\n\n <ul :class=\"suit('list')\">\n <li\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :aria-label=\"`${item.value} & Up`\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <template v-for=\"(full, n) in item.stars\">\n <svg\n v-if=\"full\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :class=\"[suit('starIcon'), suit('starIcon--full')]\"\n :key=\"n + '-full'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starSymbol\" />\n </svg>\n\n <svg\n v-else\n :class=\"[suit('starIcon'), suit('starIcon--empty')]\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :key=\"n + '-empty'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starEmptySymbol\" />\n </svg>\n </template>\n\n <span :class=\"suit('label')\" aria-hidden=\"true\">\n <slot name=\"andUp\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin(\n {\n connector: connectRatingMenu,\n },\n {\n $$widgetType: 'ais.ratingMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n max: {\n type: Number,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n max: this.max,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n :can-refine=\"state.canRefine\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: none\">\n <symbol id=\"ais-RatingMenu-starSymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 .288l2.833 8.718h9.167l-7.417 5.389 2.833 8.718-7.416-5.388-7.417 5.388 2.833-8.718-7.416-5.389h9.167z\"\n />\n </symbol>\n <symbol id=\"ais-RatingMenu-starEmptySymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 6.76l1.379 4.246h4.465l-3.612 2.625 1.379 4.246-3.611-2.625-3.612 2.625 1.379-4.246-3.612-2.625h4.465l1.38-4.246zm0-6.472l-2.833 8.718h-9.167l7.416 5.389-2.833 8.718 7.417-5.388 7.416 5.388-2.833-8.718 7.417-5.389h-9.167l-2.833-8.718z\"\n />\n </symbol>\n </svg>\n\n <ul :class=\"suit('list')\">\n <li\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :aria-label=\"`${item.value} & Up`\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <template v-for=\"(full, n) in item.stars\">\n <svg\n v-if=\"full\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :class=\"[suit('starIcon'), suit('starIcon--full')]\"\n :key=\"n + '-full'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starSymbol\" />\n </svg>\n\n <svg\n v-else\n :class=\"[suit('starIcon'), suit('starIcon--empty')]\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :key=\"n + '-empty'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starEmptySymbol\" />\n </svg>\n </template>\n\n <span :class=\"suit('label')\" aria-hidden=\"true\">\n <slot name=\"andUp\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin(\n {\n connector: connectRatingMenu,\n },\n {\n $$widgetType: 'ais.ratingMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n max: {\n type: Number,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n max: this.max,\n };\n },\n },\n};\n</script>\n","<template>\n <form\n action=\"\"\n role=\"search\"\n novalidate\n :class=\"suit('form')\"\n @submit.prevent=\"onFormSubmit\"\n @reset.prevent=\"onFormReset\"\n >\n <!-- :value/@input allows us to pass v-model to the component in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"onInput($event)\"\n @compositionend=\"onInput($event)\"\n ref=\"input\"\n />\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n aria-hidden=\"true\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"\n (!value && !modelValue) ||\n (showLoadingIndicator && shouldShowLoadingIndicator)\n \"\n >\n <slot name=\"reset-icon\">\n <svg\n aria-hidden=\"true\"\n height=\"10\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n width=\"10\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n :aria-hidden=\"!shouldShowLoadingIndicator\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(1 1)\" stroke-width=\"2\">\n <circle stroke-opacity=\".5\" cx=\"18\" cy=\"18\" r=\"18\" />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n isFocused() {\n return document.activeElement === this.$refs.input;\n },\n onInput(event) {\n if (!(this.ignoreCompositionEvents && event.isComposing)) {\n this.$emit('input', event.target.value);\n this.$emit('update:modelValue', event.target.value);\n }\n },\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <form\n action=\"\"\n role=\"search\"\n novalidate\n :class=\"suit('form')\"\n @submit.prevent=\"onFormSubmit\"\n @reset.prevent=\"onFormReset\"\n >\n <!-- :value/@input allows us to pass v-model to the component in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"onInput($event)\"\n @compositionend=\"onInput($event)\"\n ref=\"input\"\n />\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n aria-hidden=\"true\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"\n (!value && !modelValue) ||\n (showLoadingIndicator && shouldShowLoadingIndicator)\n \"\n >\n <slot name=\"reset-icon\">\n <svg\n aria-hidden=\"true\"\n height=\"10\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n width=\"10\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n :aria-hidden=\"!shouldShowLoadingIndicator\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(1 1)\" stroke-width=\"2\">\n <circle stroke-opacity=\".5\" cx=\"18\" cy=\"18\" r=\"18\" />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n isFocused() {\n return document.activeElement === this.$refs.input;\n },\n onInput(event) {\n if (!(this.ignoreCompositionEvents && event.isComposing)) {\n this.$emit('input', event.target.value);\n this.$emit('update:modelValue', event.target.value);\n }\n },\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"items\"\n :refine=\"refine\"\n :search-for-items=\"state.searchForItems\"\n :search-for-items-query=\"searchForFacetValuesQuery\"\n :toggle-show-more=\"toggleShowMore\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :createURL=\"state.createURL\"\n :is-from-search=\"state.isFromSearch\"\n :can-refine=\"state.canRefine\"\n :send-event=\"state.sendEvent\"\n >\n <div :class=\"suit('searchBox')\" v-if=\"searchable\">\n <search-input\n v-model=\"searchForFacetValues\"\n :placeholder=\"searchablePlaceholder\"\n :class-names=\"classNames\"\n />\n </div>\n <slot\n name=\"noResults\"\n :query=\"searchForFacetValues\"\n v-if=\"state.isFromSearch && items.length === 0\"\n >\n <div :class=\"suit('noResults')\">No results.</div>\n </slot>\n <ul :class=\"suit('list')\">\n <li\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n v-for=\"item in items\"\n :key=\"item.value\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"refine(item.value)\"\n />\n <span v-if=\"searchable\" :class=\"suit('labelText')\">\n <ais-highlight attribute=\"item\" :hit=\"item\" />\n </span>\n <span v-else :class=\"suit('labelText')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </label>\n </slot>\n </li>\n </ul>\n <button\n :class=\"[\n suit('showMore'),\n {\n [suit('showMore', 'disabled')]: !state.canToggleShowMore,\n },\n ]\"\n @click=\"toggleShowMore\"\n v-if=\"showMore\"\n :disabled=\"!state.canToggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n Show {{ state.isShowingMore ? 'less' : 'more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport AisHighlight from './Highlight.vue';\nimport SearchInput from './SearchInput.vue';\n\nconst noop = () => {};\n\nexport default {\n name: 'AisRefinementList',\n components: { SearchInput, AisHighlight },\n mixins: [\n createSuitMixin({ name: 'RefinementList' }),\n createWidgetMixin(\n {\n connector: connectRefinementList,\n },\n {\n $$widgetType: 'ais.refinementList',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n searchable: {\n type: Boolean,\n default: undefined,\n },\n searchablePlaceholder: {\n type: String,\n required: false,\n default: 'Search here…',\n },\n operator: {\n default: 'or',\n validator(value) {\n return value === 'and' || value === 'or';\n },\n required: false,\n },\n limit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n required: false,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n required: false,\n default: undefined,\n },\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n data() {\n return {\n searchForFacetValuesQuery: '',\n };\n },\n computed: {\n searchForFacetValues: {\n get() {\n return this.searchForFacetValuesQuery;\n },\n set(value) {\n this.state.searchForItems(value);\n this.searchForFacetValuesQuery = value;\n },\n },\n toggleShowMore() {\n return this.state.toggleShowMore || noop;\n },\n items() {\n return this.state.items.map((item) =>\n Object.assign({}, item, {\n _highlightResult: {\n item: {\n value: item.highlighted,\n },\n },\n })\n );\n },\n widgetParams() {\n return {\n attribute: this.attribute,\n operator: this.operator,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n escapeFacetValues: true,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n this.searchForFacetValuesQuery = '';\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"items\"\n :refine=\"refine\"\n :search-for-items=\"state.searchForItems\"\n :search-for-items-query=\"searchForFacetValuesQuery\"\n :toggle-show-more=\"toggleShowMore\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :createURL=\"state.createURL\"\n :is-from-search=\"state.isFromSearch\"\n :can-refine=\"state.canRefine\"\n :send-event=\"state.sendEvent\"\n >\n <div :class=\"suit('searchBox')\" v-if=\"searchable\">\n <search-input\n v-model=\"searchForFacetValues\"\n :placeholder=\"searchablePlaceholder\"\n :class-names=\"classNames\"\n />\n </div>\n <slot\n name=\"noResults\"\n :query=\"searchForFacetValues\"\n v-if=\"state.isFromSearch && items.length === 0\"\n >\n <div :class=\"suit('noResults')\">No results.</div>\n </slot>\n <ul :class=\"suit('list')\">\n <li\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n v-for=\"item in items\"\n :key=\"item.value\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"refine(item.value)\"\n />\n <span v-if=\"searchable\" :class=\"suit('labelText')\">\n <ais-highlight attribute=\"item\" :hit=\"item\" />\n </span>\n <span v-else :class=\"suit('labelText')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </label>\n </slot>\n </li>\n </ul>\n <button\n :class=\"[\n suit('showMore'),\n {\n [suit('showMore', 'disabled')]: !state.canToggleShowMore,\n },\n ]\"\n @click=\"toggleShowMore\"\n v-if=\"showMore\"\n :disabled=\"!state.canToggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n Show {{ state.isShowingMore ? 'less' : 'more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport AisHighlight from './Highlight.vue';\nimport SearchInput from './SearchInput.vue';\n\nconst noop = () => {};\n\nexport default {\n name: 'AisRefinementList',\n components: { SearchInput, AisHighlight },\n mixins: [\n createSuitMixin({ name: 'RefinementList' }),\n createWidgetMixin(\n {\n connector: connectRefinementList,\n },\n {\n $$widgetType: 'ais.refinementList',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n searchable: {\n type: Boolean,\n default: undefined,\n },\n searchablePlaceholder: {\n type: String,\n required: false,\n default: 'Search here…',\n },\n operator: {\n default: 'or',\n validator(value) {\n return value === 'and' || value === 'or';\n },\n required: false,\n },\n limit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n required: false,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n required: false,\n default: undefined,\n },\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n data() {\n return {\n searchForFacetValuesQuery: '',\n };\n },\n computed: {\n searchForFacetValues: {\n get() {\n return this.searchForFacetValuesQuery;\n },\n set(value) {\n this.state.searchForItems(value);\n this.searchForFacetValuesQuery = value;\n },\n },\n toggleShowMore() {\n return this.state.toggleShowMore || noop;\n },\n items() {\n return this.state.items.map((item) =>\n Object.assign({}, item, {\n _highlightResult: {\n item: {\n value: item.highlighted,\n },\n },\n })\n );\n },\n widgetParams() {\n return {\n attribute: this.attribute,\n operator: this.operator,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n escapeFacetValues: true,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n this.searchForFacetValuesQuery = '';\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state && state.state && state.results\">\n <slot v-bind=\"stateResults\">\n <p>\n Use this component to have a different layout based on a certain state.\n </p>\n <p>Fill in the slot, and get access to the following things:</p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</pre>\n <pre>status: {{ state.status }}</pre>\n <pre>error: {{ state.error }}</pre>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin({ connector: true }),\n createSuitMixin({ name: 'StateResults' }),\n ],\n props: {\n catchError: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n renderFn: () => {\n const { status, error } = this.instantSearchInstance;\n const results = this.getParentIndex().getResults();\n const helper = this.getParentIndex().getHelper();\n const state = helper ? helper.state : null;\n\n // @MAJOR no longer spread this inside `results`\n this.state = {\n results,\n state,\n status,\n error,\n };\n },\n };\n },\n created() {\n this.instantSearchInstance.addListener('render', this.renderFn);\n this.renderFn();\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.instantSearchInstance.removeListener('render', this.renderFn);\n if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n }\n }\n },\n watch: {\n catchError: {\n immediate: true,\n handler(catchError) {\n if (catchError) {\n this.errorFn = () => {};\n this.instantSearchInstance.addListener('error', this.errorFn);\n } else if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n this.errorFn = undefined;\n }\n },\n },\n },\n computed: {\n stateResults() {\n const { results, state, status, error } = this.state;\n return _objectSpread({}, results, { results, state, status, error });\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state && state.state && state.results\">\n <slot v-bind=\"stateResults\">\n <p>\n Use this component to have a different layout based on a certain state.\n </p>\n <p>Fill in the slot, and get access to the following things:</p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</pre>\n <pre>status: {{ state.status }}</pre>\n <pre>error: {{ state.error }}</pre>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin({ connector: true }),\n createSuitMixin({ name: 'StateResults' }),\n ],\n props: {\n catchError: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n renderFn: () => {\n const { status, error } = this.instantSearchInstance;\n const results = this.getParentIndex().getResults();\n const helper = this.getParentIndex().getHelper();\n const state = helper ? helper.state : null;\n\n // @MAJOR no longer spread this inside `results`\n this.state = {\n results,\n state,\n status,\n error,\n };\n },\n };\n },\n created() {\n this.instantSearchInstance.addListener('render', this.renderFn);\n this.renderFn();\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.instantSearchInstance.removeListener('render', this.renderFn);\n if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n }\n }\n },\n watch: {\n catchError: {\n immediate: true,\n handler(catchError) {\n if (catchError) {\n this.errorFn = () => {};\n this.instantSearchInstance.addListener('error', this.errorFn);\n } else if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n this.errorFn = undefined;\n }\n },\n },\n },\n computed: {\n stateResults() {\n const { results, state, status, error } = this.state;\n return _objectSpread({}, results, { results, state, status, error });\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :current-refinement=\"currentRefinement\"\n :is-search-stalled=\"state.isSearchStalled\"\n :refine=\"state.refine\"\n >\n <search-input\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @reset=\"$emit('reset')\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :show-loading-indicator=\"showLoadingIndicator\"\n :should-show-loading-indicator=\"state.isSearchStalled\"\n :ignore-composition-events=\"ignoreCompositionEvents\"\n :submit-title=\"submitTitle\"\n :reset-title=\"resetTitle\"\n :class-names=\"classNames\"\n v-model=\"currentRefinement\"\n ref=\"searchInput\"\n >\n <template #loading-indicator v-if=\"isVue3\">\n <slot name=\"loading-indicator\" />\n </template>\n <slot v-if=\"isVue2\" name=\"loading-indicator\" slot=\"loading-indicator\" />\n\n <template #submit-icon v-if=\"isVue3\">\n <slot name=\"submit-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"submit-icon\" slot=\"submit-icon\" />\n\n <template #reset-icon v-if=\"isVue3\">\n <slot name=\"reset-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"reset-icon\" slot=\"reset-icon\" />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\n\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin(\n {\n connector: connectSearchBox,\n },\n {\n $$widgetType: 'ais.searchBox',\n }\n ),\n createSuitMixin({ name: 'SearchBox' }),\n ],\n components: {\n SearchInput,\n },\n props: {\n placeholder: {\n type: String,\n default: '',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: true,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Submit the search query',\n },\n resetTitle: {\n type: String,\n default: 'Clear the search query',\n },\n value: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: String,\n default: undefined,\n },\n queryHook: {\n type: Function,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n widgetParams() {\n return {\n queryHook: this.queryHook,\n };\n },\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n\n // we return the local value if the input is focused to avoid\n // concurrent updates when typing\n const { searchInput } = this.$refs;\n if (searchInput && searchInput.isFocused()) {\n return this.localValue;\n }\n\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :current-refinement=\"currentRefinement\"\n :is-search-stalled=\"state.isSearchStalled\"\n :refine=\"state.refine\"\n >\n <search-input\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @reset=\"$emit('reset')\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :show-loading-indicator=\"showLoadingIndicator\"\n :should-show-loading-indicator=\"state.isSearchStalled\"\n :ignore-composition-events=\"ignoreCompositionEvents\"\n :submit-title=\"submitTitle\"\n :reset-title=\"resetTitle\"\n :class-names=\"classNames\"\n v-model=\"currentRefinement\"\n ref=\"searchInput\"\n >\n <template #loading-indicator v-if=\"isVue3\">\n <slot name=\"loading-indicator\" />\n </template>\n <slot v-if=\"isVue2\" name=\"loading-indicator\" slot=\"loading-indicator\" />\n\n <template #submit-icon v-if=\"isVue3\">\n <slot name=\"submit-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"submit-icon\" slot=\"submit-icon\" />\n\n <template #reset-icon v-if=\"isVue3\">\n <slot name=\"reset-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"reset-icon\" slot=\"reset-icon\" />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\n\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin(\n {\n connector: connectSearchBox,\n },\n {\n $$widgetType: 'ais.searchBox',\n }\n ),\n createSuitMixin({ name: 'SearchBox' }),\n ],\n components: {\n SearchInput,\n },\n props: {\n placeholder: {\n type: String,\n default: '',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: true,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Submit the search query',\n },\n resetTitle: {\n type: String,\n default: 'Clear the search query',\n },\n value: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: String,\n default: undefined,\n },\n queryHook: {\n type: Function,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n widgetParams() {\n return {\n queryHook: this.queryHook,\n };\n },\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n\n // we return the local value if the input is focused to avoid\n // concurrent updates when typing\n const { searchInput } = this.$refs;\n if (searchInput && searchInput.isFocused()) {\n return this.localValue;\n }\n\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_snippetResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisSnippet',\n mixins: [createSuitMixin({ name: 'Snippet' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_snippetResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisSnippet',\n mixins: [createSuitMixin({ name: 'Snippet' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :items=\"state.options\"\n :has-no-results=\"state.hasNoResults\"\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :can-refine=\"state.canRefine\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine($event.currentTarget.value)\"\n aria-label=\"Sort results by\"\n >\n <option\n v-for=\"item in state.options\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.value === state.currentRefinement\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSortBy } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisSortBy',\n mixins: [\n createSuitMixin({ name: 'SortBy' }),\n createWidgetMixin(\n { connector: connectSortBy },\n {\n $$widgetType: 'ais.sortBy',\n }\n ),\n\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :items=\"state.options\"\n :has-no-results=\"state.hasNoResults\"\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :can-refine=\"state.canRefine\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine($event.currentTarget.value)\"\n aria-label=\"Sort results by\"\n >\n <option\n v-for=\"item in state.options\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.value === state.currentRefinement\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSortBy } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisSortBy',\n mixins: [\n createSuitMixin({ name: 'SortBy' }),\n createWidgetMixin(\n { connector: connectSortBy },\n {\n $$widgetType: 'ais.sortBy',\n }\n ),\n\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-bind=\"state\"\n :results=\"state.instantSearchInstance.helper.lastResults\"\n >\n <!-- prettier-ignore -->\n <span :class=\"suit('text')\"\n ><template v-if=\"state.areHitsSorted\"\n >{{ sortedResultsSentence }}</template\n ><template v-else>{{ resultsSentence }}</template\n > found in {{ state.processingTimeMS.toLocaleString() }}ms</span\n >\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectStats } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisStats',\n mixins: [\n createWidgetMixin(\n { connector: connectStats },\n {\n $$widgetType: 'ais.stats',\n }\n ),\n createSuitMixin({ name: 'Stats' }),\n ],\n computed: {\n sortedResultsSentence() {\n const { nbHits, nbSortedHits } = this.state;\n\n const suffix = `sorted out of ${nbHits.toLocaleString()}`;\n\n if (nbSortedHits === 0) {\n return `No relevant results ${suffix}`;\n }\n\n if (nbSortedHits === 1) {\n return `1 relevant result ${suffix}`;\n }\n\n if (nbSortedHits > 1) {\n return `${(\n nbSortedHits || 0\n ).toLocaleString()} relevant results ${suffix}`;\n }\n\n return '';\n },\n resultsSentence() {\n const { nbHits } = this.state;\n\n if (nbHits === 0) {\n return 'No results';\n }\n\n if (nbHits === 1) {\n return '1 result';\n }\n\n if (nbHits > 1) {\n return `${nbHits.toLocaleString()} results`;\n }\n\n return '';\n },\n widgetParams() {\n return {};\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-bind=\"state\"\n :results=\"state.instantSearchInstance.helper.lastResults\"\n >\n <!-- prettier-ignore -->\n <span :class=\"suit('text')\"\n ><template v-if=\"state.areHitsSorted\"\n >{{ sortedResultsSentence }}</template\n ><template v-else>{{ resultsSentence }}</template\n > found in {{ state.processingTimeMS.toLocaleString() }}ms</span\n >\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectStats } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisStats',\n mixins: [\n createWidgetMixin(\n { connector: connectStats },\n {\n $$widgetType: 'ais.stats',\n }\n ),\n createSuitMixin({ name: 'Stats' }),\n ],\n computed: {\n sortedResultsSentence() {\n const { nbHits, nbSortedHits } = this.state;\n\n const suffix = `sorted out of ${nbHits.toLocaleString()}`;\n\n if (nbSortedHits === 0) {\n return `No relevant results ${suffix}`;\n }\n\n if (nbSortedHits === 1) {\n return `1 relevant result ${suffix}`;\n }\n\n if (nbSortedHits > 1) {\n return `${(\n nbSortedHits || 0\n ).toLocaleString()} relevant results ${suffix}`;\n }\n\n return '';\n },\n resultsSentence() {\n const { nbHits } = this.state;\n\n if (nbHits === 0) {\n return 'No results';\n }\n\n if (nbHits === 1) {\n return '1 result';\n }\n\n if (nbHits > 1) {\n return `${nbHits.toLocaleString()} results`;\n }\n\n return '';\n },\n widgetParams() {\n return {};\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :value=\"state.value\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :name=\"state.value.name\"\n :value=\"on\"\n :checked=\"state.value.isRefined\"\n @change=\"state.refine(state.value)\"\n />\n <span :class=\"suit('labelText')\">{{ label || state.value.name }}</span>\n <span v-if=\"state.value.count !== null\" :class=\"suit('count')\">{{\n state.value.count.toLocaleString()\n }}</span>\n </label>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectToggleRefinement } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisToggleRefinement',\n mixins: [\n createSuitMixin({ name: 'ToggleRefinement' }),\n createWidgetMixin(\n {\n connector: connectToggleRefinement,\n },\n {\n $$widgetType: 'ais.toggleRefinement',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n on: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: true,\n },\n off: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n on: this.on,\n off: this.off,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :value=\"state.value\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :name=\"state.value.name\"\n :value=\"on\"\n :checked=\"state.value.isRefined\"\n @change=\"state.refine(state.value)\"\n />\n <span :class=\"suit('labelText')\">{{ label || state.value.name }}</span>\n <span v-if=\"state.value.count !== null\" :class=\"suit('count')\">{{\n state.value.count.toLocaleString()\n }}</span>\n </label>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectToggleRefinement } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisToggleRefinement',\n mixins: [\n createSuitMixin({ name: 'ToggleRefinement' }),\n createWidgetMixin(\n {\n connector: connectToggleRefinement,\n },\n {\n $$widgetType: 'ais.toggleRefinement',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n on: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: true,\n },\n off: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n on: this.on,\n off: this.off,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot v-bind=\"rootSlotProps\">\n <button\n type=\"button\"\n :class=\"suit('button')\"\n :title=\"state.isBrowserSupported ? buttonTitle : disabledButtonTitle\"\n :disabled=\"!state.isBrowserSupported\"\n @click=\"handleClick\"\n >\n <slot name=\"buttonText\" v-bind=\"innerSlotProps\">\n <svg v-bind=\"buttonSvgAttrs\" v-if=\"errorNotAllowed\">\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\" />\n <path d=\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n <svg v-bind=\"buttonSvgAttrs\" v-else>\n <path\n d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"\n :fill=\"state.isListening ? 'currentColor' : 'none'\"\n />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n </slot>\n </button>\n <div :class=\"suit('status')\">\n <slot name=\"status\" v-bind=\"innerSlotProps\">\n <p>{{ state.voiceListeningState.transcript }}</p>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectVoiceSearch } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisVoiceSearch',\n mixins: [\n createWidgetMixin(\n {\n connector: connectVoiceSearch,\n },\n {\n $$widgetType: 'ais.voiceSearch',\n }\n ),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n language: {\n type: String,\n default: undefined,\n },\n additionalQueryParameters: {\n type: Object,\n default: undefined,\n },\n buttonTitle: {\n type: String,\n required: false,\n default: 'Search by voice',\n },\n disabledButtonTitle: {\n type: String,\n required: false,\n default: 'Search by voice (not supported on this browser)',\n },\n },\n data() {\n return {\n buttonSvgAttrs: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '2',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n };\n },\n computed: {\n widgetParams() {\n return {\n searchAsYouSpeak: this.searchAsYouSpeak,\n language: this.language,\n additionalQueryParameters: this.additionalQueryParameters,\n };\n },\n errorNotAllowed() {\n return (\n this.state.voiceListeningState.status === 'error' &&\n this.state.voiceListeningState.errorCode === 'not-allowed'\n );\n },\n rootSlotProps() {\n return {\n isBrowserSupported: this.state.isBrowserSupported,\n isListening: this.state.isListening,\n toggleListening: this.state.toggleListening,\n voiceListeningState: this.state.voiceListeningState,\n };\n },\n innerSlotProps() {\n return {\n status: this.state.voiceListeningState.status,\n errorCode: this.state.voiceListeningState.errorCode,\n isListening: this.state.isListening,\n transcript: this.state.voiceListeningState.transcript,\n isSpeechFinal: this.state.voiceListeningState.isSpeechFinal,\n isBrowserSupported: this.state.isBrowserSupported,\n };\n },\n },\n methods: {\n handleClick(event) {\n event.currentTarget.blur();\n this.state.toggleListening();\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot v-bind=\"rootSlotProps\">\n <button\n type=\"button\"\n :class=\"suit('button')\"\n :title=\"state.isBrowserSupported ? buttonTitle : disabledButtonTitle\"\n :disabled=\"!state.isBrowserSupported\"\n @click=\"handleClick\"\n >\n <slot name=\"buttonText\" v-bind=\"innerSlotProps\">\n <svg v-bind=\"buttonSvgAttrs\" v-if=\"errorNotAllowed\">\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\" />\n <path d=\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n <svg v-bind=\"buttonSvgAttrs\" v-else>\n <path\n d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"\n :fill=\"state.isListening ? 'currentColor' : 'none'\"\n />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n </slot>\n </button>\n <div :class=\"suit('status')\">\n <slot name=\"status\" v-bind=\"innerSlotProps\">\n <p>{{ state.voiceListeningState.transcript }}</p>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectVoiceSearch } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisVoiceSearch',\n mixins: [\n createWidgetMixin(\n {\n connector: connectVoiceSearch,\n },\n {\n $$widgetType: 'ais.voiceSearch',\n }\n ),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n language: {\n type: String,\n default: undefined,\n },\n additionalQueryParameters: {\n type: Object,\n default: undefined,\n },\n buttonTitle: {\n type: String,\n required: false,\n default: 'Search by voice',\n },\n disabledButtonTitle: {\n type: String,\n required: false,\n default: 'Search by voice (not supported on this browser)',\n },\n },\n data() {\n return {\n buttonSvgAttrs: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '2',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n };\n },\n computed: {\n widgetParams() {\n return {\n searchAsYouSpeak: this.searchAsYouSpeak,\n language: this.language,\n additionalQueryParameters: this.additionalQueryParameters,\n };\n },\n errorNotAllowed() {\n return (\n this.state.voiceListeningState.status === 'error' &&\n this.state.voiceListeningState.errorCode === 'not-allowed'\n );\n },\n rootSlotProps() {\n return {\n isBrowserSupported: this.state.isBrowserSupported,\n isListening: this.state.isListening,\n toggleListening: this.state.toggleListening,\n voiceListeningState: this.state.voiceListeningState,\n };\n },\n innerSlotProps() {\n return {\n status: this.state.voiceListeningState.status,\n errorCode: this.state.voiceListeningState.errorCode,\n isListening: this.state.isListening,\n transcript: this.state.voiceListeningState.transcript,\n isSpeechFinal: this.state.voiceListeningState.isSpeechFinal,\n isBrowserSupported: this.state.isBrowserSupported,\n };\n },\n },\n methods: {\n handleClick(event) {\n event.currentTarget.blur();\n this.state.toggleListening();\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state && state.isVirtualReplica\" :class=\"suit()\">\n <slot :is-relevant-sorted=\"state.isRelevantSorted\" :refine=\"state.refine\">\n <div :class=\"suit('text')\">\n <slot name=\"text\" :is-relevant-sorted=\"state.isRelevantSorted\" />\n </div>\n <button type=\"button\" :class=\"suit('button')\" @click=\"refine()\">\n <slot name=\"button\" :is-relevant-sorted=\"state.isRelevantSorted\">\n {{\n state.isRelevantSorted ? 'See all results' : 'See relevant results'\n }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRelevantSort } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRelevantSort',\n mixins: [\n createSuitMixin({ name: 'RelevantSort' }),\n createWidgetMixin(\n {\n connector: connectRelevantSort,\n },\n {\n $$widgetType: 'ais.relevantSort',\n }\n ),\n ],\n methods: {\n refine() {\n if (this.state.isRelevantSorted) {\n this.state.refine(0);\n } else {\n this.state.refine(undefined);\n }\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state && state.isVirtualReplica\" :class=\"suit()\">\n <slot :is-relevant-sorted=\"state.isRelevantSorted\" :refine=\"state.refine\">\n <div :class=\"suit('text')\">\n <slot name=\"text\" :is-relevant-sorted=\"state.isRelevantSorted\" />\n </div>\n <button type=\"button\" :class=\"suit('button')\" @click=\"refine()\">\n <slot name=\"button\" :is-relevant-sorted=\"state.isRelevantSorted\">\n {{\n state.isRelevantSorted ? 'See all results' : 'See relevant results'\n }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRelevantSort } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRelevantSort',\n mixins: [\n createSuitMixin({ name: 'RelevantSort' }),\n createWidgetMixin(\n {\n connector: connectRelevantSort,\n },\n {\n $$widgetType: 'ais.relevantSort',\n }\n ),\n ],\n methods: {\n refine() {\n if (this.state.isRelevantSorted) {\n this.state.refine(0);\n } else {\n this.state.refine(undefined);\n }\n },\n },\n};\n</script>\n","import { connectDynamicWidgets } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3, renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nfunction getWidgetAttribute(vnode) {\n const props = isVue3\n ? vnode.props\n : vnode.componentOptions && vnode.componentOptions.propsData;\n if (props) {\n if (props.attribute) {\n return props.attribute;\n }\n if (Array.isArray(props.attributes)) {\n return props.attributes[0];\n }\n }\n\n let children;\n if (isVue3) {\n children =\n vnode.children && vnode.children.default && vnode.children.default();\n } else {\n children =\n vnode.componentOptions && vnode.componentOptions.children\n ? vnode.componentOptions.children\n : vnode.children;\n }\n\n if (Array.isArray(children)) {\n // return first child with a truthy attribute\n return children.reduce(\n (acc, curr) => acc || getWidgetAttribute(curr),\n undefined\n );\n }\n\n return undefined;\n}\n\nexport default {\n name: 'AisDynamicWidgets',\n mixins: [\n createWidgetMixin(\n {\n connector: connectDynamicWidgets,\n },\n {\n $$widgetType: 'ais.dynamicWidgets',\n }\n ),\n createSuitMixin({ name: 'DynamicWidgets' }),\n ],\n props: {\n transformItems: {\n type: Function,\n default: undefined,\n },\n facets: {\n type: Array,\n default: undefined,\n },\n maxValuesPerFacet: {\n type: Number,\n default: undefined,\n },\n },\n render: renderCompat(function (h) {\n const components = new Map();\n\n (getDefaultSlot(this) || []).forEach((vnode) => {\n const attribute = getWidgetAttribute(vnode);\n if (attribute) {\n components.set(\n attribute,\n h('div', { key: attribute, class: [this.suit('widget')] }, [vnode])\n );\n }\n });\n\n // by default, render everything, but hidden so that the routing doesn't disappear\n if (!this.state) {\n const allComponents = [];\n components.forEach((component) => allComponents.push(component));\n\n return h(\n 'div',\n _objectSpread(\n {\n class: [this.suit()],\n },\n { attrs: { hidden: true } }\n ),\n allComponents\n );\n }\n\n return h(\n 'div',\n { class: [this.suit()] },\n this.state.attributesToRender.map((attribute) =>\n components.get(attribute)\n )\n );\n }),\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n facets: this.facets,\n maxValuesPerFacet: this.maxValuesPerFacet,\n // we do not pass \"widgets\" to the connector, since Vue is in charge of rendering\n widgets: [],\n };\n },\n },\n};\n","import { warn } from '../util/warn';\n\nimport AisDynamicWidgets from './DynamicWidgets';\n\n// @MAJOR remove this file\nexport default Object.assign({}, AisDynamicWidgets, {\n name: 'AisExperimentalDynamicWidgets',\n mounted() {\n warn('Use AisDynamicWidgets instead of AisExperimentalDynamicWidgets.');\n },\n});\n","/* eslint import/namespace: ['error', { allowComputed: true }]*/\n\nimport * as widgets from './widgets';\n\nexport const plugin = {\n install(localVue) {\n Object.keys(widgets).forEach((widgetName) => {\n localVue.component(widgets[widgetName].name, widgets[widgetName]);\n });\n },\n};\n","import instantsearch from 'instantsearch.js/es';\nimport {\n waitForResults,\n getInitialResults,\n} from 'instantsearch.js/es/lib/server';\n\nimport { isVue3, isVue2, Vue2, createSSRApp } from './vue-compat';\nimport { warn } from './warn';\n\nfunction defaultCloneComponent(componentInstance, { mixins = [] } = {}) {\n const options = {\n serverPrefetch: undefined,\n fetch: undefined,\n _base: undefined,\n name: 'ais-ssr-root-component',\n };\n\n let app;\n\n if (isVue3) {\n const appOptions = Object.assign({}, componentInstance.$options, options);\n appOptions.mixins = [...mixins, ...(appOptions.mixins || [])];\n app = createSSRApp(appOptions);\n if (componentInstance.$router) {\n app.use(componentInstance.$router);\n }\n if (componentInstance.$store) {\n app.use(componentInstance.$store);\n }\n if (componentInstance.$i18n) {\n app.use(componentInstance.$i18n);\n }\n } else {\n // copy over global Vue APIs\n options.router = componentInstance.$router;\n options.store = componentInstance.$store;\n options.i18n = componentInstance.$i18n;\n\n const Extended = componentInstance.$vnode\n ? componentInstance.$vnode.componentOptions.Ctor.extend(options)\n : Vue2.component(\n options.name,\n Object.assign({}, componentInstance.$options, options)\n );\n\n app = new Extended({\n propsData: componentInstance.$options.propsData,\n mixins: [...mixins],\n });\n }\n\n // https://stackoverflow.com/a/48195006/3185307\n app.$slots = componentInstance.$slots;\n app.$root = componentInstance.$root;\n if (isVue2) {\n app.$options.serverPrefetch = [];\n }\n\n return app;\n}\n\nfunction augmentInstantSearch(instantSearchOptions, cloneComponent) {\n const search = instantsearch(instantSearchOptions);\n\n let initialResults;\n\n /**\n * main API for SSR, called in serverPrefetch of a root component which contains instantsearch\n * @param {Object} props the object including `component` and `renderToString`\n * @param {Object} props.component the calling component's `this`\n * @param {Function} props.renderToString the function to render componentInstance to string\n * @returns {Promise} result of the search, to save for .hydrate\n */\n search.findResultsState = function ({ component, renderToString }) {\n if (!renderToString) {\n throw new Error(\n 'findResultsState requires `renderToString: (component) => Promise<string>` in the first argument.'\n );\n }\n\n let app;\n let instance;\n\n return Promise.resolve()\n .then(() => {\n app = cloneComponent(component, {\n mixins: [\n {\n beforeCreate() {\n const descriptor = Object.getOwnPropertyDescriptor(\n component,\n '$nuxt'\n );\n\n const isWritable = descriptor\n ? descriptor.writable || descriptor.set\n : false;\n\n if (component.$nuxt && isWritable) {\n // In case of Nuxt (3), we ensure the context is shared between\n // the real and cloned component\n this.$nuxt = component.$nuxt;\n }\n },\n created() {\n instance = this.instantsearch;\n\n instance.start();\n // although we use start for initializing the main index,\n // we don't want to send search requests yet\n instance.started = false;\n },\n },\n ],\n });\n })\n .then(() => renderToString(app))\n .then(() => waitForResults(instance))\n .then((requestParamsList) => {\n initialResults = getInitialResults(\n instance.mainIndex,\n requestParamsList\n );\n search.hydrate(initialResults);\n return search.getState();\n });\n };\n\n /**\n * @returns {Promise} result state to serialize and enter into .hydrate\n */\n search.getState = function () {\n if (!initialResults) {\n throw new Error('You need to wait for findResultsState to finish');\n }\n return initialResults;\n };\n\n /**\n * make sure correct data is available in each widget's state.\n * called in widget mixin with (this.widget, this)\n *\n * @param {object} widget The widget instance\n * @param {object} parent The local parent index\n * @returns {void}\n */\n search.__forceRender = function (widget, parent) {\n const results = parent.getResults();\n\n // this happens when a different InstantSearch gets rendered initially,\n // after the hydrate finished. There's thus no initial results available.\n if (results === null) {\n return;\n }\n\n const state = results._state;\n\n const localHelper = parent.getHelper();\n // helper gets created in init, but that means it doesn't get the injected\n // parameters, because those are from the lastResults\n localHelper.state = state;\n\n widget.render({\n helper: localHelper,\n results,\n scopedResults: parent.getScopedResults(),\n parent,\n state,\n templatesConfig: {},\n createURL: parent.createURL,\n instantSearchInstance: search,\n searchMetadata: {\n isSearchStalled: false,\n },\n });\n };\n\n /**\n * Called both in server\n * @param {object} results a map of indexId: SearchResults\n * @returns {void}\n */\n search.hydrate = function (results) {\n if (!results) {\n warn(\n 'The result of `findResultsState()` needs to be passed to `hydrate()`.'\n );\n return;\n }\n\n search._initialResults = results;\n\n search.start();\n search.started = false;\n };\n return search;\n}\n\nexport function createServerRootMixin(instantSearchOptions = {}) {\n const { $cloneComponent = defaultCloneComponent } = instantSearchOptions;\n\n const search = augmentInstantSearch(instantSearchOptions, $cloneComponent);\n\n // put this in the user's root Vue instance\n // we can then reuse that InstantSearch instance seamlessly from `ais-instant-search-ssr`\n const rootMixin = {\n provide() {\n return {\n $_ais_ssrInstantSearchInstance: this.instantsearch,\n };\n },\n data() {\n return {\n // this is in data, so that the real & cloned render do not share\n // the same instantsearch instance.\n instantsearch: search,\n };\n },\n };\n\n return rootMixin;\n}\n"],"names":["suit","widgetName","element","modifier","Error","const","elements","push","join","createSuitMixin","props","classNames","type","Object","default","undefined","methods","className","name","userClassName","this","_objectSpread","target","i","arguments","length","source","ownKeys","keys","getOwnPropertySymbols","concat","filter","sym","getOwnPropertyDescriptor","enumerable","forEach","key","_defineProperty","obj","value","defineProperty","configurable","writable","isVue2","isVue3","renderCompat","fn","h","tag","children","attrs","scopedSlots","on","onPropKeys","flatProps","assign","reduce","acc","toUpperCase","slice","Vue.h","call","getDefaultSlot","component","$slots","slots","cache","Set","warn","message","has","add","console","createWidgetMixin","additionalProperties","inject","instantSearchInstance","from","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","_initialResults","started","__forceRender","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","mixins","connectAutocomplete","$$widgetType","escapeHTML","Boolean","required","computed","_createElementVNode","_ctx","_createElementBlock","class","_renderSlot","refine","currentRefinement","indices","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","mitt","provide","canRefine","updateCanRefine","all","clear","createPanelConsumerMixin","emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","isLastItem","index","items","createURL","href","onClick","item","label","aria-hidden","connectClearRefinements","excludedAttributes","includedAttributes","hasRefinements","disabled","inheritAttrs","connectConfigure","searchParameters","$attrs","render","slot","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","capitalize","toString","charAt","toLocaleUpperCase","refinements","refinement","level","Number","$props","isRefined","count","_createBlock","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","canToggleShowMore","isShowingMore","toggleShowMore","sendEvent","_createVNode","htmlUnescapes","&amp;","&lt;","&gt;","&quot;","&#39;","reEscapedHtml","reHasEscapedHtml","RegExp","unescape","string","test","replace","character","TAG_PLACEHOLDER","highlightPreTag","highlightPostTag","parseHighlightedAttribute","splitByPreTag","highlightedValue","split","preTag","firstValue","shift","isHighlighted","postTag","let","splitByPostTag","parseAlgoliaHit","highlightObject","getPropertyByPath","highlightProperty","isArray","map","TextNode","context","highlightedTagName","parsedHighlights","$data","AisHighlighter","highlighted-tag-name","highlight-property","pre-tag","post-tag","connectHitsWithInsights","hits","insights","itemIndex","objectID","onAuxclick","connectHitsPerPage","hasNoResults","onChange","$event","currentTarget","selected","connectIndex","indexWidget","$_ais_getParentIndex","indexName","indexId","createInstantSearchComponent","$_ais_instantSearchInstance","searchClient","helper","setClient","search","setIndex","stalledSearchDelay","_stalledSearchDelay","routing","onStateChange","searchFunction","_searchFunction","middlewares","next","prev","middleware","indexOf","middlewareToRemove","unuse","middlewareToAdd","use","future","INSTANTSEARCH_FUTURE_DEFAULTS","client","addAlgoliaAgent","vueVersion","version","mounted","$nextTick","start","dispose","__initialSearchResults","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","page","results","isFirstPage","isLastPage","connectMenu","showShowMoreButton","connectNumericMenu","checked","connectPagination","padding","totalPages","showFirst","showLast","showNext","emits","p","Math","min","max","nbPages","$emit","nbHits","pages","aria-label","getSlot","theme","algoliaUrl","location","hostname","rel","style","viewBox","fill","d","connectQueryRules","trackedFilters","transformRuleContexts","connectRange","precision","minInput","maxInput","updated","step","pow","values","range","minValue","Infinity","minRange","maxValue","maxRange","pick","first","second","onSubmit","placeholder","connectRatingMenu","xmlns","id","xlink:href","_hoisted_6","_hoisted_8","stars","full","n","width","height","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","ignoreCompositionEvents","submitTitle","resetTitle","modelValue","query","isFocused","document","activeElement","$refs","input","onInput","event","isComposing","onFormSubmit","blur","onFormReset","_hoisted_10","action","role","novalidate","onReset","autocorrect","autocapitalize","autocomplete","spellcheck","maxlength","onFocus","onBlur","onCompositionend","ref","title","hidden","stroke","noop","SearchInput","AisHighlight","connectRefinementList","searchable","searchablePlaceholder","operator","searchForFacetValuesQuery","searchForFacetValues","get","set","searchForItems","_highlightResult","highlighted","escapeFacetValues","searchForItemsQuery","isFromSearch","class-names","catchError","renderFn","getResults","getHelper","status","error","addListener","removeListener","errorFn","stateResults","connectSearchBox","queryHook","localValue","isControlled","model","searchInput","val","isSearchStalled","show-loading-indicator","should-show-loading-indicator","ignore-composition-events","submit-title","reset-title","connectSortBy","options","connectStats","sortedResultsSentence","suffix","toLocaleString","nbSortedHits","resultsSentence","_mergeProps","lastResults","_Fragment","processingTimeMS","connectToggleRefinement","off","connectVoiceSearch","searchAsYouSpeak","language","additionalQueryParameters","buttonTitle","disabledButtonTitle","buttonSvgAttrs","strokeWidth","strokeLinecap","strokeLinejoin","errorNotAllowed","voiceListeningState","errorCode","rootSlotProps","isBrowserSupported","isListening","toggleListening","innerSlotProps","transcript","isSpeechFinal","handleClick","x1","y1","x2","y2","_hoisted_9","_hoisted_11","connectRelevantSort","isRelevantSorted","isVirtualReplica","getWidgetAttribute","vnode","curr","connectDynamicWidgets","facets","maxValuesPerFacet","Map","allComponents","attributesToRender","widgets","AisDynamicWidgets","plugin","install","localVue","defaultCloneComponent","componentInstance","app","serverPrefetch","fetch","_base","appOptions","createSSRApp","$router","$store","$i18n","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","initialResults","findResultsState","instance","renderToString","Promise","resolve","then","beforeCreate","descriptor","isWritable","$nuxt","waitForResults","requestParamsList","getInitialResults","hydrate","getState","parent","_state","localHelper","scopedResults","getScopedResults","templatesConfig","searchMetadata","createServerRootMixin","$cloneComponent"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/util/suit.js","../../src/mixins/suit.js","../../src/util/polyfills.js","../../src/util/vue-compat/index-vue3.js","../../src/util/warn.js","../../src/mixins/widget.js","../../src/components/Autocomplete.vue","../../src/components/Autocomplete.vue?vue&type=template&id=52a2a414&lang.js","../../src/mixins/panel.js","../../src/components/Breadcrumb.vue","../../src/components/Breadcrumb.vue?vue&type=template&id=ea18edbe&lang.js","../../src/components/ClearRefinements.vue","../../src/components/ClearRefinements.vue?vue&type=template&id=41d81b11&lang.js","../../src/components/Configure.js","../../src/components/ConfigureRelatedItems.js","../../src/components/CurrentRefinements.vue","../../src/components/CurrentRefinements.vue?vue&type=template&id=5584328f&lang.js","../../src/components/HierarchicalMenuList.vue","../../src/components/HierarchicalMenuList.vue?vue&type=template&id=420e1cd4&lang.js","../../src/components/HierarchicalMenu.vue","../../src/components/HierarchicalMenu.vue?vue&type=template&id=15099ac6&lang.js","../../src/util/pragma.js","../../src/components/Highlighter.js","../../src/components/Highlight.vue","../../src/components/Highlight.vue?vue&type=template&id=214ecb36&lang.js","../../src/components/Hits.js","../../src/components/HitsPerPage.vue","../../src/components/HitsPerPage.vue?vue&type=template&id=5d43db9c&lang.js","../../src/components/Index.js","../../src/util/createInstantSearchComponent.js","../../src/components/InstantSearch.js","../../src/components/InstantSearchSsr.js","../../src/components/InfiniteHits.vue","../../src/components/InfiniteHits.vue?vue&type=template&id=39939af3&lang.js","../../src/components/Menu.vue","../../src/components/Menu.vue?vue&type=template&id=55b32cf6&lang.js","../../src/components/MenuSelect.vue","../../src/components/MenuSelect.vue?vue&type=template&id=11a03a77&lang.js","../../src/components/NumericMenu.vue","../../src/components/NumericMenu.vue?vue&type=template&id=583b28d4&lang.js","../../src/components/Pagination.vue","../../src/components/Pagination.vue?vue&type=template&id=5b708f87&lang.js","../../src/components/Panel.vue","../../src/components/Panel.vue?vue&type=template&id=7fcc1827&lang.js","../../src/components/PoweredBy.vue","../../src/components/PoweredBy.vue?vue&type=template&id=85db7eac&lang.js","../../src/components/QueryRuleContext.js","../../src/components/QueryRuleCustomData.vue","../../src/components/QueryRuleCustomData.vue?vue&type=template&id=1e550962&lang.js","../../src/components/RangeInput.vue","../../src/components/RangeInput.vue?vue&type=template&id=3e30e816&lang.js","../../src/components/RatingMenu.vue","../../src/components/RatingMenu.vue?vue&type=template&id=6effe1ff&lang.js","../../src/components/SearchInput.vue","../../src/components/SearchInput.vue?vue&type=template&id=02fb82e2&lang.js","../../src/components/RefinementList.vue","../../src/components/RefinementList.vue?vue&type=template&id=80c1baee&lang.js","../../src/components/StateResults.vue","../../src/components/StateResults.vue?vue&type=template&id=f5047700&lang.js","../../src/components/SearchBox.vue","../../src/components/SearchBox.vue?vue&type=template&id=b43316e4&lang.js","../../src/components/Snippet.vue","../../src/components/Snippet.vue?vue&type=template&id=edc35952&lang.js","../../src/components/SortBy.vue","../../src/components/SortBy.vue?vue&type=template&id=78751313&lang.js","../../src/components/Stats.vue","../../src/components/Stats.vue?vue&type=template&id=67854642&lang.js","../../src/components/ToggleRefinement.vue","../../src/components/ToggleRefinement.vue?vue&type=template&id=fc27238e&lang.js","../../src/components/VoiceSearch.vue","../../src/components/VoiceSearch.vue?vue&type=template&id=c25adbd0&lang.js","../../src/components/RelevantSort.vue","../../src/components/RelevantSort.vue?vue&type=template&id=d83cf556&lang.js","../../src/components/DynamicWidgets.js","../../src/components/ExperimentalDynamicWidgets.js","../../src/plugin.js","../../src/util/createServerRootMixin.js"],"sourcesContent":["/**\n * Create class names like ais-widgetName-element--modifier\n *\n * @param {string} widgetName first part\n * @param {string} element part separated by -\n * @param {string} modifier final part, separated by --\n *\n * @returns {string} the composed class name\n */\nexport default function suit(widgetName, element, modifier) {\n if (!widgetName) {\n throw new Error('You need to provide `widgetName` in your data');\n }\n\n const elements = [`ais-${widgetName}`];\n\n if (element) {\n elements.push(`-${element}`);\n }\n\n if (modifier) {\n elements.push(`--${modifier}`);\n }\n\n return elements.join('');\n}\n","import suit from '../util/suit';\n\nexport const createSuitMixin = ({ name }) => ({\n props: {\n classNames: {\n type: Object,\n default: undefined,\n },\n },\n methods: {\n suit(element, modifier) {\n const className = suit(name, element, modifier);\n const userClassName = this.classNames && this.classNames[className];\n if (userClassName) {\n return [className, userClassName].join(' ');\n }\n return className;\n },\n },\n});\n","/* eslint-disable eslint-comments/no-unlimited-disable */\n/* eslint-disable */\n\n// source: @babel/plugin-proposal-object-rest-spread@7.2.0\n// prettier-ignore\nexport function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\n// source: @babel/plugin-proposal-object-rest-spread@7.2.0\n// prettier-ignore\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n","import * as Vue from 'vue';\n\nconst isVue2 = false;\nconst isVue3 = true;\nconst Vue2 = undefined;\n\nexport { createApp, createSSRApp, h, version, nextTick } from 'vue';\nexport { Vue, Vue2, isVue2, isVue3 };\n\nexport function renderCompat(fn) {\n function h(tag, props, children) {\n if (\n typeof props === 'object' &&\n (props.attrs || props.props || props.scopedSlots || props.on)\n ) {\n // In vue 3, we no longer wrap with `attrs` or `props` key.\n const onPropKeys = Object.keys(props.on || {});\n const flatProps = Object.assign(\n {},\n props,\n props.attrs,\n props.props,\n onPropKeys.reduce((acc, key) => {\n // eslint-disable-next-line no-param-reassign\n acc[`on${key[0].toUpperCase()}${key.slice(1)}`] = props.on[key];\n return acc;\n }, {})\n );\n delete flatProps.attrs;\n delete flatProps.props;\n delete flatProps.scopedSlots;\n onPropKeys.forEach((key) => delete flatProps.on[key]);\n if (flatProps.on && Object.keys(flatProps.on).length === 0) {\n delete flatProps.on;\n }\n\n return Vue.h(\n tag,\n flatProps,\n props.scopedSlots\n ? Object.assign({ default: () => children }, props.scopedSlots)\n : children\n );\n }\n\n return Vue.h(tag, props, children);\n }\n\n return function () {\n return fn.call(this, h);\n };\n}\n\nexport function getDefaultSlot(component) {\n const $slots = component.$slots || component.slots;\n\n if (typeof $slots.default === 'function') {\n // Vue 3\n return $slots.default();\n }\n\n // Vue 3 with @vue/compat\n return $slots.default;\n}\n\nexport function getScopedSlot(component, name) {\n return (component.$slots || component.slots || {})[name];\n}\n","const cache = new Set();\n\nexport function warn(message) {\n if (cache.has(message)) return;\n cache.add(message);\n // eslint-disable-next-line no-console\n console.warn(message);\n}\n","import { _objectSpread } from '../util/polyfills';\nimport { isVue3 } from '../util/vue-compat';\nimport { warn } from '../util/warn';\n\nexport const createWidgetMixin = (\n { connector } = {},\n additionalProperties = {}\n) => ({\n inject: {\n instantSearchInstance: {\n from: '$_ais_instantSearchInstance',\n default() {\n const tag = this.$options._componentTag;\n throw new TypeError(\n `It looks like you forgot to wrap your Algolia search component \"<${tag}>\" inside of an \"<ais-instant-search>\" component.`\n );\n },\n },\n getParentIndex: {\n from: '$_ais_getParentIndex',\n default() {\n return () => this.instantSearchInstance.mainIndex;\n },\n },\n },\n data() {\n return {\n state: null,\n };\n },\n created() {\n if (typeof connector === 'function') {\n this.factory = connector(this.updateState, () => {});\n this.widget = _objectSpread(\n this.factory(this.widgetParams),\n additionalProperties\n );\n this.getParentIndex().addWidgets([this.widget]);\n\n if (\n this.instantSearchInstance._initialResults &&\n !this.instantSearchInstance.started\n ) {\n if (typeof this.instantSearchInstance.__forceRender !== 'function') {\n throw new Error(\n 'You are using server side rendering with <ais-instant-search> instead of <ais-instant-search-ssr>.'\n );\n }\n this.instantSearchInstance.__forceRender(\n this.widget,\n this.getParentIndex()\n );\n }\n } else if (connector !== true) {\n warn(\n `You are using the InstantSearch widget mixin, but didn't provide a connector.\nWhile this is technically possible, and will give you access to the Helper,\nit's not the recommended way of making custom components.\n\nIf you want to disable this message, pass { connector: true } to the mixin.\n\nRead more on using connectors: https://alg.li/vue-custom`\n );\n }\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.getParentIndex().removeWidgets([this.widget]);\n }\n },\n watch: {\n widgetParams: {\n handler(nextWidgetParams) {\n this.state = null;\n this.getParentIndex().removeWidgets([this.widget]);\n this.widget = _objectSpread(\n this.factory(nextWidgetParams),\n additionalProperties\n );\n this.getParentIndex().addWidgets([this.widget]);\n },\n deep: true,\n },\n },\n methods: {\n updateState(state = {}, isFirstRender) {\n if (!isFirstRender) {\n // Avoid updating the state on first render\n // otherwise there will be a flash of placeholder data\n this.state = state;\n }\n },\n },\n});\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>\n This widget doesn't render anything without a filled in default slot.\n </p>\n <p>query, function to refine and results are provided.</p>\n <pre>refine: Function</pre>\n <pre>currentRefinement: \"{{ state.currentRefinement }}\"</pre>\n <details>\n <summary><code>indices</code>:</summary>\n <pre>{{ state.indices }}</pre>\n </details>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisAutocomplete',\n mixins: [\n createWidgetMixin(\n {\n connector: connectAutocomplete,\n },\n {\n $$widgetType: 'ais.autocomplete',\n }\n ),\n createSuitMixin({ name: 'Autocomplete' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n };\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>\n This widget doesn't render anything without a filled in default slot.\n </p>\n <p>query, function to refine and results are provided.</p>\n <pre>refine: Function</pre>\n <pre>currentRefinement: \"{{ state.currentRefinement }}\"</pre>\n <details>\n <summary><code>indices</code>:</summary>\n <pre>{{ state.indices }}</pre>\n </details>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisAutocomplete',\n mixins: [\n createWidgetMixin(\n {\n connector: connectAutocomplete,\n },\n {\n $$widgetType: 'ais.autocomplete',\n }\n ),\n createSuitMixin({ name: 'Autocomplete' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n };\n },\n },\n};\n</script>\n","import mitt from 'mitt';\n\nimport { isVue3 } from '../util/vue-compat';\n\nexport const PANEL_EMITTER_NAMESPACE = 'instantSearchPanelEmitter';\nexport const PANEL_CHANGE_EVENT = 'PANEL_CHANGE_EVENT';\n\nexport const createPanelProviderMixin = () => ({\n props: {\n emitter: {\n type: Object,\n required: false,\n default() {\n return mitt();\n },\n },\n },\n provide() {\n return {\n [PANEL_EMITTER_NAMESPACE]: this.emitter,\n };\n },\n data() {\n return {\n canRefine: true,\n };\n },\n created() {\n this.emitter.on(PANEL_CHANGE_EVENT, (value) => {\n this.updateCanRefine(value);\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n this.emitter.all.clear();\n },\n methods: {\n updateCanRefine(value) {\n this.canRefine = value;\n },\n },\n});\n\nexport const createPanelConsumerMixin = ({\n mapStateToCanRefine = (state) => Boolean(state.canRefine),\n} = {}) => ({\n inject: {\n emitter: {\n from: PANEL_EMITTER_NAMESPACE,\n default() {\n return {\n emit: () => {},\n };\n },\n },\n },\n data() {\n return {\n state: null,\n hasAlreadyEmitted: false,\n };\n },\n watch: {\n state: {\n immediate: true,\n handler(nextState, previousState) {\n if (!nextState) {\n return;\n }\n\n const previousCanRefine = mapStateToCanRefine(previousState || {});\n const nextCanRefine = mapStateToCanRefine(nextState);\n\n if (!this.hasAlreadyEmitted || previousCanRefine !== nextCanRefine) {\n this.emitter.emit(PANEL_CHANGE_EVENT, nextCanRefine);\n this.hasAlreadyEmitted = true;\n }\n },\n },\n },\n});\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"[\n suit('item'),\n !state.items.length && suit('item', 'selected'),\n ]\"\n >\n <a\n v-if=\"Boolean(state.items.length)\"\n :href=\"state.createURL()\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine()\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n <a\n v-else\n :href=\"state.createURL(null)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(null)\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n </li>\n <li\n v-for=\"(item, index) in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), isLastItem(index) && suit('item', 'selected')]\"\n >\n <span :class=\"suit('separator')\" aria-hidden=\"true\">\n <slot name=\"separator\">></slot> </span\n ><a\n v-if=\"!isLastItem(index)\"\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >{{ item.label }}</a\n >\n <template v-else>{{ item.label }}</template>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisBreadcrumb',\n mixins: [\n createWidgetMixin(\n {\n connector: connectBreadcrumb,\n },\n {\n $$widgetType: 'ais.breadcrumb',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'Breadcrumb' }),\n ],\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n separator: this.separator,\n rootPath: this.rootPath,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n isLastItem(index) {\n return this.state.items.length - 1 === index;\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"[\n suit('item'),\n !state.items.length && suit('item', 'selected'),\n ]\"\n >\n <a\n v-if=\"Boolean(state.items.length)\"\n :href=\"state.createURL()\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine()\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n <a\n v-else\n :href=\"state.createURL(null)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(null)\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n </li>\n <li\n v-for=\"(item, index) in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), isLastItem(index) && suit('item', 'selected')]\"\n >\n <span :class=\"suit('separator')\" aria-hidden=\"true\">\n <slot name=\"separator\">></slot> </span\n ><a\n v-if=\"!isLastItem(index)\"\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >{{ item.label }}</a\n >\n <template v-else>{{ item.label }}</template>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisBreadcrumb',\n mixins: [\n createWidgetMixin(\n {\n connector: connectBreadcrumb,\n },\n {\n $$widgetType: 'ais.breadcrumb',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'Breadcrumb' }),\n ],\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n separator: this.separator,\n rootPath: this.rootPath,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n isLastItem(index) {\n return this.state.items.length - 1 === index;\n },\n },\n};\n</script>\n","<!-- @MAJOR remove `type=\"reset\"` -->\n<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :can-refine=\"canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <button\n type=\"reset\"\n :class=\"[suit('button'), !canRefine && suit('button', 'disabled')]\"\n :disabled=\"!canRefine\"\n @click.prevent=\"state.refine\"\n >\n <slot name=\"resetLabel\"> Clear refinements </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectClearRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisClearRefinements',\n mixins: [\n createWidgetMixin(\n {\n connector: connectClearRefinements,\n },\n {\n $$widgetType: 'ais.clearRefinements',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'ClearRefinements' }),\n ],\n props: {\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n canRefine() {\n return this.state.hasRefinements;\n },\n },\n};\n</script>\n","<!-- @MAJOR remove `type=\"reset\"` -->\n<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :can-refine=\"canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <button\n type=\"reset\"\n :class=\"[suit('button'), !canRefine && suit('button', 'disabled')]\"\n :disabled=\"!canRefine\"\n @click.prevent=\"state.refine\"\n >\n <slot name=\"resetLabel\"> Clear refinements </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectClearRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisClearRefinements',\n mixins: [\n createWidgetMixin(\n {\n connector: connectClearRefinements,\n },\n {\n $$widgetType: 'ais.clearRefinements',\n }\n ),\n createPanelConsumerMixin(),\n createSuitMixin({ name: 'ClearRefinements' }),\n ],\n props: {\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n canRefine() {\n return this.state.hasRefinements;\n },\n },\n};\n</script>\n","import { connectConfigure } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, renderCompat } from '../util/vue-compat';\n\nexport default {\n inheritAttrs: false,\n name: 'AisConfigure',\n mixins: [\n createSuitMixin({ name: 'Configure' }),\n createWidgetMixin(\n {\n connector: connectConfigure,\n },\n {\n $$widgetType: 'ais.configure',\n }\n ),\n ],\n computed: {\n widgetParams() {\n return {\n searchParameters: this.$attrs,\n };\n },\n },\n render: renderCompat(function (h) {\n const slot = isVue3 ? this.$slots.default : this.$scopedSlots.default;\n\n if (!this.state || !slot) {\n return null;\n }\n\n return h(\n 'div',\n {\n class: this.suit(),\n },\n [\n slot({\n refine: this.state.refine,\n searchParameters: this.state.widgetParams.searchParameters,\n }),\n ]\n );\n }),\n};\n","import { EXPERIMENTAL_connectConfigureRelatedItems } from 'instantsearch.js/es/connectors';\n\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n inheritAttrs: false,\n name: 'AisExperimentalConfigureRelatedItems',\n mixins: [\n createWidgetMixin(\n {\n connector: EXPERIMENTAL_connectConfigureRelatedItems,\n },\n {\n $$widgetType: 'ais.configureRelatedItems',\n }\n ),\n ],\n props: {\n hit: {\n type: Object,\n required: true,\n },\n matchingPatterns: {\n type: Object,\n required: true,\n },\n transformSearchParameters: {\n type: Function,\n required: false,\n },\n },\n computed: {\n widgetParams() {\n return {\n hit: this.hit,\n matchingPatterns: this.matchingPatterns,\n transformSearchParameters: this.transformSearchParameters,\n };\n },\n },\n render() {\n return null;\n },\n};\n","<template>\n <div :class=\"[suit(), noRefinement && suit('', 'noRefinement')]\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :items=\"state.items\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.attribute\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :refine=\"item.refine\"\n :item=\"item\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('label')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{\n refinement.label\n }}</q>\n <template v-else>{{ refinement.label }}</template> </span\n ><button\n :class=\"suit('delete')\"\n type=\"button\"\n @click.left.exact=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin(\n {\n connector: connectCurrentRefinements,\n },\n {\n $$widgetType: 'ais.currentRefinements',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n noRefinement() {\n return this.state && this.state.items.length === 0;\n },\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n createItemKey({ attribute, value, type, operator }) {\n return [attribute, type, value, operator].join(':');\n },\n capitalize(value) {\n if (!value) return '';\n return (\n value.toString().charAt(0).toLocaleUpperCase() +\n value.toString().slice(1)\n );\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), noRefinement && suit('', 'noRefinement')]\" v-if=\"state\">\n <slot\n :refine=\"state.refine\"\n :items=\"state.items\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.attribute\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :refine=\"item.refine\"\n :item=\"item\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('label')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{\n refinement.label\n }}</q>\n <template v-else>{{ refinement.label }}</template> </span\n ><button\n :class=\"suit('delete')\"\n type=\"button\"\n @click.left.exact=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin(\n {\n connector: connectCurrentRefinements,\n },\n {\n $$widgetType: 'ais.currentRefinements',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n includedAttributes: {\n type: Array,\n default: undefined,\n },\n excludedAttributes: {\n type: Array,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n noRefinement() {\n return this.state && this.state.items.length === 0;\n },\n widgetParams() {\n return {\n includedAttributes: this.includedAttributes,\n excludedAttributes: this.excludedAttributes,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n createItemKey({ attribute, value, type, operator }) {\n return [attribute, type, value, operator].join(':');\n },\n capitalize(value) {\n if (!value) return '';\n return (\n value.toString().charAt(0).toLocaleUpperCase() +\n value.toString().slice(1)\n );\n },\n },\n};\n</script>\n","<template>\n <ul\n v-if=\"items.length > 0\"\n :class=\"[\n suit('list'),\n level > 0 && suit('list', 'child'),\n suit('list', `lvl${level}`),\n ]\"\n >\n <li\n v-for=\"item in items\"\n :key=\"item.value\"\n :class=\"[\n suit('item'),\n item.isRefined && suit('item', 'selected'),\n item.data && item.data.length > 0 && suit('item', 'parent'),\n ]\"\n >\n <a\n :href=\"createURL(item.value)\"\n :class=\"[suit('link'), item.isRefined && suit('link', 'selected')]\"\n @click.prevent=\"refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n <hierarchical-menu-list\n v-if=\"item.data\"\n :items=\"item.data\"\n :level=\"level + 1\"\n :refine=\"refine\"\n :createURL=\"createURL\"\n :suit=\"suit\"\n />\n </li>\n </ul>\n</template>\n\n<script>\nexport default {\n name: 'HierarchicalMenuList',\n props: {\n items: {\n type: Array,\n required: true,\n },\n level: {\n type: Number,\n required: true,\n },\n refine: {\n type: Function,\n required: true,\n },\n createURL: {\n type: Function,\n required: true,\n },\n suit: {\n type: Function,\n required: true,\n },\n },\n};\n</script>\n","<template>\n <ul\n v-if=\"items.length > 0\"\n :class=\"[\n suit('list'),\n level > 0 && suit('list', 'child'),\n suit('list', `lvl${level}`),\n ]\"\n >\n <li\n v-for=\"item in items\"\n :key=\"item.value\"\n :class=\"[\n suit('item'),\n item.isRefined && suit('item', 'selected'),\n item.data && item.data.length > 0 && suit('item', 'parent'),\n ]\"\n >\n <a\n :href=\"createURL(item.value)\"\n :class=\"[suit('link'), item.isRefined && suit('link', 'selected')]\"\n @click.prevent=\"refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n <hierarchical-menu-list\n v-if=\"item.data\"\n :items=\"item.data\"\n :level=\"level + 1\"\n :refine=\"refine\"\n :createURL=\"createURL\"\n :suit=\"suit\"\n />\n </li>\n </ul>\n</template>\n\n<script>\nexport default {\n name: 'HierarchicalMenuList',\n props: {\n items: {\n type: Array,\n required: true,\n },\n level: {\n type: Number,\n required: true,\n },\n refine: {\n type: Function,\n required: true,\n },\n createURL: {\n type: Function,\n required: true,\n },\n suit: {\n type: Function,\n required: true,\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <hierarchical-menu-list\n :items=\"state.items\"\n :level=\"0\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :suit=\"suit\"\n />\n\n <button\n v-if=\"showMore\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n {{ state.isShowingMore ? 'Show less' : 'Show more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHierarchicalMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport HierarchicalMenuList from './HierarchicalMenuList.vue';\n\nexport default {\n name: 'AisHierarchicalMenu',\n mixins: [\n createSuitMixin({ name: 'HierarchicalMenu' }),\n createWidgetMixin(\n {\n connector: connectHierarchicalMenu,\n },\n {\n $$widgetType: 'ais.hierarchicalMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n components: {\n HierarchicalMenuList,\n },\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n showParentLevel: {\n type: Boolean,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n separator: this.separator,\n rootPath: this.rootPath,\n showParentLevel: this.showParentLevel,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <hierarchical-menu-list\n :items=\"state.items\"\n :level=\"0\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :suit=\"suit\"\n />\n\n <button\n v-if=\"showMore\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n {{ state.isShowingMore ? 'Show less' : 'Show more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHierarchicalMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport HierarchicalMenuList from './HierarchicalMenuList.vue';\n\nexport default {\n name: 'AisHierarchicalMenu',\n mixins: [\n createSuitMixin({ name: 'HierarchicalMenu' }),\n createWidgetMixin(\n {\n connector: connectHierarchicalMenu,\n },\n {\n $$widgetType: 'ais.hierarchicalMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n components: {\n HierarchicalMenuList,\n },\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n separator: {\n type: String,\n default: undefined,\n },\n rootPath: {\n type: String,\n default: undefined,\n },\n showParentLevel: {\n type: Boolean,\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attributes: this.attributes,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n separator: this.separator,\n rootPath: this.rootPath,\n showParentLevel: this.showParentLevel,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","import { h, Fragment } from 'vue';\n\nexport const createElement = (tag, props, children) => {\n if (!children) {\n return h(tag, props);\n }\n\n if (tag === Fragment) {\n return h(tag, Array.isArray(children) ? children : [children]);\n }\n\n // It does work to just pass a string but outputs a warning about performance issues\n const newChildren =\n typeof children === 'string' ? { default: () => children } : children;\n // Passing a `children` prop to a DOM element outputs a warning\n const newProps =\n typeof tag === 'string' ? props : Object.assign(props, { children });\n\n return h(tag, newProps, newChildren);\n};\n\nexport { Fragment };\n","import { createHighlightComponent } from 'instantsearch-ui-components';\nimport {\n getHighlightedParts,\n getPropertyByPath,\n unescape,\n} from 'instantsearch.js/es/lib/utils';\n\nimport { createElement, Fragment } from '../util/pragma';\n\nconst Highlight = createHighlightComponent({ createElement, Fragment });\n\nexport default {\n name: 'AisHighlighter',\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n suit: {\n type: Function,\n required: true,\n },\n highlightProperty: {\n type: String,\n required: true,\n },\n preTag: {\n type: String,\n required: true,\n },\n postTag: {\n type: String,\n required: true,\n },\n },\n render() {\n const property =\n getPropertyByPath(this.hit[this.highlightProperty], this.attribute) || [];\n const properties = Array.isArray(property) ? property : [property];\n\n const parts = properties.map((singleValue) =>\n getHighlightedParts(unescape(singleValue.value || '')).map(\n ({ value, isHighlighted }) => ({\n // We have to do this because Vue gets rid of TextNodes with a single white space\n value: value === ' ' ? ' ' : value,\n isHighlighted,\n })\n )\n );\n\n return createElement(Highlight, {\n classNames: {\n root: this.suit(),\n highlighted: this.suit('highlighted'),\n },\n highlightedTagName: this.highlightedTagName,\n nonHighlightedTagName: Fragment,\n parts,\n });\n },\n};\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_highlightResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from '../util/vue-compat/Highlighter';\n\nexport default {\n name: 'AisHighlight',\n mixins: [createSuitMixin({ name: 'Highlight' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_highlightResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from '../util/vue-compat/Highlighter';\n\nexport default {\n name: 'AisHighlight',\n mixins: [createSuitMixin({ name: 'Highlight' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","import { createHitsComponent } from 'instantsearch-ui-components';\nimport { connectHitsWithInsights } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { getScopedSlot, renderCompat } from '../util/vue-compat';\n\nexport default {\n name: 'AisHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectHitsWithInsights,\n },\n {\n $$widgetType: 'ais.hits',\n }\n ),\n createSuitMixin({ name: 'Hits' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n items() {\n return this.state.hits;\n },\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n };\n },\n },\n render: renderCompat(function (h) {\n if (!this.state) {\n return null;\n }\n\n const defaultSlot = getScopedSlot(this, 'default');\n const itemSlot = getScopedSlot(this, 'item');\n\n const itemComponent = ({\n hit,\n index,\n onClick,\n onAuxClick,\n // We don't want to pass the Preact key as a prop\n key: _key,\n ...rootProps\n }) => {\n return h(\n 'li',\n {\n key: hit.objectID,\n attrs: rootProps,\n on: {\n click: onClick,\n auxclick: onAuxClick,\n },\n },\n [\n (itemSlot &&\n itemSlot({\n item: hit,\n index,\n insights: this.state.insights,\n sendEvent: this.state.sendEvent,\n })) ||\n `objectID: ${hit.objectID}, index: ${index}`,\n ]\n );\n };\n\n // We only want to render the default slot\n // if no other slots are defined\n if (!itemSlot && defaultSlot) {\n return h(\n 'div',\n {\n attrs: {\n class: this.suit(),\n },\n },\n [\n defaultSlot({\n items: this.state.hits,\n insights: this.state.insights,\n sendEvent: this.state.sendEvent,\n }),\n ]\n );\n }\n\n return h(createHitsComponent({ createElement: h }), {\n hits: this.state.hits,\n itemComponent,\n sendEvent: this.state.sendEvent,\n classNames: this.classNames && {\n root: this.classNames['ais-Hits'],\n list: this.classNames['ais-Hits-list'],\n item: this.classNames['ais-Hits-item'],\n },\n });\n }),\n};\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :has-no-results=\"state.hasNoResults\"\n :can-refine=\"state.canRefine\"\n :createURL=\"state.createURL\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine(Number($event.currentTarget.value))\"\n >\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsPerPage } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisHitsPerPage',\n mixins: [\n createSuitMixin({ name: 'HitsPerPage' }),\n createWidgetMixin(\n {\n connector: connectHitsPerPage,\n },\n {\n $$widgetType: 'ais.hitsPerPage',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :has-no-results=\"state.hasNoResults\"\n :can-refine=\"state.canRefine\"\n :createURL=\"state.createURL\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine(Number($event.currentTarget.value))\"\n >\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsPerPage } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisHitsPerPage',\n mixins: [\n createSuitMixin({ name: 'HitsPerPage' }),\n createWidgetMixin(\n {\n connector: connectHitsPerPage,\n },\n {\n $$widgetType: 'ais.hitsPerPage',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","import indexWidget from 'instantsearch.js/es/widgets/index/index';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\n// wrapped in a dummy function, since indexWidget doesn't render\nconst connectIndex = () => indexWidget;\n\nexport default {\n name: 'AisIndex',\n mixins: [\n createSuitMixin({ name: 'Index' }),\n createWidgetMixin(\n { connector: connectIndex },\n {\n $$widgetType: 'ais.index',\n }\n ),\n ],\n provide() {\n return {\n // The widget is created & registered by widgetMixin, accessor is needed\n // because provide is not reactive.\n $_ais_getParentIndex: () => this.widget,\n };\n },\n props: {\n indexName: {\n type: String,\n required: true,\n },\n indexId: {\n type: String,\n required: false,\n },\n },\n render: renderCompat(function (h) {\n return h('div', {}, getDefaultSlot(this));\n }),\n computed: {\n widgetParams() {\n return {\n indexName: this.indexName,\n indexId: this.indexId,\n };\n },\n },\n};\n","import { INSTANTSEARCH_FUTURE_DEFAULTS } from 'instantsearch.js/es/lib/InstantSearch';\n\nimport { version } from '../../package.json'; // rollup does pick only what needed from json\nimport { createSuitMixin } from '../mixins/suit';\n\nimport { _objectSpread } from './polyfills';\nimport { isVue3, version as vueVersion } from './vue-compat';\nimport { warn } from './warn';\n\nexport const createInstantSearchComponent = (component) =>\n _objectSpread(\n {\n mixins: [createSuitMixin({ name: 'InstantSearch' })],\n provide() {\n return {\n $_ais_instantSearchInstance: this.instantSearchInstance,\n };\n },\n watch: {\n searchClient(searchClient) {\n warn(\n false,\n 'The `search-client` prop of `<ais-instant-search>` changed between renders, which may cause more search requests than necessary. If this is an unwanted behavior, please provide a stable reference: https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-search-client'\n );\n\n this.instantSearchInstance.helper.setClient(searchClient).search();\n },\n indexName(indexName) {\n this.instantSearchInstance.helper.setIndex(indexName || '').search();\n },\n stalledSearchDelay(stalledSearchDelay) {\n // private InstantSearch.js API:\n this.instantSearchInstance._stalledSearchDelay = stalledSearchDelay;\n },\n routing() {\n throw new Error(\n 'routing configuration can not be changed dynamically at this point.' +\n '\\n\\n' +\n 'Please open a new issue: https://github.com/algolia/instantsearch/discussions/new?category=ideas&labels=triage%2cLibrary%3A+Vue+InstantSearch&title=Feature%20request%3A%20dynamic%20props'\n );\n },\n onStateChange() {\n throw new Error(\n 'onStateChange configuration can not be changed dynamically at this point.' +\n '\\n\\n' +\n 'Please open a new issue: https://github.com/algolia/instantsearch/discussions/new?category=ideas&labels=triage%2cLibrary%3A+Vue+InstantSearch&title=Feature%20request%3A%20dynamic%20props'\n );\n },\n searchFunction(searchFunction) {\n // private InstantSearch.js API:\n this.instantSearchInstance._searchFunction = searchFunction;\n },\n middlewares: {\n immediate: true,\n handler(next, prev) {\n (prev || [])\n .filter((middleware) => (next || []).indexOf(middleware) === -1)\n .forEach((middlewareToRemove) => {\n this.instantSearchInstance.unuse(middlewareToRemove);\n });\n\n (next || [])\n .filter((middleware) => (prev || []).indexOf(middleware) === -1)\n .forEach((middlewareToAdd) => {\n this.instantSearchInstance.use(middlewareToAdd);\n });\n },\n },\n future(future) {\n this.instantSearchInstance.future = Object.assign(\n INSTANTSEARCH_FUTURE_DEFAULTS,\n future\n );\n },\n },\n created() {\n const searchClient = this.instantSearchInstance.client;\n if (typeof searchClient.addAlgoliaAgent === 'function') {\n searchClient.addAlgoliaAgent(`Vue (${vueVersion})`);\n searchClient.addAlgoliaAgent(`Vue InstantSearch (${version})`);\n }\n },\n mounted() {\n // from the documentation: https://vuejs.org/v2/api/#mounted\n // \"Note that mounted does not guarantee that all child components have also been mounted. If you want to\n // wait until the entire view has been rendered, you can use vm.$nextTick inside of mounted\"\n this.$nextTick(() => {\n if (!this.instantSearchInstance.started) {\n this.instantSearchInstance.start();\n }\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.instantSearchInstance.started) {\n this.instantSearchInstance.dispose();\n }\n\n // a hydrated instance will no longer be hydrated once disposed, and starts from scratch\n this.instantSearchInstance.__initialSearchResults = undefined;\n },\n },\n component\n );\n","import instantsearch from 'instantsearch.js/es';\n\nimport { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\nimport { warn } from '../util/warn';\n\nconst oldApiWarning = `Vue InstantSearch: You used the prop api-key or app-id.\nThese have been replaced by search-client.\n\nSee more info here: https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-search-client`;\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearch',\n props: {\n searchClient: {\n type: Object,\n required: true,\n },\n insightsClient: {\n type: Function,\n default: undefined,\n },\n indexName: {\n type: String,\n required: true,\n },\n routing: {\n default: undefined,\n validator(value) {\n if (\n typeof value === 'boolean' ||\n (!value.router && !value.stateMapping)\n ) {\n warn(\n 'The `routing` option expects an object with `router` and/or `stateMapping`.\\n\\nSee https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-routing'\n );\n return false;\n }\n return true;\n },\n },\n insights: {\n default: undefined,\n validator(value) {\n return (\n typeof value === 'undefined' ||\n typeof value === 'boolean' ||\n typeof value === 'object'\n );\n },\n },\n stalledSearchDelay: {\n type: Number,\n default: undefined,\n },\n searchFunction: {\n type: Function,\n default: undefined,\n },\n onStateChange: {\n type: Function,\n default: undefined,\n },\n initialUiState: {\n type: Object,\n default: undefined,\n },\n apiKey: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n appId: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n middlewares: {\n type: Array,\n default: null,\n },\n future: {\n type: Object,\n default: undefined,\n },\n },\n data() {\n return {\n instantSearchInstance: instantsearch({\n searchClient: this.searchClient,\n insightsClient: this.insightsClient,\n insights: this.insights,\n indexName: this.indexName,\n routing: this.routing,\n stalledSearchDelay: this.stalledSearchDelay,\n searchFunction: this.searchFunction,\n onStateChange: this.onStateChange,\n initialUiState: this.initialUiState,\n future: this.future,\n }),\n };\n },\n render: renderCompat(function (h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: false,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","import { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearchSsr',\n inject: {\n $_ais_ssrInstantSearchInstance: {\n default() {\n throw new Error('`createServerRootMixin` is required when using SSR.');\n },\n },\n },\n data() {\n return {\n instantSearchInstance: this.$_ais_ssrInstantSearchInstance,\n };\n },\n render: renderCompat(function (h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: true,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-if=\"showPrevious\"\n name=\"loadPrevious\"\n :refine-previous=\"refinePrevious\"\n :page=\"state.results.page\"\n :is-first-page=\"state.isFirstPage\"\n >\n <button\n :class=\"[\n suit('loadPrevious'),\n state.isFirstPage && suit('loadPrevious', 'disabled'),\n ]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >\n Show previous results\n </button>\n </slot>\n\n <slot\n :items=\"items\"\n :results=\"state.results\"\n :is-last-page=\"state.isLastPage\"\n :refine-previous=\"refinePrevious\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, index) in items\"\n :class=\"suit('item')\"\n :key=\"item.objectID\"\n @click=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n @auxclick=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n objectID: {{ item.objectID }}, index: {{ index }}\n </slot>\n </li>\n </ol>\n\n <slot\n name=\"loadMore\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :page=\"state.results.page\"\n :is-last-page=\"state.isLastPage\"\n >\n <button\n :class=\"[\n suit('loadMore'),\n state.isLastPage && suit('loadMore', 'disabled'),\n ]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >\n Show more results\n </button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisInfiniteHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectInfiniteHitsWithInsights,\n },\n {\n $$widgetType: 'ais.infiniteHits',\n }\n ),\n createSuitMixin({ name: 'InfiniteHits' }),\n ],\n props: {\n showPrevious: {\n type: Boolean,\n default: false,\n },\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n cache: {\n type: Object,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n showPrevious: this.showPrevious,\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n cache: this.cache,\n };\n },\n items() {\n // Fixes InstantSearch.js connectors API: every list\n // of things must be called `items`\n return this.state.hits;\n },\n },\n methods: {\n refinePrevious() {\n this.state.showPrevious();\n },\n refineNext() {\n this.state.showMore();\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-if=\"showPrevious\"\n name=\"loadPrevious\"\n :refine-previous=\"refinePrevious\"\n :page=\"state.results.page\"\n :is-first-page=\"state.isFirstPage\"\n >\n <button\n :class=\"[\n suit('loadPrevious'),\n state.isFirstPage && suit('loadPrevious', 'disabled'),\n ]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >\n Show previous results\n </button>\n </slot>\n\n <slot\n :items=\"items\"\n :results=\"state.results\"\n :is-last-page=\"state.isLastPage\"\n :refine-previous=\"refinePrevious\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, index) in items\"\n :class=\"suit('item')\"\n :key=\"item.objectID\"\n @click=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n @auxclick=\"state.sendEvent('click:internal', item, 'Hit Clicked')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n objectID: {{ item.objectID }}, index: {{ index }}\n </slot>\n </li>\n </ol>\n\n <slot\n name=\"loadMore\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :page=\"state.results.page\"\n :is-last-page=\"state.isLastPage\"\n >\n <button\n :class=\"[\n suit('loadMore'),\n state.isLastPage && suit('loadMore', 'disabled'),\n ]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >\n Show more results\n </button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisInfiniteHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectInfiniteHitsWithInsights,\n },\n {\n $$widgetType: 'ais.infiniteHits',\n }\n ),\n createSuitMixin({ name: 'InfiniteHits' }),\n ],\n props: {\n showPrevious: {\n type: Boolean,\n default: false,\n },\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n cache: {\n type: Object,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n showPrevious: this.showPrevious,\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n cache: this.cache,\n };\n },\n items() {\n // Fixes InstantSearch.js connectors API: every list\n // of things must be called `items`\n return this.state.hits;\n },\n },\n methods: {\n refinePrevious() {\n this.state.showPrevious();\n },\n refineNext() {\n this.state.showMore();\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n\n <button\n v-if=\"showShowMoreButton\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">{{\n state.isShowingMore ? 'Show less' : 'Show more'\n }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenu',\n mixins: [\n createSuitMixin({ name: 'Menu' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n // TODO: implement searchable in connector\n // searchable: {\n // type: Boolean,\n // default: false,\n // },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n showShowMoreButton() {\n return this.state.canRefine && this.showMore;\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n\n <button\n v-if=\"showShowMoreButton\"\n :class=\"[\n suit('showMore'),\n !state.canToggleShowMore && suit('showMore', 'disabled'),\n ]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">{{\n state.isShowingMore ? 'Show less' : 'Show more'\n }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenu',\n mixins: [\n createSuitMixin({ name: 'Menu' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n // TODO: implement searchable in connector\n // searchable: {\n // type: Boolean,\n // default: false,\n // },\n limit: {\n type: Number,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n showShowMoreButton() {\n return this.state.canRefine && this.showMore;\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"refine($event.currentTarget.value)\"\n >\n <option :class=\"suit('option')\" value=\"\">\n <slot name=\"defaultOption\"> See all </slot>\n </option>\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n <slot name=\"item\" :item=\"item\">\n {{ item.label }} ({{ item.count }})\n </slot>\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenuSelect',\n mixins: [\n createSuitMixin({ name: 'MenuSelect' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menuSelect',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n limit: {\n type: Number,\n default: 10,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"refine($event.currentTarget.value)\"\n >\n <option :class=\"suit('option')\" value=\"\">\n <slot name=\"defaultOption\"> See all </slot>\n </option>\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n <slot name=\"item\" :item=\"item\">\n {{ item.label }} ({{ item.count }})\n </slot>\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisMenuSelect',\n mixins: [\n createSuitMixin({ name: 'MenuSelect' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menuSelect',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n limit: {\n type: Number,\n default: 10,\n },\n sortBy: {\n type: [Array, Function],\n default: undefined,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n limit: this.limit,\n sortBy: this.sortBy,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"[suit('list')]\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <label :class=\"suit('label')\">\n <input\n type=\"radio\"\n :class=\"suit('radio')\"\n :name=\"attribute\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"state.refine($event.target.value)\"\n />\n <span :class=\"suit('labelText')\">{{ item.label }}</span>\n </label>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectNumericMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisNumericMenu',\n mixins: [\n createWidgetMixin(\n {\n connector: connectNumericMenu,\n },\n {\n $$widgetType: 'ais.numericMenu',\n }\n ),\n createSuitMixin({ name: 'NumericMenu' }),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n transformItems: this.transformItems,\n items: this.items,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"[suit('list')]\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <label :class=\"suit('label')\">\n <input\n type=\"radio\"\n :class=\"suit('radio')\"\n :name=\"attribute\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"state.refine($event.target.value)\"\n />\n <span :class=\"suit('labelText')\">{{ item.label }}</span>\n </label>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectNumericMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisNumericMenu',\n mixins: [\n createWidgetMixin(\n {\n connector: connectNumericMenu,\n },\n {\n $$widgetType: 'ais.numericMenu',\n }\n ),\n createSuitMixin({ name: 'NumericMenu' }),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n transformItems: this.transformItems,\n items: this.items,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"{ [suit()]: true, [suit('', 'noRefinement')]: state.nbPages <= 1 }\"\n >\n <slot\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :current-refinement=\"state.currentRefinement\"\n :nb-hits=\"state.nbHits\"\n :nb-pages=\"state.nbPages\"\n :pages=\"state.pages\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'firstPage')]: true,\n }\"\n v-if=\"showFirst\"\n >\n <slot\n name=\"first\"\n :createURL=\"() => state.createURL(0)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(0)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"First Page\"\n :href=\"state.createURL(0)\"\n @click.exact.left.prevent=\"refine(0)\"\n >‹‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"First Page\">‹‹</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'previousPage')]: true,\n }\"\n v-if=\"showPrevious\"\n >\n <slot\n name=\"previous\"\n :createURL=\"() => state.createURL(state.currentRefinement - 1)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(state.currentRefinement - 1)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Previous Page\"\n :href=\"state.createURL(state.currentRefinement - 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement - 1)\"\n >‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Previous Page\">‹</span>\n </template>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'page')]: true,\n [suit('item', 'selected')]: state.currentRefinement === page,\n }\"\n v-for=\"page in state.pages\"\n :key=\"page\"\n >\n <slot\n name=\"item\"\n :page=\"page\"\n :createURL=\"() => state.createURL(page)\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(page)\"\n >\n <a\n :class=\"suit('link')\"\n :href=\"state.createURL(page)\"\n :aria-label=\"`Page ${page + 1}`\"\n @click.exact.left.prevent=\"refine(page)\"\n >{{ page + 1 }}</a\n >\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'nextPage')]: true,\n }\"\n v-if=\"showNext\"\n >\n <slot\n name=\"next\"\n :createURL=\"() => state.createURL(state.currentRefinement + 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.currentRefinement + 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Next Page\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Next Page\">›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'lastPage')]: true,\n }\"\n v-if=\"showLast\"\n >\n <slot\n name=\"last\"\n :createURL=\"() => state.createURL(state.nbPages - 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.nbPages - 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.exact.left.prevent=\"refine(state.nbPages - 1)\"\n >››</a\n >\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n >\n ››\n </span>\n </template>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectPagination } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisPagination',\n mixins: [\n createSuitMixin({ name: 'Pagination' }),\n createWidgetMixin(\n {\n connector: connectPagination,\n },\n {\n $$widgetType: 'ais.pagination',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n padding: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n totalPages: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n showFirst: {\n type: Boolean,\n default: true,\n },\n showLast: {\n type: Boolean,\n default: true,\n },\n showNext: {\n type: Boolean,\n default: true,\n },\n showPrevious: {\n type: Boolean,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n padding: this.padding,\n totalPages: this.totalPages,\n };\n },\n },\n emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"{ [suit()]: true, [suit('', 'noRefinement')]: state.nbPages <= 1 }\"\n >\n <slot\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :current-refinement=\"state.currentRefinement\"\n :nb-hits=\"state.nbHits\"\n :nb-pages=\"state.nbPages\"\n :pages=\"state.pages\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'firstPage')]: true,\n }\"\n v-if=\"showFirst\"\n >\n <slot\n name=\"first\"\n :createURL=\"() => state.createURL(0)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(0)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"First Page\"\n :href=\"state.createURL(0)\"\n @click.exact.left.prevent=\"refine(0)\"\n >‹‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"First Page\">‹‹</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n [suit('item', 'previousPage')]: true,\n }\"\n v-if=\"showPrevious\"\n >\n <slot\n name=\"previous\"\n :createURL=\"() => state.createURL(state.currentRefinement - 1)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(state.currentRefinement - 1)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Previous Page\"\n :href=\"state.createURL(state.currentRefinement - 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement - 1)\"\n >‹</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Previous Page\">‹</span>\n </template>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'page')]: true,\n [suit('item', 'selected')]: state.currentRefinement === page,\n }\"\n v-for=\"page in state.pages\"\n :key=\"page\"\n >\n <slot\n name=\"item\"\n :page=\"page\"\n :createURL=\"() => state.createURL(page)\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(page)\"\n >\n <a\n :class=\"suit('link')\"\n :href=\"state.createURL(page)\"\n :aria-label=\"`Page ${page + 1}`\"\n @click.exact.left.prevent=\"refine(page)\"\n >{{ page + 1 }}</a\n >\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'nextPage')]: true,\n }\"\n v-if=\"showNext\"\n >\n <slot\n name=\"next\"\n :createURL=\"() => state.createURL(state.currentRefinement + 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.currentRefinement + 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Next Page\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.exact.left.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a\n >\n </template>\n <template v-else>\n <span :class=\"suit('link')\" aria-label=\"Next Page\">›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'disabled')]: state.isLastPage,\n [suit('item', 'lastPage')]: true,\n }\"\n v-if=\"showLast\"\n >\n <slot\n name=\"last\"\n :createURL=\"() => state.createURL(state.nbPages - 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.nbPages - 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.exact.left.prevent=\"refine(state.nbPages - 1)\"\n >››</a\n >\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n :aria-label=\"`Last Page, Page ${state.nbPages}`\"\n >\n ››\n </span>\n </template>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectPagination } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisPagination',\n mixins: [\n createSuitMixin({ name: 'Pagination' }),\n createWidgetMixin(\n {\n connector: connectPagination,\n },\n {\n $$widgetType: 'ais.pagination',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n padding: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n totalPages: {\n type: Number,\n default: undefined,\n validator(value) {\n return value > 0;\n },\n },\n showFirst: {\n type: Boolean,\n default: true,\n },\n showLast: {\n type: Boolean,\n default: true,\n },\n showNext: {\n type: Boolean,\n default: true,\n },\n showPrevious: {\n type: Boolean,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n padding: this.padding,\n totalPages: this.totalPages,\n };\n },\n },\n emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div v-if=\"getSlot('header')\" :class=\"suit('header')\">\n <slot name=\"header\" :has-refinements=\"canRefine\" />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div v-if=\"getSlot('footer')\" :class=\"suit('footer')\">\n <slot name=\"footer\" :has-refinements=\"canRefine\" />\n </div>\n </div>\n</template>\n\n<script>\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div v-if=\"getSlot('header')\" :class=\"suit('header')\">\n <slot name=\"header\" :has-refinements=\"canRefine\" />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div v-if=\"getSlot('footer')\" :class=\"suit('footer')\">\n <slot name=\"footer\" :has-refinements=\"canRefine\" />\n </div>\n </div>\n</template>\n\n<script>\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\">\n <a\n :class=\"suit('link')\"\n :href=\"algoliaUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"search by Algolia\"\n >\n <svg\n style=\"height: 1.2em; width: auto\"\n :class=\"[suit('logo'), suit('', theme)]\"\n viewBox=\"0 0 572 64\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#36395a'\"\n d=\"M16 48.3c-3.4 0-6.3-.6-8.7-1.7A12.4 12.4 0 0 1 1.9 42C.6 40 0 38 0 35.4h6.5a6.7 6.7 0 0 0 3.9 6c1.4.7 3.3 1.1 5.6 1.1 2.2 0 4-.3 5.4-1a7 7 0 0 0 3-2.4 6 6 0 0 0 1-3.4c0-1.5-.6-2.8-1.9-3.7-1.3-1-3.3-1.6-5.9-1.8l-4-.4c-3.7-.3-6.6-1.4-8.8-3.4a10 10 0 0 1-3.3-7.9c0-2.4.6-4.6 1.8-6.4a12 12 0 0 1 5-4.3c2.2-1 4.7-1.6 7.5-1.6s5.5.5 7.6 1.6a12 12 0 0 1 5 4.4c1.2 1.8 1.8 4 1.8 6.7h-6.5a6.4 6.4 0 0 0-3.5-5.9c-1-.6-2.6-1-4.4-1s-3.2.3-4.4 1c-1.1.6-2 1.4-2.6 2.4-.5 1-.8 2-.8 3.1a5 5 0 0 0 1.5 3.6c1 1 2.6 1.7 4.7 1.9l4 .3c2.8.2 5.2.8 7.2 1.8 2.1 1 3.7 2.2 4.9 3.8a9.7 9.7 0 0 1 1.7 5.8c0 2.5-.7 4.7-2 6.6a13 13 0 0 1-5.6 4.4c-2.4 1-5.2 1.6-8.4 1.6Zm35.6 0c-2.6 0-4.8-.4-6.7-1.3a13 13 0 0 1-4.7-3.5 17.1 17.1 0 0 1-3.6-10.4v-1c0-2 .3-3.8 1-5.6a13 13 0 0 1 7.3-8.3 15 15 0 0 1 6.3-1.4A13.2 13.2 0 0 1 64 24.3c1 2.2 1.6 4.6 1.6 7.2V34H39.4v-4.3h21.8l-1.8 2.2c0-2-.3-3.7-.9-5.1a7.3 7.3 0 0 0-2.7-3.4c-1.2-.7-2.7-1.1-4.6-1.1s-3.4.4-4.7 1.3a8 8 0 0 0-2.9 3.6c-.6 1.5-.9 3.3-.9 5.4 0 2 .3 3.7 1 5.3a7.9 7.9 0 0 0 2.8 3.7c1.3.8 3 1.3 5 1.3s3.8-.5 5.1-1.3c1.3-1 2.1-2 2.4-3.2h6a11.8 11.8 0 0 1-7 8.7 16 16 0 0 1-6.4 1.2ZM80 48c-2.2 0-4-.3-5.7-1a8.4 8.4 0 0 1-3.7-3.3 9.7 9.7 0 0 1-1.3-5.2c0-2 .5-3.8 1.5-5.2a9 9 0 0 1 4.3-3.1c1.8-.7 4-1 6.7-1H89v4.1h-7.5c-2 0-3.4.5-4.4 1.4-1 1-1.6 2.1-1.6 3.6s.5 2.7 1.6 3.6c1 1 2.5 1.4 4.4 1.4 1.1 0 2.2-.2 3.2-.7 1-.4 1.9-1 2.6-2 .6-1 1-2.4 1-4.2l1.7 2.1c-.2 2-.7 3.8-1.5 5.2a9 9 0 0 1-3.4 3.3 12 12 0 0 1-5.3 1Zm9.5-.7v-8.8h-1v-10c0-1.8-.5-3.2-1.4-4.1-1-1-2.4-1.4-4.2-1.4a142.9 142.9 0 0 0-10.2.4v-5.6a74.8 74.8 0 0 1 8.6-.4c3 0 5.5.4 7.5 1.2s3.4 2 4.4 3.6c1 1.7 1.4 4 1.4 6.7v18.4h-5Zm12.9 0V17.8h5v12.3h-.2c0-4.2 1-7.4 2.8-9.5a11 11 0 0 1 8.3-3.1h1v5.6h-2a9 9 0 0 0-6.3 2.2c-1.5 1.5-2.2 3.6-2.2 6.4v15.6h-6.4Zm34.4 1a15 15 0 0 1-6.6-1.3c-1.9-.9-3.4-2-4.7-3.5a15.5 15.5 0 0 1-2.7-5c-.6-1.7-1-3.6-1-5.4v-1c0-2 .4-3.8 1-5.6a15 15 0 0 1 2.8-4.9c1.3-1.5 2.8-2.6 4.6-3.5a16.4 16.4 0 0 1 13.3.2c2 1 3.5 2.3 4.8 4a12 12 0 0 1 2 6H144c-.2-1.6-1-3-2.2-4.1a7.5 7.5 0 0 0-5.2-1.7 8 8 0 0 0-4.7 1.3 8 8 0 0 0-2.8 3.6 13.8 13.8 0 0 0 0 10.3c.6 1.5 1.5 2.7 2.8 3.6s2.8 1.3 4.8 1.3c1.5 0 2.7-.2 3.8-.8a7 7 0 0 0 2.6-2c.7-1 1-2 1.2-3.2h6.2a11 11 0 0 1-2 6.2 15.1 15.1 0 0 1-11.8 5.5Zm19.7-1v-40h6.4V31h-1.3c0-3 .4-5.5 1.1-7.6a9.7 9.7 0 0 1 3.5-4.8A9.9 9.9 0 0 1 172 17h.3c3.5 0 6 1.1 7.9 3.5 1.7 2.3 2.6 5.7 2.6 10v16.8h-6.4V29.6c0-2.1-.6-3.8-1.8-5a6.4 6.4 0 0 0-4.8-1.8c-2 0-3.7.7-5 2a7.8 7.8 0 0 0-1.9 5.5v17h-6.4Zm63.8 1a12.2 12.2 0 0 1-10.9-6.2 19 19 0 0 1-1.8-7.3h1.4v12.5h-5.1v-40h6.4v19.8l-2 3.5c.2-3.1.8-5.7 1.9-7.7a11 11 0 0 1 4.4-4.5c1.8-1 3.9-1.5 6.1-1.5a13.4 13.4 0 0 1 12.8 9.1c.7 1.9 1 3.8 1 6v1c0 2.2-.3 4.1-1 6a13.6 13.6 0 0 1-13.2 9.4Zm-1.2-5.5a8.4 8.4 0 0 0 7.9-5c.7-1.5 1.1-3.3 1.1-5.3s-.4-3.8-1.1-5.3a8.7 8.7 0 0 0-3.2-3.6 9.6 9.6 0 0 0-9.2-.2 8.5 8.5 0 0 0-3.3 3.2c-.8 1.4-1.3 3-1.3 5v2.3a9 9 0 0 0 1.3 4.8 9 9 0 0 0 3.4 3c1.4.7 2.8 1 4.4 1Zm27.3 3.9-10-28.9h6.5l9.5 28.9h-6Zm-7.5 12.2v-5.7h4.9c1 0 2-.1 2.9-.4a4 4 0 0 0 2-1.4c.4-.7.9-1.6 1.2-2.7l8.6-30.9h6.2l-9.3 32.4a14 14 0 0 1-2.5 5 8.9 8.9 0 0 1-4 2.8c-1.5.6-3.4.9-5.6.9h-4.4Zm9-12.2v-5.2h6.4v5.2H248Z\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#003DFF'\"\n d=\"M534.4 9.1H528a.8.8 0 0 1-.7-.7V1.8c0-.4.2-.7.6-.8l6.5-1c.4 0 .8.2.9.6v7.8c0 .4-.4.7-.8.7zM428 35.2V.8c0-.5-.3-.8-.7-.8h-.2l-6.4 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.5 0 .8-.4.8-.8V43c0-.4-.3-.7-.6-.8-4.5-.5-4.5-6-4.5-7zm106.5-21.8H528c-.4 0-.7.4-.7.8v34c0 .4.3.8.7.8h6.5c.4 0 .8-.4.8-.8v-34c0-.5-.4-.8-.8-.8zm-17.7 21.8V.8c0-.5-.3-.8-.8-.8l-6.5 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.4 0 .8-.4.8-.8V43c0-.4-.3-.7-.7-.8-4.4-.5-4.4-6-4.4-7zm-22.2-20.6a16.5 16.5 0 0 1 8.6 9.3c.8 2.2 1.3 4.8 1.3 7.5a19.4 19.4 0 0 1-4.6 12.6 14.8 14.8 0 0 1-5.2 3.6c-2 .9-5.2 1.4-6.8 1.4a21 21 0 0 1-6.7-1.4 15.4 15.4 0 0 1-8.6-9.3 21.3 21.3 0 0 1 0-14.4 15.2 15.2 0 0 1 8.6-9.3c2-.8 4.3-1.2 6.7-1.2s4.6.4 6.7 1.2zm-6.7 27.6c2.7 0 4.7-1 6.2-3s2.2-4.3 2.2-7.8-.7-6.3-2.2-8.3-3.5-3-6.2-3-4.7 1-6.1 3c-1.5 2-2.2 4.8-2.2 8.3s.7 5.8 2.2 7.8 3.5 3 6.2 3zm-88.8-28.8c-6.2 0-11.7 3.3-14.8 8.2a18.6 18.6 0 0 0 4.8 25.2c1.8 1.2 4 1.8 6.2 1.7s.1 0 .1 0h.9c4.2-.7 8-4 9.1-8.1v7.4c0 .4.3.7.8.7h6.4a.7.7 0 0 0 .7-.7V14.2c0-.5-.3-.8-.7-.8h-13.5zm6.3 26.5a9.8 9.8 0 0 1-5.7 2h-.5a10 10 0 0 1-9.2-14c1.4-3.7 5-6.3 9-6.3h6.4v18.3zm152.3-26.5h13.5c.5 0 .8.3.8.7v33.7c0 .4-.3.7-.8.7h-6.4a.7.7 0 0 1-.8-.7v-7.4c-1.2 4-4.8 7.4-9 8h-.1a4.2 4.2 0 0 1-.5.1h-.9a10.3 10.3 0 0 1-7-2.6c-4-3.3-6.5-8.4-6.5-14.2 0-3.7 1-7.2 3-10 3-5 8.5-8.3 14.7-8.3zm.6 28.4c2.2-.1 4.2-.6 5.7-2V21.7h-6.3a9.8 9.8 0 0 0-9 6.4 10.2 10.2 0 0 0 9.1 13.9h.5zM452.8 13.4c-6.2 0-11.7 3.3-14.8 8.2a18.5 18.5 0 0 0 3.6 24.3 10.4 10.4 0 0 0 13 .6c2.2-1.5 3.8-3.7 4.5-6.1v7.8c0 2.8-.8 5-2.2 6.3-1.5 1.5-4 2.2-7.5 2.2l-6-.3c-.3 0-.7.2-.8.5l-1.6 5.5c-.1.4.1.8.5 1h.1c2.8.4 5.5.6 7 .6 6.3 0 11-1.4 14-4.1 2.7-2.5 4.2-6.3 4.5-11.4V14.2c0-.5-.4-.8-.8-.8h-13.5zm6.3 8.2v18.3a9.6 9.6 0 0 1-5.6 2h-1a10.3 10.3 0 0 1-8.8-14c1.4-3.7 5-6.3 9-6.3h6.4zM291 31.5A32 32 0 0 1 322.8 0h30.8c.6 0 1.2.5 1.2 1.2v61.5c0 1.1-1.3 1.7-2.2 1l-19.2-17a18 18 0 0 1-11 3.4 18.1 18.1 0 1 1 18.2-14.8c-.1.4-.5.7-.9.6-.1 0-.3 0-.4-.2l-3.8-3.4c-.4-.3-.6-.8-.7-1.4a12 12 0 1 0-2.4 8.3c.4-.4 1-.5 1.6-.2l14.7 13.1v-46H323a26 26 0 1 0 10 49.7c.8-.4 1.6-.2 2.3.3l3 2.7c.3.2.3.7 0 1l-.2.2a32 32 0 0 1-47.2-28.6z\"\n />\n </svg>\n </a>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPoweredBy',\n mixins: [createSuitMixin({ name: 'PoweredBy' })],\n props: {\n theme: {\n default: 'light',\n validator(value) {\n return ['light', 'dark'].indexOf(value) !== -1;\n },\n },\n },\n computed: {\n algoliaUrl() {\n return (\n 'https://www.algolia.com/?' +\n 'utm_source=vue-instantsearch&' +\n 'utm_medium=website&' +\n `utm_content=${location ? location.hostname : ''}&` +\n 'utm_campaign=poweredby'\n );\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\">\n <a\n :class=\"suit('link')\"\n :href=\"algoliaUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"search by Algolia\"\n >\n <svg\n style=\"height: 1.2em; width: auto\"\n :class=\"[suit('logo'), suit('', theme)]\"\n viewBox=\"0 0 572 64\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#36395a'\"\n d=\"M16 48.3c-3.4 0-6.3-.6-8.7-1.7A12.4 12.4 0 0 1 1.9 42C.6 40 0 38 0 35.4h6.5a6.7 6.7 0 0 0 3.9 6c1.4.7 3.3 1.1 5.6 1.1 2.2 0 4-.3 5.4-1a7 7 0 0 0 3-2.4 6 6 0 0 0 1-3.4c0-1.5-.6-2.8-1.9-3.7-1.3-1-3.3-1.6-5.9-1.8l-4-.4c-3.7-.3-6.6-1.4-8.8-3.4a10 10 0 0 1-3.3-7.9c0-2.4.6-4.6 1.8-6.4a12 12 0 0 1 5-4.3c2.2-1 4.7-1.6 7.5-1.6s5.5.5 7.6 1.6a12 12 0 0 1 5 4.4c1.2 1.8 1.8 4 1.8 6.7h-6.5a6.4 6.4 0 0 0-3.5-5.9c-1-.6-2.6-1-4.4-1s-3.2.3-4.4 1c-1.1.6-2 1.4-2.6 2.4-.5 1-.8 2-.8 3.1a5 5 0 0 0 1.5 3.6c1 1 2.6 1.7 4.7 1.9l4 .3c2.8.2 5.2.8 7.2 1.8 2.1 1 3.7 2.2 4.9 3.8a9.7 9.7 0 0 1 1.7 5.8c0 2.5-.7 4.7-2 6.6a13 13 0 0 1-5.6 4.4c-2.4 1-5.2 1.6-8.4 1.6Zm35.6 0c-2.6 0-4.8-.4-6.7-1.3a13 13 0 0 1-4.7-3.5 17.1 17.1 0 0 1-3.6-10.4v-1c0-2 .3-3.8 1-5.6a13 13 0 0 1 7.3-8.3 15 15 0 0 1 6.3-1.4A13.2 13.2 0 0 1 64 24.3c1 2.2 1.6 4.6 1.6 7.2V34H39.4v-4.3h21.8l-1.8 2.2c0-2-.3-3.7-.9-5.1a7.3 7.3 0 0 0-2.7-3.4c-1.2-.7-2.7-1.1-4.6-1.1s-3.4.4-4.7 1.3a8 8 0 0 0-2.9 3.6c-.6 1.5-.9 3.3-.9 5.4 0 2 .3 3.7 1 5.3a7.9 7.9 0 0 0 2.8 3.7c1.3.8 3 1.3 5 1.3s3.8-.5 5.1-1.3c1.3-1 2.1-2 2.4-3.2h6a11.8 11.8 0 0 1-7 8.7 16 16 0 0 1-6.4 1.2ZM80 48c-2.2 0-4-.3-5.7-1a8.4 8.4 0 0 1-3.7-3.3 9.7 9.7 0 0 1-1.3-5.2c0-2 .5-3.8 1.5-5.2a9 9 0 0 1 4.3-3.1c1.8-.7 4-1 6.7-1H89v4.1h-7.5c-2 0-3.4.5-4.4 1.4-1 1-1.6 2.1-1.6 3.6s.5 2.7 1.6 3.6c1 1 2.5 1.4 4.4 1.4 1.1 0 2.2-.2 3.2-.7 1-.4 1.9-1 2.6-2 .6-1 1-2.4 1-4.2l1.7 2.1c-.2 2-.7 3.8-1.5 5.2a9 9 0 0 1-3.4 3.3 12 12 0 0 1-5.3 1Zm9.5-.7v-8.8h-1v-10c0-1.8-.5-3.2-1.4-4.1-1-1-2.4-1.4-4.2-1.4a142.9 142.9 0 0 0-10.2.4v-5.6a74.8 74.8 0 0 1 8.6-.4c3 0 5.5.4 7.5 1.2s3.4 2 4.4 3.6c1 1.7 1.4 4 1.4 6.7v18.4h-5Zm12.9 0V17.8h5v12.3h-.2c0-4.2 1-7.4 2.8-9.5a11 11 0 0 1 8.3-3.1h1v5.6h-2a9 9 0 0 0-6.3 2.2c-1.5 1.5-2.2 3.6-2.2 6.4v15.6h-6.4Zm34.4 1a15 15 0 0 1-6.6-1.3c-1.9-.9-3.4-2-4.7-3.5a15.5 15.5 0 0 1-2.7-5c-.6-1.7-1-3.6-1-5.4v-1c0-2 .4-3.8 1-5.6a15 15 0 0 1 2.8-4.9c1.3-1.5 2.8-2.6 4.6-3.5a16.4 16.4 0 0 1 13.3.2c2 1 3.5 2.3 4.8 4a12 12 0 0 1 2 6H144c-.2-1.6-1-3-2.2-4.1a7.5 7.5 0 0 0-5.2-1.7 8 8 0 0 0-4.7 1.3 8 8 0 0 0-2.8 3.6 13.8 13.8 0 0 0 0 10.3c.6 1.5 1.5 2.7 2.8 3.6s2.8 1.3 4.8 1.3c1.5 0 2.7-.2 3.8-.8a7 7 0 0 0 2.6-2c.7-1 1-2 1.2-3.2h6.2a11 11 0 0 1-2 6.2 15.1 15.1 0 0 1-11.8 5.5Zm19.7-1v-40h6.4V31h-1.3c0-3 .4-5.5 1.1-7.6a9.7 9.7 0 0 1 3.5-4.8A9.9 9.9 0 0 1 172 17h.3c3.5 0 6 1.1 7.9 3.5 1.7 2.3 2.6 5.7 2.6 10v16.8h-6.4V29.6c0-2.1-.6-3.8-1.8-5a6.4 6.4 0 0 0-4.8-1.8c-2 0-3.7.7-5 2a7.8 7.8 0 0 0-1.9 5.5v17h-6.4Zm63.8 1a12.2 12.2 0 0 1-10.9-6.2 19 19 0 0 1-1.8-7.3h1.4v12.5h-5.1v-40h6.4v19.8l-2 3.5c.2-3.1.8-5.7 1.9-7.7a11 11 0 0 1 4.4-4.5c1.8-1 3.9-1.5 6.1-1.5a13.4 13.4 0 0 1 12.8 9.1c.7 1.9 1 3.8 1 6v1c0 2.2-.3 4.1-1 6a13.6 13.6 0 0 1-13.2 9.4Zm-1.2-5.5a8.4 8.4 0 0 0 7.9-5c.7-1.5 1.1-3.3 1.1-5.3s-.4-3.8-1.1-5.3a8.7 8.7 0 0 0-3.2-3.6 9.6 9.6 0 0 0-9.2-.2 8.5 8.5 0 0 0-3.3 3.2c-.8 1.4-1.3 3-1.3 5v2.3a9 9 0 0 0 1.3 4.8 9 9 0 0 0 3.4 3c1.4.7 2.8 1 4.4 1Zm27.3 3.9-10-28.9h6.5l9.5 28.9h-6Zm-7.5 12.2v-5.7h4.9c1 0 2-.1 2.9-.4a4 4 0 0 0 2-1.4c.4-.7.9-1.6 1.2-2.7l8.6-30.9h6.2l-9.3 32.4a14 14 0 0 1-2.5 5 8.9 8.9 0 0 1-4 2.8c-1.5.6-3.4.9-5.6.9h-4.4Zm9-12.2v-5.2h6.4v5.2H248Z\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF' : '#003DFF'\"\n d=\"M534.4 9.1H528a.8.8 0 0 1-.7-.7V1.8c0-.4.2-.7.6-.8l6.5-1c.4 0 .8.2.9.6v7.8c0 .4-.4.7-.8.7zM428 35.2V.8c0-.5-.3-.8-.7-.8h-.2l-6.4 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.5 0 .8-.4.8-.8V43c0-.4-.3-.7-.6-.8-4.5-.5-4.5-6-4.5-7zm106.5-21.8H528c-.4 0-.7.4-.7.8v34c0 .4.3.8.7.8h6.5c.4 0 .8-.4.8-.8v-34c0-.5-.4-.8-.8-.8zm-17.7 21.8V.8c0-.5-.3-.8-.8-.8l-6.5 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.4 0 .8-.4.8-.8V43c0-.4-.3-.7-.7-.8-4.4-.5-4.4-6-4.4-7zm-22.2-20.6a16.5 16.5 0 0 1 8.6 9.3c.8 2.2 1.3 4.8 1.3 7.5a19.4 19.4 0 0 1-4.6 12.6 14.8 14.8 0 0 1-5.2 3.6c-2 .9-5.2 1.4-6.8 1.4a21 21 0 0 1-6.7-1.4 15.4 15.4 0 0 1-8.6-9.3 21.3 21.3 0 0 1 0-14.4 15.2 15.2 0 0 1 8.6-9.3c2-.8 4.3-1.2 6.7-1.2s4.6.4 6.7 1.2zm-6.7 27.6c2.7 0 4.7-1 6.2-3s2.2-4.3 2.2-7.8-.7-6.3-2.2-8.3-3.5-3-6.2-3-4.7 1-6.1 3c-1.5 2-2.2 4.8-2.2 8.3s.7 5.8 2.2 7.8 3.5 3 6.2 3zm-88.8-28.8c-6.2 0-11.7 3.3-14.8 8.2a18.6 18.6 0 0 0 4.8 25.2c1.8 1.2 4 1.8 6.2 1.7s.1 0 .1 0h.9c4.2-.7 8-4 9.1-8.1v7.4c0 .4.3.7.8.7h6.4a.7.7 0 0 0 .7-.7V14.2c0-.5-.3-.8-.7-.8h-13.5zm6.3 26.5a9.8 9.8 0 0 1-5.7 2h-.5a10 10 0 0 1-9.2-14c1.4-3.7 5-6.3 9-6.3h6.4v18.3zm152.3-26.5h13.5c.5 0 .8.3.8.7v33.7c0 .4-.3.7-.8.7h-6.4a.7.7 0 0 1-.8-.7v-7.4c-1.2 4-4.8 7.4-9 8h-.1a4.2 4.2 0 0 1-.5.1h-.9a10.3 10.3 0 0 1-7-2.6c-4-3.3-6.5-8.4-6.5-14.2 0-3.7 1-7.2 3-10 3-5 8.5-8.3 14.7-8.3zm.6 28.4c2.2-.1 4.2-.6 5.7-2V21.7h-6.3a9.8 9.8 0 0 0-9 6.4 10.2 10.2 0 0 0 9.1 13.9h.5zM452.8 13.4c-6.2 0-11.7 3.3-14.8 8.2a18.5 18.5 0 0 0 3.6 24.3 10.4 10.4 0 0 0 13 .6c2.2-1.5 3.8-3.7 4.5-6.1v7.8c0 2.8-.8 5-2.2 6.3-1.5 1.5-4 2.2-7.5 2.2l-6-.3c-.3 0-.7.2-.8.5l-1.6 5.5c-.1.4.1.8.5 1h.1c2.8.4 5.5.6 7 .6 6.3 0 11-1.4 14-4.1 2.7-2.5 4.2-6.3 4.5-11.4V14.2c0-.5-.4-.8-.8-.8h-13.5zm6.3 8.2v18.3a9.6 9.6 0 0 1-5.6 2h-1a10.3 10.3 0 0 1-8.8-14c1.4-3.7 5-6.3 9-6.3h6.4zM291 31.5A32 32 0 0 1 322.8 0h30.8c.6 0 1.2.5 1.2 1.2v61.5c0 1.1-1.3 1.7-2.2 1l-19.2-17a18 18 0 0 1-11 3.4 18.1 18.1 0 1 1 18.2-14.8c-.1.4-.5.7-.9.6-.1 0-.3 0-.4-.2l-3.8-3.4c-.4-.3-.6-.8-.7-1.4a12 12 0 1 0-2.4 8.3c.4-.4 1-.5 1.6-.2l14.7 13.1v-46H323a26 26 0 1 0 10 49.7c.8-.4 1.6-.2 2.3.3l3 2.7c.3.2.3.7 0 1l-.2.2a32 32 0 0 1-47.2-28.6z\"\n />\n </svg>\n </a>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPoweredBy',\n mixins: [createSuitMixin({ name: 'PoweredBy' })],\n props: {\n theme: {\n default: 'light',\n validator(value) {\n return ['light', 'dark'].indexOf(value) !== -1;\n },\n },\n },\n computed: {\n algoliaUrl() {\n return (\n 'https://www.algolia.com/?' +\n 'utm_source=vue-instantsearch&' +\n 'utm_medium=website&' +\n `utm_content=${location ? location.hostname : ''}&` +\n 'utm_campaign=poweredby'\n );\n },\n },\n};\n</script>\n","import { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisQueryRuleContext',\n mixins: [\n createSuitMixin({ name: 'QueryRuleContext' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleContext',\n }\n ),\n ],\n props: {\n trackedFilters: {\n type: Object,\n required: true,\n },\n transformRuleContexts: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n trackedFilters: this.trackedFilters,\n transformRuleContexts: this.transformRuleContexts,\n };\n },\n },\n render() {\n return null;\n },\n};\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot :items=\"state.items\">\n <div v-for=\"(item, key) in state.items\" :key=\"key\">\n <slot name=\"item\" :item=\"item\">\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisQueryRuleCustomData',\n mixins: [\n createSuitMixin({ name: 'QueryRuleCustomData' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleCustomData',\n }\n ),\n ],\n props: {\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot :items=\"state.items\">\n <div v-for=\"(item, key) in state.items\" :key=\"key\">\n <slot name=\"item\" :item=\"item\">\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisQueryRuleCustomData',\n mixins: [\n createSuitMixin({ name: 'QueryRuleCustomData' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleCustomData',\n }\n ),\n ],\n props: {\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :current-refinement=\"values\"\n :refine=\"refine\"\n :can-refine=\"state.canRefine\"\n :range=\"state.range\"\n :send-event=\"state.sendEvent\"\n >\n <form\n :class=\"suit('form')\"\n @submit.prevent=\"\n refine({\n min: pick(minInput, values.min),\n max: pick(maxInput, values.max),\n })\n \"\n >\n <label :class=\"suit('label')\">\n <slot name=\"minLabel\" />\n <input\n type=\"number\"\n :class=\"[suit('input'), suit('input', 'min')]\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.min\"\n :value=\"values.min\"\n @change=\"minInput = $event.currentTarget.value\"\n />\n </label>\n <span :class=\"suit('separator')\">\n <slot name=\"separator\">to</slot>\n </span>\n <label :class=\"suit('label')\">\n <slot name=\"maxLabel\" />\n <input\n :class=\"[suit('input'), suit('input', 'max')]\"\n type=\"number\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.max\"\n :value=\"values.max\"\n @change=\"maxInput = $event.currentTarget.value\"\n />\n </label>\n <button :class=\"suit('submit')\" type=\"submit\">\n <slot name=\"submitLabel\"> Go </slot>\n </button>\n </form>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRange } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRangeInput',\n mixins: [\n createSuitMixin({ name: 'RangeInput' }),\n createWidgetMixin(\n {\n connector: connectRange,\n },\n {\n $$widgetType: 'ais.rangeInput',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n min: {\n type: Number,\n required: false,\n default: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n step() {\n return 1 / Math.pow(10, this.precision);\n },\n values() {\n const [minValue, maxValue] = this.state.start;\n const { min: minRange, max: maxRange } = this.state.range;\n\n return {\n min:\n minValue !== -Infinity && minValue !== minRange\n ? minValue\n : undefined,\n max:\n maxValue !== Infinity && maxValue !== maxRange ? maxValue : undefined,\n };\n },\n },\n methods: {\n pick(first, second) {\n if (first !== null && first !== undefined) {\n return first;\n } else {\n return second;\n }\n },\n refine({ min, max }) {\n this.state.refine([min, max]);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :current-refinement=\"values\"\n :refine=\"refine\"\n :can-refine=\"state.canRefine\"\n :range=\"state.range\"\n :send-event=\"state.sendEvent\"\n >\n <form\n :class=\"suit('form')\"\n @submit.prevent=\"\n refine({\n min: pick(minInput, values.min),\n max: pick(maxInput, values.max),\n })\n \"\n >\n <label :class=\"suit('label')\">\n <slot name=\"minLabel\" />\n <input\n type=\"number\"\n :class=\"[suit('input'), suit('input', 'min')]\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.min\"\n :value=\"values.min\"\n @change=\"minInput = $event.currentTarget.value\"\n />\n </label>\n <span :class=\"suit('separator')\">\n <slot name=\"separator\">to</slot>\n </span>\n <label :class=\"suit('label')\">\n <slot name=\"maxLabel\" />\n <input\n :class=\"[suit('input'), suit('input', 'max')]\"\n type=\"number\"\n :step=\"step\"\n :min=\"state.range.min\"\n :max=\"state.range.max\"\n :placeholder=\"state.range.max\"\n :value=\"values.max\"\n @change=\"maxInput = $event.currentTarget.value\"\n />\n </label>\n <button :class=\"suit('submit')\" type=\"submit\">\n <slot name=\"submitLabel\"> Go </slot>\n </button>\n </form>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRange } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRangeInput',\n mixins: [\n createSuitMixin({ name: 'RangeInput' }),\n createWidgetMixin(\n {\n connector: connectRange,\n },\n {\n $$widgetType: 'ais.rangeInput',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n min: {\n type: Number,\n required: false,\n default: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n step() {\n return 1 / Math.pow(10, this.precision);\n },\n values() {\n const [minValue, maxValue] = this.state.start;\n const { min: minRange, max: maxRange } = this.state.range;\n\n return {\n min:\n minValue !== -Infinity && minValue !== minRange\n ? minValue\n : undefined,\n max:\n maxValue !== Infinity && maxValue !== maxRange ? maxValue : undefined,\n };\n },\n },\n methods: {\n pick(first, second) {\n if (first !== null && first !== undefined) {\n return first;\n } else {\n return second;\n }\n },\n refine({ min, max }) {\n this.state.refine([min, max]);\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n :can-refine=\"state.canRefine\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: none\">\n <symbol id=\"ais-RatingMenu-starSymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 .288l2.833 8.718h9.167l-7.417 5.389 2.833 8.718-7.416-5.388-7.417 5.388 2.833-8.718-7.416-5.389h9.167z\"\n />\n </symbol>\n <symbol id=\"ais-RatingMenu-starEmptySymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 6.76l1.379 4.246h4.465l-3.612 2.625 1.379 4.246-3.611-2.625-3.612 2.625 1.379-4.246-3.612-2.625h4.465l1.38-4.246zm0-6.472l-2.833 8.718h-9.167l7.416 5.389-2.833 8.718 7.417-5.388 7.416 5.388-2.833-8.718 7.417-5.389h-9.167l-2.833-8.718z\"\n />\n </symbol>\n </svg>\n\n <ul :class=\"suit('list')\">\n <li\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :aria-label=\"`${item.value} & Up`\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <template v-for=\"(full, n) in item.stars\">\n <svg\n v-if=\"full\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :class=\"[suit('starIcon'), suit('starIcon--full')]\"\n :key=\"n + '-full'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starSymbol\" />\n </svg>\n\n <svg\n v-else\n :class=\"[suit('starIcon'), suit('starIcon--empty')]\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :key=\"n + '-empty'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starEmptySymbol\" />\n </svg>\n </template>\n\n <span :class=\"suit('label')\" aria-hidden=\"true\">\n <slot name=\"andUp\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin(\n {\n connector: connectRatingMenu,\n },\n {\n $$widgetType: 'ais.ratingMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n max: {\n type: Number,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n max: this.max,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n :can-refine=\"state.canRefine\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: none\">\n <symbol id=\"ais-RatingMenu-starSymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 .288l2.833 8.718h9.167l-7.417 5.389 2.833 8.718-7.416-5.388-7.417 5.388 2.833-8.718-7.416-5.389h9.167z\"\n />\n </symbol>\n <symbol id=\"ais-RatingMenu-starEmptySymbol\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 6.76l1.379 4.246h4.465l-3.612 2.625 1.379 4.246-3.611-2.625-3.612 2.625 1.379-4.246-3.612-2.625h4.465l1.38-4.246zm0-6.472l-2.833 8.718h-9.167l7.416 5.389-2.833 8.718 7.417-5.388 7.416 5.388-2.833-8.718 7.417-5.389h-9.167l-2.833-8.718z\"\n />\n </symbol>\n </svg>\n\n <ul :class=\"suit('list')\">\n <li\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :aria-label=\"`${item.value} & Up`\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <template v-for=\"(full, n) in item.stars\">\n <svg\n v-if=\"full\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :class=\"[suit('starIcon'), suit('starIcon--full')]\"\n :key=\"n + '-full'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starSymbol\" />\n </svg>\n\n <svg\n v-else\n :class=\"[suit('starIcon'), suit('starIcon--empty')]\"\n aria-hidden=\"true\"\n width=\"24\"\n height=\"24\"\n :key=\"n + '-empty'\"\n >\n <use xlink:href=\"#ais-RatingMenu-starEmptySymbol\" />\n </svg>\n </template>\n\n <span :class=\"suit('label')\" aria-hidden=\"true\">\n <slot name=\"andUp\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin(\n {\n connector: connectRatingMenu,\n },\n {\n $$widgetType: 'ais.ratingMenu',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n max: {\n type: Number,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n max: this.max,\n };\n },\n },\n};\n</script>\n","<template>\n <form\n action=\"\"\n role=\"search\"\n novalidate\n :class=\"suit('form')\"\n @submit.prevent=\"onFormSubmit\"\n @reset.prevent=\"onFormReset\"\n >\n <!-- :value/@input allows us to pass v-model to the component in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"onInput($event)\"\n @compositionend=\"onInput($event)\"\n ref=\"input\"\n />\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n aria-hidden=\"true\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"\n (!value && !modelValue) ||\n (showLoadingIndicator && shouldShowLoadingIndicator)\n \"\n >\n <slot name=\"reset-icon\">\n <svg\n aria-hidden=\"true\"\n height=\"10\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n width=\"10\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n :aria-hidden=\"!shouldShowLoadingIndicator\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(1 1)\" stroke-width=\"2\">\n <circle stroke-opacity=\".5\" cx=\"18\" cy=\"18\" r=\"18\" />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n isFocused() {\n return document.activeElement === this.$refs.input;\n },\n onInput(event) {\n if (!(this.ignoreCompositionEvents && event.isComposing)) {\n this.$emit('input', event.target.value);\n this.$emit('update:modelValue', event.target.value);\n }\n },\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <form\n action=\"\"\n role=\"search\"\n novalidate\n :class=\"suit('form')\"\n @submit.prevent=\"onFormSubmit\"\n @reset.prevent=\"onFormReset\"\n >\n <!-- :value/@input allows us to pass v-model to the component in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"onInput($event)\"\n @compositionend=\"onInput($event)\"\n ref=\"input\"\n />\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n aria-hidden=\"true\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"\n (!value && !modelValue) ||\n (showLoadingIndicator && shouldShowLoadingIndicator)\n \"\n >\n <slot name=\"reset-icon\">\n <svg\n aria-hidden=\"true\"\n height=\"10\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n width=\"10\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n :aria-hidden=\"!shouldShowLoadingIndicator\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g fill=\"none\" fill-rule=\"evenodd\">\n <g transform=\"translate(1 1)\" stroke-width=\"2\">\n <circle stroke-opacity=\".5\" cx=\"18\" cy=\"18\" r=\"18\" />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n isFocused() {\n return document.activeElement === this.$refs.input;\n },\n onInput(event) {\n if (!(this.ignoreCompositionEvents && event.isComposing)) {\n this.$emit('input', event.target.value);\n this.$emit('update:modelValue', event.target.value);\n }\n },\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"items\"\n :refine=\"refine\"\n :search-for-items=\"state.searchForItems\"\n :search-for-items-query=\"searchForFacetValuesQuery\"\n :toggle-show-more=\"toggleShowMore\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :createURL=\"state.createURL\"\n :is-from-search=\"state.isFromSearch\"\n :can-refine=\"state.canRefine\"\n :send-event=\"state.sendEvent\"\n >\n <div :class=\"suit('searchBox')\" v-if=\"searchable\">\n <search-input\n v-model=\"searchForFacetValues\"\n :placeholder=\"searchablePlaceholder\"\n :class-names=\"classNames\"\n />\n </div>\n <slot\n name=\"noResults\"\n :query=\"searchForFacetValues\"\n v-if=\"state.isFromSearch && items.length === 0\"\n >\n <div :class=\"suit('noResults')\">No results.</div>\n </slot>\n <ul :class=\"suit('list')\">\n <li\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n v-for=\"item in items\"\n :key=\"item.value\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"refine(item.value)\"\n />\n <span v-if=\"searchable\" :class=\"suit('labelText')\">\n <ais-highlight attribute=\"item\" :hit=\"item\" />\n </span>\n <span v-else :class=\"suit('labelText')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </label>\n </slot>\n </li>\n </ul>\n <button\n :class=\"[\n suit('showMore'),\n {\n [suit('showMore', 'disabled')]: !state.canToggleShowMore,\n },\n ]\"\n @click=\"toggleShowMore\"\n v-if=\"showMore\"\n :disabled=\"!state.canToggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n Show {{ state.isShowingMore ? 'less' : 'more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport AisHighlight from './Highlight.vue';\nimport SearchInput from './SearchInput.vue';\n\nconst noop = () => {};\n\nexport default {\n name: 'AisRefinementList',\n components: { SearchInput, AisHighlight },\n mixins: [\n createSuitMixin({ name: 'RefinementList' }),\n createWidgetMixin(\n {\n connector: connectRefinementList,\n },\n {\n $$widgetType: 'ais.refinementList',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n searchable: {\n type: Boolean,\n default: undefined,\n },\n searchablePlaceholder: {\n type: String,\n required: false,\n default: 'Search here…',\n },\n operator: {\n default: 'or',\n validator(value) {\n return value === 'and' || value === 'or';\n },\n required: false,\n },\n limit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n required: false,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n required: false,\n default: undefined,\n },\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n data() {\n return {\n searchForFacetValuesQuery: '',\n };\n },\n computed: {\n searchForFacetValues: {\n get() {\n return this.searchForFacetValuesQuery;\n },\n set(value) {\n this.state.searchForItems(value);\n this.searchForFacetValuesQuery = value;\n },\n },\n toggleShowMore() {\n return this.state.toggleShowMore || noop;\n },\n items() {\n return this.state.items.map((item) =>\n Object.assign({}, item, {\n _highlightResult: {\n item: {\n value: item.highlighted,\n },\n },\n })\n );\n },\n widgetParams() {\n return {\n attribute: this.attribute,\n operator: this.operator,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n escapeFacetValues: true,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n this.searchForFacetValuesQuery = '';\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"items\"\n :refine=\"refine\"\n :search-for-items=\"state.searchForItems\"\n :search-for-items-query=\"searchForFacetValuesQuery\"\n :toggle-show-more=\"toggleShowMore\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :createURL=\"state.createURL\"\n :is-from-search=\"state.isFromSearch\"\n :can-refine=\"state.canRefine\"\n :send-event=\"state.sendEvent\"\n >\n <div :class=\"suit('searchBox')\" v-if=\"searchable\">\n <search-input\n v-model=\"searchForFacetValues\"\n :placeholder=\"searchablePlaceholder\"\n :class-names=\"classNames\"\n />\n </div>\n <slot\n name=\"noResults\"\n :query=\"searchForFacetValues\"\n v-if=\"state.isFromSearch && items.length === 0\"\n >\n <div :class=\"suit('noResults')\">No results.</div>\n </slot>\n <ul :class=\"suit('list')\">\n <li\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n v-for=\"item in items\"\n :key=\"item.value\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"refine(item.value)\"\n />\n <span v-if=\"searchable\" :class=\"suit('labelText')\">\n <ais-highlight attribute=\"item\" :hit=\"item\" />\n </span>\n <span v-else :class=\"suit('labelText')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </label>\n </slot>\n </li>\n </ul>\n <button\n :class=\"[\n suit('showMore'),\n {\n [suit('showMore', 'disabled')]: !state.canToggleShowMore,\n },\n ]\"\n @click=\"toggleShowMore\"\n v-if=\"showMore\"\n :disabled=\"!state.canToggleShowMore\"\n >\n <slot name=\"showMoreLabel\" :is-showing-more=\"state.isShowingMore\">\n Show {{ state.isShowingMore ? 'less' : 'more' }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nimport AisHighlight from './Highlight.vue';\nimport SearchInput from './SearchInput.vue';\n\nconst noop = () => {};\n\nexport default {\n name: 'AisRefinementList',\n components: { SearchInput, AisHighlight },\n mixins: [\n createSuitMixin({ name: 'RefinementList' }),\n createWidgetMixin(\n {\n connector: connectRefinementList,\n },\n {\n $$widgetType: 'ais.refinementList',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n searchable: {\n type: Boolean,\n default: undefined,\n },\n searchablePlaceholder: {\n type: String,\n required: false,\n default: 'Search here…',\n },\n operator: {\n default: 'or',\n validator(value) {\n return value === 'and' || value === 'or';\n },\n required: false,\n },\n limit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMoreLimit: {\n type: Number,\n required: false,\n default: undefined,\n },\n showMore: {\n type: Boolean,\n required: false,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n required: false,\n default: undefined,\n },\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n data() {\n return {\n searchForFacetValuesQuery: '',\n };\n },\n computed: {\n searchForFacetValues: {\n get() {\n return this.searchForFacetValuesQuery;\n },\n set(value) {\n this.state.searchForItems(value);\n this.searchForFacetValuesQuery = value;\n },\n },\n toggleShowMore() {\n return this.state.toggleShowMore || noop;\n },\n items() {\n return this.state.items.map((item) =>\n Object.assign({}, item, {\n _highlightResult: {\n item: {\n value: item.highlighted,\n },\n },\n })\n );\n },\n widgetParams() {\n return {\n attribute: this.attribute,\n operator: this.operator,\n limit: this.limit,\n showMore: this.showMore,\n showMoreLimit: this.showMoreLimit,\n sortBy: this.sortBy,\n escapeFacetValues: true,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n refine(value) {\n this.state.refine(value);\n this.searchForFacetValuesQuery = '';\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state && state.state && state.results\">\n <slot v-bind=\"stateResults\">\n <p>\n Use this component to have a different layout based on a certain state.\n </p>\n <p>Fill in the slot, and get access to the following things:</p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</pre>\n <pre>status: {{ state.status }}</pre>\n <pre>error: {{ state.error }}</pre>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin({ connector: true }),\n createSuitMixin({ name: 'StateResults' }),\n ],\n props: {\n catchError: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n renderFn: () => {\n const { status, error } = this.instantSearchInstance;\n const results = this.getParentIndex().getResults();\n const helper = this.getParentIndex().getHelper();\n const state = helper ? helper.state : null;\n\n // @MAJOR no longer spread this inside `results`\n this.state = {\n results,\n state,\n status,\n error,\n };\n },\n };\n },\n created() {\n this.instantSearchInstance.addListener('render', this.renderFn);\n this.renderFn();\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.instantSearchInstance.removeListener('render', this.renderFn);\n if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n }\n }\n },\n watch: {\n catchError: {\n immediate: true,\n handler(catchError) {\n if (catchError) {\n this.errorFn = () => {};\n this.instantSearchInstance.addListener('error', this.errorFn);\n } else if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n this.errorFn = undefined;\n }\n },\n },\n },\n computed: {\n stateResults() {\n const { results, state, status, error } = this.state;\n return _objectSpread({}, results, { results, state, status, error });\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state && state.state && state.results\">\n <slot v-bind=\"stateResults\">\n <p>\n Use this component to have a different layout based on a certain state.\n </p>\n <p>Fill in the slot, and get access to the following things:</p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</pre>\n <pre>status: {{ state.status }}</pre>\n <pre>error: {{ state.error }}</pre>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3 } from '../util/vue-compat';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin({ connector: true }),\n createSuitMixin({ name: 'StateResults' }),\n ],\n props: {\n catchError: {\n type: Boolean,\n default: false,\n },\n },\n data() {\n return {\n renderFn: () => {\n const { status, error } = this.instantSearchInstance;\n const results = this.getParentIndex().getResults();\n const helper = this.getParentIndex().getHelper();\n const state = helper ? helper.state : null;\n\n // @MAJOR no longer spread this inside `results`\n this.state = {\n results,\n state,\n status,\n error,\n };\n },\n };\n },\n created() {\n this.instantSearchInstance.addListener('render', this.renderFn);\n this.renderFn();\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.instantSearchInstance.removeListener('render', this.renderFn);\n if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n }\n }\n },\n watch: {\n catchError: {\n immediate: true,\n handler(catchError) {\n if (catchError) {\n this.errorFn = () => {};\n this.instantSearchInstance.addListener('error', this.errorFn);\n } else if (this.errorFn) {\n this.instantSearchInstance.removeListener('error', this.errorFn);\n this.errorFn = undefined;\n }\n },\n },\n },\n computed: {\n stateResults() {\n const { results, state, status, error } = this.state;\n return _objectSpread({}, results, { results, state, status, error });\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :current-refinement=\"currentRefinement\"\n :is-search-stalled=\"state.isSearchStalled\"\n :refine=\"state.refine\"\n >\n <search-input\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @reset=\"$emit('reset')\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :show-loading-indicator=\"showLoadingIndicator\"\n :should-show-loading-indicator=\"state.isSearchStalled\"\n :ignore-composition-events=\"ignoreCompositionEvents\"\n :submit-title=\"submitTitle\"\n :reset-title=\"resetTitle\"\n :class-names=\"classNames\"\n v-model=\"currentRefinement\"\n ref=\"searchInput\"\n >\n <template #loading-indicator v-if=\"isVue3\">\n <slot name=\"loading-indicator\" />\n </template>\n <slot v-if=\"isVue2\" name=\"loading-indicator\" slot=\"loading-indicator\" />\n\n <template #submit-icon v-if=\"isVue3\">\n <slot name=\"submit-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"submit-icon\" slot=\"submit-icon\" />\n\n <template #reset-icon v-if=\"isVue3\">\n <slot name=\"reset-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"reset-icon\" slot=\"reset-icon\" />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\n\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin(\n {\n connector: connectSearchBox,\n },\n {\n $$widgetType: 'ais.searchBox',\n }\n ),\n createSuitMixin({ name: 'SearchBox' }),\n ],\n components: {\n SearchInput,\n },\n props: {\n placeholder: {\n type: String,\n default: '',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: true,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Submit the search query',\n },\n resetTitle: {\n type: String,\n default: 'Clear the search query',\n },\n value: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: String,\n default: undefined,\n },\n queryHook: {\n type: Function,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n widgetParams() {\n return {\n queryHook: this.queryHook,\n };\n },\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n\n // we return the local value if the input is focused to avoid\n // concurrent updates when typing\n const { searchInput } = this.$refs;\n if (searchInput && searchInput.isFocused()) {\n return this.localValue;\n }\n\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n :current-refinement=\"currentRefinement\"\n :is-search-stalled=\"state.isSearchStalled\"\n :refine=\"state.refine\"\n >\n <search-input\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @reset=\"$emit('reset')\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :show-loading-indicator=\"showLoadingIndicator\"\n :should-show-loading-indicator=\"state.isSearchStalled\"\n :ignore-composition-events=\"ignoreCompositionEvents\"\n :submit-title=\"submitTitle\"\n :reset-title=\"resetTitle\"\n :class-names=\"classNames\"\n v-model=\"currentRefinement\"\n ref=\"searchInput\"\n >\n <template #loading-indicator v-if=\"isVue3\">\n <slot name=\"loading-indicator\" />\n </template>\n <slot v-if=\"isVue2\" name=\"loading-indicator\" slot=\"loading-indicator\" />\n\n <template #submit-icon v-if=\"isVue3\">\n <slot name=\"submit-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"submit-icon\" slot=\"submit-icon\" />\n\n <template #reset-icon v-if=\"isVue3\">\n <slot name=\"reset-icon\" />\n </template>\n <slot v-if=\"isVue2\" name=\"reset-icon\" slot=\"reset-icon\" />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\n\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin(\n {\n connector: connectSearchBox,\n },\n {\n $$widgetType: 'ais.searchBox',\n }\n ),\n createSuitMixin({ name: 'SearchBox' }),\n ],\n components: {\n SearchInput,\n },\n props: {\n placeholder: {\n type: String,\n default: '',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: true,\n },\n ignoreCompositionEvents: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Submit the search query',\n },\n resetTitle: {\n type: String,\n default: 'Clear the search query',\n },\n value: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: String,\n default: undefined,\n },\n queryHook: {\n type: Function,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n widgetParams() {\n return {\n queryHook: this.queryHook,\n };\n },\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n\n // we return the local value if the input is focused to avoid\n // concurrent updates when typing\n const { searchInput } = this.$refs;\n if (searchInput && searchInput.isFocused()) {\n return this.localValue;\n }\n\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_snippetResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from '../util/vue-compat/Highlighter';\n\nexport default {\n name: 'AisSnippet',\n mixins: [createSuitMixin({ name: 'Snippet' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_snippetResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from '../util/vue-compat/Highlighter';\n\nexport default {\n name: 'AisSnippet',\n mixins: [createSuitMixin({ name: 'Snippet' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :items=\"state.options\"\n :has-no-results=\"state.hasNoResults\"\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :can-refine=\"state.canRefine\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine($event.currentTarget.value)\"\n aria-label=\"Sort results by\"\n >\n <option\n v-for=\"item in state.options\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.value === state.currentRefinement\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSortBy } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisSortBy',\n mixins: [\n createSuitMixin({ name: 'SortBy' }),\n createWidgetMixin(\n { connector: connectSortBy },\n {\n $$widgetType: 'ais.sortBy',\n }\n ),\n\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\" v-if=\"state\">\n <slot\n :items=\"state.options\"\n :has-no-results=\"state.hasNoResults\"\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :can-refine=\"state.canRefine\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"state.refine($event.currentTarget.value)\"\n aria-label=\"Sort results by\"\n >\n <option\n v-for=\"item in state.options\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.value === state.currentRefinement\"\n >\n {{ item.label }}\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSortBy } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisSortBy',\n mixins: [\n createSuitMixin({ name: 'SortBy' }),\n createWidgetMixin(\n { connector: connectSortBy },\n {\n $$widgetType: 'ais.sortBy',\n }\n ),\n\n createPanelConsumerMixin(),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-bind=\"state\"\n :results=\"state.instantSearchInstance.helper.lastResults\"\n >\n <!-- prettier-ignore -->\n <span :class=\"suit('text')\"\n ><template v-if=\"state.areHitsSorted\"\n >{{ sortedResultsSentence }}</template\n ><template v-else>{{ resultsSentence }}</template\n > found in {{ state.processingTimeMS.toLocaleString() }}ms</span\n >\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectStats } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisStats',\n mixins: [\n createWidgetMixin(\n { connector: connectStats },\n {\n $$widgetType: 'ais.stats',\n }\n ),\n createSuitMixin({ name: 'Stats' }),\n ],\n computed: {\n sortedResultsSentence() {\n const { nbHits, nbSortedHits } = this.state;\n\n const suffix = `sorted out of ${nbHits.toLocaleString()}`;\n\n if (nbSortedHits === 0) {\n return `No relevant results ${suffix}`;\n }\n\n if (nbSortedHits === 1) {\n return `1 relevant result ${suffix}`;\n }\n\n if (nbSortedHits > 1) {\n return `${(\n nbSortedHits || 0\n ).toLocaleString()} relevant results ${suffix}`;\n }\n\n return '';\n },\n resultsSentence() {\n const { nbHits } = this.state;\n\n if (nbHits === 0) {\n return 'No results';\n }\n\n if (nbHits === 1) {\n return '1 result';\n }\n\n if (nbHits > 1) {\n return `${nbHits.toLocaleString()} results`;\n }\n\n return '';\n },\n widgetParams() {\n return {};\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot\n v-bind=\"state\"\n :results=\"state.instantSearchInstance.helper.lastResults\"\n >\n <!-- prettier-ignore -->\n <span :class=\"suit('text')\"\n ><template v-if=\"state.areHitsSorted\"\n >{{ sortedResultsSentence }}</template\n ><template v-else>{{ resultsSentence }}</template\n > found in {{ state.processingTimeMS.toLocaleString() }}ms</span\n >\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectStats } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisStats',\n mixins: [\n createWidgetMixin(\n { connector: connectStats },\n {\n $$widgetType: 'ais.stats',\n }\n ),\n createSuitMixin({ name: 'Stats' }),\n ],\n computed: {\n sortedResultsSentence() {\n const { nbHits, nbSortedHits } = this.state;\n\n const suffix = `sorted out of ${nbHits.toLocaleString()}`;\n\n if (nbSortedHits === 0) {\n return `No relevant results ${suffix}`;\n }\n\n if (nbSortedHits === 1) {\n return `1 relevant result ${suffix}`;\n }\n\n if (nbSortedHits > 1) {\n return `${(\n nbSortedHits || 0\n ).toLocaleString()} relevant results ${suffix}`;\n }\n\n return '';\n },\n resultsSentence() {\n const { nbHits } = this.state;\n\n if (nbHits === 0) {\n return 'No results';\n }\n\n if (nbHits === 1) {\n return '1 result';\n }\n\n if (nbHits > 1) {\n return `${nbHits.toLocaleString()} results`;\n }\n\n return '';\n },\n widgetParams() {\n return {};\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :value=\"state.value\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :name=\"state.value.name\"\n :value=\"on\"\n :checked=\"state.value.isRefined\"\n @change=\"state.refine(state.value)\"\n />\n <span :class=\"suit('labelText')\">{{ label || state.value.name }}</span>\n <span v-if=\"state.value.count !== null\" :class=\"suit('count')\">{{\n state.value.count.toLocaleString()\n }}</span>\n </label>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectToggleRefinement } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisToggleRefinement',\n mixins: [\n createSuitMixin({ name: 'ToggleRefinement' }),\n createWidgetMixin(\n {\n connector: connectToggleRefinement,\n },\n {\n $$widgetType: 'ais.toggleRefinement',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n on: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: true,\n },\n off: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n on: this.on,\n off: this.off,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :value=\"state.value\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :name=\"state.value.name\"\n :value=\"on\"\n :checked=\"state.value.isRefined\"\n @change=\"state.refine(state.value)\"\n />\n <span :class=\"suit('labelText')\">{{ label || state.value.name }}</span>\n <span v-if=\"state.value.count !== null\" :class=\"suit('count')\">{{\n state.value.count.toLocaleString()\n }}</span>\n </label>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectToggleRefinement } from 'instantsearch.js/es/connectors';\n\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisToggleRefinement',\n mixins: [\n createSuitMixin({ name: 'ToggleRefinement' }),\n createWidgetMixin(\n {\n connector: connectToggleRefinement,\n },\n {\n $$widgetType: 'ais.toggleRefinement',\n }\n ),\n createPanelConsumerMixin(),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n on: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: true,\n },\n off: {\n type: [String, Number, Boolean, Array],\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n on: this.on,\n off: this.off,\n };\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot v-bind=\"rootSlotProps\">\n <button\n type=\"button\"\n :class=\"suit('button')\"\n :title=\"state.isBrowserSupported ? buttonTitle : disabledButtonTitle\"\n :disabled=\"!state.isBrowserSupported\"\n @click=\"handleClick\"\n >\n <slot name=\"buttonText\" v-bind=\"innerSlotProps\">\n <svg v-bind=\"buttonSvgAttrs\" v-if=\"errorNotAllowed\">\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\" />\n <path d=\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n <svg v-bind=\"buttonSvgAttrs\" v-else>\n <path\n d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"\n :fill=\"state.isListening ? 'currentColor' : 'none'\"\n />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n </slot>\n </button>\n <div :class=\"suit('status')\">\n <slot name=\"status\" v-bind=\"innerSlotProps\">\n <p>{{ state.voiceListeningState.transcript }}</p>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectVoiceSearch } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisVoiceSearch',\n mixins: [\n createWidgetMixin(\n {\n connector: connectVoiceSearch,\n },\n {\n $$widgetType: 'ais.voiceSearch',\n }\n ),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n language: {\n type: String,\n default: undefined,\n },\n additionalQueryParameters: {\n type: Object,\n default: undefined,\n },\n buttonTitle: {\n type: String,\n required: false,\n default: 'Search by voice',\n },\n disabledButtonTitle: {\n type: String,\n required: false,\n default: 'Search by voice (not supported on this browser)',\n },\n },\n data() {\n return {\n buttonSvgAttrs: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '2',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n };\n },\n computed: {\n widgetParams() {\n return {\n searchAsYouSpeak: this.searchAsYouSpeak,\n language: this.language,\n additionalQueryParameters: this.additionalQueryParameters,\n };\n },\n errorNotAllowed() {\n return (\n this.state.voiceListeningState.status === 'error' &&\n this.state.voiceListeningState.errorCode === 'not-allowed'\n );\n },\n rootSlotProps() {\n return {\n isBrowserSupported: this.state.isBrowserSupported,\n isListening: this.state.isListening,\n toggleListening: this.state.toggleListening,\n voiceListeningState: this.state.voiceListeningState,\n };\n },\n innerSlotProps() {\n return {\n status: this.state.voiceListeningState.status,\n errorCode: this.state.voiceListeningState.errorCode,\n isListening: this.state.isListening,\n transcript: this.state.voiceListeningState.transcript,\n isSpeechFinal: this.state.voiceListeningState.isSpeechFinal,\n isBrowserSupported: this.state.isBrowserSupported,\n };\n },\n },\n methods: {\n handleClick(event) {\n event.currentTarget.blur();\n this.state.toggleListening();\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state\" :class=\"suit()\">\n <slot v-bind=\"rootSlotProps\">\n <button\n type=\"button\"\n :class=\"suit('button')\"\n :title=\"state.isBrowserSupported ? buttonTitle : disabledButtonTitle\"\n :disabled=\"!state.isBrowserSupported\"\n @click=\"handleClick\"\n >\n <slot name=\"buttonText\" v-bind=\"innerSlotProps\">\n <svg v-bind=\"buttonSvgAttrs\" v-if=\"errorNotAllowed\">\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\" />\n <path d=\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n <svg v-bind=\"buttonSvgAttrs\" v-else>\n <path\n d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"\n :fill=\"state.isListening ? 'currentColor' : 'none'\"\n />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n </slot>\n </button>\n <div :class=\"suit('status')\">\n <slot name=\"status\" v-bind=\"innerSlotProps\">\n <p>{{ state.voiceListeningState.transcript }}</p>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectVoiceSearch } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisVoiceSearch',\n mixins: [\n createWidgetMixin(\n {\n connector: connectVoiceSearch,\n },\n {\n $$widgetType: 'ais.voiceSearch',\n }\n ),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n language: {\n type: String,\n default: undefined,\n },\n additionalQueryParameters: {\n type: Object,\n default: undefined,\n },\n buttonTitle: {\n type: String,\n required: false,\n default: 'Search by voice',\n },\n disabledButtonTitle: {\n type: String,\n required: false,\n default: 'Search by voice (not supported on this browser)',\n },\n },\n data() {\n return {\n buttonSvgAttrs: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '2',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n };\n },\n computed: {\n widgetParams() {\n return {\n searchAsYouSpeak: this.searchAsYouSpeak,\n language: this.language,\n additionalQueryParameters: this.additionalQueryParameters,\n };\n },\n errorNotAllowed() {\n return (\n this.state.voiceListeningState.status === 'error' &&\n this.state.voiceListeningState.errorCode === 'not-allowed'\n );\n },\n rootSlotProps() {\n return {\n isBrowserSupported: this.state.isBrowserSupported,\n isListening: this.state.isListening,\n toggleListening: this.state.toggleListening,\n voiceListeningState: this.state.voiceListeningState,\n };\n },\n innerSlotProps() {\n return {\n status: this.state.voiceListeningState.status,\n errorCode: this.state.voiceListeningState.errorCode,\n isListening: this.state.isListening,\n transcript: this.state.voiceListeningState.transcript,\n isSpeechFinal: this.state.voiceListeningState.isSpeechFinal,\n isBrowserSupported: this.state.isBrowserSupported,\n };\n },\n },\n methods: {\n handleClick(event) {\n event.currentTarget.blur();\n this.state.toggleListening();\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state && state.isVirtualReplica\" :class=\"suit()\">\n <slot :is-relevant-sorted=\"state.isRelevantSorted\" :refine=\"state.refine\">\n <div :class=\"suit('text')\">\n <slot name=\"text\" :is-relevant-sorted=\"state.isRelevantSorted\" />\n </div>\n <button type=\"button\" :class=\"suit('button')\" @click=\"refine()\">\n <slot name=\"button\" :is-relevant-sorted=\"state.isRelevantSorted\">\n {{\n state.isRelevantSorted ? 'See all results' : 'See relevant results'\n }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRelevantSort } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRelevantSort',\n mixins: [\n createSuitMixin({ name: 'RelevantSort' }),\n createWidgetMixin(\n {\n connector: connectRelevantSort,\n },\n {\n $$widgetType: 'ais.relevantSort',\n }\n ),\n ],\n methods: {\n refine() {\n if (this.state.isRelevantSorted) {\n this.state.refine(0);\n } else {\n this.state.refine(undefined);\n }\n },\n },\n};\n</script>\n","<template>\n <div v-if=\"state && state.isVirtualReplica\" :class=\"suit()\">\n <slot :is-relevant-sorted=\"state.isRelevantSorted\" :refine=\"state.refine\">\n <div :class=\"suit('text')\">\n <slot name=\"text\" :is-relevant-sorted=\"state.isRelevantSorted\" />\n </div>\n <button type=\"button\" :class=\"suit('button')\" @click=\"refine()\">\n <slot name=\"button\" :is-relevant-sorted=\"state.isRelevantSorted\">\n {{\n state.isRelevantSorted ? 'See all results' : 'See relevant results'\n }}\n </slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRelevantSort } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisRelevantSort',\n mixins: [\n createSuitMixin({ name: 'RelevantSort' }),\n createWidgetMixin(\n {\n connector: connectRelevantSort,\n },\n {\n $$widgetType: 'ais.relevantSort',\n }\n ),\n ],\n methods: {\n refine() {\n if (this.state.isRelevantSorted) {\n this.state.refine(0);\n } else {\n this.state.refine(undefined);\n }\n },\n },\n};\n</script>\n","import { connectDynamicWidgets } from 'instantsearch.js/es/connectors';\n\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3, renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nfunction getWidgetAttribute(vnode) {\n const props = isVue3\n ? vnode.props\n : vnode.componentOptions && vnode.componentOptions.propsData;\n if (props) {\n if (props.attribute) {\n return props.attribute;\n }\n if (Array.isArray(props.attributes)) {\n return props.attributes[0];\n }\n }\n\n let children;\n if (isVue3) {\n children =\n vnode.children && vnode.children.default && vnode.children.default();\n } else {\n children =\n vnode.componentOptions && vnode.componentOptions.children\n ? vnode.componentOptions.children\n : vnode.children;\n }\n\n if (Array.isArray(children)) {\n // return first child with a truthy attribute\n return children.reduce(\n (acc, curr) => acc || getWidgetAttribute(curr),\n undefined\n );\n }\n\n return undefined;\n}\n\nexport default {\n name: 'AisDynamicWidgets',\n mixins: [\n createWidgetMixin(\n {\n connector: connectDynamicWidgets,\n },\n {\n $$widgetType: 'ais.dynamicWidgets',\n }\n ),\n createSuitMixin({ name: 'DynamicWidgets' }),\n ],\n props: {\n transformItems: {\n type: Function,\n default: undefined,\n },\n facets: {\n type: Array,\n default: undefined,\n },\n maxValuesPerFacet: {\n type: Number,\n default: undefined,\n },\n },\n render: renderCompat(function (h) {\n const components = new Map();\n\n (getDefaultSlot(this) || []).forEach((vnode) => {\n const attribute = getWidgetAttribute(vnode);\n if (attribute) {\n components.set(\n attribute,\n h('div', { key: attribute, class: [this.suit('widget')] }, [vnode])\n );\n }\n });\n\n // by default, render everything, but hidden so that the routing doesn't disappear\n if (!this.state) {\n const allComponents = [];\n components.forEach((component) => allComponents.push(component));\n\n return h(\n 'div',\n _objectSpread(\n {\n class: [this.suit()],\n },\n { attrs: { hidden: true } }\n ),\n allComponents\n );\n }\n\n return h(\n 'div',\n { class: [this.suit()] },\n this.state.attributesToRender.map((attribute) =>\n components.get(attribute)\n )\n );\n }),\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n facets: this.facets,\n maxValuesPerFacet: this.maxValuesPerFacet,\n // we do not pass \"widgets\" to the connector, since Vue is in charge of rendering\n widgets: [],\n };\n },\n },\n};\n","import { warn } from '../util/warn';\n\nimport AisDynamicWidgets from './DynamicWidgets';\n\n// @MAJOR remove this file\nexport default Object.assign({}, AisDynamicWidgets, {\n name: 'AisExperimentalDynamicWidgets',\n mounted() {\n warn('Use AisDynamicWidgets instead of AisExperimentalDynamicWidgets.');\n },\n});\n","/* eslint import/namespace: ['error', { allowComputed: true }]*/\n\nimport * as widgets from './widgets';\n\nexport const plugin = {\n install(localVue) {\n Object.keys(widgets).forEach((widgetName) => {\n localVue.component(widgets[widgetName].name, widgets[widgetName]);\n });\n },\n};\n","import instantsearch from 'instantsearch.js/es';\nimport {\n waitForResults,\n getInitialResults,\n} from 'instantsearch.js/es/lib/server';\n\nimport { isVue3, isVue2, Vue2, createSSRApp } from './vue-compat';\nimport { warn } from './warn';\n\nfunction defaultCloneComponent(componentInstance, { mixins = [] } = {}) {\n const options = {\n serverPrefetch: undefined,\n fetch: undefined,\n _base: undefined,\n name: 'ais-ssr-root-component',\n };\n\n let app;\n\n if (isVue3) {\n const appOptions = Object.assign({}, componentInstance.$options, options);\n appOptions.mixins = [...mixins, ...(appOptions.mixins || [])];\n app = createSSRApp(appOptions);\n if (componentInstance.$router) {\n app.use(componentInstance.$router);\n }\n if (componentInstance.$store) {\n app.use(componentInstance.$store);\n }\n if (componentInstance.$i18n) {\n app.use(componentInstance.$i18n);\n }\n } else {\n // copy over global Vue APIs\n options.router = componentInstance.$router;\n options.store = componentInstance.$store;\n options.i18n = componentInstance.$i18n;\n\n const Extended = componentInstance.$vnode\n ? componentInstance.$vnode.componentOptions.Ctor.extend(options)\n : Vue2.component(\n options.name,\n Object.assign({}, componentInstance.$options, options)\n );\n\n app = new Extended({\n propsData: componentInstance.$options.propsData,\n mixins: [...mixins],\n });\n }\n\n // https://stackoverflow.com/a/48195006/3185307\n app.$slots = componentInstance.$slots;\n app.$root = componentInstance.$root;\n if (isVue2) {\n app.$options.serverPrefetch = [];\n }\n\n return app;\n}\n\nfunction augmentInstantSearch(instantSearchOptions, cloneComponent) {\n const search = instantsearch(instantSearchOptions);\n\n let initialResults;\n\n /**\n * main API for SSR, called in serverPrefetch of a root component which contains instantsearch\n * @param {Object} props the object including `component` and `renderToString`\n * @param {Object} props.component the calling component's `this`\n * @param {Function} props.renderToString the function to render componentInstance to string\n * @returns {Promise} result of the search, to save for .hydrate\n */\n search.findResultsState = function ({ component, renderToString }) {\n if (!renderToString) {\n throw new Error(\n 'findResultsState requires `renderToString: (component) => Promise<string>` in the first argument.'\n );\n }\n\n let app;\n let instance;\n\n return Promise.resolve()\n .then(() => {\n app = cloneComponent(component, {\n mixins: [\n {\n beforeCreate() {\n const descriptor = Object.getOwnPropertyDescriptor(\n component,\n '$nuxt'\n );\n\n const isWritable = descriptor\n ? descriptor.writable || descriptor.set\n : false;\n\n if (component.$nuxt && isWritable) {\n // In case of Nuxt (3), we ensure the context is shared between\n // the real and cloned component\n this.$nuxt = component.$nuxt;\n }\n },\n created() {\n instance = this.instantsearch;\n\n instance.start();\n // although we use start for initializing the main index,\n // we don't want to send search requests yet\n instance.started = false;\n },\n },\n ],\n });\n })\n .then(() => renderToString(app))\n .then(() => waitForResults(instance))\n .then((requestParamsList) => {\n initialResults = getInitialResults(\n instance.mainIndex,\n requestParamsList\n );\n search.hydrate(initialResults);\n return search.getState();\n });\n };\n\n /**\n * @returns {Promise} result state to serialize and enter into .hydrate\n */\n search.getState = function () {\n if (!initialResults) {\n throw new Error('You need to wait for findResultsState to finish');\n }\n return initialResults;\n };\n\n /**\n * make sure correct data is available in each widget's state.\n * called in widget mixin with (this.widget, this)\n *\n * @param {object} widget The widget instance\n * @param {object} parent The local parent index\n * @returns {void}\n */\n search.__forceRender = function (widget, parent) {\n const results = parent.getResults();\n\n // this happens when a different InstantSearch gets rendered initially,\n // after the hydrate finished. There's thus no initial results available.\n if (results === null) {\n return;\n }\n\n const state = results._state;\n\n const localHelper = parent.getHelper();\n // helper gets created in init, but that means it doesn't get the injected\n // parameters, because those are from the lastResults\n localHelper.state = state;\n\n widget.render({\n helper: localHelper,\n results,\n scopedResults: parent.getScopedResults(),\n parent,\n state,\n templatesConfig: {},\n createURL: parent.createURL,\n instantSearchInstance: search,\n searchMetadata: {\n isSearchStalled: false,\n },\n });\n };\n\n /**\n * Called both in server\n * @param {object} results a map of indexId: SearchResults\n * @returns {void}\n */\n search.hydrate = function (results) {\n if (!results) {\n warn(\n 'The result of `findResultsState()` needs to be passed to `hydrate()`.'\n );\n return;\n }\n\n search._initialResults = results;\n\n search.start();\n search.started = false;\n };\n return search;\n}\n\nexport function createServerRootMixin(instantSearchOptions = {}) {\n const { $cloneComponent = defaultCloneComponent } = instantSearchOptions;\n\n const search = augmentInstantSearch(instantSearchOptions, $cloneComponent);\n\n // put this in the user's root Vue instance\n // we can then reuse that InstantSearch instance seamlessly from `ais-instant-search-ssr`\n const rootMixin = {\n provide() {\n return {\n $_ais_ssrInstantSearchInstance: this.instantsearch,\n };\n },\n data() {\n return {\n // this is in data, so that the real & cloned render do not share\n // the same instantsearch instance.\n instantsearch: search,\n };\n },\n };\n\n return rootMixin;\n}\n"],"names":["suit","widgetName","element","modifier","Error","const","elements","push","join","createSuitMixin","props","classNames","type","Object","default","undefined","methods","className","name","userClassName","this","_objectSpread","target","i","arguments","length","source","ownKeys","keys","getOwnPropertySymbols","concat","filter","sym","getOwnPropertyDescriptor","enumerable","forEach","key","_defineProperty","obj","value","defineProperty","configurable","writable","isVue2","isVue3","renderCompat","fn","h","tag","children","attrs","scopedSlots","on","onPropKeys","flatProps","assign","reduce","acc","toUpperCase","slice","Vue.h","call","getDefaultSlot","component","$slots","slots","getScopedSlot","cache","Set","warn","message","has","add","console","createWidgetMixin","additionalProperties","inject","instantSearchInstance","from","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","_initialResults","started","__forceRender","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","mixins","connectAutocomplete","$$widgetType","escapeHTML","Boolean","required","computed","_createElementVNode","_ctx","_createElementBlock","class","_renderSlot","refine","currentRefinement","indices","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","mitt","provide","canRefine","updateCanRefine","all","clear","createPanelConsumerMixin","emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","isLastItem","index","items","createURL","href","onClick","item","label","aria-hidden","connectClearRefinements","excludedAttributes","includedAttributes","hasRefinements","disabled","inheritAttrs","connectConfigure","searchParameters","$attrs","render","slot","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","capitalize","toString","charAt","toLocaleUpperCase","refinements","refinement","level","Number","$props","isRefined","count","_createBlock","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","canToggleShowMore","isShowingMore","toggleShowMore","sendEvent","_createVNode","createElement","Fragment","isArray","newChildren","newProps","Highlight","createHighlightComponent","highlightedTagName","highlightProperty","preTag","postTag","property","getPropertyByPath","parts","map","singleValue","getHighlightedParts","unescape","root","highlighted","nonHighlightedTagName","AisHighlighter","highlighted-tag-name","highlight-property","pre-tag","post-tag","connectHitsWithInsights","hits","defaultSlot","itemSlot","insights","createHitsComponent","objectID","rootProps","click","auxclick","onAuxClick","list","connectHitsPerPage","hasNoResults","onChange","$event","currentTarget","selected","connectIndex","indexWidget","$_ais_getParentIndex","indexName","indexId","createInstantSearchComponent","$_ais_instantSearchInstance","searchClient","helper","setClient","search","setIndex","stalledSearchDelay","_stalledSearchDelay","routing","onStateChange","searchFunction","_searchFunction","middlewares","next","prev","middleware","indexOf","middlewareToRemove","unuse","middlewareToAdd","use","future","INSTANTSEARCH_FUTURE_DEFAULTS","client","addAlgoliaAgent","vueVersion","version","mounted","$nextTick","start","dispose","__initialSearchResults","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","page","results","isFirstPage","isLastPage","onAuxclick","connectMenu","showShowMoreButton","connectNumericMenu","checked","connectPagination","padding","totalPages","showFirst","showLast","showNext","emits","p","Math","min","max","nbPages","$emit","nbHits","pages","aria-label","getSlot","theme","algoliaUrl","location","hostname","rel","style","viewBox","fill","d","connectQueryRules","trackedFilters","transformRuleContexts","connectRange","precision","minInput","maxInput","updated","step","pow","values","range","minValue","Infinity","minRange","maxValue","maxRange","pick","first","second","onSubmit","placeholder","$data","connectRatingMenu","xmlns","id","xlink:href","_hoisted_6","_hoisted_8","stars","full","n","width","height","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","ignoreCompositionEvents","submitTitle","resetTitle","modelValue","query","isFocused","document","activeElement","$refs","input","onInput","event","isComposing","onFormSubmit","blur","onFormReset","_hoisted_10","action","role","novalidate","onReset","autocorrect","autocapitalize","autocomplete","spellcheck","maxlength","onFocus","onBlur","onCompositionend","ref","title","hidden","stroke","noop","SearchInput","AisHighlight","connectRefinementList","searchable","searchablePlaceholder","operator","searchForFacetValuesQuery","searchForFacetValues","get","set","searchForItems","_highlightResult","escapeFacetValues","searchForItemsQuery","isFromSearch","class-names","catchError","renderFn","getResults","getHelper","status","error","addListener","removeListener","errorFn","stateResults","connectSearchBox","queryHook","localValue","isControlled","model","searchInput","val","isSearchStalled","show-loading-indicator","should-show-loading-indicator","ignore-composition-events","submit-title","reset-title","connectSortBy","options","connectStats","sortedResultsSentence","suffix","toLocaleString","nbSortedHits","resultsSentence","_mergeProps","lastResults","_Fragment","processingTimeMS","connectToggleRefinement","off","connectVoiceSearch","searchAsYouSpeak","language","additionalQueryParameters","buttonTitle","disabledButtonTitle","buttonSvgAttrs","strokeWidth","strokeLinecap","strokeLinejoin","errorNotAllowed","voiceListeningState","errorCode","rootSlotProps","isBrowserSupported","isListening","toggleListening","innerSlotProps","transcript","isSpeechFinal","handleClick","x1","y1","x2","y2","_hoisted_9","_hoisted_11","connectRelevantSort","isRelevantSorted","isVirtualReplica","getWidgetAttribute","vnode","curr","connectDynamicWidgets","facets","maxValuesPerFacet","Map","allComponents","attributesToRender","widgets","AisDynamicWidgets","plugin","install","localVue","defaultCloneComponent","componentInstance","app","serverPrefetch","fetch","_base","appOptions","createSSRApp","$router","$store","$i18n","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","initialResults","findResultsState","instance","renderToString","Promise","resolve","then","beforeCreate","descriptor","isWritable","$nuxt","waitForResults","requestParamsList","getInitialResults","hydrate","getState","parent","_state","localHelper","scopedResults","getScopedResults","templatesConfig","searchMetadata","createServerRootMixin","$cloneComponent"],"mappings":"goBASe,SAASA,KAAKC,EAAYC,EAASC,GAChD,IAAKF,EACH,MAAM,IAAIG,MAAM,iDAGlBC,IAAMC,EAAW,QAAQL,GAUzB,OARIC,GACFI,EAASC,SAASL,GAGhBC,GACFG,EAASC,UAAUJ,GAGdG,EAASE,KAAK,ICtBX,IAACC,gDACXC,MAAO,CACLC,WAAY,CACVC,KAAMC,OACNC,aAASC,IAGbC,QAAS,CACPhB,cAAKE,EAASC,GACZE,IAAMY,EAAYjB,KAAKkB,EAAMhB,EAASC,GAChCgB,EAAgBC,KAAKT,YAAcS,KAAKT,WAAWM,GACzD,OAAIE,EACK,CAACF,EAAWE,GAAeX,KAAK,KAElCS,MCXN,SAASI,cAAcC,GAAU,oBAASC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAAK,CAAE,IAAIG,EAAyB,MAAhBF,EAAUD,GAAaC,EAAUD,GAAK,GAAQI,EAAUd,OAAOe,KAAKF,GAAqD,mBAAjCb,OAAOgB,wBAAwCF,EAAUA,EAAQG,OAAOjB,OAAOgB,sBAAsBH,GAAQK,OAAO,SAAUC,GAAO,OAAOnB,OAAOoB,yBAAyBP,EAAQM,GAAKE,eAAmBP,EAAQQ,QAAQ,SAAUC,GAAOC,gBAAgBf,EAAQc,EAAKV,EAAOU,MAAa,OAAOd,EAI/d,SAASe,gBAAgBC,EAAKF,EAAKG,GAAiK,OAApJH,KAAOE,EAAOzB,OAAO2B,eAAeF,EAAKF,EAAK,CAAEG,MAAOA,EAAOL,YAAY,EAAMO,cAAc,EAAMC,UAAU,IAAkBJ,EAAIF,GAAOG,EAAgBD,ECP3MjC,IAAMsC,QAAS,EACTC,QAAS,EAMR,SAASC,aAAaC,GAC3B,SAASC,EAAEC,EAAKtC,EAAOuC,GACrB,GACmB,iBAAVvC,IACNA,EAAMwC,OAASxC,EAAMA,OAASA,EAAMyC,aAAezC,EAAM0C,IAC1D,CAEA/C,IAAMgD,EAAaxC,OAAOe,KAAKlB,EAAM0C,IAAM,IACrCE,EAAYzC,OAAO0C,OACvB,GACA7C,EACAA,EAAMwC,MACNxC,EAAMA,MACN2C,EAAWG,gBAAQC,EAAKrB,GAGtB,OADAqB,OAASrB,EAAI,GAAGsB,cAAgBtB,EAAIuB,MAAM,IAAQjD,EAAM0C,GAAGhB,GACpDqB,GACN,KAUL,cAROH,EAAUJ,aACVI,EAAU5C,aACV4C,EAAUH,YACjBE,EAAWlB,iBAASC,iBAAekB,EAAUF,GAAGhB,KAC5CkB,EAAUF,IAA2C,IAArCvC,OAAOe,KAAK0B,EAAUF,IAAI3B,eACrC6B,EAAUF,GAGZQ,MACLZ,EACAM,EACA5C,EAAMyC,YACFtC,OAAO0C,OAAO,CAAEzC,0BAAemC,IAAYvC,EAAMyC,aACjDF,GAIR,OAAOW,MAAMZ,EAAKtC,EAAOuC,GAG3B,OAAO,WACL,OAAOH,EAAGe,KAAKzC,KAAM2B,IAIlB,SAASe,eAAeC,GAC7B1D,IAAM2D,EAASD,EAAUC,QAAUD,EAAUE,MAE7C,MAA8B,mBAAnBD,EAAOlD,QAETkD,EAAOlD,UAITkD,EAAOlD,QAGT,SAASoD,cAAcH,EAAW7C,GACvC,OAAQ6C,EAAUC,QAAUD,EAAUE,OAAS,IAAI/C,GClErDb,IAAM8D,MAAQ,IAAIC,IAEX,SAASC,KAAKC,GACfH,MAAMI,IAAID,KACdH,MAAMK,IAAIF,GAEVG,QAAQJ,KAAKC,ICFH,IAACI,6BAEXC,wBADgB,4CACO,OACnB,CACJC,OAAQ,CACNC,sBAAuB,CACrBC,KAAM,8BACNhE,mBACET,IAAM2C,EAAM5B,KAAK2D,SAASC,cAC1B,MAAM,IAAIC,8EAC4DjC,yDAI1EkC,eAAgB,CACdJ,KAAM,uBACNhE,8BACE,yBAAaM,EAAKyD,sBAAsBM,cAI9CC,gBACE,MAAO,CACLC,MAAO,OAGXC,mBACE,GAAyB,mBAAdC,GAQT,GAPAnE,KAAKoE,QAAUD,EAAUnE,KAAKqE,0BAC9BrE,KAAKsE,OAASrE,cACZD,KAAKoE,QAAQpE,KAAKuE,cAClBhB,GAEFvD,KAAK8D,iBAAiBU,WAAW,CAACxE,KAAKsE,SAGrCtE,KAAKyD,sBAAsBgB,kBAC1BzE,KAAKyD,sBAAsBiB,QAC5B,CACA,GAAwD,mBAA7C1E,KAAKyD,sBAAsBkB,cACpC,MAAM,IAAI3F,MACR,sGAGJgB,KAAKyD,sBAAsBkB,cACzB3E,KAAKsE,OACLtE,KAAK8D,wBAGc,IAAdK,GACTlB,KACE,uWAUqC,yBACrCjD,KAAKsE,QACPtE,KAAK8D,iBAAiBc,cAAc,CAAC5E,KAAKsE,YAG9CO,MAAO,CACLN,aAAc,CACZO,iBAAQC,GACN/E,KAAKiE,MAAQ,KACbjE,KAAK8D,iBAAiBc,cAAc,CAAC5E,KAAKsE,SAC1CtE,KAAKsE,OAASrE,cACZD,KAAKoE,QAAQW,GACbxB,GAEFvD,KAAK8D,iBAAiBU,WAAW,CAACxE,KAAKsE,UAEzCU,MAAM,MAGVpF,QAAS,CACPyE,qBAAYJ,EAAYgB,kBAAJ,IACbA,IAGHjF,KAAKiE,MAAQA,eC9DN,CACbnE,KAAM,kBACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWgB,gCAEb,CACEC,aAAc,qBAGlB/F,gBAAgB,CAAES,KAAM,kBAE1BR,MAAO,CACL+F,WAAY,CACV7F,KAAM8F,QACNC,UAAU,EACV7F,SAAS,IAGb8F,SAAU,CACRjB,wBACE,MAAO,CACLc,WAAYrF,KAAKqF,0BC3CnBI,yHAGAA,gCAAG,qEACHA,kCAAK,kCAGHA,uCAASA,uBAAoB,YAAd,+BAAc,8CAbRC,EAAK,uBAAhCC,oCAAMC,yBAAOF,YACXG,mCACGC,OAAQJ,QAAMI,OACdC,kBAAoBL,QAAMK,kBAC1BC,QAASN,QAAMM,2BAEhBC,WAGAC,WACAC,WACAV,kCAAK,2CAAuBC,QAAMK,mBAAoB,OACtDN,uCACEW,WACAX,sDAAQC,QAAMM,yECXf/G,IAAMoH,wBAA0B,4BAC1BC,mBAAqB,qBAErBC,mDAAkC,CAC7CjH,MAAO,CACLkH,QAAS,CACPhH,KAAMC,OACN8F,UAAU,EACV7F,mBACE,OAAO+G,UAIbC,yBACE,SAAO,IACJL,yBAA0BrG,KAAKwG,WAGpCxC,gBACE,MAAO,CACL2C,WAAW,IAGfzC,8BACElE,KAAKwG,QAAQxE,GAAGsE,4BAAqBnF,GACnCnB,EAAK4G,gBAAgBzF,QAGkB,yBACzCnB,KAAKwG,QAAQK,IAAIC,WAEnBlH,QAAS,CACPgH,yBAAgBzF,GACdnB,KAAK2G,UAAYxF,OAKV4F,oDAET,+DADqB9C,UAAUqB,QAAQrB,EAAM0C,cAE/CnD,OAAQ,CACNgD,QAAS,CACP9C,KAAM2C,wBACN3G,mBACE,MAAO,CACLsH,sBAKRhD,gBACE,MAAO,CACLC,MAAO,KACPgD,mBAAmB,IAGvBpC,MAAO,CACLZ,MAAO,CACLiD,WAAW,EACXpC,iBAAQqC,EAAWC,GACjB,GAAKD,EAAL,CAIAlI,IAAMoI,EAAoBC,EAAoBF,GAAiB,IACzDG,EAAgBD,EAAoBH,GAErCnH,KAAKiH,mBAAqBI,IAAsBE,IACnDvH,KAAKwG,QAAQQ,KAAKV,mBAAoBiB,GACtCvH,KAAKiH,mBAAoB,kBCXpB,CACbnH,KAAM,gBACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWqD,8BAEb,CACEpC,aAAc,mBAGlB2B,2BACA1H,gBAAgB,CAAES,KAAM,gBAE1BR,MAAO,CACLmI,WAAY,CACVjI,KAAMkI,MACNnC,UAAU,GAEZoC,UAAW,CACTnI,KAAMoI,OACNlI,aAASC,GAEXkI,SAAU,CACRrI,KAAMoI,OACNlI,aAASC,GAEXmI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLkD,WAAYzH,KAAKyH,WACjBE,UAAW3H,KAAK2H,UAChBE,SAAU7H,KAAK6H,SACfC,eAAgB9H,KAAK8H,kBAI3BlI,QAAS,CACPoI,oBAAWC,GACT,OAAOjI,KAAKiE,MAAMiE,MAAM7H,OAAS,IAAM4H,uHCzGnCvC,EAAK,uBADbC,oCAEGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAErCG,mCACGqC,MAAOxC,QAAMwC,MACbvB,UAAYjB,QAAMiB,UAClBb,OAAQJ,QAAMI,OACdqC,UAAWzC,QAAMyC,6BAElB1C,6BAAKG,yBAAOF,kBACVD,6BACGG,8FAMON,QAAQI,QAAMwC,MAAM7H,yBAD5BsF,kCAEGyC,KAAM1C,QAAMyC,YACZvC,yBAAOF,gBACP2C,yDAAe3C,QAAMI,0BAEtBD,6EAAuB,+CAEzBF,kCAEGyC,KAAM1C,QAAMyC,gBACZvC,yBAAOF,gBACP2C,yDAAe3C,QAAMI,8BAEtBD,6EAAuB,qDAG3BF,wDAC0BD,QAAMwC,eAAtBI,EAAML,0BADhBtC,6BAEG3E,IAAKsH,EAAKC,MACV3C,0BAAQF,eAAc/B,aAAWsE,IAAUvC,8BAE5CD,uBAEC,QAFMG,yBAAOF,qBAAmB8C,cAAY,SAC3C3C,6EAAuB,YAEhBlC,aAAWsE,oBAMpBtC,qFAAoB2C,EAAKC,iCAPxB5C,kCAEEyC,KAAM1C,QAAMyC,UAAUG,EAAKnH,OAC3ByE,yBAAOF,gBACP2C,6CAAe3C,QAAMI,OAAOwC,EAAKnH,0CAC9BmH,EAAKC,wGCpBrB,aAAe,CACbzI,KAAM,sBACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWsE,oCAEb,CACErD,aAAc,yBAGlB2B,2BACA1H,gBAAgB,CAAES,KAAM,sBAE1BR,MAAO,CACLoJ,mBAAoB,CAClBlJ,KAAMkI,MACNhI,aAASC,GAEXgJ,mBAAoB,CAClBnJ,KAAMkI,MACNhI,aAASC,GAEXmI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLoE,mBAAoB3I,KAAK2I,mBACzBD,mBAAoB1I,KAAK0I,mBACzBZ,eAAgB9H,KAAK8H,iBAGzBnB,qBACE,OAAO3G,KAAKiE,MAAM2E,uNC3DjBjC,UAAYhD,YACZmC,OAAQJ,QAAMI,uFAIbtG,KAAK,QACJoG,0BAAQF,6DACRmD,UAAWlF,4LAGZkC,yLCTR,cAAe,CACbiD,cAAc,EACdhJ,KAAM,eACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,cACxBwD,kBACE,CACEa,UAAW4E,6BAEb,CACE3D,aAAc,mBAIpBI,SAAU,CACRjB,wBACE,MAAO,CACLyE,iBAAkBhJ,KAAKiJ,UAI7BC,OAAQzH,aAAa,SAAUE,GAC7B1C,IAAMkK,EAAgBnJ,KAAK4C,OAAOlD,QAElC,OAAKM,KAAKiE,OAAUkF,EAIbxH,EACL,MACA,CACEiE,MAAO5F,KAAKpB,QAEd,CACEuK,EAAK,CACHrD,OAAQ9F,KAAKiE,MAAM6B,OACnBkD,iBAAkBhJ,KAAKiE,MAAMM,aAAayE,qBAXvC,8BC3BE,CACbF,cAAc,EACdhJ,KAAM,uCACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWiF,sDAEb,CACEhE,aAAc,+BAIpB9F,MAAO,CACL+J,IAAK,CACH7J,KAAMC,OACN8F,UAAU,GAEZ+D,iBAAkB,CAChB9J,KAAMC,OACN8F,UAAU,GAEZgE,0BAA2B,CACzB/J,KAAMuI,SACNxC,UAAU,IAGdC,SAAU,CACRjB,wBACE,MAAO,CACL8E,IAAKrJ,KAAKqJ,IACVC,iBAAkBtJ,KAAKsJ,iBACvBC,0BAA2BvJ,KAAKuJ,6BAItCL,kBACE,OAAO,gBCkBI,CACbpJ,KAAM,wBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,uBACxBwD,kBACE,CACEa,UAAWqF,sCAEb,CACEpE,aAAc,2BAGlB2B,4BAEFzH,MAAO,CACLqJ,mBAAoB,CAClBnJ,KAAMkI,MACNhI,aAASC,GAEX+I,mBAAoB,CAClBlJ,KAAMkI,MACNhI,aAASC,GAEXmI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRiE,wBACE,OAAOzJ,KAAKiE,OAAqC,IAA5BjE,KAAKiE,MAAMiE,MAAM7H,QAExCkE,wBACE,MAAO,CACLoE,mBAAoB3I,KAAK2I,mBACzBD,mBAAoB1I,KAAK0I,mBACzBZ,eAAgB9H,KAAK8H,kBAI3BlI,QAAS,CACP8J,sDACE,MAAO,CAACC,SAAiBxI,cAAiB/B,KAAK,MAEjDwK,oBAAWzI,GACT,OAAKA,EAEHA,EAAM0I,WAAWC,OAAO,GAAGC,oBAC3B5I,EAAM0I,WAAWtH,MAAM,GAHN,0FCvGgDmD,EAAK,uBAA5EC,oCAAMC,0BAAQF,SAAQ/B,gBAAgB+B,8BACpCG,mCACGC,OAAQJ,QAAMI,OACdoC,MAAOxC,QAAMwC,MACbC,UAAWzC,QAAMyC,6BAElB1C,6BAAKG,yBAAOF,qCACVC,wDACiBD,QAAMwC,eAAdI,0BADT3C,6BAEG3E,IAAKsH,EAAKqB,UACV/D,yBAAOF,kBAERG,gCAEGC,OAAQwC,EAAKxC,OACbwC,KAAMA,EACNH,UAAWzC,QAAMyC,6BAElB1C,+BAAOG,yBAAOF,sCAAkB/B,aAAW2E,EAAKC,QAAS,2BACzD5C,wDACuB2C,EAAK0B,qBAAnBC,0BADTtE,+BAEG3E,IAAK2C,gBAAcsG,GACnBrE,yBAAOF,sBAERG,sCAEGC,OAAQwC,EAAKxC,OACbmE,WAAYA,EACZ9B,UAAWzC,QAAMyC,6BAElB1C,uBAKC,QALMG,yBAAOF,qCACHuE,EAAWN,2BAApBhE,4DACEsE,EAAW1B,4BAEb5C,qFAAoBsE,EAAW1B,oBAChC9C,iCACEG,yBAAOF,kBACRlG,KAAK,SACJ6I,6CAAkBC,EAAKxC,OAAOmE,+ICAjD,aAAe,CACbnK,KAAM,uBACNR,MAAO,CACL4I,MAAO,CACL1I,KAAMkI,MACNnC,UAAU,GAEZ2E,MAAO,CACL1K,KAAM2K,OACN5E,UAAU,GAEZO,OAAQ,CACNtG,KAAMuI,SACNxC,UAAU,GAEZ4C,UAAW,CACT3I,KAAMuI,SACNxC,UAAU,GAEZ3G,KAAM,CACJY,KAAMuI,SACNxC,UAAU,mIC1DN6E,QAAM/J,0BADdsF,mCAEGC,+HAMDD,wDACiByE,iBAAR9B,0BADT3C,6BAEG3E,IAAKsH,EAAKnH,MACVyE,qIAMDH,4BACG2C,KAAMgC,YAAU9B,EAAKnH,OACrByE,0BAAQwE,eAAc9B,EAAK+B,WAAaD,4BACxC/B,6CAAe+B,SAAO9B,EAAKnH,uBAE5BsE,+BAAOG,yBAAOwE,sCAAkB9B,EAAKC,UACrC9C,+BAAOG,yBAAOwE,sCAAkB9B,EAAKgC,4BAG/BhC,EAAS,sBADjBiC,yBAEGrC,MAAOI,EAAKtE,KACZkG,MAAOE,UACPtE,OAAQsE,SACRjC,UAAWiC,YACXxL,KAAMwL,qKCiBf,aAAe,CACbtK,KAAM,sBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,qBACxBwD,kBACE,CACEa,UAAWqG,oCAEb,CACEpF,aAAc,yBAGlB2B,4BAEF0D,WAAY,sBACVC,UAEFpL,MAAO,CACLmI,WAAY,CACVjI,KAAMkI,MACNnC,UAAU,GAEZoF,MAAO,CACLnL,KAAM2K,OACNzK,aAASC,GAEXiL,cAAe,CACbpL,KAAM2K,OACNzK,aAASC,GAEXkL,SAAU,CACRrL,KAAM8F,QACN5F,SAAS,GAEXoL,OAAQ,CACNtL,KAAM,CAACkI,MAAOK,UACdrI,aAASC,GAEXgI,UAAW,CACTnI,KAAMoI,OACNlI,aAASC,GAEXkI,SAAU,CACRrI,KAAMoI,OACNlI,aAASC,GAEXoL,gBAAiB,CACfvL,KAAM8F,QACN5F,aAASC,GAEXmI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLkD,WAAYzH,KAAKyH,WACjBkD,MAAO3K,KAAK2K,MACZE,SAAU7K,KAAK6K,SACfD,cAAe5K,KAAK4K,cACpBjD,UAAW3H,KAAK2H,UAChBE,SAAU7H,KAAK6H,SACfkD,gBAAiB/K,KAAK+K,gBACtBD,OAAQ9K,KAAK8K,OACbhD,eAAgB9H,KAAK8H,wICjHnBpC,EAAK,uBADbC,oCAEGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAErCG,mCACGqC,MAAOxC,QAAMwC,MACbvB,UAAYjB,QAAMiB,UAClBqE,kBAAsBtF,QAAMsF,kBAC5BC,cAAiBvF,QAAMuF,cACvBnF,OAAQJ,QAAMI,OACdqC,UAAWzC,QAAMyC,UACjB+C,eAAkBxF,QAAMwF,eACxBC,UAAYzF,QAAMyF,6BAEnBC,mBACGlD,MAAOxC,QAAMwC,MACbgC,MAAO,EACPpE,OAAQJ,QAAMI,OACdqC,UAAWzC,QAAMyC,UACjBvJ,KAAM8G,sDAID0E,EAAQ,0BADhBzE,uCAEGC,yGAIAiD,UAAWnD,QAAMsF,kBACjB3C,iHAAe3C,QAAMwF,mBAANxF,SAAMwF,2CAEtBrF,yCAA4BoF,cAAiBvF,QAAMuF,yEAC9CvF,QAAMuF,6JC/BZhM,IAAMoM,uBAAiBzJ,EAAKtC,EAAOuC,GACxC,IAAKA,EACH,OAAOF,MAAEC,EAAKtC,GAGhB,GAAIsC,IAAQ0J,aACV,OAAO3J,MAAEC,EAAK8F,MAAM6D,QAAQ1J,GAAYA,EAAW,CAACA,IAItD5C,IAAMuM,EACgB,iBAAb3J,EAAwB,CAAEnC,0BAAemC,IAAaA,EAEzD4J,EACW,iBAAR7J,EAAmBtC,EAAQG,OAAO0C,OAAO7C,EAAO,UAAEuC,IAE3D,OAAOF,MAAEC,EAAK6J,EAAUD,ICTpBE,UAAYC,mDAAyB,eAAEN,uBAAeC,8BAE7C,CACbxL,KAAM,iBACNR,MAAO,CACL+J,IAAK,CACH7J,KAAMC,OACN8F,UAAU,GAEZoE,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZqG,mBAAoB,CAClBpM,KAAMoI,OACNlI,QAAS,QAEXd,KAAM,CACJY,KAAMuI,SACNxC,UAAU,GAEZsG,kBAAmB,CACjBrM,KAAMoI,OACNrC,UAAU,GAEZuG,OAAQ,CACNtM,KAAMoI,OACNrC,UAAU,GAEZwG,QAAS,CACPvM,KAAMoI,OACNrC,UAAU,IAGd2D,kBACEjK,IAAM+M,EACJC,wBAAkBjM,KAAKqJ,IAAIrJ,KAAK6L,mBAAoB7L,KAAK2J,YAAc,GAGnEuC,GAFaxE,MAAM6D,QAAQS,GAAYA,EAAW,CAACA,IAEhCG,aAAKC,UAC5BC,0BAAoBC,eAASF,EAAYjL,OAAS,KAAKgL,qCAGnDhL,MAAiB,MAAVA,EAAgB,KAAOA,qCAMpC,OAAOkK,cAAcK,UAAW,CAC9BnM,WAAY,CACVgN,KAAMvM,KAAKpB,OACX4N,YAAaxM,KAAKpB,KAAK,gBAEzBgN,mBAAoB5L,KAAK4L,mBACzBa,sBAAuBnB,mBACvBY,eCjDS,CACbpM,KAAM,eACNoF,OAAQ,CAAC7F,gBAAgB,CAAES,KAAM,eACjC2K,WAAY,gBAAEiC,gBACdpN,MAAO,CACL+J,IAAK,CACH7J,KAAMC,OACN8F,UAAU,GAEZoE,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZqG,mBAAoB,CAClBpM,KAAMoI,OACNlI,QAAS,8GC9Bb6K,mBACGlB,IAAKe,MACLT,UAAWS,YACXuC,uBAAsBvC,qBACtBxL,KAAM8G,OACPkH,qBAAmB,mBACnBC,UAAQ,SACRC,WAAS,+OCDb,SAAe,CACbhN,KAAM,UACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAW4I,oCAEb,CACE3H,aAAc,aAGlB/F,gBAAgB,CAAES,KAAM,UAE1BR,MAAO,CACL+F,WAAY,CACV7F,KAAM8F,QACN5F,SAAS,GAEXoI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACR0C,iBACE,OAAOlI,KAAKiE,MAAM+I,MAEpBzI,wBACE,MAAO,CACLc,WAAYrF,KAAKqF,WACjByC,eAAgB9H,KAAK8H,kBAI3BoB,OAAQzH,aAAa,SAAUE,cAC7B,IAAK3B,KAAKiE,MACR,OAAO,KAGThF,IAAMgO,EAAcnK,cAAc9C,KAAM,WAClCkN,EAAWpK,cAAc9C,KAAM,QAoCrC,OAAKkN,GAAYD,EACRtL,EACL,MACA,CACEG,MAAO,CACL8D,MAAO5F,KAAKpB,SAGhB,CACEqO,EAAY,CACV/E,MAAOlI,KAAKiE,MAAM+I,KAClBG,SAAUnN,KAAKiE,MAAMkJ,SACrBhC,UAAWnL,KAAKiE,MAAMkH,cAMvBxJ,EAAEyL,8CAAoB,CAAE/B,cAAe1J,IAAM,CAClDqL,KAAMhN,KAAKiE,MAAM+I,kKA5CjB,OAAOrL,EACL,KACA,CACEX,IAAKqI,EAAIgE,SACTvL,MAAOwL,EACPtL,GAAI,CACFuL,MAAOlF,EACPmF,SAAUC,IAGd,CACGP,GACCA,EAAS,CACP5E,KAAMe,QACNpB,EACAkF,SAAUnN,EAAKiE,MAAMkJ,SACrBhC,UAAWnL,EAAKiE,MAAMkH,0BAEX9B,uBAAwBpB,KA4B3CkD,UAAWnL,KAAKiE,MAAMkH,UACtB5L,WAAYS,KAAKT,YAAc,CAC7BgN,KAAMvM,KAAKT,WAAW,YACtBmO,KAAM1N,KAAKT,WAAW,iBACtB+I,KAAMtI,KAAKT,WAAW,gCC1Ef,CACbO,KAAM,iBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,gBACxBwD,kBACE,CACEa,UAAWwJ,+BAEb,CACEvI,aAAc,oBAGlB2B,4BAEFzH,MAAO,CACL4I,MAAO,CACL1I,KAAMkI,MACNnC,UAAU,GAEZuC,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACL2D,MAAOlI,KAAKkI,MACZJ,eAAgB9H,KAAK8H,2FC7DhBpC,EAAK,uBAAhBC,oCAAmBC,yBAAOF,YACxBG,mCACGqC,MAAOxC,QAAMwC,MACbpC,OAAQJ,QAAMI,OACd8H,aAAgBlI,QAAMkI,aACtBjH,UAAYjB,QAAMiB,UAClBwB,UAAWzC,QAAMyC,6BAElB1C,iCACGG,yBAAOF,kBACPmI,wCAAQnI,QAAMI,OAAOqE,OAAO2D,EAAOC,cAAc5M,+BAElDwE,wDACiBD,QAAMwC,eAAdI,0BADT3C,iCAEG3E,IAAKsH,EAAKnH,MACVyE,yBAAOF,kBACPvE,MAAOmH,EAAKnH,MACZ6M,SAAU1F,EAAK+B,+BAEb/B,EAAKC,oGCblBtJ,IAAMgP,+BAAqBC,mBAEZ,CACbpO,KAAM,WACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,UACxBwD,kBACE,CAAEa,UAAW8J,cACb,CACE7I,aAAc,eAIpBsB,8BACE,MAAO,CAGLyH,uCAA4BnO,EAAKsE,UAGrChF,MAAO,CACL8O,UAAW,CACT5O,KAAMoI,OACNrC,UAAU,GAEZ8I,QAAS,CACP7O,KAAMoI,OACNrC,UAAU,IAGd2D,OAAQzH,aAAa,SAAUE,GAC7B,OAAOA,EAAE,MAAO,GAAIe,eAAe1C,SAErCwF,SAAU,CACRjB,wBACE,MAAO,CACL6J,UAAWpO,KAAKoO,UAChBC,QAASrO,KAAKqO,6BCnCTC,sCAAgC3L,gBAC3C1C,kBACE,CACEiF,OAAQ,CAAC7F,gBAAgB,CAAES,KAAM,mBACjC4G,mBACE,MAAO,CACL6H,4BAA6BvO,KAAKyD,wBAGtCoB,MAAO,CACL2J,sBAAaA,GACXvL,MACE,GAIFjD,KAAKyD,sBAAsBgL,OAAOC,UAAUF,GAAcG,UAE5DP,mBAAUA,GACRpO,KAAKyD,sBAAsBgL,OAAOG,SAASR,GAAa,IAAIO,UAE9DE,4BAAmBA,GAEjB7O,KAAKyD,sBAAsBqL,oBAAsBD,GAEnDE,mBACE,MAAM,IAAI/P,MACR,sQAKJgQ,yBACE,MAAM,IAAIhQ,MACR,4QAKJiQ,wBAAeA,GAEbjP,KAAKyD,sBAAsByL,gBAAkBD,GAE/CE,YAAa,CACXjI,WAAW,EACXpC,iBAAQsK,EAAMC,eACXA,GAAQ,IACN1O,gBAAQ2O,UAAqD,KAArCF,GAAQ,IAAIG,QAAQD,KAC5CvO,iBAASyO,GACRxP,EAAKyD,sBAAsBgM,MAAMD,MAGpCJ,GAAQ,IACNzO,gBAAQ2O,UAAqD,KAArCD,GAAQ,IAAIE,QAAQD,KAC5CvO,iBAAS2O,GACR1P,EAAKyD,sBAAsBkM,IAAID,OAIvCE,gBAAOA,GACL5P,KAAKyD,sBAAsBmM,OAASnQ,OAAO0C,OACzC0N,8CACAD,KAIN1L,mBACEjF,IAAMuP,EAAexO,KAAKyD,sBAAsBqM,OACJ,mBAAjCtB,EAAauB,kBACtBvB,EAAauB,wBAAwBC,iBACrCxB,EAAauB,sCAAsCE,eAGvDC,8BAIElQ,KAAKmQ,qBACEnQ,EAAKyD,sBAAsBiB,SAC9B1E,EAAKyD,sBAAsB2M,aAIU,yBACrCpQ,KAAKyD,sBAAsBiB,SAC7B1E,KAAKyD,sBAAsB4M,UAI7BrQ,KAAKyD,sBAAsB6M,4BAAyB3Q,MAGxDgD,IC/FE4N,cAAgB,2OAKPjC,6BAA6B,CAC1CxO,KAAM,mBACNR,MAAO,CACLkP,aAAc,CACZhP,KAAMC,OACN8F,UAAU,GAEZiL,eAAgB,CACdhR,KAAMuI,SACNrI,aAASC,GAEXyO,UAAW,CACT5O,KAAMoI,OACNrC,UAAU,GAEZwJ,QAAS,CACPrP,aAASC,EACT8Q,mBAAUtP,GACR,QACmB,kBAAVA,IACLA,EAAMuP,SAAWvP,EAAMwP,gBAEzB1N,KACE,iLAEK,KAKbkK,SAAU,CACRzN,aAASC,EACT8Q,mBAAUtP,GACR,YACmB,IAAVA,GACU,kBAAVA,GACU,iBAAVA,IAIb0N,mBAAoB,CAClBrP,KAAM2K,OACNzK,aAASC,GAEXsP,eAAgB,CACdzP,KAAMuI,SACNrI,aAASC,GAEXqP,cAAe,CACbxP,KAAMuI,SACNrI,aAASC,GAEXiR,eAAgB,CACdpR,KAAMC,OACNC,aAASC,GAEXkR,OAAQ,CACNrR,KAAMoI,OACNlI,aAASC,EACT8Q,mBAAUtP,GAIR,OAHIA,GACF8B,KAAKsN,gBAEA,IAGXO,MAAO,CACLtR,KAAMoI,OACNlI,aAASC,EACT8Q,mBAAUtP,GAIR,OAHIA,GACF8B,KAAKsN,gBAEA,IAGXpB,YAAa,CACX3P,KAAMkI,MACNhI,QAAS,MAEXkQ,OAAQ,CACNpQ,KAAMC,OACNC,aAASC,IAGbqE,gBACE,MAAO,CACLP,sBAAuBsN,cAAc,CACnCvC,aAAcxO,KAAKwO,aACnBgC,eAAgBxQ,KAAKwQ,eACrBrD,SAAUnN,KAAKmN,SACfiB,UAAWpO,KAAKoO,UAChBW,QAAS/O,KAAK+O,QACdF,mBAAoB7O,KAAK6O,mBACzBI,eAAgBjP,KAAKiP,eACrBD,cAAehP,KAAKgP,cACpB4B,eAAgB5Q,KAAK4Q,eACrBhB,OAAQ5P,KAAK4P,WAInB1G,OAAQzH,aAAa,SAAUE,SAC7B,OAAOA,EACL,MACA,CACEiE,SAAO,KACJ5F,KAAKpB,SAAS,IACdoB,KAAKpB,KAAK,GAAI,SAAS,MAG5B8D,eAAe1C,4BCtHNsO,6BAA6B,CAC1CxO,KAAM,sBACN0D,OAAQ,CACNwN,+BAAgC,CAC9BtR,mBACE,MAAM,IAAIV,MAAM,0DAItBgF,gBACE,MAAO,CACLP,sBAAuBzD,KAAKgR,iCAGhC9H,OAAQzH,aAAa,SAAUE,SAC7B,OAAOA,EACL,MACA,CACEiE,SAAO,KACJ5F,KAAKpB,SAAS,IACdoB,KAAKpB,KAAK,GAAI,SAAS,MAG5B8D,eAAe1C,oBCqDN,CACbF,KAAM,kBACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAW8M,4CAEb,CACE7L,aAAc,qBAGlB/F,gBAAgB,CAAES,KAAM,kBAE1BR,MAAO,CACL4R,aAAc,CACZ1R,KAAM8F,QACN5F,SAAS,GAEX2F,WAAY,CACV7F,KAAM8F,QACN5F,SAAS,GAEXoI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,GAEXoD,MAAO,CACLvD,KAAMC,OACNC,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACL2M,aAAclR,KAAKkR,aACnB7L,WAAYrF,KAAKqF,WACjByC,eAAgB9H,KAAK8H,eACrB/E,MAAO/C,KAAK+C,QAGhBmF,iBAGE,OAAOlI,KAAKiE,MAAM+I,OAGtBpN,QAAS,CACPuR,0BACEnR,KAAKiE,MAAMiN,gBAEbE,sBACEpR,KAAKiE,MAAM4G,8ICjIJnF,EAAK,uBAAhBC,oCAAmBC,yBAAOF,YAEhB0E,EAAY,aADpBvE,8CAGGsL,eAAiBxN,iBACjB0N,KAAM3L,QAAM4L,QAAQD,KACpBE,YAAe7L,QAAM6L,+BAEtB9L,iCACGG,0GAIAiD,SAAUnD,QAAM6L,YAChBlJ,uCAAO1E,kGAMZkC,mCACGqC,MAAOvE,QACP2N,QAAS5L,QAAM4L,QACfE,WAAc9L,QAAM8L,WACpBL,eAAiBxN,iBACjByN,WAAazN,aACbmC,OAAQnC,aACRwJ,SAAUzH,QAAMyH,SAChBhC,UAAYzF,QAAMyF,6BAEnB1F,6BAAKG,yBAAOF,qCACVC,wDAC0BhC,iBAAhB2E,EAAML,0BADhBtC,6BAEGC,yBAAOF,gBACP1E,IAAKsH,EAAK+E,SACVhF,2BAAO3C,QAAMyF,2BAA4B7C,kBACzCmJ,8BAAU/L,QAAMyF,2BAA4B7C,oBAE7CzC,gCAEGyC,KAAMA,EACNL,MAAOA,EACPkF,SAAUzH,QAAMyH,SAChBhC,UAAYzF,QAAMyF,mFAEN7C,EAAK+E,UAAW,gCAAYpF,uCAK/CpC,oCAEGuL,WAAazN,aACbmC,OAAQnC,aACR0N,KAAM3L,QAAM4L,QAAQD,KACpBG,WAAc9L,QAAM8L,8BAErB/L,iCACGG,iGAIAiD,SAAUnD,QAAM8L,WAChBnJ,uCAAO1E,2HCRlB,aAAe,CACb7D,KAAM,UACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,SACxBwD,kBACE,CAAEa,UAAWuN,wBACb,CACEtM,aAAc,aAGlB2B,4BAEFzH,MAAO,CACLqK,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAOZoF,MAAO,CACLnL,KAAM2K,OACNzK,aAASC,GAEXiL,cAAe,CACbpL,KAAM2K,OACNzK,aAASC,GAEXkL,SAAU,CACRrL,KAAM8F,QACN5F,SAAS,GAEXoL,OAAQ,CACNtL,KAAM,CAACkI,MAAOK,UACdrI,aAASC,GAEXmI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLoF,UAAW3J,KAAK2J,UAChBgB,MAAO3K,KAAK2K,MACZE,SAAU7K,KAAK6K,SACfD,cAAe5K,KAAK4K,cACpBE,OAAQ9K,KAAK8K,OACbhD,eAAgB9H,KAAK8H,iBAGzB6J,8BACE,OAAO3R,KAAKiE,MAAM0C,WAAa3G,KAAK6K,4GC7GhCnF,EAAK,uBADbC,oCAEGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAErCG,mCACGqC,MAAOxC,QAAMwC,MACbvB,UAAYjB,QAAMiB,UAClBqE,kBAAsBtF,QAAMsF,kBAC5BC,cAAiBvF,QAAMuF,cACvBnF,OAAQJ,QAAMI,OACdqC,UAAWzC,QAAMyC,UACjB+C,eAAkBxF,QAAMwF,eACxBC,UAAYzF,QAAMyF,6BAEnB1F,6BAAKG,yBAAOF,qCACVC,wDACiBD,QAAMwC,eAAdI,0BADT3C,6BAEG3E,IAAKsH,EAAKnH,MACVyE,0BAAQF,eAAc4C,EAAK+B,WAAa3E,8BAEzCD,4BACG2C,KAAM1C,QAAMyC,UAAUG,EAAKnH,OAC3ByE,yBAAOF,gBACP2C,6CAAe3C,QAAMI,OAAOwC,EAAKnH,uBAElCsE,+BAAOG,yBAAOF,sCAAkB4C,EAAKC,UACrC9C,+BAAOG,yBAAOF,sCAAkB4C,EAAKgC,4CAMnC3G,EAAkB,oCAD1BgC,uCAEGC,yGAIAiD,UAAWnD,QAAMsF,kBACjB3C,yDAAe3C,QAAMwF,kCAEtBrF,yCAA4BoF,cAAiBvF,QAAMuF,yEACjDvF,QAAMuF,6JCAhB,aAAe,CACbnL,KAAM,gBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,eACxBwD,kBACE,CAAEa,UAAWuN,wBACb,CACEtM,aAAc,mBAGlB2B,4BAEFzH,MAAO,CACLqK,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZoF,MAAO,CACLnL,KAAM2K,OACNzK,QAAS,IAEXoL,OAAQ,CACNtL,KAAM,CAACkI,MAAOK,UACdrI,aAASC,GAEXmI,eAAgB,CACdtI,KAAMuI,SACNrI,iBAAQwI,GACN,OAAOA,KAIb1C,SAAU,CACRjB,wBACE,MAAO,CACLoF,UAAW3J,KAAK2J,UAChBgB,MAAO3K,KAAK2K,MACZG,OAAQ9K,KAAK8K,OACbhD,eAAgB9H,KAAK8H,kBAI3BlI,QAAS,CACPkG,gBAAO3E,GACLnB,KAAKiE,MAAM6B,OAAO3E,8ECnFduE,EAAK,uBAFbC,oCACGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAGrCG,mCACGqC,MAAOxC,QAAMwC,MACbvB,UAAYjB,QAAMiB,UAClBb,OAAQnC,SACRwE,UAAWzC,QAAMyC,UACjBgD,UAAYzF,QAAMyF,6BAEnB1F,iCACGG,yBAAOF,kBACPmI,wCAAQlK,SAAOmK,EAAOC,cAAc5M,WAErCsE,iCAASG,yBAAOF,kBAAgBvE,MAAM,KACpC0E,wHAEFF,wDACiBD,QAAMwC,eAAdI,0BADT3C,iCAEG3E,IAAKsH,EAAKnH,MACVyE,yBAAOF,kBACPvE,MAAOmH,EAAKnH,MACZ6M,SAAU1F,EAAK+B,YAEhBxE,gCAAmByC,KAAMA,6DACpBA,EAAKC,gCAAaD,EAAKgC,OAAQ,yGCe9C,aAAe,CACbxK,KAAM,iBACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWyN,+BAEb,CACExM,aAAc,oBAGlB/F,gBAAgB,CAAES,KAAM,gBACxBiH,4BAEFzH,MAAO,CACLqK,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZ2C,MAAO,CACL1I,KAAMkI,MACNnC,UAAU,GAEZuC,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLoF,UAAW3J,KAAK2J,UAChB7B,eAAgB9H,KAAK8H,eACrBI,MAAOlI,KAAKkI,wFCzEVxC,EAAK,uBADbC,oCAEGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAErCG,mCACGqC,MAAOxC,QAAMwC,MACbvB,UAAYjB,QAAMiB,UAClBb,OAAQJ,QAAMI,OACdqC,UAAWzC,QAAMyC,UACjBgD,UAAYzF,QAAMyF,6BAEnB1F,6BAAKG,0BAAQF,sCACXC,wDACiBD,QAAMwC,eAAdI,0BADT3C,6BAEG3E,IAAKsH,EAAKC,MACV3C,0BAAQF,eAAc4C,EAAK+B,WAAa3E,8BAEzCD,gCAAQG,yBAAOF,mBACbD,gCACEjG,KAAK,QACJoG,yBAAOF,iBACP5F,KAAMsK,YACNjJ,MAAOmH,EAAKnH,MACZ0Q,QAASvJ,EAAK+B,UACdwD,wCAAQnI,QAAMI,OAAOgI,EAAO5N,OAAOiB,gCAEtCsE,+BAAOG,yBAAOF,0CAAsB4C,EAAKC,6FCkJrD,aAAe,CACbzI,KAAM,gBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,eACxBwD,kBACE,CACEa,UAAW2N,8BAEb,CACE1M,aAAc,mBAGlB2B,4BAEFzH,MAAO,CACLyS,QAAS,CACPvS,KAAM2K,OACNzK,aAASC,EACT8Q,mBAAUtP,GACR,OAAOA,EAAQ,IAGnB6Q,WAAY,CACVxS,KAAM2K,OACNzK,aAASC,EACT8Q,mBAAUtP,GACR,OAAOA,EAAQ,IAGnB8Q,UAAW,CACTzS,KAAM8F,QACN5F,SAAS,GAEXwS,SAAU,CACR1S,KAAM8F,QACN5F,SAAS,GAEXyS,SAAU,CACR3S,KAAM8F,QACN5F,SAAS,GAEXwR,aAAc,CACZ1R,KAAM8F,QACN5F,SAAS,IAGb8F,SAAU,CACRjB,wBACE,MAAO,CACLwN,QAAS/R,KAAK+R,QACdC,WAAYhS,KAAKgS,cAIvBI,MAAO,CAAC,eACRxS,QAAS,CACPkG,gBAAOuL,GACLpS,IAAMoT,EAAIC,KAAKC,IAAID,KAAKE,IAAInB,EAAM,GAAIrR,KAAKiE,MAAMwO,QAAU,GAC3DzS,KAAKiE,MAAM6B,OAAOuM,GAElBrS,KAAK0S,MAAM,cAAeL,4NCvOtB3M,EAAK,uBADbC,oCAEGC,iCAAUF,eAAgBA,2BAA2BA,QAAM+M,iBAE5D5M,mCACGC,OAAQnC,SACRwE,UAAWzC,QAAMyC,UACjBpC,kBAAoBL,QAAMK,kBAC1B4M,OAASjN,QAAMiN,OACfF,QAAU/M,QAAM+M,QAChBG,MAAOlN,QAAMkN,MACbrB,YAAe7L,QAAM6L,YACrBC,WAAc9L,QAAM8L,0CAErB/L,6BAAKG,yBAAOF,kBAOF0E,EAAS,2BANjBzE,mCACGC,4IAODC,iCAEGsC,4BAAiBzC,QAAMyC,cACvBoJ,YAAe7L,QAAM6L,YACrBzL,yBAAcnC,gCAEE+B,QAAM6L,6BAUrB5L,qCAAOC,yBAAOF,gBAAcmN,aAAW,cAAa,0BATpDlN,kCACGC,yBAAOF,gBACRmN,aAAW,aACVzK,KAAM1C,QAAMyC,aACZE,yDAA0B1E,2CAC1B,6DAcDyG,EAAY,8BANpBzE,mCACGC,+IAODC,oCAEGsC,4BAAiBzC,QAAMyC,UAAUzC,QAAMK,sBACvCwL,YAAe7L,QAAM6L,YACrBzL,yBAAcnC,SAAO+B,QAAMK,yCAEXL,QAAM6L,6BAUrB5L,qCAAOC,yBAAOF,gBAAcmN,aAAW,iBAAgB,yBATvDlN,kCACGC,yBAAOF,gBACRmN,aAAW,gBACVzK,KAAM1C,QAAMyC,UAAUzC,QAAMK,qBAC5BsC,yDAA0B1E,SAAO+B,QAAMK,oDACvC,+EASTJ,wDAMiBD,QAAMkN,eAAdvB,gCANT1L,6BACGC,+IAMA5E,IAAKqQ,IAENxL,gCAEGwL,KAAMA,EACNlJ,4BAAiBzC,QAAMyC,UAAUkJ,IACjCE,YAAe7L,QAAM6L,YACrBC,WAAc9L,QAAM8L,WACpB1L,yBAAcnC,SAAO0N,uBAEtB5L,4BACGG,yBAAOF,gBACP0C,KAAM1C,QAAMyC,UAAUkJ,GACtBwB,sBAAoBxB,KACpBhJ,6CAA0B1E,SAAO0N,qDAC9BA,qCAWFjH,EAAQ,0BANhBzE,mCACGC,0IAODC,gCAEGsC,4BAAiBzC,QAAMyC,UAAUzC,QAAMK,sBACvCyL,WAAc9L,QAAM8L,WACpB1L,yBAAcnC,SAAO+B,QAAMK,yCAEXL,QAAM8L,4BAUrB7L,qCAAOC,yBAAOF,gBAAcmN,aAAW,aAAY,yBATnDlN,kCACGC,yBAAOF,gBACRmN,aAAW,YACVzK,KAAM1C,QAAMyC,UAAUzC,QAAMK,qBAC5BsC,yDAA0B1E,SAAO+B,QAAMK,oDACvC,4DAcDqE,EAAQ,0BANhBzE,mCACGC,0IAODC,gCAEGsC,4BAAiBzC,QAAMyC,UAAUzC,QAAM+M,YACvCjB,WAAc9L,QAAM8L,WACpB1L,yBAAcnC,SAAO+B,QAAM+M,+BAEX/M,QAAM8L,4BAUrB7L,qCACGC,yBAAOF,gBACPmN,gCAA+BnN,yDAXlCC,kCACGC,yBAAOF,gBACPmN,gCAA+BnN,gBAC/B0C,KAAM1C,QAAMyC,UAAUzC,QAAM+M,WAC5BpK,yDAA0B1E,SAAO+B,QAAM+M,0CACvC,8HCjIjB,aAAe,CACb3S,KAAM,WACNoF,OAAQ,CAAC7F,gBAAgB,CAAES,KAAM,UAAYyG,4BAC7C3G,QAAS,CACPkT,iBAAQhT,GACN,OACIE,KAAK4C,OAAO9C,4DCxBpB6F,8BAAMC,0BAAQF,UAASA,aAAaA,8BACvB/B,qCAAXgC,oCAA+BC,yBAAOF,oBACpCG,kCAAqB+C,eAAiBlD,iDAExCD,8BAAMG,yBAAOF,kBACXG,mCAAO+C,eAAiBlD,kBAEf/B,qCAAXgC,oCAA+BC,yBAAOF,oBACpCG,kCAAqB+C,eAAiBlD,8ECqB5C,aAAe,CACb5F,KAAM,eACNoF,OAAQ,CAAC7F,gBAAgB,CAAES,KAAM,eACjCR,MAAO,CACLyT,MAAO,CACLrT,QAAS,QACT+Q,mBAAUtP,GACR,OAA6C,IAAtC,CAAC,QAAS,QAAQoO,QAAQpO,MAIvCqE,SAAU,CACRwN,sBACE,MACE,yFAGeC,SAAWA,SAASC,SAAW,yJC9CpDvN,8BAAMC,yBAAOF,YACXD,4BACGG,yBAAOF,gBACP0C,KAAMzE,aACPzD,OAAO,SACPiT,IAAI,WACJN,aAAW,uCAEXlN,8BACEyN,MAAA,8BACCxN,0BAAQF,eAAcA,UAAS0E,WAChCiJ,QAAQ,eAER5N,+BACG6N,cAAMlJ,yBACPmJ,EAAE,miGAEJ9N,+BACG6N,cAAMlJ,yBACPmJ,EAAE,4oECfZ,qBAAe,CACbzT,KAAM,sBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,qBACxBwD,kBACE,CACEa,UAAWqP,8BAEb,CACEpO,aAAc,0BAIpB9F,MAAO,CACLmU,eAAgB,CACdjU,KAAMC,OACN8F,UAAU,GAEZmO,sBAAuB,CACrBlU,KAAMuI,SACNxC,UAAU,EACV7F,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLkP,eAAgBzT,KAAKyT,eACrBC,sBAAuB1T,KAAK0T,yBAIlCxK,kBACE,OAAO,gBCpBI,CACbpJ,KAAM,yBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,wBACxBwD,kBACE,CACEa,UAAWqP,8BAEb,CACEpO,aAAc,6BAIpB9F,MAAO,CACLwI,eAAgB,CACdtI,KAAMuI,SACNxC,UAAU,EACV7F,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLuD,eAAgB9H,KAAK8H,yDCxChBpC,EAAK,uBAAhBC,oCAAmBC,yBAAOF,YACxBG,mCAAOqC,MAAOxC,QAAMwC,4CAClBvC,wDAA2BD,QAAMwC,eAApBI,EAAMtH,0BAAnB2E,8BAAyC3E,IAAKA,IAC5C6E,gCAAmByC,KAAMA,qBACvB7C,sDAAQ6C,kFC4DlB,aAAe,CACbxI,KAAM,gBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,eACxBwD,kBACE,CACEa,UAAWwP,yBAEb,CACEvO,aAAc,mBAGlB2B,4BAEFzH,MAAO,CACLqK,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZgN,IAAK,CACH/S,KAAM2K,OACN5E,UAAU,EACV7F,aAASC,GAEX6S,IAAK,CACHhT,KAAM2K,OACN5E,UAAU,EACV7F,aAASC,GAEXiU,UAAW,CACTpU,KAAM2K,OACN5E,UAAU,EACV7F,QAAS,IAGbsE,gBACE,MAAO,CACL6P,cAAUlU,EACVmU,cAAUnU,IAGdoU,mBACE/T,KAAK6T,cAAWlU,EAChBK,KAAK8T,cAAWnU,GAElB6F,SAAU,CACRjB,wBACE,MAAO,CACLoF,UAAW3J,KAAK2J,UAChB4I,IAAKvS,KAAKuS,IACVC,IAAKxS,KAAKwS,IACVoB,UAAW5T,KAAK4T,YAGpBI,gBACE,OAAO,EAAI1B,KAAK2B,IAAI,GAAIjU,KAAK4T,YAE/BM,wBAC+BlU,KAAKiE,MAAMmM,sBACCpQ,KAAKiE,MAAMkQ,sBAEpD,MAAO,CACL5B,IACE6B,KAAcC,EAAAA,GAAYD,IAAaE,EACnCF,OACAzU,EACN6S,IACE+B,IAAaF,EAAAA,GAAYE,IAAaC,EAAWD,OAAW5U,KAIpEC,QAAS,CACP6U,cAAKC,EAAOC,GACV,OAAID,MAAAA,EACKA,EAEAC,GAGX7O,uCACE9F,KAAKiE,MAAM6B,OAAO,CAACyM,EAAKC,6JC/IpB9M,EAAK,uBADbC,oCAEGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAErCG,mCACGE,kBAAoBpC,SACpBmC,OAAQnC,SACRgD,UAAYjB,QAAMiB,UAClBwN,MAAOzO,QAAMyO,MACbhJ,UAAYzF,QAAMyF,6BAEnB1F,+BACGG,yBAAOF,gBACPkP,+JAODnP,gCAAQG,yBAAOF,mBACbG,oCACAJ,gCACEjG,KAAK,SACJoG,0BAAQF,gBAAeA,wBACvBsO,KAAMrQ,OACN4O,IAAK7M,QAAMyO,MAAM5B,IACjBC,IAAK9M,QAAMyO,MAAM3B,IACjBqC,YAAanP,QAAMyO,MAAM5B,IACzBpR,MAAOwC,SAAO4O,IACd1E,wCAAQiH,WAAWhH,EAAOC,cAAc5M,mCAG7CsE,+BAAOG,yBAAOF,uBACZG,6EAAuB,aAEzBJ,gCAAQG,yBAAOF,mBACbG,oCACAJ,gCACGG,0BAAQF,gBAAeA,wBACxBlG,KAAK,SACJwU,KAAMrQ,OACN4O,IAAK7M,QAAMyO,MAAM5B,IACjBC,IAAK9M,QAAMyO,MAAM3B,IACjBqC,YAAanP,QAAMyO,MAAM3B,IACzBrR,MAAOwC,SAAO6O,IACd3E,wCAAQiH,WAAWhH,EAAOC,cAAc5M,mCAG7CsE,iCAASG,yBAAOF,kBAAgBlG,KAAK,WACnCqG,kKCyBV,aAAe,CACb/F,KAAM,gBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,eACxBwD,kBACE,CACEa,UAAW4Q,8BAEb,CACE3P,aAAc,mBAGlB2B,4BAEFzH,MAAO,CACLqK,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZiN,IAAK,CACHhT,KAAM2K,OACNzK,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLoF,UAAW3J,KAAK2J,UAChB6I,IAAKxS,KAAKwS,sBC/FPwC,MAAM,6BAA6B5B,MAAA,+BACtC3N,iCAAQwP,GAAG,4BAA4B5B,QAAQ,cAC7C5N,+BACE8N,EAAE,iIAGN9N,iCAAQwP,GAAG,iCAAiC5B,QAAQ,cAClD5N,+BACE8N,EAAE,sQAPNrN,aAKAC,wEA4BQV,8BAAKyP,aAAW,mDAAhBC,yBAWA1P,8BAAKyP,aAAW,wDAAhBE,kDArDH1P,EAAK,uBAAhBC,oCAAmBC,yBAAOF,YACxBG,mCACGqC,MAAOxC,QAAMwC,MACbpC,OAAQJ,QAAMI,OACdqC,UAAWzC,QAAMyC,UACjBgD,UAAYzF,QAAMyF,UAClBxE,UAAYjB,QAAMiB,8CAEnBhB,6BAAAM,4BAaAR,6BAAKG,yBAAOF,qCACVC,wDACwBD,QAAMwC,eAApBI,EAAMtH,0BADhB2E,6BAEG3E,IAAKA,EACL4E,0BAAQF,eAAc4C,EAAK+B,WAAa3E,8BAEzCD,4BACG2C,KAAM1C,QAAMyC,UAAUG,EAAKnH,OAC3B0R,aAAevK,gBACf1C,yBAAOF,gBACP2C,6CAAe3C,QAAMI,OAAOwC,EAAKnH,0CAElCwE,wDAA8B2C,EAAK+M,eAAjBC,EAAMC,oEAEdD,mBADR3P,8BAEE6C,cAAY,OACZgN,MAAM,KACNC,OAAO,KACN7P,0BAAQF,mBAAkBA,2BAC1B1E,IAAKuU,2CAKR5P,8BAEGC,0BAAQF,mBAAkBA,4BAC3B8C,cAAY,OACZgN,MAAM,KACNC,OAAO,KACNzU,IAAKuU,wCAMV9P,+BAAOG,yBAAOF,iBAAe8C,cAAY,SACvC3C,yEAAmB,eAErBJ,+BAAOG,yBAAOF,sCAAkB4C,EAAKgC,2GCoDjD,aAAe,CACbxK,KAAM,cACNoF,OAAQ,CAAC7F,gBAAgB,CAAES,KAAM,eACjCR,MAAO,CACLuV,YAAa,CACXrV,KAAMoI,OACNlI,QAAS,gBAEXgW,UAAW,CACTlW,KAAM8F,QACN5F,SAAS,GAEXiW,qBAAsB,CACpBnW,KAAM8F,QACN5F,SAAS,GAEXkW,2BAA4B,CAC1BpW,KAAM8F,QACN5F,SAAS,GAEXmW,wBAAyB,CACvBrW,KAAM8F,QACN5F,SAAS,GAEXoW,YAAa,CACXtW,KAAMoI,OACNlI,QAAS,UAEXqW,WAAY,CACVvW,KAAMoI,OACNlI,QAAS,SAEXyB,MAAO,CACL3B,KAAMoI,OACNrC,UAAU,EACV7F,aAASC,GAEXqW,WAAY,CACVxW,KAAMoI,OACNrC,UAAU,EACV7F,aAASC,IAGbyS,MAAO,CAAC,QAAS,oBAAqB,OAAQ,QAAS,SACvDpO,gBACE,MAAO,CACLiS,MAAO,KAGXrW,QAAS,CACPsW,qBACE,OAAOC,SAASC,gBAAkBpW,KAAKqW,MAAMC,OAE/CC,iBAAQC,GACAxW,KAAK6V,yBAA2BW,EAAMC,cAC1CzW,KAAK0S,MAAM,QAAS8D,EAAMtW,OAAOiB,OACjCnB,KAAK0S,MAAM,oBAAqB8D,EAAMtW,OAAOiB,SAGjDuV,wBACgB1W,KAAKqW,MAAMC,MACnBK,QAERC,uBACE5W,KAAK0S,MAAM,QAAS,IACpB1S,KAAK0S,MAAM,oBAAqB,IAChC1S,KAAK0S,MAAM,0GCxIPjN,+BACE8N,EAAE,2aADJpN,2DAwBAV,+BACE8N,EAAE,iOADJ4B,wcAsBA0B,mEAxFRlR,+BACEmR,OAAO,GACPC,KAAK,SACLC,WAAA,GACCpR,yBAAOF,gBACPkP,gHAAgBjR,yDAChBsT,+GAAetT,yDAIhB8B,gCACEjG,KAAK,SACL0X,YAAY,MACZC,eAAe,MACfC,aAAa,MACbC,WAAW,QACXC,UAAU,MACVzE,aAAW,SACVgC,YAAazK,cACbsL,UAAWtL,YACXxE,yBAAOF,iBACPvE,MAAOiJ,SAASA,aAChBmN,uCAAO7R,gBAAeoI,KACtB0J,sCAAM9R,eAAcoI,KACpByI,uCAAO5S,UAAQmK,KACf2J,gDAAgB9T,UAAQmK,KACzB4J,IAAI,+BAENjS,iCACEjG,KAAK,SACJmY,MAAOvN,cACPxE,yBAAOF,kBACPkS,OAAQxN,wBAAwBA,+BAEjCvE,4EACEF,8BACE6C,cAAY,OACZgN,MAAM,KACNC,OAAO,KACPpC,QAAQ,YACPzN,yBAAOF,6DASdD,iCACEjG,KAAK,QACJmY,MAAOvN,aACPxE,yBAAOF,iBACPkS,uFAKD/R,2EACEF,8BACE6C,cAAY,OACZiN,OAAO,KACPpC,QAAQ,YACPzN,yBAAOF,qBACR8P,MAAM,4CAUJpL,EAAoB,sCAD5BzE,qCAEGiS,QAASxN,6BACTxE,yBAAOF,8BAERG,kFACEF,8BACG6C,eAAc4B,6BACfyI,aAAW,sBACX2C,MAAM,KACNC,OAAO,KACPoC,OAAO,OACPxE,QAAQ,YACPzN,yBAAOF,wICGlBzG,QAAM6Y,2BAES,CACbhY,KAAM,oBACN2K,WAAY,aAAEsN,sBAAaC,UAC3B9S,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,mBACxBwD,kBACE,CACEa,UAAW8T,kCAEb,CACE7S,aAAc,uBAGlB2B,4BAEFzH,MAAO,CACLqK,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZ2S,WAAY,CACV1Y,KAAM8F,QACN5F,aAASC,GAEXwY,sBAAuB,CACrB3Y,KAAMoI,OACNrC,UAAU,EACV7F,QAAS,gBAEX0Y,SAAU,CACR1Y,QAAS,KACT+Q,mBAAUtP,GACR,MAAiB,QAAVA,GAA6B,OAAVA,GAE5BoE,UAAU,GAEZoF,MAAO,CACLnL,KAAM2K,OACN5E,UAAU,EACV7F,aAASC,GAEXiL,cAAe,CACbpL,KAAM2K,OACN5E,UAAU,EACV7F,aAASC,GAEXkL,SAAU,CACRrL,KAAM8F,QACNC,UAAU,EACV7F,SAAS,GAEXoL,OAAQ,CACNtL,KAAM,CAACkI,MAAOK,UACdxC,UAAU,EACV7F,aAASC,GAEXmI,eAAgB,CACdtI,KAAMuI,SACNxC,UAAU,EACV7F,aAASC,IAGbqE,gBACE,MAAO,CACLqU,0BAA2B,KAG/B7S,SAAU,CACR8S,qBAAsB,CACpBC,eACE,OAAOvY,KAAKqY,2BAEdG,aAAIrX,GACFnB,KAAKiE,MAAMwU,eAAetX,GAC1BnB,KAAKqY,0BAA4BlX,IAGrC+J,0BACE,OAAOlL,KAAKiE,MAAMiH,gBAAkB4M,MAEtC5P,iBACE,OAAOlI,KAAKiE,MAAMiE,MAAMiE,aAAK7D,UAC3B7I,OAAO0C,OAAO,GAAImG,EAAM,CACtBoQ,iBAAkB,CAChBpQ,KAAM,CACJnH,MAAOmH,EAAKkE,mBAMtBjI,wBACE,MAAO,CACLoF,UAAW3J,KAAK2J,UAChByO,SAAUpY,KAAKoY,SACfzN,MAAO3K,KAAK2K,MACZE,SAAU7K,KAAK6K,SACfD,cAAe5K,KAAK4K,cACpBE,OAAQ9K,KAAK8K,OACb6N,mBAAmB,EACnB7Q,eAAgB9H,KAAK8H,kBAI3BlI,QAAS,CACPkG,gBAAO3E,GACLnB,KAAKiE,MAAM6B,OAAO3E,GAClBnB,KAAKqY,0BAA4B,qMCpM7B3S,EAAK,uBAFbC,oCACGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAGrCG,mCACGqC,MAAOvE,QACPmC,OAAQnC,SACR8U,eAAkB/S,QAAM+S,eACxBG,oBAAwB9D,4BACxB5J,eAAkBvH,iBAClBqH,kBAAsBtF,QAAMsF,kBAC5BC,cAAiBvF,QAAMuF,cACvB9C,UAAWzC,QAAMyC,UACjB0Q,aAAgBnT,QAAMmT,aACtBlS,UAAYjB,QAAMiB,UAClBwE,UAAYzF,QAAMyF,mCAEmBf,EAAU,4BAAhDzE,oCAAMC,yBAAOF,uBACX0F,8BACWzH,4EAAAA,EAAoB,yBAC5BkR,YAAazK,wBACb0O,cAAapT,oGAMVA,QAAMmT,kBAAgBlV,QAAMtD,OAHpCwF,2CAEGoQ,MAAOtS,0CAGR8B,8BAAMG,yBAAOF,sBAAmB,kDAElCD,6BAAKG,yBAAOF,qCACVC,wDAEiBhC,iBAAR2E,0BAFT3C,6BACGC,0BAAQF,eAAc4C,EAAK+B,WAAa3E,4BAExC1E,IAAKsH,EAAKnH,QAEX0E,gCAEGyC,KAAMA,EACNxC,OAAQnC,SACRwE,UAAWzC,QAAMyC,6BAElB1C,gCAAQG,yBAAOF,mBACbD,gCACGG,yBAAOF,oBACRlG,KAAK,WACJ2B,MAAOmH,EAAKnH,MACZ0Q,QAASvJ,EAAK+B,UACdwD,4BAAQlK,SAAO2E,EAAKnH,+BAEXiJ,EAAU,4BAAtBzE,qCAAyBC,yBAAOF,uBAC9B0F,mBAAezB,UAAU,OAAQN,IAAKf,yCAExC3C,qCAAcC,yBAAOF,0CAAsB4C,EAAKC,WAChD9C,+BAAOG,yBAAOF,sCAAkB4C,EAAKgC,iCAarCF,EAAQ,0BARhBzE,uCACGC,oHAMAyC,6FAAO1E,gDAEPkF,UAAWnD,QAAMsF,oBAElBnF,yCAA4BoF,cAAiBvF,QAAMuF,kFACzCvF,QAAMuF,mJCpDxB,mBAAe,CACbnL,KAAM,kBACNoF,OAAQ,CACN5B,kBAAkB,CAAEa,WAAW,IAC/B9E,gBAAgB,CAAES,KAAM,kBAE1BR,MAAO,CACLyZ,WAAY,CACVvZ,KAAM8F,QACN5F,SAAS,IAGbsE,2BACE,MAAO,CACLgV,0BAC4BhZ,EAAKyD,2CACzB6N,EAAUtR,EAAK8D,iBAAiBmV,aAChCxK,EAASzO,EAAK8D,iBAAiBoV,YAC/BjV,EAAQwK,EAASA,EAAOxK,MAAQ,KAGtCjE,EAAKiE,MAAQ,SACXqN,QACArN,SACAkV,QACAC,MAKRlV,mBACElE,KAAKyD,sBAAsB4V,YAAY,SAAUrZ,KAAKgZ,UACtDhZ,KAAKgZ,cAEoC,yBACrChZ,KAAKsE,SACPtE,KAAKyD,sBAAsB6V,eAAe,SAAUtZ,KAAKgZ,UACrDhZ,KAAKuZ,SACPvZ,KAAKyD,sBAAsB6V,eAAe,QAAStZ,KAAKuZ,eAI9D1U,MAAO,CACLkU,WAAY,CACV7R,WAAW,EACXpC,iBAAQiU,GACFA,GACF/Y,KAAKuZ,qBACLvZ,KAAKyD,sBAAsB4V,YAAY,QAASrZ,KAAKuZ,UAC5CvZ,KAAKuZ,UACdvZ,KAAKyD,sBAAsB6V,eAAe,QAAStZ,KAAKuZ,SACxDvZ,KAAKuZ,aAAU5Z,UAKvB6F,SAAU,CACRgU,8BAC4CxZ,KAAKiE,kBAC/C,OAAOhE,cAAc,GAAIqR,EAAS,SAAEA,oEC7EpC7L,6HAGAA,gCAAG,sGALoBC,SAASA,QAAMzB,OAASyB,QAAM4L,yBAAzD3L,oCAAMC,yBAAOF,YACXG,4EAAclC,mCACZsC,aAGAC,aACAT,kCAAK,gCAAYhG,OAAOe,KAAKkF,QAAM4L,aACnC7L,kCAAK,8BAAUhG,OAAOe,KAAKkF,QAAMzB,WACjCwB,kCAAK,+BAAWC,QAAMyT,WACtB1T,kCAAK,8BAAUC,QAAM0T,yECwC3B,aAAe,CACbtZ,KAAM,eACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWsV,6BAEb,CACErU,aAAc,kBAGlB/F,gBAAgB,CAAES,KAAM,eAE1B2K,WAAY,aACVsN,UAEFzY,MAAO,CACLuV,YAAa,CACXrV,KAAMoI,OACNlI,QAAS,IAEXgW,UAAW,CACTlW,KAAM8F,QACN5F,SAAS,GAEXiW,qBAAsB,CACpBnW,KAAM8F,QACN5F,SAAS,GAEXmW,wBAAyB,CACvBrW,KAAM8F,QACN5F,SAAS,GAEXoW,YAAa,CACXtW,KAAMoI,OACNlI,QAAS,2BAEXqW,WAAY,CACVvW,KAAMoI,OACNlI,QAAS,0BAEXyB,MAAO,CACL3B,KAAMoI,OACNlI,aAASC,GAEXqW,WAAY,CACVxW,KAAMoI,OACNlI,aAASC,GAEX+Z,UAAW,CACTla,KAAMuI,SACNrI,aAASC,IAGbqE,gBACE,MAAO,CACL2V,WAAY,UACZpY,cACAC,SAGJgE,SAAU,CACRjB,wBACE,MAAO,CACLmV,UAAW1Z,KAAK0Z,YAGpBE,wBACE,YACwB,IAAf5Z,KAAKmB,YACe,IAApBnB,KAAKgW,YAGhB6D,iBACE,OAAO7Z,KAAKmB,OAASnB,KAAKgW,YAE5BjQ,kBAAmB,CACjBwS,eAGMvY,KAAK4Z,cAAgB5Z,KAAK6Z,QAAU7Z,KAAK2Z,aAE3C3Z,KAAK2Z,WAAa3Z,KAAK6Z,MACvB7Z,KAAK0S,MAAM,QAAS1S,KAAK6Z,OACzB7Z,KAAK0S,MAAM,oBAAqB1S,KAAK6Z,OACrC7Z,KAAKiE,MAAM6B,OAAO9F,KAAK6Z,cAKD7Z,KAAKqW,kBAC7B,OAAIyD,GAAeA,EAAY5D,YACtBlW,KAAK2Z,WAGP3Z,KAAK6Z,OAAS7Z,KAAKiE,MAAMgS,OAAS,IAE3CuC,aAAIuB,GACF/Z,KAAK2Z,WAAaI,EAClB/Z,KAAKiE,MAAM6B,OAAOiU,GACd/Z,KAAK4Z,eACP5Z,KAAK0S,MAAM,QAASqH,GACpB/Z,KAAK0S,MAAM,oBAAqBqH,yFCvJ7BrU,EAAK,uBAAhBC,oCAAmBC,yBAAOF,YACxBG,mCACGE,kBAAoBpC,oBACpBqW,gBAAmBtU,QAAMsU,gBACzBlU,OAAQJ,QAAMI,0BAEfsF,mBACGmM,uCAAO7R,gBAAeoI,KACtB0J,sCAAM9R,eAAcoI,KACpBmJ,uCAAOvR,mBACPmP,YAAazK,cACbsL,UAAWtL,YACX6P,yBAAwB7P,uBACxB8P,gCAA+BxU,QAAMsU,gBACrCG,4BAA2B/P,0BAC3BgQ,eAAchQ,cACdiQ,cAAajQ,aACb0O,cAAapT,wBACL/B,yEAAAA,EAAiB,sBAC1B+T,IAAI,sEAKQ5C,EAAM,OAAlBjP,mDAA6CsD,KAAK,oDAKtC2L,EAAM,OAAlBjP,6CAAuCsD,KAAK,8CAKhC2L,EAAM,OAAlBjP,4CAAsCsD,KAAK,sDAbR2L,EAAM,aAA9B,qDACTjP,gEAI2BiP,EAAM,aAAxB,+CACTjP,0DAI0BiP,EAAM,aAAvB,8CACTjP,ySCjBV,aAAe,CACb/F,KAAM,aACNoF,OAAQ,CAAC7F,gBAAgB,CAAES,KAAM,aACjC2K,WAAY,gBAAEiC,gBACdpN,MAAO,CACL+J,IAAK,CACH7J,KAAMC,OACN8F,UAAU,GAEZoE,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZqG,mBAAoB,CAClBpM,KAAMoI,OACNlI,QAAS,8GC9Bb6K,mBACGlB,IAAKe,MACLT,UAAWS,YACXuC,uBAAsBvC,qBACtBxL,KAAM8G,OACPkH,qBAAmB,iBACnBC,UAAQ,SACRC,WAAS,8FC2Bb,aAAe,CACbhN,KAAM,YACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,WACxBwD,kBACE,CAAEa,UAAWmW,0BACb,CACElV,aAAc,eAIlB2B,4BAEFzH,MAAO,CACL4I,MAAO,CACL1I,KAAMkI,MACNnC,UAAU,GAEZuC,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACL2D,MAAOlI,KAAKkI,MACZJ,eAAgB9H,KAAK8H,2FC7DApC,EAAK,uBAAhCC,oCAAMC,yBAAOF,YACXG,mCACGqC,MAAOxC,QAAM6U,QACb3M,aAAgBlI,QAAMkI,aACtB9H,OAAQJ,QAAMI,OACdC,kBAAoBL,QAAMK,kBAC1BY,UAAYjB,QAAMiB,6BAEnBlB,iCACGG,yBAAOF,kBACPmI,wCAAQnI,QAAMI,OAAOgI,EAAOC,cAAc5M,SAC3C0R,aAAW,uCAEXlN,wDACiBD,QAAM6U,iBAAdjS,0BADT3C,iCAEG3E,IAAKsH,EAAKnH,MACVyE,yBAAOF,kBACPvE,MAAOmH,EAAKnH,MACZ6M,SAAU1F,EAAKnH,QAAUuE,QAAMK,uCAE7BuC,EAAKC,oGCElB,aAAe,CACbzI,KAAM,WACNoF,OAAQ,CACN5B,kBACE,CAAEa,UAAWqW,yBACb,CACEpV,aAAc,cAGlB/F,gBAAgB,CAAES,KAAM,WAE1B0F,SAAU,CACRiV,uCACmCza,KAAKiE,kCAEhCyW,EAAS,iBAAiB/H,EAAOgI,iBAEvC,OAAqB,IAAjBC,yBAC4BF,EAGX,IAAjBE,uBAC0BF,EAG1BE,EAAe,GAEfA,GAAgB,GAChBD,sCAAqCD,EAGlC,IAETG,iCACqB7a,KAAKiE,aAExB,OAAe,IAAX0O,EACK,aAGM,IAAXA,EACK,WAGLA,EAAS,EACDA,EAAOgI,4BAGZ,IAETpW,wBACE,MAAO,4CCzEAmB,EAAK,uBAAhBC,oCAAmBC,yBAAOF,YACxBG,kCAAAiV,wBAEGxJ,QAAS5L,QAAMjC,sBAAsBgL,OAAOsM,gCAG7CtV,+BAAOG,yBAAOF,kBACKA,QAAmB,+BAAnCC,uBAEAqV,8DADKrX,mDACLgC,qFAAoBhC,iFACP+B,QAAMuV,iBAAiBN,kBAAmB,2EC0BhE,aAAe,CACb7a,KAAM,sBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,qBACxBwD,kBACE,CACEa,UAAW+W,oCAEb,CACE9V,aAAc,yBAGlB2B,4BAEFzH,MAAO,CACLqK,UAAW,CACTnK,KAAMoI,OACNrC,UAAU,GAEZvD,GAAI,CACFxC,KAAM,CAACoI,OAAQuC,OAAQ7E,QAASoC,OAChCnC,UAAU,EACV7F,SAAS,GAEXyb,IAAK,CACH3b,KAAM,CAACoI,OAAQuC,OAAQ7E,QAASoC,OAChCnC,UAAU,EACV7F,aAASC,GAEX4I,MAAO,CACL/I,KAAMoI,OACNlI,aAASC,IAGb6F,SAAU,CACRjB,wBACE,MAAO,CACLoF,UAAW3J,KAAK2J,UAChB3H,GAAIhC,KAAKgC,GACTmZ,IAAKnb,KAAKmb,sFC1ERzV,EAAK,uBADbC,oCAEGC,0BAAQF,UAASA,QAAMiB,WAAajB,8BAErCG,mCACG1E,MAAOuE,QAAMvE,MACbwF,UAAYjB,QAAMiB,UAClBb,OAAQJ,QAAMI,OACdqC,UAAWzC,QAAMyC,UACjBgD,UAAYzF,QAAMyF,6BAEnB1F,gCAAQG,yBAAOF,mBACbD,gCACGG,yBAAOF,oBACRlG,KAAK,WACJM,KAAM4F,QAAMvE,MAAMrB,KAClBqB,MAAOiJ,KACPyH,QAASnM,QAAMvE,MAAMkJ,UACrBwD,wCAAQnI,QAAMI,OAAOJ,QAAMvE,gCAE9BsE,+BAAOG,yBAAOF,0CAAsB0E,SAAS1E,QAAMvE,MAAMrB,gBAC7C4F,QAAMvE,MAAMmJ,uBAAxB3E,qCAAyCC,yBAAOF,sCAC9CA,QAAMvE,MAAMmJ,MAAMqQ,uHCqB5B,aAAe,CACb7a,KAAM,iBACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWiX,+BAEb,CACEhW,aAAc,oBAGlB/F,gBAAgB,CAAES,KAAM,iBAE1BR,MAAO,CACL+b,iBAAkB,CAChB7b,KAAM8F,QACNC,UAAU,EACV7F,aAASC,GAEX2b,SAAU,CACR9b,KAAMoI,OACNlI,aAASC,GAEX4b,0BAA2B,CACzB/b,KAAMC,OACNC,aAASC,GAEX6b,YAAa,CACXhc,KAAMoI,OACNrC,UAAU,EACV7F,QAAS,mBAEX+b,oBAAqB,CACnBjc,KAAMoI,OACNrC,UAAU,EACV7F,QAAS,oDAGbsE,gBACE,MAAO,CACL0X,eAAgB,CACd1G,MAAO,6BACPQ,MAAO,KACPC,OAAQ,KACRpC,QAAS,YACTC,KAAM,OACNuE,OAAQ,eACR8D,YAAa,IACbC,cAAe,QACfC,eAAgB,WAItBrW,SAAU,CACRjB,wBACE,MAAO,CACL8W,iBAAkBrb,KAAKqb,iBACvBC,SAAUtb,KAAKsb,SACfC,0BAA2Bvb,KAAKub,4BAGpCO,2BACE,MAC4C,UAA1C9b,KAAKiE,MAAM8X,oBAAoB5C,QACc,gBAA7CnZ,KAAKiE,MAAM8X,oBAAoBC,WAGnCC,yBACE,MAAO,CACLC,mBAAoBlc,KAAKiE,MAAMiY,mBAC/BC,YAAanc,KAAKiE,MAAMkY,YACxBC,gBAAiBpc,KAAKiE,MAAMmY,gBAC5BL,oBAAqB/b,KAAKiE,MAAM8X,sBAGpCM,0BACE,MAAO,CACLlD,OAAQnZ,KAAKiE,MAAM8X,oBAAoB5C,OACvC6C,UAAWhc,KAAKiE,MAAM8X,oBAAoBC,UAC1CG,YAAanc,KAAKiE,MAAMkY,YACxBG,WAAYtc,KAAKiE,MAAM8X,oBAAoBO,WAC3CC,cAAevc,KAAKiE,MAAM8X,oBAAoBQ,cAC9CL,mBAAoBlc,KAAKiE,MAAMiY,sBAIrCtc,QAAS,CACP4c,qBAAYhG,GACVA,EAAMzI,cAAc4I,OACpB3W,KAAKiE,MAAMmY,iYCzHLlW,iDAWAT,+BAAM8N,EAAE,qDACR9N,+BAAMgX,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,6BACjCnX,+BAAMgX,GAAG,IAAIC,GAAG,KAAKC,GAAG,KAAKC,GAAG,qDAxB/BlX,EAAK,uBAAhBC,oCAAmBC,yBAAOF,YACxBG,4EAAclC,oCACZ8B,iCACEjG,KAAK,SACJoG,yBAAOF,kBACPiS,MAAOjS,QAAMwW,mBAAqB9R,cAAcA,sBAChDvB,UAAWnD,QAAMwW,mBACjB7T,6FAAO1E,4CAERkC,+EAAgClC,qCACKA,EAAe,iCAAlDgC,uEAAamP,sDAObnP,uEAAamP,oBACXrP,+BACE8N,EAAE,uDACDD,KAAM5N,QAAMyW,wDAEfU,aACAhG,cACAiG,yCAINrX,8BAAMG,yBAAOF,oBACXG,2EAA4BlC,qCAC1B8B,oDAAMC,QAAMqW,oBAAoBO,qFCR1C,aAAe,CACbxc,KAAM,kBACNoF,OAAQ,CACN7F,gBAAgB,CAAES,KAAM,iBACxBwD,kBACE,CACEa,UAAW4Y,gCAEb,CACE3X,aAAc,sBAIpBxF,QAAS,CACPkG,kBACM9F,KAAKiE,MAAM+Y,iBACbhd,KAAKiE,MAAM6B,OAAO,GAElB9F,KAAKiE,MAAM6B,YAAOnG,4CCxCb+F,SAASA,QAAMuX,kCAA1BtX,oCAA6CC,yBAAOF,YAClDG,mCAAOmX,iBAAoBtX,QAAMsX,iBAAmBlX,OAAQJ,QAAMI,0BAChEL,8BAAMG,yBAAOF,kBACXG,gCAAmBmX,iBAAoBtX,QAAMsX,uBAE/CvX,iCAAQjG,KAAK,SAAUoG,yBAAOF,kBAAiB2C,uCAAO1E,eACpDkC,kCAAqBmX,iBAAoBtX,QAAMsX,4EAE3CtX,QAAMsX,2GCFlB,SAASE,mBAAmBC,GAC1Ble,IAYI4C,EAZEvC,EACF6d,EAAM7d,MAEV,GAAIA,EAAO,CACT,GAAIA,EAAMqK,UACR,OAAOrK,EAAMqK,UAEf,GAAIjC,MAAM6D,QAAQjM,EAAMmI,YACtB,OAAOnI,EAAMmI,WAAW,GAe5B,GATE5F,EACEsb,EAAMtb,UAAYsb,EAAMtb,SAASnC,SAAWyd,EAAMtb,SAASnC,UAQ3DgI,MAAM6D,QAAQ1J,GAEhB,OAAOA,EAASO,gBACbC,EAAK+a,UAAS/a,GAAO6a,mBAAmBE,SACzCzd,4BAON,sBAAe,CACbG,KAAM,oBACNoF,OAAQ,CACN5B,kBACE,CACEa,UAAWkZ,kCAEb,CACEjY,aAAc,uBAGlB/F,gBAAgB,CAAES,KAAM,oBAE1BR,MAAO,CACLwI,eAAgB,CACdtI,KAAMuI,SACNrI,aAASC,GAEX2d,OAAQ,CACN9d,KAAMkI,MACNhI,aAASC,GAEX4d,kBAAmB,CACjB/d,KAAM2K,OACNzK,aAASC,IAGbuJ,OAAQzH,aAAa,SAAUE,cACvB8I,EAAa,IAAI+S,IAavB,IAXC9a,eAAe1C,OAAS,IAAIe,iBAASoc,GACpCle,IAAM0K,EAAYuT,mBAAmBC,GACjCxT,GACFc,EAAW+N,IACT7O,EACAhI,EAAE,MAAO,CAAEX,IAAK2I,EAAW/D,MAAO,CAAC5F,EAAKpB,KAAK,YAAc,CAACue,QAM7Dnd,KAAKiE,MAAO,CACfhF,IAAMwe,EAAgB,GAGtB,OAFAhT,EAAW1J,iBAAS4B,UAAc8a,EAActe,KAAKwD,KAE9ChB,EACL,MACA1B,cACE,CACE2F,MAAO,CAAC5F,KAAKpB,SAEf,CAAEkD,MAAO,CAAE8V,QAAQ,KAErB6F,GAIJ,OAAO9b,EACL,MACA,CAAEiE,MAAO,CAAC5F,KAAKpB,SACfoB,KAAKiE,MAAMyZ,mBAAmBvR,aAAKxC,UACjCc,EAAW8N,IAAI5O,QAIrBnE,SAAU,CACRjB,wBACE,MAAO,CACLuD,eAAgB9H,KAAK8H,eACrBwV,OAAQtd,KAAKsd,OACbC,kBAAmBvd,KAAKud,kBAExBI,QAAS,kCC7GFle,OAAO0C,OAAO,GAAIyb,kBAAmB,CAClD9d,KAAM,gCACNoQ,mBACEjN,KAAK,8gCCJI4a,OAAS,CACpBC,iBAAQC,GACNte,OAAOe,KAAKmd,SAAS5c,iBAASlC,GAC5Bkf,EAASpb,UAAUgb,QAAQ9e,GAAYiB,KAAM6d,QAAQ9e,QCE3D,SAASmf,sBAAsBC,oBAAqC,kCAAP,IAC3Dhf,IAOIif,EAPE3D,EAAU,CACd4D,oBAAgBxe,EAChBye,WAAOze,EACP0e,WAAO1e,EACPG,KAAM,0BAMAwe,EAAa7e,OAAO0C,OAAO,GAAI8b,EAAkBta,SAAU4W,GAsCnE,OArCE+D,EAAWpZ,OAAaA,SAAYoZ,EAAWpZ,QAAU,IACzDgZ,EAAMK,iBAAaD,GACfL,EAAkBO,SACpBN,EAAIvO,IAAIsO,EAAkBO,SAExBP,EAAkBQ,QACpBP,EAAIvO,IAAIsO,EAAkBQ,QAExBR,EAAkBS,OACpBR,EAAIvO,IAAIsO,EAAkBS,OAsB9BR,EAAItb,OAASqb,EAAkBrb,OAC/Bsb,EAAIS,MAAQV,EAAkBU,MAKvBT,EAGT,SAASU,qBAAqBC,EAAsBC,GAClD7f,IAEI8f,EAFEpQ,EAASoC,cAAc8N,GAqI7B,OA1HAlQ,EAAOqQ,iBAAmB,gBAOpBd,EACAe,mCAPJ,IAAKC,EACH,MAAM,IAAIlgB,MACR,qGAOJ,OAAOmgB,QAAQC,UACZC,gBACCnB,EAAMY,EAAenc,EAAW,CAC9BuC,OAAQ,CACN,CACEoa,wBACErgB,IAAMsgB,EAAa9f,OAAOoB,yBACxB8B,EACA,SAGI6c,IAAaD,IACfA,EAAWje,UAAYie,EAAW/G,KAGlC7V,EAAU8c,OAASD,IAGrBxf,KAAKyf,MAAQ9c,EAAU8c,QAG3Bvb,oBACE+a,EAAWjf,KAAK+Q,eAEPX,QAGT6O,EAASva,SAAU,SAM5B2a,uBAAWH,EAAehB,KAC1BmB,uBAAWK,sBAAeT,KAC1BI,cAAMM,GAML,OALAZ,EAAiBa,yBACfX,EAASlb,UACT4b,GAEFhR,EAAOkR,QAAQd,GACRpQ,EAAOmR,cAOpBnR,EAAOmR,SAAW,WAChB,IAAKf,EACH,MAAM,IAAI/f,MAAM,mDAElB,OAAO+f,GAWTpQ,EAAOhK,cAAgB,SAAUL,EAAQyb,GACvC9gB,IAAMqS,EAAUyO,EAAO9G,aAIvB,GAAgB,OAAZ3H,EAAJ,CAIArS,IAAMgF,EAAQqN,EAAQ0O,OAEhBC,EAAcF,EAAO7G,YAG3B+G,EAAYhc,MAAQA,EAEpBK,EAAO4E,OAAO,CACZuF,OAAQwR,UACR3O,EACA4O,cAAeH,EAAOI,0BACtBJ,QACA9b,EACAmc,gBAAiB,GACjBjY,UAAW4X,EAAO5X,UAClB1E,sBAAuBkL,EACvB0R,eAAgB,CACdrG,iBAAiB,OAUvBrL,EAAOkR,QAAU,SAAUvO,GACpBA,GAOL3C,EAAOlK,gBAAkB6M,EAEzB3C,EAAOyB,QACPzB,EAAOjK,SAAU,GATfzB,KACE,0EAUC0L,EAGF,SAAS2R,sBAAsBzB,kBAAuB,2CACjCb,uBAE1B/e,IAAM0P,EAASiQ,qBAAqBC,EAAsB0B,GAmB1D,MAfkB,CAChB7Z,mBACE,MAAO,CACLsK,+BAAgChR,KAAK+Q,gBAGzC/M,gBACE,MAAO,CAGL+M,cAAepC"}