vue-instantsearch 3.6.0 → 3.9.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.
- package/CHANGELOG.md +40 -0
- package/dist/vue-instantsearch.common.js +1 -1
- package/dist/vue-instantsearch.common.js.map +1 -1
- package/dist/vue-instantsearch.js +1 -1
- package/dist/vue-instantsearch.js.map +1 -1
- package/es/package.json.js +1 -1
- package/es/src/components/Breadcrumb.vue.js +1 -1
- package/es/src/components/Breadcrumb.vue.js.map +1 -1
- package/es/src/components/ClearRefinements.vue.js +1 -1
- package/es/src/components/ClearRefinements.vue.js.map +1 -1
- package/es/src/components/CurrentRefinements.vue.js +1 -1
- package/es/src/components/CurrentRefinements.vue.js.map +1 -1
- package/es/src/components/DynamicWidgets.js +2 -0
- package/es/src/components/DynamicWidgets.js.map +1 -0
- package/es/src/components/HierarchicalMenu.vue.js +1 -1
- package/es/src/components/HierarchicalMenu.vue.js.map +1 -1
- package/es/src/components/Highlighter.vue.js.map +1 -1
- package/es/src/components/Hits.vue.js +1 -1
- package/es/src/components/Hits.vue.js.map +1 -1
- package/es/src/components/HitsPerPage.vue.js +1 -1
- package/es/src/components/HitsPerPage.vue.js.map +1 -1
- package/es/src/components/InfiniteHits.vue.js +1 -1
- package/es/src/components/InfiniteHits.vue.js.map +1 -1
- package/es/src/components/InstantSearch.js +1 -1
- package/es/src/components/InstantSearch.js.map +1 -1
- package/es/src/components/Menu.vue.js +1 -1
- package/es/src/components/Menu.vue.js.map +1 -1
- package/es/src/components/MenuSelect.vue.js +1 -1
- package/es/src/components/MenuSelect.vue.js.map +1 -1
- package/es/src/components/NumericMenu.vue.js +1 -1
- package/es/src/components/NumericMenu.vue.js.map +1 -1
- package/es/src/components/Pagination.vue.js +1 -1
- package/es/src/components/Pagination.vue.js.map +1 -1
- package/es/src/components/QueryRuleContext.js +1 -1
- package/es/src/components/QueryRuleContext.js.map +1 -1
- package/es/src/components/QueryRuleCustomData.vue.js +1 -1
- package/es/src/components/QueryRuleCustomData.vue.js.map +1 -1
- package/es/src/components/RangeInput.vue.js +1 -1
- package/es/src/components/RangeInput.vue.js.map +1 -1
- package/es/src/components/RatingMenu.vue.js +1 -1
- package/es/src/components/RatingMenu.vue.js.map +1 -1
- package/es/src/components/RefinementList.vue.js +1 -1
- package/es/src/components/RefinementList.vue.js.map +1 -1
- package/es/src/components/SortBy.vue.js +1 -1
- package/es/src/components/SortBy.vue.js.map +1 -1
- package/es/src/components/ToggleRefinement.vue.js +1 -1
- package/es/src/components/ToggleRefinement.vue.js.map +1 -1
- package/es/src/instantsearch.js +1 -1
- package/es/src/mixins/widget.js +1 -1
- package/es/src/mixins/widget.js.map +1 -1
- package/es/src/util/createInstantSearchComponent.js +1 -1
- package/es/src/util/createInstantSearchComponent.js.map +1 -1
- package/es/src/util/createServerRootMixin.js +1 -1
- package/es/src/util/createServerRootMixin.js.map +1 -1
- package/es/src/widgets.js +1 -1
- package/package.json +5 -5
- package/src/__tests__/index.js +2 -0
- package/src/components/Breadcrumb.vue +3 -5
- package/src/components/ClearRefinements.vue +3 -7
- package/src/components/CurrentRefinements.vue +3 -7
- package/src/components/DynamicWidgets.js +87 -0
- package/src/components/HierarchicalMenu.vue +8 -11
- package/src/components/Highlighter.vue +16 -4
- package/src/components/Hits.vue +2 -3
- package/src/components/HitsPerPage.vue +1 -4
- package/src/components/InfiniteHits.vue +2 -3
- package/src/components/InstantSearch.js +11 -7
- package/src/components/Menu.vue +5 -8
- package/src/components/MenuSelect.vue +2 -3
- package/src/components/NumericMenu.vue +2 -3
- package/src/components/Pagination.vue +1 -1
- package/src/components/QueryRuleContext.js +1 -1
- package/src/components/QueryRuleCustomData.vue +1 -1
- package/src/components/RangeInput.vue +3 -0
- package/src/components/RatingMenu.vue +2 -1
- package/src/components/RefinementList.vue +8 -7
- package/src/components/SortBy.vue +1 -3
- package/src/components/ToggleRefinement.vue +1 -2
- package/src/components/__tests__/DynamicWidgets.js +419 -0
- package/src/components/__tests__/HierarchicalMenu.js +23 -0
- package/src/components/__tests__/Hits.js +22 -1
- package/src/components/__tests__/InfiniteHits.js +21 -0
- package/src/components/__tests__/InstantSearch-integration.js +155 -1
- package/src/components/__tests__/Menu.js +22 -0
- package/src/components/__tests__/MenuSelect.js +22 -0
- package/src/components/__tests__/NumericMenu.js +22 -0
- package/src/components/__tests__/RangeInput.js +22 -0
- package/src/components/__tests__/RatingMenu.js +23 -0
- package/src/components/__tests__/RefinementList.js +22 -0
- package/src/components/__tests__/ToggleRefinement.js +22 -0
- package/src/mixins/widget.js +1 -1
- package/src/util/__tests__/createServerRootMixin.test.js +229 -83
- package/src/util/createInstantSearchComponent.js +16 -0
- package/src/util/createServerRootMixin.js +40 -104
- package/src/util/testutils/helper.js +2 -2
- package/src/widgets.js +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-instantsearch.common.js","sources":["../src/util/suit.js","../src/mixins/suit.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/polyfills.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/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","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 { warn } from '../util/warn';\n\nexport const createWidgetMixin = ({ connector } = {}) => ({\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 = this.factory(this.widgetParams);\n this.getParentIndex().addWidgets([this.widget]);\n\n if (\n this.instantSearchInstance.__initialSearchResults &&\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 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 = this.factory(nextWidgetParams);\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({ connector: connectAutocomplete }),\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 Vue from 'vue';\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 new Vue({\n name: 'PanelProvider',\n });\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 beforeDestroy() {\n this.emitter.$destroy();\n },\n methods: {\n updateCanRefine(value) {\n this.canRefine = value;\n },\n },\n});\n\nexport const createPanelConsumerMixin = ({ mapStateToCanRefine }) => ({\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\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({ connector: connectBreadcrumb }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\n createSuitMixin({ name: 'Breadcrumb' }),\n ],\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n separator: {\n type: String,\n default: ' > ',\n },\n rootPath: {\n type: String,\n default: null,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\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({ connector: connectClearRefinements }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.hasRefinements),\n }),\n createSuitMixin({ name: 'ClearRefinements' }),\n ],\n props: {\n // explicitly no default, since included and excluded are incompatible\n // eslint-disable-next-line vue/require-default-prop\n excludedAttributes: {\n type: Array,\n },\n // explicitly no default, since included and excluded are incompatible\n // eslint-disable-next-line vue/require-default-prop\n includedAttributes: {\n type: Array,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\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';\n\nexport default {\n inheritAttrs: false,\n name: 'AisConfigure',\n mixins: [\n createSuitMixin({ name: 'Configure' }),\n createWidgetMixin({ connector: connectConfigure }),\n ],\n computed: {\n widgetParams() {\n return {\n searchParameters: this.$attrs,\n };\n },\n },\n render(createElement) {\n if (!this.state || !this.$scopedSlots.default) {\n return null;\n }\n\n return createElement(\n 'div',\n {\n class: this.suit(),\n },\n [\n this.$scopedSlots.default({\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({ connector: EXPERIMENTAL_connectConfigureRelatedItems }),\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')\">{{ item.label | capitalize }}: </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({ connector: connectCurrentRefinements }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state =>\n Boolean(state.items) && state.items.length > 0,\n }),\n ],\n props: {\n // no default because included and excluded are incompatible\n // eslint-disable-next-line vue/require-default-prop\n includedAttributes: {\n type: Array,\n },\n // no default because included and excluded are incompatible\n // eslint-disable-next-line vue/require-default-prop\n excludedAttributes: {\n type: Array,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\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 },\n filters: {\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"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 >\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\nconst mapStateToCanRefine = state =>\n Boolean(state.items) && state.items.length > 0;\n\nexport default {\n name: 'AisHierarchicalMenu',\n mixins: [\n createSuitMixin({ name: 'HierarchicalMenu' }),\n createWidgetMixin({ connector: connectHierarchicalMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine,\n }),\n ],\n components: {\n HierarchicalMenuList,\n },\n props: {\n attributes: {\n type: Array,\n required: true,\n },\n limit: {\n type: Number,\n default: 10,\n },\n showMoreLimit: {\n type: Number,\n default: 20,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default() {\n return ['name:asc'];\n },\n },\n separator: {\n type: String,\n default: ' > ',\n },\n rootPath: {\n type: String,\n default: null,\n },\n showParentLevel: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\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 canRefine() {\n return mapStateToCanRefine(this.state);\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 '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\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 * `&`, `<`, `>`, `"`, and `'` 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, & 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 { parseAlgoliaHit } from '../util/parseAlgoliaHit';\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: { type: Function, required: true },\n highlightProperty: { type: String, required: true },\n preTag: { type: String, required: true },\n postTag: { type: String, required: true },\n },\n data() {\n return {\n textNode: {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\n },\n },\n };\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 >\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({ connector: connectHitsWithInsights }),\n createSuitMixin({ name: 'Hits' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\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 >\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({ connector: connectHitsPerPage }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n default: () => [],\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\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';\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({ connector: connectIndex }),\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(createElement) {\n return createElement('div', {}, this.$slots.default);\n },\n computed: {\n widgetParams() {\n return {\n indexName: this.indexName,\n indexId: this.indexId,\n };\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 { createSuitMixin } from '../mixins/suit';\nimport { version } from '../../package.json'; // rollup does pick only what needed from json\nimport { _objectSpread } from './polyfills';\nimport Vue from 'vue';\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 },\n created() {\n const searchClient = this.instantSearchInstance.client;\n if (typeof searchClient.addAlgoliaAgent === 'function') {\n searchClient.addAlgoliaAgent(`Vue (${Vue.version})`);\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 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';\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 required: false,\n },\n indexName: {\n type: String,\n required: true,\n },\n routing: {\n default: null,\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: 200,\n },\n searchFunction: {\n type: Function,\n default: null,\n },\n initialUiState: {\n type: Object,\n required: false,\n },\n apiKey: {\n type: String,\n default: null,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n appId: {\n type: String,\n default: null,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\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(createElement) {\n return createElement(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: false,\n },\n },\n this.$slots.default\n );\n },\n});\n","import { createInstantSearchComponent } from '../util/createInstantSearchComponent';\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(createElement) {\n return createElement(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: true,\n },\n },\n this.$slots.default\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 >\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({ connector: connectInfiniteHitsWithInsights }),\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(items) {\n return items;\n },\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 >\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({ connector: connectMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\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: 10,\n },\n showMoreLimit: {\n type: Number,\n default: 20,\n },\n showMore: {\n type: Boolean,\n default: false,\n },\n sortBy: {\n type: [Array, Function],\n default() {\n return ['count:desc', 'name:asc'];\n },\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 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 >\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({ connector: connectMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\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() {\n return ['name:asc'];\n },\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\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({ connector: connectNumericMenu }),\n createSuitMixin({ name: 'NumericMenu' }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\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(items) {\n return items;\n },\n },\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n transformItems: this.transformItems,\n items: this.items,\n };\n },\n canRefine() {\n return !this.state.hasNoResults;\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', '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({ connector: connectPagination }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.nbPages > 1,\n }),\n ],\n props: {\n padding: {\n type: Number,\n default: 3,\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 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=\"$slots.header || $scopedSlots.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=\"$slots.footer || $scopedSlots.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 { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\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 connector: connectQueryRules,\n }),\n ],\n props: {\n trackedFilters: {\n type: Object,\n required: true,\n },\n transformRuleContexts: {\n type: Function,\n required: false,\n default: ruleContexts => ruleContexts,\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 connector: connectQueryRules,\n }),\n ],\n props: {\n transformItems: {\n type: Function,\n required: false,\n default: items => items,\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :current-refinement=\"values\"\n :refine=\"refine\"\n :can-refine=\"canRefine\"\n :range=\"state.range\"\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\nconst mapStateToCanRefine = state =>\n state && Boolean(state.range) && state.range.min !== state.range.max;\n\nexport default {\n name: 'AisRangeInput',\n mixins: [\n createSuitMixin({ name: 'RangeInput' }),\n createWidgetMixin({ connector: connectRange }),\n createPanelConsumerMixin({\n mapStateToCanRefine,\n }),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n min: {\n type: Number,\n required: false,\n default: -Infinity,\n },\n max: {\n type: Number,\n required: false,\n default: Infinity,\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 canRefine() {\n return mapStateToCanRefine(this.state);\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 >\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\">& 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({ connector: connectRatingMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n max: {\n type: Number,\n default: 5,\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 -->\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\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"$emit('input', $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 || (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: true,\n },\n },\n data() {\n return {\n query: '',\n };\n },\n methods: {\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\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 >\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({ connector: connectRefinementList }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n searchable: {\n type: Boolean,\n default: false,\n },\n searchablePlaceholder: {\n default: 'Search here…',\n type: String,\n required: false,\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 default: 10,\n required: false,\n },\n showMoreLimit: {\n type: Number,\n default: 20,\n required: false,\n },\n showMore: {\n type: Boolean,\n default: false,\n required: false,\n },\n sortBy: {\n type: [Array, Function],\n default: () => ['isRefined', 'count:desc', 'name:asc'],\n required: false,\n },\n transformItems: {\n type: Function,\n default: items => items,\n required: false,\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 on the\n <code>slot-scope</code>:\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({ connector: connectStateResults }),\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 >\n <slot\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n <slot\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n <slot\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 SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin({ connector: connectSearchBox }),\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 },\n data() {\n return {\n localValue: '',\n };\n },\n computed: {\n isControlled() {\n return typeof this.value !== 'undefined';\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.value !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.value;\n this.$emit('input', this.value);\n this.state.refine(this.value);\n }\n return this.value || 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 }\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 >\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({ connector: connectSortBy }),\n\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\n ],\n props: {\n items: {\n type: Array,\n required: true,\n },\n transformItems: {\n type: Function,\n default(items) {\n return items;\n },\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({ connector: connectStats }),\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :value=\"state.value\"\n :can-refine=\"canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\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\nconst mapStateToCanRefine = state => Boolean(state.value && state.value.count);\n\nexport default {\n name: 'AisToggleRefinement',\n mixins: [\n createSuitMixin({ name: 'ToggleRefinement' }),\n createWidgetMixin({ connector: connectToggleRefinement }),\n createPanelConsumerMixin({\n mapStateToCanRefine,\n }),\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 // explicit otherwise Vue coerces the default value\n // to false because of the `Boolean` prop type\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 canRefine() {\n return mapStateToCanRefine(this.state);\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({ connector: connectVoiceSearch }),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\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 };\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({ connector: connectRelevantSort }),\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","/* 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 Vue from 'vue';\nimport instantsearch from 'instantsearch.js/es';\nimport algoliaHelper from 'algoliasearch-helper';\nconst { SearchResults, SearchParameters } = algoliaHelper;\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 renderToString(app, _renderToString) {\n return new Promise((resolve, reject) =>\n _renderToString(app, (err, res) => {\n if (err) reject(err);\n resolve(res);\n })\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) {\n const options = {\n serverPrefetch: undefined,\n fetch: undefined,\n _base: undefined,\n name: 'ais-ssr-root-component',\n // copy over global Vue APIs\n router: componentInstance.$router,\n store: componentInstance.$store,\n };\n\n const Extended = componentInstance.$vnode\n ? componentInstance.$vnode.componentOptions.Ctor.extend(options)\n : Vue.component(Object.assign({}, componentInstance.$options, options));\n\n const app = new Extended({\n propsData: componentInstance.$options.propsData,\n });\n\n // https://stackoverflow.com/a/48195006/3185307\n app.$slots = componentInstance.$slots;\n app.$root = componentInstance.$root;\n app.$options.serverPrefetch = [];\n\n return app;\n}\n\nfunction augmentInstantSearch(\n instantSearchOptions,\n searchClient,\n indexName,\n cloneComponent\n) {\n /* eslint-disable no-param-reassign */\n\n const helper = algoliaHelper(searchClient, indexName);\n const search = instantsearch(instantSearchOptions);\n\n let resultsState;\n\n /**\n * main API for SSR, called in serverPrefetch of a root component which contains instantsearch\n * @param {object} componentInstance the calling component's `this`\n * @returns {Promise} result of the search, to save for .hydrate\n */\n search.findResultsState = function(componentInstance) {\n let _renderToString;\n try {\n _renderToString = require('vue-server-renderer/basic');\n } catch (e) {\n // error is handled by regular if, in case it's `undefined`\n }\n if (!_renderToString) {\n throw new Error('you need to install vue-server-renderer');\n }\n\n let app;\n\n return Promise.resolve()\n .then(() => {\n app = cloneComponent(componentInstance);\n\n app.instantsearch.helper = helper;\n app.instantsearch.mainHelper = helper;\n\n app.instantsearch.mainIndex.init({\n instantSearchInstance: app.instantsearch,\n parent: null,\n uiState: app.instantsearch._initialUiState,\n });\n })\n .then(() => renderToString(app, _renderToString))\n .then(() => searchOnlyWithDerivedHelpers(helper))\n .then(() => {\n const results = {};\n walkIndex(app.instantsearch.mainIndex, widget => {\n results[widget.getIndexId()] = widget.getResults();\n });\n\n search.hydrate(results);\n\n resultsState = Object.keys(results)\n .map(indexId => {\n const { _state, _rawResults } = results[indexId];\n return [\n indexId,\n {\n // copy just the values of SearchParameters, not the functions\n _state: Object.keys(_state).reduce((acc, key) => {\n acc[key] = _state[key];\n return acc;\n }, {}),\n _rawResults,\n },\n ];\n })\n .reduce(\n (acc, [key, val]) => {\n acc[key] = val;\n return acc;\n },\n {\n __identifier: 'stringified',\n }\n );\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 (!resultsState) {\n throw new Error('You need to wait for findResultsState to finish');\n }\n return resultsState;\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 localHelper = parent.getHelper();\n\n const results = search.__initialSearchResults[parent.getIndexId()];\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) {\n return;\n }\n\n const state = results._state;\n\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().map(result =>\n Object.assign(result, {\n results: search.__initialSearchResults[result.indexId],\n })\n ),\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 const initialResults =\n results.__identifier === 'stringified'\n ? Object.keys(results).reduce((acc, indexId) => {\n if (indexId === '__identifier') {\n return acc;\n }\n acc[indexId] = new SearchResults(\n new SearchParameters(results[indexId]._state),\n results[indexId]._rawResults\n );\n return acc;\n }, {})\n : results;\n\n search.__initialSearchResults = initialResults;\n\n search.helper = helper;\n search.mainHelper = helper;\n\n search.mainIndex.init({\n instantSearchInstance: search,\n parent: null,\n uiState: search._initialUiState,\n });\n };\n\n /* eslint-enable no-param-reassign */\n return search;\n}\n\nexport function createServerRootMixin(instantSearchOptions = {}) {\n const {\n searchClient,\n indexName,\n $cloneComponent = defaultCloneComponent,\n } = instantSearchOptions;\n\n if (!searchClient || !indexName) {\n throw new Error(\n 'createServerRootMixin requires `searchClient` and `indexName` in the first argument'\n );\n }\n\n const search = augmentInstantSearch(\n instantSearchOptions,\n searchClient,\n indexName,\n $cloneComponent\n );\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 & duplicated 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","cache","Set","warn","message","has","add","console","createWidgetMixin","inject","instantSearchInstance","from","tag","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","__initialSearchResults","started","__forceRender","beforeDestroy","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","render","mixins","connectAutocomplete","escapeHTML","Boolean","required","computed","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","Vue","provide","canRefine","$on","value","updateCanRefine","$destroy","createPanelConsumerMixin","$emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","items","isLastItem","index","length","connectClearRefinements","hasRefinements","excludedAttributes","includedAttributes","inheritAttrs","connectConfigure","searchParameters","$attrs","createElement","$scopedSlots","class","refine","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","filters","capitalize","toString","charAt","toLocaleUpperCase","slice","level","Number","createURL","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","htmlUnescapes","&","<",">",""","'","reEscapedHtml","reHasEscapedHtml","RegExp","source","unescape","string","test","replace","character","TAG_PLACEHOLDER","highlightPreTag","highlightPostTag","parseHighlightedAttribute","splitByPreTag","highlightedValue","split","preTag","firstValue","shift","isHighlighted","postTag","let","forEach","splitByPostTag","parseAlgoliaHit","highlightObject","getPropertyByPath","highlightProperty","isArray","map","item","highlightedTagName","textNode","functional","context","slots","parsedHighlights","AisHighlighter","connectHitsWithInsights","hits","connectHitsPerPage","hasNoResults","selected","find","handleChange","connectIndex","indexWidget","$_ais_getParentIndex","indexName","indexId","$slots","_objectSpread","target","i","arguments","ownKeys","keys","getOwnPropertySymbols","concat","filter","sym","getOwnPropertyDescriptor","enumerable","key","_defineProperty","obj","defineProperty","configurable","writable","createInstantSearchComponent","component","$_ais_instantSearchInstance","searchClient","helper","setClient","search","setIndex","stalledSearchDelay","_stalledSearchDelay","routing","searchFunction","_searchFunction","client","addAlgoliaAgent","version","mounted","$nextTick","start","dispose","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","connectMenu","showShowMoreButton","connectNumericMenu","connectPagination","nbPages","padding","totalPages","showFirst","showLast","showNext","page","p","Math","min","max","theme","indexOf","algoliaUrl","location","hostname","connectQueryRules","trackedFilters","transformRuleContexts","ruleContexts","range","connectRange","Infinity","precision","minInput","maxInput","updated","step","pow","values","minValue","minRange","maxValue","maxRange","pick","first","second","connectRatingMenu","placeholder","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","submitTitle","resetTitle","query","onFormSubmit","$refs","input","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","localValue","isControlled","currentRefinement","val","connectSortBy","connectStats","count","connectToggleRefinement","label","on","off","connectVoiceSearch","searchAsYouSpeak","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","plugin","install","localVue","widgets","walkIndex","visit","getWidgets","$$type","renderToString","app","_renderToString","Promise","resolve","reject","err","res","searchOnlyWithDerivedHelpers","derivedHelpers","derivedHelper","e","defaultCloneComponent","componentInstance","options","serverPrefetch","fetch","_base","$router","store","$store","$vnode","componentOptions","Ctor","extend","propsData","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","resultsState","algoliaHelper","findResultsState","require","then","mainHelper","parent","uiState","_initialUiState","getIndexId","getResults","hydrate","_state","reduce","acc","_rawResults","__identifier","getState","localHelper","getHelper","scopedResults","getScopedResults","result","templatesConfig","searchMetadata","isSearchStalled","initialResults","SearchResults","SearchParameters","createServerRootMixin","$cloneComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vue-instantsearch.common.js","sources":["../src/util/suit.js","../src/mixins/suit.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/polyfills.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/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","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 { warn } from '../util/warn';\n\nexport const createWidgetMixin = ({ connector } = {}) => ({\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 = this.factory(this.widgetParams);\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 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 = this.factory(nextWidgetParams);\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({ connector: connectAutocomplete }),\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 Vue from 'vue';\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 new Vue({\n name: 'PanelProvider',\n });\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 beforeDestroy() {\n this.emitter.$destroy();\n },\n methods: {\n updateCanRefine(value) {\n this.canRefine = value;\n },\n },\n});\n\nexport const createPanelConsumerMixin = ({ mapStateToCanRefine }) => ({\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\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({ connector: connectBreadcrumb }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\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({ connector: connectClearRefinements }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.hasRefinements),\n }),\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';\n\nexport default {\n inheritAttrs: false,\n name: 'AisConfigure',\n mixins: [\n createSuitMixin({ name: 'Configure' }),\n createWidgetMixin({ connector: connectConfigure }),\n ],\n computed: {\n widgetParams() {\n return {\n searchParameters: this.$attrs,\n };\n },\n },\n render(createElement) {\n if (!this.state || !this.$scopedSlots.default) {\n return null;\n }\n\n return createElement(\n 'div',\n {\n class: this.suit(),\n },\n [\n this.$scopedSlots.default({\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({ connector: EXPERIMENTAL_connectConfigureRelatedItems }),\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')\">{{ item.label | capitalize }}: </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({ connector: connectCurrentRefinements }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state =>\n Boolean(state.items) && state.items.length > 0,\n }),\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 },\n filters: {\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"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\nconst mapStateToCanRefine = state =>\n Boolean(state.items) && state.items.length > 0;\n\nexport default {\n name: 'AisHierarchicalMenu',\n mixins: [\n createSuitMixin({ name: 'HierarchicalMenu' }),\n createWidgetMixin({ connector: connectHierarchicalMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine,\n }),\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 canRefine() {\n return mapStateToCanRefine(this.state);\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 '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\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 * `&`, `<`, `>`, `"`, and `'` 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, & 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 { parseAlgoliaHit } from '../util/parseAlgoliaHit';\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 {\n textNode: {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\n },\n },\n };\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({ connector: connectHitsWithInsights }),\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 >\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({ connector: connectHitsPerPage }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\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';\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({ connector: connectIndex }),\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(createElement) {\n return createElement('div', {}, this.$slots.default);\n },\n computed: {\n widgetParams() {\n return {\n indexName: this.indexName,\n indexId: this.indexId,\n };\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 { createSuitMixin } from '../mixins/suit';\nimport { version } from '../../package.json'; // rollup does pick only what needed from json\nimport { _objectSpread } from './polyfills';\nimport Vue from 'vue';\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 (${Vue.version})`);\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 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';\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(createElement) {\n return createElement(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: false,\n },\n },\n this.$slots.default\n );\n },\n});\n","import { createInstantSearchComponent } from '../util/createInstantSearchComponent';\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(createElement) {\n return createElement(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: true,\n },\n },\n this.$slots.default\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({ connector: connectInfiniteHitsWithInsights }),\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({ connector: connectMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\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({ connector: connectMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"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({ connector: connectNumericMenu }),\n createSuitMixin({ name: 'NumericMenu' }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\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 canRefine() {\n return !this.state.hasNoResults;\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', '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({ connector: connectPagination }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.nbPages > 1,\n }),\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 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=\"$slots.header || $scopedSlots.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=\"$slots.footer || $scopedSlots.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 { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\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 connector: connectQueryRules,\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 connector: connectQueryRules,\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :current-refinement=\"values\"\n :refine=\"refine\"\n :can-refine=\"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\nconst mapStateToCanRefine = state =>\n state && Boolean(state.range) && state.range.min !== state.range.max;\n\nexport default {\n name: 'AisRangeInput',\n mixins: [\n createSuitMixin({ name: 'RangeInput' }),\n createWidgetMixin({ connector: connectRange }),\n createPanelConsumerMixin({\n mapStateToCanRefine,\n }),\n ],\n props: {\n attribute: {\n type: String,\n required: true,\n },\n min: {\n type: Number,\n required: false,\n // @major: remove this default\n default: -Infinity,\n },\n max: {\n type: Number,\n required: false,\n // @major: remove this default\n default: Infinity,\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 canRefine() {\n return mapStateToCanRefine(this.state);\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 >\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\">& 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({ connector: connectRatingMenu }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\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 -->\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\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"$emit('input', $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 || (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: true,\n },\n },\n data() {\n return {\n query: '',\n };\n },\n methods: {\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\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({ connector: connectRefinementList }),\n createPanelConsumerMixin({\n mapStateToCanRefine: state => Boolean(state.canRefine),\n }),\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 on the\n <code>slot-scope</code>:\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({ connector: connectStateResults }),\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 >\n <slot\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n <slot\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n <slot\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 SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin({ connector: connectSearchBox }),\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 },\n data() {\n return {\n localValue: '',\n };\n },\n computed: {\n isControlled() {\n return typeof this.value !== 'undefined';\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.value !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.value;\n this.$emit('input', this.value);\n this.state.refine(this.value);\n }\n return this.value || 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 }\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 >\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({ connector: connectSortBy }),\n\n createPanelConsumerMixin({\n mapStateToCanRefine: state => state.hasNoResults === false,\n }),\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({ connector: connectStats }),\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(), !canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :value=\"state.value\"\n :can-refine=\"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\nconst mapStateToCanRefine = state => Boolean(state.value && state.value.count);\n\nexport default {\n name: 'AisToggleRefinement',\n mixins: [\n createSuitMixin({ name: 'ToggleRefinement' }),\n createWidgetMixin({ connector: connectToggleRefinement }),\n createPanelConsumerMixin({\n mapStateToCanRefine,\n }),\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 canRefine() {\n return mapStateToCanRefine(this.state);\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({ connector: connectVoiceSearch }),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\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 };\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({ connector: connectRelevantSort }),\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 { EXPERIMENTAL_connectDynamicWidgets } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\n\nfunction getWidgetAttribute(vnode) {\n const props = 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 const children =\n vnode.componentOptions && vnode.componentOptions.children\n ? vnode.componentOptions.children\n : vnode.children;\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: 'AisExperimentalDynamicWidgets',\n mixins: [\n createWidgetMixin({ connector: EXPERIMENTAL_connectDynamicWidgets }),\n createSuitMixin({ name: 'DynamicWidgets' }),\n ],\n props: {\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n render(createElement) {\n const components = new Map();\n (this.$slots.default || []).forEach(vnode => {\n const attribute = getWidgetAttribute(vnode);\n if (attribute) {\n components.set(\n attribute,\n createElement(\n 'div',\n { key: attribute, class: [this.suit('widget')] },\n [vnode]\n )\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 createElement(\n 'div',\n { attrs: { hidden: true }, class: [this.suit()] },\n allComponents\n );\n }\n\n return createElement(\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 // we do not pass \"widgets\" to the connector, since Vue is in charge of rendering\n widgets: [],\n };\n },\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 Vue from 'vue';\nimport instantsearch from 'instantsearch.js/es';\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 renderToString(app, _renderToString) {\n return new Promise((resolve, reject) =>\n _renderToString(app, (err, res) => {\n if (err) reject(err);\n resolve(res);\n })\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) {\n const options = {\n serverPrefetch: undefined,\n fetch: undefined,\n _base: undefined,\n name: 'ais-ssr-root-component',\n // copy over global Vue APIs\n router: componentInstance.$router,\n store: componentInstance.$store,\n };\n\n const Extended = componentInstance.$vnode\n ? componentInstance.$vnode.componentOptions.Ctor.extend(options)\n : Vue.component(\n options.name,\n Object.assign({}, componentInstance.$options, options)\n );\n\n const app = new Extended({\n propsData: componentInstance.$options.propsData,\n });\n\n // https://stackoverflow.com/a/48195006/3185307\n app.$slots = componentInstance.$slots;\n app.$root = componentInstance.$root;\n app.$options.serverPrefetch = [];\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} componentInstance the calling component's `this`\n * @returns {Promise} result of the search, to save for .hydrate\n */\n search.findResultsState = function(componentInstance) {\n let _renderToString;\n try {\n _renderToString = require('vue-server-renderer/basic');\n } catch (e) {\n // error is handled by regular if, in case it's `undefined`\n }\n if (!_renderToString) {\n throw new Error('you need to install vue-server-renderer');\n }\n\n let app;\n let instance;\n\n return Promise.resolve()\n .then(() => {\n app = cloneComponent(componentInstance);\n\n instance = app.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 .then(() => renderToString(app, _renderToString))\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","cache","Set","warn","message","has","add","console","createWidgetMixin","inject","instantSearchInstance","from","tag","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","_initialResults","started","__forceRender","beforeDestroy","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","render","mixins","connectAutocomplete","escapeHTML","Boolean","required","computed","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","Vue","provide","canRefine","$on","value","updateCanRefine","$destroy","createPanelConsumerMixin","$emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","isLastItem","index","items","length","connectClearRefinements","hasRefinements","excludedAttributes","includedAttributes","inheritAttrs","connectConfigure","searchParameters","$attrs","createElement","$scopedSlots","class","refine","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","filters","capitalize","toString","charAt","toLocaleUpperCase","slice","level","Number","createURL","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","htmlUnescapes","&","<",">",""","'","reEscapedHtml","reHasEscapedHtml","RegExp","source","unescape","string","test","replace","character","TAG_PLACEHOLDER","highlightPreTag","highlightPostTag","parseHighlightedAttribute","splitByPreTag","highlightedValue","split","preTag","firstValue","shift","isHighlighted","postTag","let","forEach","splitByPostTag","parseAlgoliaHit","highlightObject","getPropertyByPath","highlightProperty","isArray","map","item","highlightedTagName","textNode","functional","context","slots","parsedHighlights","AisHighlighter","connectHitsWithInsights","hits","connectHitsPerPage","hasNoResults","selected","find","handleChange","connectIndex","indexWidget","$_ais_getParentIndex","indexName","indexId","$slots","_objectSpread","target","i","arguments","ownKeys","keys","getOwnPropertySymbols","concat","filter","sym","getOwnPropertyDescriptor","enumerable","key","_defineProperty","obj","defineProperty","configurable","writable","createInstantSearchComponent","component","$_ais_instantSearchInstance","searchClient","helper","setClient","search","setIndex","stalledSearchDelay","_stalledSearchDelay","routing","searchFunction","_searchFunction","middlewares","next","prev","middleware","indexOf","middlewareToRemove","unuse","middlewareToAdd","use","client","addAlgoliaAgent","version","mounted","$nextTick","start","dispose","__initialSearchResults","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","connectMenu","showShowMoreButton","connectNumericMenu","connectPagination","nbPages","padding","totalPages","showFirst","showLast","showNext","page","p","Math","min","max","theme","algoliaUrl","location","hostname","connectQueryRules","trackedFilters","transformRuleContexts","range","connectRange","Infinity","precision","minInput","maxInput","updated","step","pow","values","minValue","minRange","maxValue","maxRange","pick","first","second","connectRatingMenu","placeholder","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","submitTitle","resetTitle","query","onFormSubmit","$refs","input","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","localValue","isControlled","currentRefinement","val","connectSortBy","connectStats","count","connectToggleRefinement","label","on","off","connectVoiceSearch","searchAsYouSpeak","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","componentOptions","propsData","children","reduce","acc","curr","EXPERIMENTAL_connectDynamicWidgets","Map","allComponents","attrs","hidden","attributesToRender","widgets","plugin","install","localVue","walkIndex","visit","getWidgets","$$type","renderToString","app","_renderToString","Promise","resolve","reject","err","res","searchOnlyWithDerivedHelpers","derivedHelpers","derivedHelper","e","defaultCloneComponent","componentInstance","options","serverPrefetch","fetch","_base","$router","store","$store","$vnode","Ctor","extend","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","initialResults","findResultsState","instance","require","then","mainHelper","getResults","getIndexId","_state","_rawResults","hydrate","getState","parent","localHelper","getHelper","scopedResults","getScopedResults","templatesConfig","searchMetadata","isSearchStalled","createServerRootMixin","$cloneComponent"],"mappings":"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"}
|