vue-instantsearch 4.5.0 → 4.6.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 (44) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +5 -5
  3. package/src/__tests__/index.js +1 -0
  4. package/src/components/HierarchicalMenuList.vue +4 -1
  5. package/src/components/InstantSearch.js +5 -0
  6. package/src/components/StateResults.vue +55 -12
  7. package/src/components/__tests__/StateResults.js +6 -0
  8. package/src/components/__tests__/__snapshots__/HierarchicalMenu.js.snap +2 -2
  9. package/src/components/__tests__/__snapshots__/StateResults.js.snap +6 -0
  10. package/src/mixins/__mocks__/widget.js +10 -0
  11. package/src/util/createInstantSearchComponent.js +7 -0
  12. package/vue2/cjs/index.js +1 -1
  13. package/vue2/cjs/index.js.map +1 -1
  14. package/vue2/es/package.json.js +1 -1
  15. package/vue2/es/src/components/HierarchicalMenuList.vue.js +1 -1
  16. package/vue2/es/src/components/HierarchicalMenuList.vue.js.map +1 -1
  17. package/vue2/es/src/components/InstantSearch.js +1 -1
  18. package/vue2/es/src/components/InstantSearch.js.map +1 -1
  19. package/vue2/es/src/components/StateResults.vue.js +1 -1
  20. package/vue2/es/src/components/StateResults.vue.js.map +1 -1
  21. package/vue2/es/src/util/createInstantSearchComponent.js +1 -1
  22. package/vue2/es/src/util/createInstantSearchComponent.js.map +1 -1
  23. package/vue2/umd/index.js +1 -1
  24. package/vue2/umd/index.js.map +1 -1
  25. package/vue3/cjs/index.js +1 -1
  26. package/vue3/cjs/index.js.map +1 -1
  27. package/vue3/es/package.json.js +1 -1
  28. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=script&lang.js.map +1 -1
  29. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=0435b314&lang.js +1 -1
  30. package/vue3/es/src/components/HierarchicalMenuList.vue_vue&type=template&id=0435b314&lang.js.map +1 -1
  31. package/vue3/es/src/components/InstantSearch.js +1 -1
  32. package/vue3/es/src/components/InstantSearch.js.map +1 -1
  33. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js +1 -1
  34. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js.map +1 -1
  35. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=5992f3d5&lang.js +1 -1
  36. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=5992f3d5&lang.js.map +1 -1
  37. package/vue3/es/src/util/createInstantSearchComponent.js +1 -1
  38. package/vue3/es/src/util/createInstantSearchComponent.js.map +1 -1
  39. package/vue3/umd/index.js +1 -1
  40. package/vue3/umd/index.js.map +1 -1
  41. package/vue2/es/src/connectors/connectStateResults.js +0 -2
  42. package/vue2/es/src/connectors/connectStateResults.js.map +0 -1
  43. package/vue3/es/src/connectors/connectStateResults.js +0 -2
  44. package/vue3/es/src/connectors/connectStateResults.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-vue2.js","../../src/util/warn.js","../../src/mixins/widget.js","../../src/components/Autocomplete.vue","../../src/mixins/panel.js","../../src/components/Breadcrumb.vue","../../src/components/ClearRefinements.vue","../../src/components/Configure.js","../../src/components/ConfigureRelatedItems.js","../../src/components/CurrentRefinements.vue","../../src/components/HierarchicalMenuList.vue","../../src/components/HierarchicalMenu.vue","../../src/util/unescape.js","../../src/util/parseAlgoliaHit.js","../../src/components/Highlighter.vue","../../src/components/Highlight.vue","../../src/components/Hits.vue","../../src/components/HitsPerPage.vue","../../src/components/Index.js","../../src/util/createInstantSearchComponent.js","../../src/components/InstantSearch.js","../../src/components/InstantSearchSsr.js","../../src/components/InfiniteHits.vue","../../src/components/Menu.vue","../../src/components/MenuSelect.vue","../../src/components/NumericMenu.vue","../../src/components/Pagination.vue","../../src/components/Panel.vue","../../src/components/PoweredBy.vue","../../src/components/QueryRuleContext.js","../../src/components/QueryRuleCustomData.vue","../../src/components/RangeInput.vue","../../src/components/RatingMenu.vue","../../src/components/SearchInput.vue","../../src/components/RefinementList.vue","../../src/connectors/connectStateResults.js","../../src/components/StateResults.vue","../../src/components/SearchBox.vue","../../src/components/Snippet.vue","../../src/components/SortBy.vue","../../src/components/Stats.vue","../../src/components/ToggleRefinement.vue","../../src/components/VoiceSearch.vue","../../src/components/RelevantSort.vue","../../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 */\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 Vue from 'vue';\n\nconst isVue2 = true;\nconst isVue3 = false;\nconst Vue2 = Vue;\nconst version = Vue.version;\n\nexport { Vue, Vue2, isVue2, isVue3, version };\n\nexport function renderCompat(fn) {\n return function(createElement) {\n return fn.call(this, createElement);\n };\n}\n\nexport function getDefaultSlot(component) {\n return component.$slots.default;\n}\n\n// Vue3-only APIs\nexport const computed = undefined;\nexport const createApp = undefined;\nexport const createSSRApp = undefined;\nexport const createRef = undefined;\nexport const customRef = undefined;\nexport const defineAsyncComponent = undefined;\nexport const defineComponent = undefined;\nexport const del = undefined;\nexport const getCurrentInstance = undefined;\nexport const h = undefined;\nexport const inject = undefined;\nexport const isRaw = undefined;\nexport const isReactive = undefined;\nexport const isReadonly = undefined;\nexport const isRef = undefined;\nexport const markRaw = undefined;\nexport const nextTick = undefined;\nexport const onActivated = undefined;\nexport const onBeforeMount = undefined;\nexport const onBeforeUnmount = undefined;\nexport const onBeforeUpdate = undefined;\nexport const onDeactivated = undefined;\nexport const onErrorCaptured = undefined;\nexport const onMounted = undefined;\nexport const onServerPrefetch = undefined;\nexport const onUnmounted = undefined;\nexport const onUpdated = undefined;\nexport const provide = undefined;\nexport const proxyRefs = undefined;\nexport const reactive = undefined;\nexport const readonly = undefined;\nexport const ref = undefined;\nexport const set = undefined;\nexport const shallowReactive = undefined;\nexport const shallowReadonly = undefined;\nexport const shallowRef = undefined;\nexport const toRaw = undefined;\nexport const toRef = undefined;\nexport const toRefs = undefined;\nexport const triggerRef = undefined;\nexport const unref = undefined;\nexport const useCSSModule = undefined;\nexport const useCssModule = undefined;\nexport const warn = undefined;\nexport const watch = undefined;\nexport const watchEffect = undefined;\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\n :class=\"suit()\"\n v-if=\"state\"\n >\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>This widget doesn't render anything without a filled in default slot.</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 { createWidgetMixin } from '../mixins/widget';\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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 { isVue3 } from '../util/vue-compat';\nimport mitt from 'mitt';\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 :class=\"[suit('item'), !state.items.length && suit('item', 'selected')]\">\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 <span v-else>\n <slot name=\"rootLabel\">Home</slot>\n </span>\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\n :class=\"suit('separator')\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">></slot>\n </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 <span v-else>{{ item.label }}</span>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\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()\"\n >\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';\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 { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\nimport { connectConfigure } from 'instantsearch.js/es/connectors';\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 { createWidgetMixin } from '../mixins/widget';\nimport { EXPERIMENTAL_connectConfigureRelatedItems } from 'instantsearch.js/es/connectors';\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\n :class=\"[suit(), noRefinement && suit('','noRefinement')]\"\n v-if=\"state\"\n >\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'\">{{ refinement.label }}</q>\n <template v-else>\n {{ refinement.label }}\n </template>\n </span>\n <button\n :class=\"suit('delete')\"\n @click=\"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 { createWidgetMixin } from '../mixins/widget';\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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\n .toString()\n .charAt(0)\n .toLocaleUpperCase() + value.toString().slice(1)\n );\n },\n },\n};\n</script>\n","<template>\n <ul\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.data && suit('item', 'parent'),\n item.isRefined && suit('item', 'selected')\n ]\"\n >\n <a\n :href=\"createURL(item.value)\"\n :class=\"suit('link')\"\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\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\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >{{ state.isShowingMore ? 'Show less' : 'Show more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHierarchicalMenu } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport HierarchicalMenuList from './HierarchicalMenuList.vue';\nimport { createSuitMixin } from '../mixins/suit';\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';\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 </span>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\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';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\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 >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"itemIndex\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ itemIndex }}</slot>\n </li>\n </ol>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :hasNoResults=\"state.hasNoResults\"\n :canRefine=\"state.canRefine\"\n >\n <select\n :class=\"suit('select')\"\n v-model=\"selected\"\n @change=\"handleChange\"\n >\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n >{{ item.label }}</option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsPerPage } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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 data() {\n return {\n selected: this.items.find(item => item.default === true).value,\n };\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n handleChange() {\n this.state.refine(this.selected);\n },\n },\n};\n</script>\n","import { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport indexWidget from 'instantsearch.js/es/widgets/index/index';\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 { createSuitMixin } from '../mixins/suit';\nimport { version } from '../../package.json'; // rollup does pick only what needed from json\nimport { _objectSpread } from './polyfills';\nimport { isVue3, version as vueVersion } from './vue-compat';\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 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/vue-instantsearch/issues/new?template=feature.md'\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 },\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';\nimport { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { warn } from '../util/warn';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\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 stalledSearchDelay: {\n type: Number,\n default: undefined,\n },\n searchFunction: {\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 },\n data() {\n return {\n instantSearchInstance: instantsearch({\n searchClient: this.searchClient,\n insightsClient: this.insightsClient,\n indexName: this.indexName,\n routing: this.routing,\n stalledSearchDelay: this.stalledSearchDelay,\n searchFunction: this.searchFunction,\n initialUiState: this.initialUiState,\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n\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=\"[suit('loadPrevious'), state.isFirstPage && suit('loadPrevious', 'disabled')]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >Show previous results</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 >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ index }}</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=\"[suit('loadMore'), state.isLastPage && suit('loadMore', 'disabled')]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >Show more results</button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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=\"[suit('showMore'), !state.canToggleShowMore && suit('showMore', 'disabled')]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >{{ state.isShowingMore ? 'Show less' : 'Show more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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\n :class=\"suit('option')\"\n value=\"\"\n >\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\n name=\"item\"\n :item=\"item\"\n >{{ item.label }} ({{ item.count }})</slot>\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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()\"\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', 'firstPage')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\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\"\n :href=\"state.createURL(0)\"\n @click.prevent=\"refine(0)\"\n >‹‹</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"First\"\n >‹‹</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'previousPage')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\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\"\n :href=\"state.createURL(state.currentRefinement - 1)\"\n @click.prevent=\"refine(state.currentRefinement - 1)\"\n >‹</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Previous\"\n >‹</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 @click.prevent=\"refine(page)\"\n >{{ page + 1 }}</a>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','nextPage')]: true,\n [suit('item','disabled')]: state.isLastPage\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\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Next\"\n >›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','lastPage')]: true,\n [suit('item','disabled')]: state.isLastPage,\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\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.prevent=\"refine(state.nbPages - 1)\"\n >››</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Last\"\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';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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\n v-if=\"getSlot('header')\"\n :class=\"suit('header')\"\n >\n <slot\n name=\"header\"\n :has-refinements=\"canRefine\"\n />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div\n v-if=\"getSlot('footer')\"\n :class=\"suit('footer')\"\n >\n <slot\n name=\"footer\"\n :has-refinements=\"canRefine\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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 168 24\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5D6494'\"\n d=\"M6.97 6.68V8.3a4.47 4.47 0 0 0-2.42-.67 2.2 2.2 0 0 0-1.38.4c-.34.26-.5.6-.5 1.02 0 .43.16.77.49 1.03.33.25.83.53 1.51.83a7.04 7.04 0 0 1 1.9 1.08c.34.24.58.54.73.89.15.34.23.74.23 1.18 0 .95-.33 1.7-1 2.24a4 4 0 0 1-2.6.81 5.71 5.71 0 0 1-2.94-.68v-1.71c.84.63 1.81.94 2.92.94.58 0 1.05-.14 1.39-.4.34-.28.5-.65.5-1.13 0-.29-.1-.55-.3-.8a2.2 2.2 0 0 0-.65-.53 23.03 23.03 0 0 0-1.64-.78 13.67 13.67 0 0 1-1.11-.64c-.12-.1-.28-.22-.46-.4a1.72 1.72 0 0 1-.39-.5 4.46 4.46 0 0 1-.22-.6c-.07-.23-.1-.48-.1-.75 0-.91.33-1.63 1-2.17a4 4 0 0 1 2.57-.8c.97 0 1.8.18 2.47.52zm7.47 5.7v-.3a2.26 2.26 0 0 0-.5-1.44c-.3-.35-.74-.53-1.32-.53-.53 0-.99.2-1.37.58-.38.39-.62.95-.72 1.68h3.91zm1 2.79v1.4c-.6.34-1.38.51-2.36.51a4.02 4.02 0 0 1-3-1.13 4.04 4.04 0 0 1-1.11-2.97c0-1.3.34-2.32 1.02-3.06a3.38 3.38 0 0 1 2.6-1.1c1.03 0 1.85.32 2.46.96.6.64.9 1.57.9 2.78 0 .33-.03.68-.09 1.04h-5.31c.1.7.4 1.24.89 1.61.49.38 1.1.56 1.85.56.86 0 1.58-.2 2.15-.6zm6.61-1.78h-1.21c-.6 0-1.05.12-1.35.36-.3.23-.46.53-.46.89 0 .37.12.66.36.88.23.2.57.32 1.02.32.5 0 .9-.15 1.2-.43.3-.28.44-.65.44-1.1v-.92zm-4.07-2.55V9.33a4.96 4.96 0 0 1 2.5-.55c2.1 0 3.17 1.03 3.17 3.08V17H22.1v-.96c-.42.68-1.15 1.02-2.19 1.02-.76 0-1.38-.22-1.84-.66-.46-.44-.7-1-.7-1.68 0-.78.3-1.38.88-1.81.59-.43 1.4-.65 2.46-.65h1.34v-.46c0-.55-.13-.97-.4-1.25-.26-.29-.7-.43-1.32-.43-.86 0-1.65.24-2.35.72zm9.34-1.93v1.42c.39-1 1.1-1.5 2.12-1.5.15 0 .31.02.5.05v1.53c-.23-.1-.48-.14-.76-.14-.54 0-.99.24-1.34.71a2.8 2.8 0 0 0-.52 1.71V17h-1.57V8.91h1.57zm5 4.09a3 3 0 0 0 .76 2.01c.47.53 1.14.8 2 .8.64 0 1.24-.18 1.8-.53v1.4c-.53.32-1.2.48-2 .48a3.98 3.98 0 0 1-4.17-4.18c0-1.16.38-2.15 1.14-2.98a4 4 0 0 1 3.1-1.23c.7 0 1.34.15 1.92.44v1.44a3.24 3.24 0 0 0-1.77-.5A2.65 2.65 0 0 0 32.33 13zm7.92-7.28v4.58c.46-1 1.3-1.5 2.5-1.5.8 0 1.42.24 1.9.73.48.5.72 1.17.72 2.05V17H43.8v-5.1c0-.56-.14-.99-.43-1.29-.28-.3-.65-.45-1.1-.45-.54 0-1 .2-1.42.6-.4.4-.61 1.02-.61 1.85V17h-1.56V5.72h1.56zM55.2 15.74c.6 0 1.1-.25 1.5-.76.4-.5.6-1.16.6-1.95 0-.92-.2-1.62-.6-2.12-.4-.5-.92-.74-1.55-.74-.56 0-1.05.22-1.5.67-.44.45-.66 1.13-.66 2.06 0 .96.22 1.67.64 2.14.43.47.95.7 1.57.7zM53 5.72v4.42a2.74 2.74 0 0 1 2.43-1.34c1.03 0 1.86.38 2.51 1.15.65.76.97 1.78.97 3.05 0 1.13-.3 2.1-.92 2.9-.62.81-1.47 1.21-2.54 1.21s-1.9-.45-2.46-1.34V17h-1.58V5.72H53zm9.9 11.1l-3.22-7.9h1.74l1 2.62 1.26 3.42c.1-.32.48-1.46 1.15-3.42l.91-2.63h1.66l-2.92 7.87c-.78 2.07-1.96 3.1-3.56 3.1-.28 0-.53-.02-.73-.07v-1.34c.17.04.35.06.54.06 1.03 0 1.76-.57 2.17-1.7z\"\n />\n <path\n fill=\"#5468FF\"\n d=\"M78.99.94h16.6a2.97 2.97 0 0 1 2.96 2.96v16.6a2.97 2.97 0 0 1-2.97 2.96h-16.6a2.97 2.97 0 0 1-2.96-2.96V3.9A2.96 2.96 0 0 1 79 .94\"\n />\n <path\n fill=\"#FFF\"\n d=\"M89.63 5.97v-.78a.98.98 0 0 0-.98-.97h-2.28a.98.98 0 0 0-.97.97V6c0 .09.08.15.17.13a7.13 7.13 0 0 1 3.9-.02c.08.02.16-.04.16-.13m-6.25 1L83 6.6a.98.98 0 0 0-1.38 0l-.46.46a.97.97 0 0 0 0 1.38l.38.39c.06.06.15.04.2-.02a7.49 7.49 0 0 1 1.63-1.62c.07-.04.08-.14.02-.2m4.16 2.45v3.34c0 .1.1.17.2.12l2.97-1.54c.06-.03.08-.12.05-.18a3.7 3.7 0 0 0-3.08-1.87c-.07 0-.14.06-.14.13m0 8.05a4.49 4.49 0 1 1 0-8.98 4.49 4.49 0 0 1 0 8.98m0-10.85a6.37 6.37 0 1 0 0 12.74 6.37 6.37 0 0 0 0-12.74\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5468FF'\"\n d=\"M120.92 18.8c-4.38.02-4.38-3.54-4.38-4.1V1.36l2.67-.42v13.25c0 .32 0 2.36 1.71 2.37v2.24zm-10.84-2.18c.82 0 1.43-.04 1.85-.12v-2.72a5.48 5.48 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.11-.44.28-.58.49a.93.93 0 0 0-.22.65c0 .63.22 1 .61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.62.11 2.23.33.6.22 1.09.53 1.44.92.36.4.61.92.76 1.48.16.56.23 1.17.23 1.85v6.87c-.4.1-1.03.2-1.86.32-.84.12-1.78.18-2.82.18-.69 0-1.32-.07-1.9-.2a4 4 0 0 1-1.46-.63c-.4-.3-.72-.67-.96-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.39-1.53.26-.45.6-.82 1.04-1.1.45-.3.95-.5 1.54-.62a8.8 8.8 0 0 1 3.79.05v-.44c0-.3-.04-.6-.11-.87a1.78 1.78 0 0 0-1.1-1.22c-.31-.12-.7-.2-1.15-.2a9.75 9.75 0 0 0-2.95.46l-.33-2.19c.34-.12.84-.23 1.48-.35.65-.12 1.34-.18 2.08-.18zm52.84 9.63c.82 0 1.43-.05 1.85-.13V13.7a5.42 5.42 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.12-.44.28-.58.5a.93.93 0 0 0-.22.65c0 .63.22.99.61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.63.11 2.23.33.6.22 1.1.53 1.45.92.35.39.6.92.76 1.48.15.56.23 1.18.23 1.85v6.88c-.41.08-1.03.19-1.87.31-.83.12-1.77.18-2.81.18-.7 0-1.33-.06-1.9-.2a4 4 0 0 1-1.47-.63c-.4-.3-.72-.67-.95-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.38-1.53.26-.45.61-.82 1.05-1.1.44-.3.95-.5 1.53-.62a8.8 8.8 0 0 1 3.8.05v-.43c0-.31-.04-.6-.12-.88-.07-.28-.2-.52-.38-.73a1.78 1.78 0 0 0-.73-.5c-.3-.1-.68-.2-1.14-.2a9.85 9.85 0 0 0-2.95.47l-.32-2.19a11.63 11.63 0 0 1 3.55-.53zm-8.03-1.27a1.62 1.62 0 0 0 0-3.24 1.62 1.62 0 1 0 0 3.24zm1.35 13.22h-2.7V7.27l2.7-.42V18.8zm-4.72 0c-4.38.02-4.38-3.54-4.38-4.1l-.01-13.34 2.67-.42v13.25c0 .32 0 2.36 1.72 2.37v2.24zm-8.7-5.9a4.7 4.7 0 0 0-.74-2.79 2.4 2.4 0 0 0-2.07-1 2.4 2.4 0 0 0-2.06 1 4.7 4.7 0 0 0-.74 2.8c0 1.16.25 1.94.74 2.62a2.4 2.4 0 0 0 2.07 1.02c.88 0 1.57-.34 2.07-1.02.49-.68.73-1.46.73-2.63zm2.74 0a6.46 6.46 0 0 1-1.52 4.23c-.49.53-1.07.94-1.76 1.22-.68.29-1.73.45-2.26.45-.53 0-1.58-.15-2.25-.45a5.1 5.1 0 0 1-2.88-3.13 7.3 7.3 0 0 1-.01-4.84 5.13 5.13 0 0 1 2.9-3.1 5.67 5.67 0 0 1 2.22-.42c.81 0 1.56.14 2.24.42.69.29 1.28.69 1.75 1.22.49.52.87 1.15 1.14 1.89a7 7 0 0 1 .43 2.5zm-20.14 0c0 1.11.25 2.36.74 2.88.5.52 1.13.78 1.91.78a4.07 4.07 0 0 0 2.12-.6V9.33c-.19-.04-.99-.2-1.76-.23a2.67 2.67 0 0 0-2.23 1 4.73 4.73 0 0 0-.78 2.8zm7.44 5.27c0 1.82-.46 3.16-1.4 4-.94.85-2.37 1.27-4.3 1.27-.7 0-2.17-.13-3.34-.4l.43-2.11c.98.2 2.27.26 2.95.26 1.08 0 1.84-.22 2.3-.66.46-.43.68-1.08.68-1.94v-.44a5.2 5.2 0 0 1-2.54.6 5.6 5.6 0 0 1-2.01-.36 4.2 4.2 0 0 1-2.58-2.71 9.88 9.88 0 0 1 .02-5.35 4.92 4.92 0 0 1 2.93-2.96 6.6 6.6 0 0 1 2.43-.46 19.64 19.64 0 0 1 4.43.66v10.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 { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot :items=\"state.items\">\n <div\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n >\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\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=\"refine({ min: pick(minInput, values.min), max: pick(maxInput, values.max) })\"\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\n :class=\"suit('submit')\"\n type=\"submit\"\n >\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';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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()\"\n >\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\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"display: none;\"\n >\n <symbol\n id=\"ais-RatingMenu-starSymbol\"\n viewBox=\"0 0 24 24\"\n >\n <path 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 </symbol>\n <symbol\n id=\"ais-RatingMenu-starEmptySymbol\"\n viewBox=\"0 0 24 24\"\n >\n <path 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 </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\n :class=\"suit('label')\"\n aria-hidden=\"true\"\n >\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';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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 required\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=\"$emit('input', $event.target.value); $emit('update:modelValue', $event.target.value)\"\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 role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"(!value && !modelValue) || (showLoadingIndicator && shouldShowLoadingIndicator)\"\n >\n <slot name=\"reset-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\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 fillRule=\"evenodd\"\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 role=\"img\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n transform=\"translate(1 1)\"\n stroke-width=\"2\"\n >\n <circle\n stroke-opacity=\".5\"\n cx=\"18\"\n cy=\"18\"\n r=\"18\"\n />\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 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 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=\"[\n suit(),\n !state.canRefine && suit('','noRefinement')\n ]\"\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\n :class=\"suit('searchBox')\"\n v-if=\"searchable\"\n >\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=\"[\n 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\n v-if=\"searchable\"\n :class=\"suit('labelText')\"\n >\n <ais-highlight\n attribute=\"item\"\n :hit=\"item\"\n />\n </span>\n <span\n v-else\n :class=\"suit('labelText')\"\n >{{ 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\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >Show {{ state.isShowingMore ? 'less' : 'more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\nimport SearchInput from './SearchInput.vue';\nimport AisHighlight from './Highlight.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","import { _objectSpread } from '../util/polyfills';\n\nconst connectStateResults = (renderFn, unmountFn = () => {}) => (\n widgetParams = {}\n) => ({\n init({ instantSearchInstance }) {\n renderFn(\n {\n state: undefined,\n results: undefined,\n instantSearchInstance,\n widgetParams,\n },\n true\n );\n },\n\n render({ results, instantSearchInstance, state }) {\n const resultsCopy = _objectSpread({}, results);\n\n const stateCopy = _objectSpread({}, state);\n\n renderFn(\n {\n results: resultsCopy,\n state: stateCopy,\n instantSearchInstance,\n widgetParams,\n },\n false\n );\n },\n\n dispose() {\n unmountFn();\n },\n});\n\nexport default connectStateResults;\n","<template>\n <div\n :class=\"suit()\"\n v-if=\"state && state.state && state.results\"\n >\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>\n Fill in the slot, and get access to the following things:\n </p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</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 connectStateResults from '../connectors/connectStateResults';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin(\n {\n connector: connectStateResults,\n },\n {\n $$widgetType: 'ais.stateResults',\n }\n ),\n createSuitMixin({ name: 'StateResults' }),\n ],\n computed: {\n stateResults() {\n // @MAJOR: replace v-bind=\"stateResults\" with :state=\"state.state\" :results=\"state.results\"\n const { state, results } = this.state;\n return _objectSpread({}, results, { results, state });\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\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 :submit-title=\"submitTitle\"\n :reset-title=\"resetTitle\"\n :class-names=\"classNames\"\n v-model=\"currentRefinement\"\n ref=\"searchInput\"\n >\n <template\n v-slot:loading-indicator\n v-if=\"isVue3\"\n >\n <slot\n name=\"loading-indicator\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n\n <template\n v-slot:submit-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"submit-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n\n <template\n v-slot:reset-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"reset-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"reset-icon\"\n slot=\"reset-icon\"\n />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\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: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\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 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 './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\n :class=\"suit()\"\n v-if=\"state\"\n >\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 >\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 >{{ item.label }}</option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSortBy } from 'instantsearch.js/es/connectors';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n v-bind=\"state\"\n :results=\"state.instantSearchInstance.helper.lastResults\"\n >\n <span :class=\"suit('text')\"><template v-if=\"state.areHitsSorted\">{{ state.nbSortedHits.toLocaleString() }} relevant results sorted out of {{ state.nbHits.toLocaleString() }}</template><template v-else>{{ state.nbHits.toLocaleString() }} results</template> found in {{ state.processingTimeMS.toLocaleString() }}ms</span>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectStats } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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 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 }}</span>\n <span\n v-if=\"state.value.count !== null\"\n :class=\"suit('count')\"\n >{{ state.value.count.toLocaleString() }}</span>\n </label>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectToggleRefinement } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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 label: {\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 },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n label: this.label,\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()\"\n >\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\n name=\"buttonText\"\n v-bind=\"innerSlotProps\"\n >\n <svg\n v-bind=\"buttonSvgAttrs\"\n v-if=\"errorNotAllowed\"\n >\n <line\n x1=\"1\"\n y1=\"1\"\n x2=\"23\"\n y2=\"23\"\n />\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\n x1=\"12\"\n y1=\"19\"\n x2=\"12\"\n y2=\"23\"\n />\n <line\n x1=\"8\"\n y1=\"23\"\n x2=\"16\"\n y2=\"23\"\n />\n </svg>\n <svg\n v-bind=\"buttonSvgAttrs\"\n v-else\n >\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\n x1=\"12\"\n y1=\"19\"\n x2=\"12\"\n y2=\"23\"\n />\n <line\n x1=\"8\"\n y1=\"23\"\n x2=\"16\"\n y2=\"23\"\n />\n </svg>\n </slot>\n </button>\n <div :class=\"suit('status')\">\n <slot\n name=\"status\"\n v-bind=\"innerSlotProps\"\n >\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';\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\n v-if=\"state && state.isVirtualReplica\"\n :class=\"suit()\"\n >\n <slot\n :is-relevant-sorted=\"state.isRelevantSorted\"\n :refine=\"state.refine\"\n >\n <div :class=\"suit('text')\">\n <slot\n name=\"text\"\n :is-relevant-sorted=\"state.isRelevantSorted\"\n />\n </div>\n <button\n type=\"button\"\n :class=\"suit('button')\"\n @click=\"refine()\"\n >\n <slot\n name=\"button\"\n :is-relevant-sorted=\"state.isRelevantSorted\"\n >{{ state.isRelevantSorted ? 'See all results' : 'See relevant results' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRelevantSort } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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 { createWidgetMixin } from '../mixins/widget';\nimport { connectDynamicWidgets } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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 => components.get(attribute))\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 AisDynamicWidgets from './DynamicWidgets';\nimport { warn } from '../util/warn';\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 { isVue3, isVue2, Vue2, createSSRApp } from './vue-compat';\nimport { warn } from './warn';\n\nfunction walkIndex(indexWidget, visit) {\n visit(indexWidget);\n\n return indexWidget.getWidgets().forEach(widget => {\n if (widget.$$type !== 'ais.index') return;\n visit(widget);\n walkIndex(widget, visit);\n });\n}\n\nfunction searchOnlyWithDerivedHelpers(helper) {\n return new Promise((resolve, reject) => {\n helper.searchOnlyWithDerivedHelpers();\n\n // we assume all derived helpers resolve at least in the same tick\n helper.derivedHelpers[0].on('result', () => {\n resolve();\n });\n\n helper.derivedHelpers.forEach(derivedHelper =>\n derivedHelper.on('error', e => {\n reject(e);\n })\n );\n });\n}\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 } else {\n // copy over global Vue APIs\n options.router = componentInstance.$router;\n options.store = componentInstance.$store;\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(() => searchOnlyWithDerivedHelpers(instance.mainHelper))\n .then(() => {\n initialResults = {};\n walkIndex(instance.mainIndex, widget => {\n const { _state, _rawResults } = widget.getResults();\n\n initialResults[widget.getIndexId()] = {\n // copy just the values of SearchParameters, not the functions\n state: Object.keys(_state).reduce((acc, key) => {\n // eslint-disable-next-line no-param-reassign\n acc[key] = _state[key];\n return acc;\n }, {}),\n results: _rawResults,\n };\n });\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","ref","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","Vue2","Vue","version","renderCompat","fn","createElement","call","getDefaultSlot","component","$slots","cache","Set","warn","message","has","add","console","createWidgetMixin","additionalProperties","inject","instantSearchInstance","from","tag","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","_initialResults","started","__forceRender","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","render","mixins","connectAutocomplete","$$widgetType","escapeHTML","Boolean","required","computed","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","mitt","provide","canRefine","on","updateCanRefine","all","clear","createPanelConsumerMixin","emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","isLastItem","index","items","connectClearRefinements","excludedAttributes","includedAttributes","hasRefinements","inheritAttrs","connectConfigure","searchParameters","$attrs","h","slot","$scopedSlots","class","refine","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","capitalize","toString","charAt","toLocaleUpperCase","slice","level","Number","createURL","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","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","item","TextNode","functional","context","slots","highlightedTagName","parsedHighlights","AisHighlighter","connectHitsWithInsights","hits","connectHitsPerPage","selected","find","handleChange","connectIndex","indexWidget","$_ais_getParentIndex","indexName","indexId","createInstantSearchComponent","$_ais_instantSearchInstance","searchClient","helper","setClient","search","setIndex","stalledSearchDelay","_stalledSearchDelay","routing","searchFunction","_searchFunction","middlewares","next","prev","middleware","indexOf","middlewareToRemove","unuse","middlewareToAdd","use","client","addAlgoliaAgent","vueVersion","mounted","$nextTick","start","dispose","__initialSearchResults","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","connectMenu","showShowMoreButton","connectNumericMenu","connectPagination","padding","totalPages","showFirst","showLast","showNext","emits","page","p","Math","min","max","nbPages","$emit","getSlot","theme","algoliaUrl","location","hostname","connectQueryRules","trackedFilters","transformRuleContexts","connectRange","precision","minInput","maxInput","updated","step","pow","values","range","minValue","Infinity","minRange","maxValue","maxRange","pick","first","second","connectRatingMenu","placeholder","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","submitTitle","resetTitle","modelValue","query","isFocused","document","activeElement","$refs","input","onFormSubmit","blur","onFormReset","noop","SearchInput","AisHighlight","connectRefinementList","searchable","searchablePlaceholder","operator","searchForFacetValuesQuery","searchForFacetValues","get","set","searchForItems","toggleShowMore","assign","_highlightResult","highlighted","escapeFacetValues","connectStateResults","renderFn","unmountFn","init","results","resultsCopy","stateCopy","stateResults","connectSearchBox","queryHook","localValue","isControlled","model","currentRefinement","searchInput","val","connectSortBy","connectStats","connectToggleRefinement","label","off","connectVoiceSearch","searchAsYouSpeak","language","additionalQueryParameters","buttonTitle","disabledButtonTitle","buttonSvgAttrs","xmlns","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","errorNotAllowed","voiceListeningState","status","errorCode","rootSlotProps","isBrowserSupported","isListening","toggleListening","innerSlotProps","transcript","isSpeechFinal","handleClick","event","currentTarget","connectRelevantSort","isRelevantSorted","getWidgetAttribute","vnode","children","componentOptions","propsData","reduce","acc","curr","connectDynamicWidgets","facets","maxValuesPerFacet","Map","allComponents","attrs","hidden","attributesToRender","widgets","AisDynamicWidgets","plugin","install","localVue","walkIndex","visit","getWidgets","$$type","searchOnlyWithDerivedHelpers","Promise","resolve","reject","derivedHelpers","derivedHelper","e","defaultCloneComponent","componentInstance","app","options","serverPrefetch","fetch","_base","$router","store","$store","$vnode","Ctor","extend","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","initialResults","findResultsState","instance","renderToString","then","beforeCreate","descriptor","isWritable","$nuxt","mainHelper","getResults","getIndexId","_state","_rawResults","hydrate","getState","parent","localHelper","getHelper","scopedResults","getScopedResults","templatesConfig","searchMetadata","isSearchStalled","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-vue2.js","../../src/util/warn.js","../../src/mixins/widget.js","../../src/components/Autocomplete.vue","../../src/mixins/panel.js","../../src/components/Breadcrumb.vue","../../src/components/ClearRefinements.vue","../../src/components/Configure.js","../../src/components/ConfigureRelatedItems.js","../../src/components/CurrentRefinements.vue","../../src/components/HierarchicalMenuList.vue","../../src/components/HierarchicalMenu.vue","../../src/util/unescape.js","../../src/util/parseAlgoliaHit.js","../../src/components/Highlighter.vue","../../src/components/Highlight.vue","../../src/components/Hits.vue","../../src/components/HitsPerPage.vue","../../src/components/Index.js","../../src/util/createInstantSearchComponent.js","../../src/components/InstantSearch.js","../../src/components/InstantSearchSsr.js","../../src/components/InfiniteHits.vue","../../src/components/Menu.vue","../../src/components/MenuSelect.vue","../../src/components/NumericMenu.vue","../../src/components/Pagination.vue","../../src/components/Panel.vue","../../src/components/PoweredBy.vue","../../src/components/QueryRuleContext.js","../../src/components/QueryRuleCustomData.vue","../../src/components/RangeInput.vue","../../src/components/RatingMenu.vue","../../src/components/SearchInput.vue","../../src/components/RefinementList.vue","../../src/components/StateResults.vue","../../src/components/SearchBox.vue","../../src/components/Snippet.vue","../../src/components/SortBy.vue","../../src/components/Stats.vue","../../src/components/ToggleRefinement.vue","../../src/components/VoiceSearch.vue","../../src/components/RelevantSort.vue","../../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 */\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 Vue from 'vue';\n\nconst isVue2 = true;\nconst isVue3 = false;\nconst Vue2 = Vue;\nconst version = Vue.version;\n\nexport { Vue, Vue2, isVue2, isVue3, version };\n\nexport function renderCompat(fn) {\n return function(createElement) {\n return fn.call(this, createElement);\n };\n}\n\nexport function getDefaultSlot(component) {\n return component.$slots.default;\n}\n\n// Vue3-only APIs\nexport const computed = undefined;\nexport const createApp = undefined;\nexport const createSSRApp = undefined;\nexport const createRef = undefined;\nexport const customRef = undefined;\nexport const defineAsyncComponent = undefined;\nexport const defineComponent = undefined;\nexport const del = undefined;\nexport const getCurrentInstance = undefined;\nexport const h = undefined;\nexport const inject = undefined;\nexport const isRaw = undefined;\nexport const isReactive = undefined;\nexport const isReadonly = undefined;\nexport const isRef = undefined;\nexport const markRaw = undefined;\nexport const nextTick = undefined;\nexport const onActivated = undefined;\nexport const onBeforeMount = undefined;\nexport const onBeforeUnmount = undefined;\nexport const onBeforeUpdate = undefined;\nexport const onDeactivated = undefined;\nexport const onErrorCaptured = undefined;\nexport const onMounted = undefined;\nexport const onServerPrefetch = undefined;\nexport const onUnmounted = undefined;\nexport const onUpdated = undefined;\nexport const provide = undefined;\nexport const proxyRefs = undefined;\nexport const reactive = undefined;\nexport const readonly = undefined;\nexport const ref = undefined;\nexport const set = undefined;\nexport const shallowReactive = undefined;\nexport const shallowReadonly = undefined;\nexport const shallowRef = undefined;\nexport const toRaw = undefined;\nexport const toRef = undefined;\nexport const toRefs = undefined;\nexport const triggerRef = undefined;\nexport const unref = undefined;\nexport const useCSSModule = undefined;\nexport const useCssModule = undefined;\nexport const warn = undefined;\nexport const watch = undefined;\nexport const watchEffect = undefined;\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\n :class=\"suit()\"\n v-if=\"state\"\n >\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>This widget doesn't render anything without a filled in default slot.</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 { createWidgetMixin } from '../mixins/widget';\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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 { isVue3 } from '../util/vue-compat';\nimport mitt from 'mitt';\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 :class=\"[suit('item'), !state.items.length && suit('item', 'selected')]\">\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 <span v-else>\n <slot name=\"rootLabel\">Home</slot>\n </span>\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\n :class=\"suit('separator')\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">></slot>\n </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 <span v-else>{{ item.label }}</span>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\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()\"\n >\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';\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 { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\nimport { connectConfigure } from 'instantsearch.js/es/connectors';\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 { createWidgetMixin } from '../mixins/widget';\nimport { EXPERIMENTAL_connectConfigureRelatedItems } from 'instantsearch.js/es/connectors';\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\n :class=\"[suit(), noRefinement && suit('','noRefinement')]\"\n v-if=\"state\"\n >\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'\">{{ refinement.label }}</q>\n <template v-else>\n {{ refinement.label }}\n </template>\n </span>\n <button\n :class=\"suit('delete')\"\n @click=\"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 { createWidgetMixin } from '../mixins/widget';\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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\n .toString()\n .charAt(0)\n .toLocaleUpperCase() + value.toString().slice(1)\n );\n },\n },\n};\n</script>\n","<template>\n <ul\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.data && suit('item', 'parent'),\n item.isRefined && suit('item', 'selected')\n ]\"\n >\n <a\n :href=\"createURL(item.value)\"\n :class=\"[\n suit('link'),\n item.isRefined && suit('link', 'selected')\n ]\"\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\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\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >{{ state.isShowingMore ? 'Show less' : 'Show more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHierarchicalMenu } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport HierarchicalMenuList from './HierarchicalMenuList.vue';\nimport { createSuitMixin } from '../mixins/suit';\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';\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 </span>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\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';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\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 >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"itemIndex\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ itemIndex }}</slot>\n </li>\n </ol>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :hasNoResults=\"state.hasNoResults\"\n :canRefine=\"state.canRefine\"\n >\n <select\n :class=\"suit('select')\"\n v-model=\"selected\"\n @change=\"handleChange\"\n >\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n >{{ item.label }}</option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsPerPage } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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 data() {\n return {\n selected: this.items.find(item => item.default === true).value,\n };\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n handleChange() {\n this.state.refine(this.selected);\n },\n },\n};\n</script>\n","import { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport indexWidget from 'instantsearch.js/es/widgets/index/index';\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 { createSuitMixin } from '../mixins/suit';\nimport { version } from '../../package.json'; // rollup does pick only what needed from json\nimport { _objectSpread } from './polyfills';\nimport { isVue3, version as vueVersion } from './vue-compat';\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 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/vue-instantsearch/issues/new?template=feature.md'\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/vue-instantsearch/issues/new?template=feature.md'\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 },\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';\nimport { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { warn } from '../util/warn';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\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 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 },\n data() {\n return {\n instantSearchInstance: instantsearch({\n searchClient: this.searchClient,\n insightsClient: this.insightsClient,\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 }),\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n\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=\"[suit('loadPrevious'), state.isFirstPage && suit('loadPrevious', 'disabled')]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >Show previous results</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 >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ index }}</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=\"[suit('loadMore'), state.isLastPage && suit('loadMore', 'disabled')]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >Show more results</button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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=\"[suit('showMore'), !state.canToggleShowMore && suit('showMore', 'disabled')]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >{{ state.isShowingMore ? 'Show less' : 'Show more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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\n :class=\"suit('option')\"\n value=\"\"\n >\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\n name=\"item\"\n :item=\"item\"\n >{{ item.label }} ({{ item.count }})</slot>\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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()\"\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', 'firstPage')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\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\"\n :href=\"state.createURL(0)\"\n @click.prevent=\"refine(0)\"\n >‹‹</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"First\"\n >‹‹</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'previousPage')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\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\"\n :href=\"state.createURL(state.currentRefinement - 1)\"\n @click.prevent=\"refine(state.currentRefinement - 1)\"\n >‹</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Previous\"\n >‹</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 @click.prevent=\"refine(page)\"\n >{{ page + 1 }}</a>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','nextPage')]: true,\n [suit('item','disabled')]: state.isLastPage\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\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Next\"\n >›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','lastPage')]: true,\n [suit('item','disabled')]: state.isLastPage,\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\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.prevent=\"refine(state.nbPages - 1)\"\n >››</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Last\"\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';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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\n v-if=\"getSlot('header')\"\n :class=\"suit('header')\"\n >\n <slot\n name=\"header\"\n :has-refinements=\"canRefine\"\n />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div\n v-if=\"getSlot('footer')\"\n :class=\"suit('footer')\"\n >\n <slot\n name=\"footer\"\n :has-refinements=\"canRefine\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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 168 24\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5D6494'\"\n d=\"M6.97 6.68V8.3a4.47 4.47 0 0 0-2.42-.67 2.2 2.2 0 0 0-1.38.4c-.34.26-.5.6-.5 1.02 0 .43.16.77.49 1.03.33.25.83.53 1.51.83a7.04 7.04 0 0 1 1.9 1.08c.34.24.58.54.73.89.15.34.23.74.23 1.18 0 .95-.33 1.7-1 2.24a4 4 0 0 1-2.6.81 5.71 5.71 0 0 1-2.94-.68v-1.71c.84.63 1.81.94 2.92.94.58 0 1.05-.14 1.39-.4.34-.28.5-.65.5-1.13 0-.29-.1-.55-.3-.8a2.2 2.2 0 0 0-.65-.53 23.03 23.03 0 0 0-1.64-.78 13.67 13.67 0 0 1-1.11-.64c-.12-.1-.28-.22-.46-.4a1.72 1.72 0 0 1-.39-.5 4.46 4.46 0 0 1-.22-.6c-.07-.23-.1-.48-.1-.75 0-.91.33-1.63 1-2.17a4 4 0 0 1 2.57-.8c.97 0 1.8.18 2.47.52zm7.47 5.7v-.3a2.26 2.26 0 0 0-.5-1.44c-.3-.35-.74-.53-1.32-.53-.53 0-.99.2-1.37.58-.38.39-.62.95-.72 1.68h3.91zm1 2.79v1.4c-.6.34-1.38.51-2.36.51a4.02 4.02 0 0 1-3-1.13 4.04 4.04 0 0 1-1.11-2.97c0-1.3.34-2.32 1.02-3.06a3.38 3.38 0 0 1 2.6-1.1c1.03 0 1.85.32 2.46.96.6.64.9 1.57.9 2.78 0 .33-.03.68-.09 1.04h-5.31c.1.7.4 1.24.89 1.61.49.38 1.1.56 1.85.56.86 0 1.58-.2 2.15-.6zm6.61-1.78h-1.21c-.6 0-1.05.12-1.35.36-.3.23-.46.53-.46.89 0 .37.12.66.36.88.23.2.57.32 1.02.32.5 0 .9-.15 1.2-.43.3-.28.44-.65.44-1.1v-.92zm-4.07-2.55V9.33a4.96 4.96 0 0 1 2.5-.55c2.1 0 3.17 1.03 3.17 3.08V17H22.1v-.96c-.42.68-1.15 1.02-2.19 1.02-.76 0-1.38-.22-1.84-.66-.46-.44-.7-1-.7-1.68 0-.78.3-1.38.88-1.81.59-.43 1.4-.65 2.46-.65h1.34v-.46c0-.55-.13-.97-.4-1.25-.26-.29-.7-.43-1.32-.43-.86 0-1.65.24-2.35.72zm9.34-1.93v1.42c.39-1 1.1-1.5 2.12-1.5.15 0 .31.02.5.05v1.53c-.23-.1-.48-.14-.76-.14-.54 0-.99.24-1.34.71a2.8 2.8 0 0 0-.52 1.71V17h-1.57V8.91h1.57zm5 4.09a3 3 0 0 0 .76 2.01c.47.53 1.14.8 2 .8.64 0 1.24-.18 1.8-.53v1.4c-.53.32-1.2.48-2 .48a3.98 3.98 0 0 1-4.17-4.18c0-1.16.38-2.15 1.14-2.98a4 4 0 0 1 3.1-1.23c.7 0 1.34.15 1.92.44v1.44a3.24 3.24 0 0 0-1.77-.5A2.65 2.65 0 0 0 32.33 13zm7.92-7.28v4.58c.46-1 1.3-1.5 2.5-1.5.8 0 1.42.24 1.9.73.48.5.72 1.17.72 2.05V17H43.8v-5.1c0-.56-.14-.99-.43-1.29-.28-.3-.65-.45-1.1-.45-.54 0-1 .2-1.42.6-.4.4-.61 1.02-.61 1.85V17h-1.56V5.72h1.56zM55.2 15.74c.6 0 1.1-.25 1.5-.76.4-.5.6-1.16.6-1.95 0-.92-.2-1.62-.6-2.12-.4-.5-.92-.74-1.55-.74-.56 0-1.05.22-1.5.67-.44.45-.66 1.13-.66 2.06 0 .96.22 1.67.64 2.14.43.47.95.7 1.57.7zM53 5.72v4.42a2.74 2.74 0 0 1 2.43-1.34c1.03 0 1.86.38 2.51 1.15.65.76.97 1.78.97 3.05 0 1.13-.3 2.1-.92 2.9-.62.81-1.47 1.21-2.54 1.21s-1.9-.45-2.46-1.34V17h-1.58V5.72H53zm9.9 11.1l-3.22-7.9h1.74l1 2.62 1.26 3.42c.1-.32.48-1.46 1.15-3.42l.91-2.63h1.66l-2.92 7.87c-.78 2.07-1.96 3.1-3.56 3.1-.28 0-.53-.02-.73-.07v-1.34c.17.04.35.06.54.06 1.03 0 1.76-.57 2.17-1.7z\"\n />\n <path\n fill=\"#5468FF\"\n d=\"M78.99.94h16.6a2.97 2.97 0 0 1 2.96 2.96v16.6a2.97 2.97 0 0 1-2.97 2.96h-16.6a2.97 2.97 0 0 1-2.96-2.96V3.9A2.96 2.96 0 0 1 79 .94\"\n />\n <path\n fill=\"#FFF\"\n d=\"M89.63 5.97v-.78a.98.98 0 0 0-.98-.97h-2.28a.98.98 0 0 0-.97.97V6c0 .09.08.15.17.13a7.13 7.13 0 0 1 3.9-.02c.08.02.16-.04.16-.13m-6.25 1L83 6.6a.98.98 0 0 0-1.38 0l-.46.46a.97.97 0 0 0 0 1.38l.38.39c.06.06.15.04.2-.02a7.49 7.49 0 0 1 1.63-1.62c.07-.04.08-.14.02-.2m4.16 2.45v3.34c0 .1.1.17.2.12l2.97-1.54c.06-.03.08-.12.05-.18a3.7 3.7 0 0 0-3.08-1.87c-.07 0-.14.06-.14.13m0 8.05a4.49 4.49 0 1 1 0-8.98 4.49 4.49 0 0 1 0 8.98m0-10.85a6.37 6.37 0 1 0 0 12.74 6.37 6.37 0 0 0 0-12.74\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5468FF'\"\n d=\"M120.92 18.8c-4.38.02-4.38-3.54-4.38-4.1V1.36l2.67-.42v13.25c0 .32 0 2.36 1.71 2.37v2.24zm-10.84-2.18c.82 0 1.43-.04 1.85-.12v-2.72a5.48 5.48 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.11-.44.28-.58.49a.93.93 0 0 0-.22.65c0 .63.22 1 .61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.62.11 2.23.33.6.22 1.09.53 1.44.92.36.4.61.92.76 1.48.16.56.23 1.17.23 1.85v6.87c-.4.1-1.03.2-1.86.32-.84.12-1.78.18-2.82.18-.69 0-1.32-.07-1.9-.2a4 4 0 0 1-1.46-.63c-.4-.3-.72-.67-.96-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.39-1.53.26-.45.6-.82 1.04-1.1.45-.3.95-.5 1.54-.62a8.8 8.8 0 0 1 3.79.05v-.44c0-.3-.04-.6-.11-.87a1.78 1.78 0 0 0-1.1-1.22c-.31-.12-.7-.2-1.15-.2a9.75 9.75 0 0 0-2.95.46l-.33-2.19c.34-.12.84-.23 1.48-.35.65-.12 1.34-.18 2.08-.18zm52.84 9.63c.82 0 1.43-.05 1.85-.13V13.7a5.42 5.42 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.12-.44.28-.58.5a.93.93 0 0 0-.22.65c0 .63.22.99.61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.63.11 2.23.33.6.22 1.1.53 1.45.92.35.39.6.92.76 1.48.15.56.23 1.18.23 1.85v6.88c-.41.08-1.03.19-1.87.31-.83.12-1.77.18-2.81.18-.7 0-1.33-.06-1.9-.2a4 4 0 0 1-1.47-.63c-.4-.3-.72-.67-.95-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.38-1.53.26-.45.61-.82 1.05-1.1.44-.3.95-.5 1.53-.62a8.8 8.8 0 0 1 3.8.05v-.43c0-.31-.04-.6-.12-.88-.07-.28-.2-.52-.38-.73a1.78 1.78 0 0 0-.73-.5c-.3-.1-.68-.2-1.14-.2a9.85 9.85 0 0 0-2.95.47l-.32-2.19a11.63 11.63 0 0 1 3.55-.53zm-8.03-1.27a1.62 1.62 0 0 0 0-3.24 1.62 1.62 0 1 0 0 3.24zm1.35 13.22h-2.7V7.27l2.7-.42V18.8zm-4.72 0c-4.38.02-4.38-3.54-4.38-4.1l-.01-13.34 2.67-.42v13.25c0 .32 0 2.36 1.72 2.37v2.24zm-8.7-5.9a4.7 4.7 0 0 0-.74-2.79 2.4 2.4 0 0 0-2.07-1 2.4 2.4 0 0 0-2.06 1 4.7 4.7 0 0 0-.74 2.8c0 1.16.25 1.94.74 2.62a2.4 2.4 0 0 0 2.07 1.02c.88 0 1.57-.34 2.07-1.02.49-.68.73-1.46.73-2.63zm2.74 0a6.46 6.46 0 0 1-1.52 4.23c-.49.53-1.07.94-1.76 1.22-.68.29-1.73.45-2.26.45-.53 0-1.58-.15-2.25-.45a5.1 5.1 0 0 1-2.88-3.13 7.3 7.3 0 0 1-.01-4.84 5.13 5.13 0 0 1 2.9-3.1 5.67 5.67 0 0 1 2.22-.42c.81 0 1.56.14 2.24.42.69.29 1.28.69 1.75 1.22.49.52.87 1.15 1.14 1.89a7 7 0 0 1 .43 2.5zm-20.14 0c0 1.11.25 2.36.74 2.88.5.52 1.13.78 1.91.78a4.07 4.07 0 0 0 2.12-.6V9.33c-.19-.04-.99-.2-1.76-.23a2.67 2.67 0 0 0-2.23 1 4.73 4.73 0 0 0-.78 2.8zm7.44 5.27c0 1.82-.46 3.16-1.4 4-.94.85-2.37 1.27-4.3 1.27-.7 0-2.17-.13-3.34-.4l.43-2.11c.98.2 2.27.26 2.95.26 1.08 0 1.84-.22 2.3-.66.46-.43.68-1.08.68-1.94v-.44a5.2 5.2 0 0 1-2.54.6 5.6 5.6 0 0 1-2.01-.36 4.2 4.2 0 0 1-2.58-2.71 9.88 9.88 0 0 1 .02-5.35 4.92 4.92 0 0 1 2.93-2.96 6.6 6.6 0 0 1 2.43-.46 19.64 19.64 0 0 1 4.43.66v10.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 { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot :items=\"state.items\">\n <div\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n >\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\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=\"refine({ min: pick(minInput, values.min), max: pick(maxInput, values.max) })\"\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\n :class=\"suit('submit')\"\n type=\"submit\"\n >\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';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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()\"\n >\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\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"display: none;\"\n >\n <symbol\n id=\"ais-RatingMenu-starSymbol\"\n viewBox=\"0 0 24 24\"\n >\n <path 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 </symbol>\n <symbol\n id=\"ais-RatingMenu-starEmptySymbol\"\n viewBox=\"0 0 24 24\"\n >\n <path 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 </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\n :class=\"suit('label')\"\n aria-hidden=\"true\"\n >\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';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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 required\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=\"$emit('input', $event.target.value); $emit('update:modelValue', $event.target.value)\"\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 role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\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 fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"(!value && !modelValue) || (showLoadingIndicator && shouldShowLoadingIndicator)\"\n >\n <slot name=\"reset-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\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 fillRule=\"evenodd\"\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 role=\"img\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n transform=\"translate(1 1)\"\n stroke-width=\"2\"\n >\n <circle\n stroke-opacity=\".5\"\n cx=\"18\"\n cy=\"18\"\n r=\"18\"\n />\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 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 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=\"[\n suit(),\n !state.canRefine && suit('','noRefinement')\n ]\"\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\n :class=\"suit('searchBox')\"\n v-if=\"searchable\"\n >\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=\"[\n 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\n v-if=\"searchable\"\n :class=\"suit('labelText')\"\n >\n <ais-highlight\n attribute=\"item\"\n :hit=\"item\"\n />\n </span>\n <span\n v-else\n :class=\"suit('labelText')\"\n >{{ 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\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >Show {{ state.isShowingMore ? 'less' : 'more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\nimport SearchInput from './SearchInput.vue';\nimport AisHighlight from './Highlight.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()\"\n v-if=\"state && state.state && state.results\"\n >\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>\n Fill in the slot, and get access to the following things:\n </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 { isVue3 } from '../util/vue-compat';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\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 },\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\n v-if=\"state\"\n :class=\"suit()\"\n >\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 :submit-title=\"submitTitle\"\n :reset-title=\"resetTitle\"\n :class-names=\"classNames\"\n v-model=\"currentRefinement\"\n ref=\"searchInput\"\n >\n <template\n v-slot:loading-indicator\n v-if=\"isVue3\"\n >\n <slot\n name=\"loading-indicator\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n\n <template\n v-slot:submit-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"submit-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n\n <template\n v-slot:reset-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"reset-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"reset-icon\"\n slot=\"reset-icon\"\n />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\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: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\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 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 './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\n :class=\"suit()\"\n v-if=\"state\"\n >\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 >\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 >{{ item.label }}</option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSortBy } from 'instantsearch.js/es/connectors';\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\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n v-bind=\"state\"\n :results=\"state.instantSearchInstance.helper.lastResults\"\n >\n <span :class=\"suit('text')\"><template v-if=\"state.areHitsSorted\">{{ state.nbSortedHits.toLocaleString() }} relevant results sorted out of {{ state.nbHits.toLocaleString() }}</template><template v-else>{{ state.nbHits.toLocaleString() }} results</template> found in {{ state.processingTimeMS.toLocaleString() }}ms</span>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectStats } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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 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 }}</span>\n <span\n v-if=\"state.value.count !== null\"\n :class=\"suit('count')\"\n >{{ state.value.count.toLocaleString() }}</span>\n </label>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectToggleRefinement } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\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 label: {\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 },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n label: this.label,\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()\"\n >\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\n name=\"buttonText\"\n v-bind=\"innerSlotProps\"\n >\n <svg\n v-bind=\"buttonSvgAttrs\"\n v-if=\"errorNotAllowed\"\n >\n <line\n x1=\"1\"\n y1=\"1\"\n x2=\"23\"\n y2=\"23\"\n />\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\n x1=\"12\"\n y1=\"19\"\n x2=\"12\"\n y2=\"23\"\n />\n <line\n x1=\"8\"\n y1=\"23\"\n x2=\"16\"\n y2=\"23\"\n />\n </svg>\n <svg\n v-bind=\"buttonSvgAttrs\"\n v-else\n >\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\n x1=\"12\"\n y1=\"19\"\n x2=\"12\"\n y2=\"23\"\n />\n <line\n x1=\"8\"\n y1=\"23\"\n x2=\"16\"\n y2=\"23\"\n />\n </svg>\n </slot>\n </button>\n <div :class=\"suit('status')\">\n <slot\n name=\"status\"\n v-bind=\"innerSlotProps\"\n >\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';\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\n v-if=\"state && state.isVirtualReplica\"\n :class=\"suit()\"\n >\n <slot\n :is-relevant-sorted=\"state.isRelevantSorted\"\n :refine=\"state.refine\"\n >\n <div :class=\"suit('text')\">\n <slot\n name=\"text\"\n :is-relevant-sorted=\"state.isRelevantSorted\"\n />\n </div>\n <button\n type=\"button\"\n :class=\"suit('button')\"\n @click=\"refine()\"\n >\n <slot\n name=\"button\"\n :is-relevant-sorted=\"state.isRelevantSorted\"\n >{{ state.isRelevantSorted ? 'See all results' : 'See relevant results' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRelevantSort } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\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 { createWidgetMixin } from '../mixins/widget';\nimport { connectDynamicWidgets } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\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 => components.get(attribute))\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 AisDynamicWidgets from './DynamicWidgets';\nimport { warn } from '../util/warn';\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 { isVue3, isVue2, Vue2, createSSRApp } from './vue-compat';\nimport { warn } from './warn';\n\nfunction walkIndex(indexWidget, visit) {\n visit(indexWidget);\n\n return indexWidget.getWidgets().forEach(widget => {\n if (widget.$$type !== 'ais.index') return;\n visit(widget);\n walkIndex(widget, visit);\n });\n}\n\nfunction searchOnlyWithDerivedHelpers(helper) {\n return new Promise((resolve, reject) => {\n helper.searchOnlyWithDerivedHelpers();\n\n // we assume all derived helpers resolve at least in the same tick\n helper.derivedHelpers[0].on('result', () => {\n resolve();\n });\n\n helper.derivedHelpers.forEach(derivedHelper =>\n derivedHelper.on('error', e => {\n reject(e);\n })\n );\n });\n}\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 } else {\n // copy over global Vue APIs\n options.router = componentInstance.$router;\n options.store = componentInstance.$store;\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(() => searchOnlyWithDerivedHelpers(instance.mainHelper))\n .then(() => {\n initialResults = {};\n walkIndex(instance.mainIndex, widget => {\n const { _state, _rawResults } = widget.getResults();\n\n initialResults[widget.getIndexId()] = {\n // copy just the values of SearchParameters, not the functions\n state: Object.keys(_state).reduce((acc, key) => {\n // eslint-disable-next-line no-param-reassign\n acc[key] = _state[key];\n return acc;\n }, {}),\n results: _rawResults,\n };\n });\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","ref","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","Vue2","Vue","version","renderCompat","fn","createElement","call","getDefaultSlot","component","$slots","cache","Set","warn","message","has","add","console","createWidgetMixin","additionalProperties","inject","instantSearchInstance","from","tag","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","_initialResults","started","__forceRender","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","render","mixins","connectAutocomplete","$$widgetType","escapeHTML","Boolean","required","computed","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","mitt","provide","canRefine","on","updateCanRefine","all","clear","createPanelConsumerMixin","emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","isLastItem","index","items","connectClearRefinements","excludedAttributes","includedAttributes","hasRefinements","inheritAttrs","connectConfigure","searchParameters","$attrs","h","slot","$scopedSlots","class","refine","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","capitalize","toString","charAt","toLocaleUpperCase","slice","level","Number","createURL","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","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","item","TextNode","functional","context","slots","highlightedTagName","parsedHighlights","AisHighlighter","connectHitsWithInsights","hits","connectHitsPerPage","selected","find","handleChange","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","client","addAlgoliaAgent","vueVersion","mounted","$nextTick","start","dispose","__initialSearchResults","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","connectMenu","showShowMoreButton","connectNumericMenu","connectPagination","padding","totalPages","showFirst","showLast","showNext","emits","page","p","Math","min","max","nbPages","$emit","getSlot","theme","algoliaUrl","location","hostname","connectQueryRules","trackedFilters","transformRuleContexts","connectRange","precision","minInput","maxInput","updated","step","pow","values","range","minValue","Infinity","minRange","maxValue","maxRange","pick","first","second","connectRatingMenu","placeholder","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","submitTitle","resetTitle","modelValue","query","isFocused","document","activeElement","$refs","input","onFormSubmit","blur","onFormReset","noop","SearchInput","AisHighlight","connectRefinementList","searchable","searchablePlaceholder","operator","searchForFacetValuesQuery","searchForFacetValues","get","set","searchForItems","toggleShowMore","assign","_highlightResult","highlighted","escapeFacetValues","catchError","renderFn","results","getResults","getHelper","status","error","addListener","removeListener","errorFn","stateResults","connectSearchBox","queryHook","localValue","isControlled","model","currentRefinement","searchInput","val","connectSortBy","connectStats","connectToggleRefinement","label","off","connectVoiceSearch","searchAsYouSpeak","language","additionalQueryParameters","buttonTitle","disabledButtonTitle","buttonSvgAttrs","xmlns","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","errorNotAllowed","voiceListeningState","errorCode","rootSlotProps","isBrowserSupported","isListening","toggleListening","innerSlotProps","transcript","isSpeechFinal","handleClick","event","currentTarget","connectRelevantSort","isRelevantSorted","getWidgetAttribute","vnode","children","componentOptions","propsData","reduce","acc","curr","connectDynamicWidgets","facets","maxValuesPerFacet","Map","allComponents","attrs","hidden","attributesToRender","widgets","AisDynamicWidgets","plugin","install","localVue","walkIndex","visit","getWidgets","$$type","searchOnlyWithDerivedHelpers","Promise","resolve","reject","derivedHelpers","derivedHelper","e","defaultCloneComponent","componentInstance","app","options","serverPrefetch","fetch","_base","$router","store","$store","$vnode","Ctor","extend","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","initialResults","findResultsState","instance","renderToString","then","beforeCreate","descriptor","isWritable","$nuxt","mainHelper","getIndexId","_state","_rawResults","hydrate","getState","parent","localHelper","scopedResults","getScopedResults","templatesConfig","searchMetadata","isSearchStalled","createServerRootMixin","$cloneComponent"],"mappings":"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"}