vue-instantsearch 4.3.3 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/package.json +5 -5
  3. package/src/__tests__/index.js +133 -26
  4. package/src/components/Autocomplete.vue +8 -1
  5. package/src/components/Breadcrumb.vue +8 -1
  6. package/src/components/ClearRefinements.vue +8 -1
  7. package/src/components/Configure.js +8 -1
  8. package/src/components/ConfigureRelatedItems.js +8 -1
  9. package/src/components/CurrentRefinements.vue +8 -1
  10. package/src/components/DynamicWidgets.js +8 -1
  11. package/src/components/HierarchicalMenu.vue +8 -1
  12. package/src/components/Hits.vue +8 -1
  13. package/src/components/HitsPerPage.vue +8 -1
  14. package/src/components/Index.js +6 -1
  15. package/src/components/InfiniteHits.vue +8 -1
  16. package/src/components/Menu.vue +6 -1
  17. package/src/components/MenuSelect.vue +6 -1
  18. package/src/components/NumericMenu.vue +8 -1
  19. package/src/components/Pagination.vue +9 -1
  20. package/src/components/QueryRuleContext.js +8 -3
  21. package/src/components/QueryRuleCustomData.vue +8 -3
  22. package/src/components/RangeInput.vue +8 -1
  23. package/src/components/RatingMenu.vue +8 -1
  24. package/src/components/RefinementList.vue +8 -1
  25. package/src/components/RelevantSort.vue +8 -1
  26. package/src/components/SearchBox.vue +8 -1
  27. package/src/components/SortBy.vue +6 -1
  28. package/src/components/StateResults.vue +8 -1
  29. package/src/components/Stats.vue +6 -1
  30. package/src/components/ToggleRefinement.vue +8 -1
  31. package/src/components/VoiceSearch.vue +8 -1
  32. package/src/components/__tests__/__snapshots__/Pagination.js.snap +21 -21
  33. package/src/mixins/__tests__/widget.test.js +102 -0
  34. package/src/mixins/widget.js +13 -3
  35. package/src/util/__tests__/createServerRootMixin.test.js +3 -2
  36. package/src/util/createServerRootMixin.js +1 -1
  37. package/vue2/cjs/index.js +1 -1
  38. package/vue2/cjs/index.js.map +1 -1
  39. package/vue2/es/package.json.js +1 -1
  40. package/vue2/es/src/components/Autocomplete.vue.js +1 -1
  41. package/vue2/es/src/components/Autocomplete.vue.js.map +1 -1
  42. package/vue2/es/src/components/Breadcrumb.vue.js +1 -1
  43. package/vue2/es/src/components/Breadcrumb.vue.js.map +1 -1
  44. package/vue2/es/src/components/ClearRefinements.vue.js +1 -1
  45. package/vue2/es/src/components/ClearRefinements.vue.js.map +1 -1
  46. package/vue2/es/src/components/Configure.js +1 -1
  47. package/vue2/es/src/components/Configure.js.map +1 -1
  48. package/vue2/es/src/components/ConfigureRelatedItems.js +1 -1
  49. package/vue2/es/src/components/ConfigureRelatedItems.js.map +1 -1
  50. package/vue2/es/src/components/CurrentRefinements.vue.js +1 -1
  51. package/vue2/es/src/components/CurrentRefinements.vue.js.map +1 -1
  52. package/vue2/es/src/components/DynamicWidgets.js +1 -1
  53. package/vue2/es/src/components/DynamicWidgets.js.map +1 -1
  54. package/vue2/es/src/components/HierarchicalMenu.vue.js +1 -1
  55. package/vue2/es/src/components/HierarchicalMenu.vue.js.map +1 -1
  56. package/vue2/es/src/components/Hits.vue.js +1 -1
  57. package/vue2/es/src/components/Hits.vue.js.map +1 -1
  58. package/vue2/es/src/components/HitsPerPage.vue.js +1 -1
  59. package/vue2/es/src/components/HitsPerPage.vue.js.map +1 -1
  60. package/vue2/es/src/components/Index.js +1 -1
  61. package/vue2/es/src/components/Index.js.map +1 -1
  62. package/vue2/es/src/components/InfiniteHits.vue.js +1 -1
  63. package/vue2/es/src/components/InfiniteHits.vue.js.map +1 -1
  64. package/vue2/es/src/components/Menu.vue.js +1 -1
  65. package/vue2/es/src/components/Menu.vue.js.map +1 -1
  66. package/vue2/es/src/components/MenuSelect.vue.js +1 -1
  67. package/vue2/es/src/components/MenuSelect.vue.js.map +1 -1
  68. package/vue2/es/src/components/NumericMenu.vue.js +1 -1
  69. package/vue2/es/src/components/NumericMenu.vue.js.map +1 -1
  70. package/vue2/es/src/components/Pagination.vue.js +1 -1
  71. package/vue2/es/src/components/Pagination.vue.js.map +1 -1
  72. package/vue2/es/src/components/QueryRuleContext.js +1 -1
  73. package/vue2/es/src/components/QueryRuleContext.js.map +1 -1
  74. package/vue2/es/src/components/QueryRuleCustomData.vue.js +1 -1
  75. package/vue2/es/src/components/QueryRuleCustomData.vue.js.map +1 -1
  76. package/vue2/es/src/components/RangeInput.vue.js +1 -1
  77. package/vue2/es/src/components/RangeInput.vue.js.map +1 -1
  78. package/vue2/es/src/components/RatingMenu.vue.js +1 -1
  79. package/vue2/es/src/components/RatingMenu.vue.js.map +1 -1
  80. package/vue2/es/src/components/RefinementList.vue.js +1 -1
  81. package/vue2/es/src/components/RefinementList.vue.js.map +1 -1
  82. package/vue2/es/src/components/RelevantSort.vue.js +1 -1
  83. package/vue2/es/src/components/RelevantSort.vue.js.map +1 -1
  84. package/vue2/es/src/components/SearchBox.vue.js +1 -1
  85. package/vue2/es/src/components/SearchBox.vue.js.map +1 -1
  86. package/vue2/es/src/components/SortBy.vue.js +1 -1
  87. package/vue2/es/src/components/SortBy.vue.js.map +1 -1
  88. package/vue2/es/src/components/StateResults.vue.js +1 -1
  89. package/vue2/es/src/components/StateResults.vue.js.map +1 -1
  90. package/vue2/es/src/components/Stats.vue.js +1 -1
  91. package/vue2/es/src/components/Stats.vue.js.map +1 -1
  92. package/vue2/es/src/components/ToggleRefinement.vue.js +1 -1
  93. package/vue2/es/src/components/ToggleRefinement.vue.js.map +1 -1
  94. package/vue2/es/src/components/VoiceSearch.vue.js +1 -1
  95. package/vue2/es/src/components/VoiceSearch.vue.js.map +1 -1
  96. package/vue2/es/src/mixins/widget.js +1 -1
  97. package/vue2/es/src/mixins/widget.js.map +1 -1
  98. package/vue2/es/src/util/createInstantSearchComponent.js +1 -1
  99. package/vue2/es/src/util/createServerRootMixin.js.map +1 -1
  100. package/vue2/umd/index.js +1 -1
  101. package/vue2/umd/index.js.map +1 -1
  102. package/vue3/cjs/index.js +1 -1
  103. package/vue3/cjs/index.js.map +1 -1
  104. package/vue3/es/package.json.js +1 -1
  105. package/vue3/es/src/components/Autocomplete.vue_vue&type=script&lang.js +1 -1
  106. package/vue3/es/src/components/Autocomplete.vue_vue&type=script&lang.js.map +1 -1
  107. package/vue3/es/src/components/Autocomplete.vue_vue&type=template&id=e7c95fd0&lang.js.map +1 -1
  108. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js +1 -1
  109. package/vue3/es/src/components/Breadcrumb.vue_vue&type=script&lang.js.map +1 -1
  110. package/vue3/es/src/components/Breadcrumb.vue_vue&type=template&id=6f46de9a&lang.js.map +1 -1
  111. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js +1 -1
  112. package/vue3/es/src/components/ClearRefinements.vue_vue&type=script&lang.js.map +1 -1
  113. package/vue3/es/src/components/ClearRefinements.vue_vue&type=template&id=410a3aaa&lang.js.map +1 -1
  114. package/vue3/es/src/components/Configure.js +1 -1
  115. package/vue3/es/src/components/Configure.js.map +1 -1
  116. package/vue3/es/src/components/ConfigureRelatedItems.js +1 -1
  117. package/vue3/es/src/components/ConfigureRelatedItems.js.map +1 -1
  118. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js +1 -1
  119. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=script&lang.js.map +1 -1
  120. package/vue3/es/src/components/CurrentRefinements.vue_vue&type=template&id=4f1917ff&lang.js.map +1 -1
  121. package/vue3/es/src/components/DynamicWidgets.js +1 -1
  122. package/vue3/es/src/components/DynamicWidgets.js.map +1 -1
  123. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js +1 -1
  124. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=script&lang.js.map +1 -1
  125. package/vue3/es/src/components/HierarchicalMenu.vue_vue&type=template&id=4361a0b8&lang.js.map +1 -1
  126. package/vue3/es/src/components/Hits.vue_vue&type=script&lang.js +1 -1
  127. package/vue3/es/src/components/Hits.vue_vue&type=script&lang.js.map +1 -1
  128. package/vue3/es/src/components/Hits.vue_vue&type=template&id=ef242920&lang.js.map +1 -1
  129. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js +1 -1
  130. package/vue3/es/src/components/HitsPerPage.vue_vue&type=script&lang.js.map +1 -1
  131. package/vue3/es/src/components/HitsPerPage.vue_vue&type=template&id=74f3ac28&lang.js.map +1 -1
  132. package/vue3/es/src/components/Index.js +1 -1
  133. package/vue3/es/src/components/Index.js.map +1 -1
  134. package/vue3/es/src/components/InfiniteHits.vue_vue&type=script&lang.js +1 -1
  135. package/vue3/es/src/components/InfiniteHits.vue_vue&type=script&lang.js.map +1 -1
  136. package/vue3/es/src/components/InfiniteHits.vue_vue&type=template&id=dcfb64b8&lang.js.map +1 -1
  137. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js +1 -1
  138. package/vue3/es/src/components/Menu.vue_vue&type=script&lang.js.map +1 -1
  139. package/vue3/es/src/components/Menu.vue_vue&type=template&id=9bcc0be2&lang.js.map +1 -1
  140. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js +1 -1
  141. package/vue3/es/src/components/MenuSelect.vue_vue&type=script&lang.js.map +1 -1
  142. package/vue3/es/src/components/MenuSelect.vue_vue&type=template&id=694477eb&lang.js.map +1 -1
  143. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js +1 -1
  144. package/vue3/es/src/components/NumericMenu.vue_vue&type=script&lang.js.map +1 -1
  145. package/vue3/es/src/components/NumericMenu.vue_vue&type=template&id=160fae0c&lang.js.map +1 -1
  146. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js +1 -1
  147. package/vue3/es/src/components/Pagination.vue_vue&type=script&lang.js.map +1 -1
  148. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=849a166c&lang.js +1 -1
  149. package/vue3/es/src/components/Pagination.vue_vue&type=template&id=849a166c&lang.js.map +1 -1
  150. package/vue3/es/src/components/QueryRuleContext.js +1 -1
  151. package/vue3/es/src/components/QueryRuleContext.js.map +1 -1
  152. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=script&lang.js +1 -1
  153. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=script&lang.js.map +1 -1
  154. package/vue3/es/src/components/QueryRuleCustomData.vue_vue&type=template&id=e4da0782&lang.js.map +1 -1
  155. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js +1 -1
  156. package/vue3/es/src/components/RangeInput.vue_vue&type=script&lang.js.map +1 -1
  157. package/vue3/es/src/components/RangeInput.vue_vue&type=template&id=1e17783d&lang.js.map +1 -1
  158. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js +1 -1
  159. package/vue3/es/src/components/RatingMenu.vue_vue&type=script&lang.js.map +1 -1
  160. package/vue3/es/src/components/RatingMenu.vue_vue&type=template&id=9254de68&lang.js.map +1 -1
  161. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js +1 -1
  162. package/vue3/es/src/components/RefinementList.vue_vue&type=script&lang.js.map +1 -1
  163. package/vue3/es/src/components/RefinementList.vue_vue&type=template&id=28927239&lang.js.map +1 -1
  164. package/vue3/es/src/components/RelevantSort.vue_vue&type=script&lang.js +1 -1
  165. package/vue3/es/src/components/RelevantSort.vue_vue&type=script&lang.js.map +1 -1
  166. package/vue3/es/src/components/RelevantSort.vue_vue&type=template&id=257b248b&lang.js.map +1 -1
  167. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js +1 -1
  168. package/vue3/es/src/components/SearchBox.vue_vue&type=script&lang.js.map +1 -1
  169. package/vue3/es/src/components/SearchBox.vue_vue&type=template&id=27029d83&lang.js.map +1 -1
  170. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js +1 -1
  171. package/vue3/es/src/components/SortBy.vue_vue&type=script&lang.js.map +1 -1
  172. package/vue3/es/src/components/SortBy.vue_vue&type=template&id=b69b3b76&lang.js.map +1 -1
  173. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js +1 -1
  174. package/vue3/es/src/components/StateResults.vue_vue&type=script&lang.js.map +1 -1
  175. package/vue3/es/src/components/StateResults.vue_vue&type=template&id=5992f3d5&lang.js.map +1 -1
  176. package/vue3/es/src/components/Stats.vue_vue&type=script&lang.js +1 -1
  177. package/vue3/es/src/components/Stats.vue_vue&type=script&lang.js.map +1 -1
  178. package/vue3/es/src/components/Stats.vue_vue&type=template&id=7337491f&lang.js.map +1 -1
  179. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js +1 -1
  180. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=script&lang.js.map +1 -1
  181. package/vue3/es/src/components/ToggleRefinement.vue_vue&type=template&id=14e4586f&lang.js.map +1 -1
  182. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js +1 -1
  183. package/vue3/es/src/components/VoiceSearch.vue_vue&type=script&lang.js.map +1 -1
  184. package/vue3/es/src/components/VoiceSearch.vue_vue&type=template&id=24b0f67a&lang.js.map +1 -1
  185. package/vue3/es/src/mixins/widget.js +1 -1
  186. package/vue3/es/src/mixins/widget.js.map +1 -1
  187. package/vue3/es/src/util/createInstantSearchComponent.js +1 -1
  188. package/vue3/es/src/util/createServerRootMixin.js +1 -1
  189. package/vue3/es/src/util/createServerRootMixin.js.map +1 -1
  190. package/vue3/umd/index.js +1 -1
  191. package/vue3/umd/index.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/util/suit.js","../../src/mixins/suit.js","../../src/util/vue-compat/index-vue3.js","../../src/util/warn.js","../../src/mixins/widget.js","../../src/components/Autocomplete.vue","../../src/components/Autocomplete.vue?vue&type=template&id=e7c95fd0&lang.js","../../src/mixins/panel.js","../../src/components/Breadcrumb.vue","../../src/components/Breadcrumb.vue?vue&type=template&id=6f46de9a&lang.js","../../src/components/ClearRefinements.vue","../../src/components/ClearRefinements.vue?vue&type=template&id=410a3aaa&lang.js","../../src/components/Configure.js","../../src/components/ConfigureRelatedItems.js","../../src/components/CurrentRefinements.vue","../../src/components/CurrentRefinements.vue?vue&type=template&id=4f1917ff&lang.js","../../src/components/HierarchicalMenuList.vue","../../src/components/HierarchicalMenuList.vue?vue&type=template&id=0435b314&lang.js","../../src/components/HierarchicalMenu.vue","../../src/components/HierarchicalMenu.vue?vue&type=template&id=4361a0b8&lang.js","../../src/util/unescape.js","../../src/util/parseAlgoliaHit.js","../../src/components/Highlighter.vue","../../src/components/Highlighter.vue?vue&type=template&id=92153c3e&lang.js","../../src/components/Highlight.vue","../../src/components/Highlight.vue?vue&type=template&id=300b0ab4&lang.js","../../src/components/Hits.vue","../../src/components/Hits.vue?vue&type=template&id=ef242920&lang.js","../../src/components/HitsPerPage.vue","../../src/components/HitsPerPage.vue?vue&type=template&id=74f3ac28&lang.js","../../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/InfiniteHits.vue?vue&type=template&id=dcfb64b8&lang.js","../../src/components/Menu.vue","../../src/components/Menu.vue?vue&type=template&id=9bcc0be2&lang.js","../../src/components/MenuSelect.vue","../../src/components/MenuSelect.vue?vue&type=template&id=694477eb&lang.js","../../src/components/NumericMenu.vue","../../src/components/NumericMenu.vue?vue&type=template&id=160fae0c&lang.js","../../src/components/Pagination.vue","../../src/components/Pagination.vue?vue&type=template&id=849a166c&lang.js","../../src/components/Panel.vue","../../src/components/Panel.vue?vue&type=template&id=d32d57f8&lang.js","../../src/components/PoweredBy.vue","../../src/components/PoweredBy.vue?vue&type=template&id=3e8d7a5b&lang.js","../../src/components/QueryRuleContext.js","../../src/components/QueryRuleCustomData.vue","../../src/components/QueryRuleCustomData.vue?vue&type=template&id=e4da0782&lang.js","../../src/components/RangeInput.vue","../../src/components/RangeInput.vue?vue&type=template&id=1e17783d&lang.js","../../src/components/RatingMenu.vue","../../src/components/RatingMenu.vue?vue&type=template&id=9254de68&lang.js","../../src/components/SearchInput.vue","../../src/components/SearchInput.vue?vue&type=template&id=2eed8ffc&lang.js","../../src/components/RefinementList.vue","../../src/components/RefinementList.vue?vue&type=template&id=28927239&lang.js","../../src/connectors/connectStateResults.js","../../src/components/StateResults.vue","../../src/components/StateResults.vue?vue&type=template&id=5992f3d5&lang.js","../../src/components/SearchBox.vue","../../src/components/SearchBox.vue?vue&type=template&id=27029d83&lang.js","../../src/components/Snippet.vue","../../src/components/Snippet.vue?vue&type=template&id=eb4966c6&lang.js","../../src/components/SortBy.vue","../../src/components/SortBy.vue?vue&type=template&id=b69b3b76&lang.js","../../src/components/Stats.vue","../../src/components/Stats.vue?vue&type=template&id=7337491f&lang.js","../../src/components/ToggleRefinement.vue","../../src/components/ToggleRefinement.vue?vue&type=template&id=14e4586f&lang.js","../../src/components/VoiceSearch.vue","../../src/components/VoiceSearch.vue?vue&type=template&id=24b0f67a&lang.js","../../src/components/RelevantSort.vue","../../src/components/RelevantSort.vue?vue&type=template&id=257b248b&lang.js","../../src/components/DynamicWidgets.js","../../src/components/ExperimentalDynamicWidgets.js","../../src/plugin.js","../../src/util/createServerRootMixin.js"],"sourcesContent":["/**\n * Create class names like ais-widgetName-element--modifier\n *\n * @param {string} widgetName first part\n * @param {string} element part separated by -\n * @param {string} modifier final part, separated by --\n *\n * @returns {string} the composed class name\n */\nexport default function suit(widgetName, element, modifier) {\n if (!widgetName) {\n throw new Error('You need to provide `widgetName` in your data');\n }\n\n const elements = [`ais-${widgetName}`];\n\n if (element) {\n elements.push(`-${element}`);\n }\n\n if (modifier) {\n elements.push(`--${modifier}`);\n }\n\n return elements.join('');\n}\n","import suit from '../util/suit';\n\nexport const createSuitMixin = ({ name }) => ({\n props: {\n classNames: {\n type: Object,\n default: undefined,\n },\n },\n methods: {\n suit(element, modifier) {\n const className = suit(name, element, modifier);\n const userClassName = this.classNames && this.classNames[className];\n if (userClassName) {\n return [className, userClassName].join(' ');\n }\n return className;\n },\n },\n});\n","import * as Vue from 'vue';\n\nconst isVue2 = false;\nconst isVue3 = true;\nconst Vue2 = undefined;\n\nexport { createApp, createSSRApp, h, version, nextTick } from 'vue';\nexport { Vue, Vue2, isVue2, isVue3 };\n\nexport function renderCompat(fn) {\n function h(tag, props, children) {\n if (typeof props === 'object' && (props.attrs || props.props)) {\n // In vue 3, we no longer wrap with `attrs` or `props` key.\n const flatProps = Object.assign({}, props, props.attrs, props.props);\n delete flatProps.attrs;\n delete flatProps.props;\n\n return Vue.h(tag, flatProps, children);\n }\n\n return Vue.h(tag, props, children);\n }\n\n return function() {\n return fn.call(this, h);\n };\n}\n\nexport function getDefaultSlot(component) {\n return component.$slots.default && component.$slots.default();\n}\n","const cache = new Set();\n\nexport function warn(message) {\n if (cache.has(message)) return;\n cache.add(message);\n // eslint-disable-next-line no-console\n console.warn(message);\n}\n","import { isVue3 } from '../util/vue-compat';\nimport { 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 [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.getParentIndex().removeWidgets([this.widget]);\n }\n },\n watch: {\n widgetParams: {\n handler(nextWidgetParams) {\n this.state = null;\n this.getParentIndex().removeWidgets([this.widget]);\n this.widget = 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","<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 { isVue3 } from '../util/vue-compat';\nimport mitt from 'mitt';\n\nexport const PANEL_EMITTER_NAMESPACE = 'instantSearchPanelEmitter';\nexport const PANEL_CHANGE_EVENT = 'PANEL_CHANGE_EVENT';\n\nexport const createPanelProviderMixin = () => ({\n props: {\n emitter: {\n type: Object,\n required: false,\n default() {\n return mitt();\n },\n },\n },\n provide() {\n return {\n [PANEL_EMITTER_NAMESPACE]: this.emitter,\n };\n },\n data() {\n return {\n canRefine: true,\n };\n },\n created() {\n this.emitter.on(PANEL_CHANGE_EVENT, value => {\n this.updateCanRefine(value);\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n this.emitter.all.clear();\n },\n methods: {\n updateCanRefine(value) {\n this.canRefine = value;\n },\n },\n});\n\nexport const createPanelConsumerMixin = ({ 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 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(), !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","<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';\nimport { isVue3, renderCompat } from '../util/vue-compat';\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: renderCompat(function(h) {\n const slot = isVue3 ? this.$slots.default : this.$scopedSlots.default;\n\n if (!this.state || !slot) {\n return null;\n }\n\n return h(\n 'div',\n {\n class: this.suit(),\n },\n [\n slot({\n refine: this.state.refine,\n searchParameters: this.state.widgetParams.searchParameters,\n }),\n ]\n );\n }),\n};\n","import { createWidgetMixin } from '../mixins/widget';\nimport { EXPERIMENTAL_connectConfigureRelatedItems } from 'instantsearch.js/es/connectors';\n\nexport default {\n inheritAttrs: false,\n name: 'AisExperimentalConfigureRelatedItems',\n mixins: [\n createWidgetMixin({ 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')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{ refinement.label }}</q>\n <template v-else>\n {{ refinement.label }}\n </template>\n </span>\n <button\n :class=\"suit('delete')\"\n @click=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin({ 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 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 <div\n :class=\"[suit(), noRefinement && suit('','noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :refine=\"state.refine\"\n :items=\"state.items\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.attribute\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :refine=\"item.refine\"\n :item=\"item\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('label')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{ refinement.label }}</q>\n <template v-else>\n {{ refinement.label }}\n </template>\n </span>\n <button\n :class=\"suit('delete')\"\n @click=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin({ 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 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 <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","<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 '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n};\n\n/** Used to match HTML entities and HTML characters. */\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */\nexport function unescape(string) {\n return string && reHasEscapedHtml.test(string)\n ? string.replace(reEscapedHtml, character => htmlUnescapes[character])\n : string;\n}\n","// copied from React InstantSearch\nimport { getPropertyByPath } from 'instantsearch.js/es/lib/utils';\nimport { unescape } from '../util/unescape';\n\nconst TAG_PLACEHOLDER = {\n highlightPreTag: '__ais-highlight__',\n highlightPostTag: '__/ais-highlight__',\n};\n\n/**\n * Parses an highlighted attribute into an array of objects with the string value, and\n * a boolean that indicated if this part is highlighted.\n *\n * @param {string} preTag - string used to identify the start of an highlighted value\n * @param {string} postTag - string used to identify the end of an highlighted value\n * @param {string} highlightedValue - highlighted attribute as returned by Algolia highlight feature\n * @return {object[]} - An array of {value: string, isHighlighted: boolean}.\n */\nfunction parseHighlightedAttribute({ preTag, postTag, highlightedValue = '' }) {\n const splitByPreTag = highlightedValue.split(preTag);\n const firstValue = splitByPreTag.shift();\n const elements =\n firstValue === '' ? [] : [{ value: firstValue, isHighlighted: false }];\n\n if (postTag === preTag) {\n let isHighlighted = true;\n splitByPreTag.forEach(split => {\n elements.push({ value: split, isHighlighted });\n isHighlighted = !isHighlighted;\n });\n } else {\n splitByPreTag.forEach(split => {\n const splitByPostTag = split.split(postTag);\n\n elements.push({\n value: splitByPostTag[0],\n isHighlighted: true,\n });\n\n if (splitByPostTag[1] !== '') {\n elements.push({\n // Vue removes nodes which are just a single space (vuejs/vue#9208),\n // we replace this by two spaces, which does not have an impact,\n // unless someone would have `white-space: pre` on the highlights\n value: splitByPostTag[1] === ' ' ? ' ' : splitByPostTag[1],\n isHighlighted: false,\n });\n }\n });\n }\n\n return elements;\n}\n\n/**\n * Find an highlighted attribute given an `attribute` and an `highlightProperty`, parses it,\n * and provided an array of objects with the string value and a boolean if this\n * value is highlighted.\n *\n * In order to use this feature, highlight must be activated in the configuration of\n * the index. The `preTag` and `postTag` attributes are respectively highlightPreTag and\n * highlightPostTag in Algolia configuration.\n *\n * @param {string} preTag - string used to identify the start of an highlighted value\n * @param {string} postTag - string used to identify the end of an highlighted value\n * @param {string} highlightProperty - the property that contains the highlight structure in the results\n * @param {string} attribute - the highlighted attribute to look for\n * @param {object} hit - the actual hit returned by Algolia.\n * @return {object[]} - An array of {value: string, isHighlighted: boolean}.\n */\nexport function parseAlgoliaHit({\n preTag = TAG_PLACEHOLDER.highlightPreTag,\n postTag = TAG_PLACEHOLDER.highlightPostTag,\n highlightProperty,\n attribute,\n hit,\n}) {\n if (!hit) throw new Error('`hit`, the matching record, must be provided');\n\n const highlightObject =\n getPropertyByPath(hit[highlightProperty], attribute) || {};\n\n if (Array.isArray(highlightObject)) {\n return highlightObject.map(item =>\n parseHighlightedAttribute({\n preTag,\n postTag,\n highlightedValue: unescape(item.value),\n })\n );\n }\n\n return parseHighlightedAttribute({\n preTag,\n postTag,\n highlightedValue: unescape(highlightObject.value),\n });\n}\n","<template>\n <span :class=\"suit()\">\n <component\n v-for=\"({ value, isHighlighted }, index) in parsedHighlights\"\n :class=\"[isHighlighted && suit('highlighted')]\"\n :key=\"index\"\n :is=\"isHighlighted ? highlightedTagName : TextNode\"\n >{{ value }}</component>\n </span>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\n },\n };\n\nexport default {\n name: 'AisHighlighter',\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n suit: {\n type: Function,\n required: true,\n },\n highlightProperty: {\n type: String,\n required: true,\n },\n preTag: {\n type: String,\n required: true,\n },\n postTag: {\n type: String,\n required: true,\n },\n },\n data() {\n return { TextNode };\n },\n computed: {\n parsedHighlights() {\n return parseAlgoliaHit({\n attribute: this.attribute,\n hit: this.hit,\n highlightProperty: this.highlightProperty,\n preTag: this.preTag,\n postTag: this.postTag,\n });\n },\n },\n};\n</script>\n","<template>\n <span :class=\"suit()\">\n <component\n v-for=\"({ value, isHighlighted }, index) in parsedHighlights\"\n :class=\"[isHighlighted && suit('highlighted')]\"\n :key=\"index\"\n :is=\"isHighlighted ? highlightedTagName : TextNode\"\n >{{ value }}</component>\n </span>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\n },\n };\n\nexport default {\n name: 'AisHighlighter',\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n suit: {\n type: Function,\n required: true,\n },\n highlightProperty: {\n type: String,\n required: true,\n },\n preTag: {\n type: String,\n required: true,\n },\n postTag: {\n type: String,\n required: true,\n },\n },\n data() {\n return { TextNode };\n },\n computed: {\n parsedHighlights() {\n return parseAlgoliaHit({\n attribute: this.attribute,\n hit: this.hit,\n highlightProperty: this.highlightProperty,\n preTag: this.preTag,\n postTag: this.postTag,\n });\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_highlightResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisHighlight',\n mixins: [createSuitMixin({ name: 'Highlight' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <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=\"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","<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';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\n// wrapped in a dummy function, since indexWidget doesn't render\nconst connectIndex = () => indexWidget;\n\nexport default {\n name: 'AisIndex',\n mixins: [\n createSuitMixin({ name: 'Index' }),\n createWidgetMixin({ 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: renderCompat(function(h) {\n return h('div', {}, getDefaultSlot(this));\n }),\n computed: {\n widgetParams() {\n return {\n indexName: this.indexName,\n indexId: this.indexId,\n };\n },\n },\n};\n","/* 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 { isVue3, version as vueVersion } from './vue-compat';\n\nexport const createInstantSearchComponent = component =>\n _objectSpread(\n {\n mixins: [createSuitMixin({ name: 'InstantSearch' })],\n provide() {\n return {\n $_ais_instantSearchInstance: this.instantSearchInstance,\n };\n },\n watch: {\n searchClient(searchClient) {\n this.instantSearchInstance.helper.setClient(searchClient).search();\n },\n indexName(indexName) {\n this.instantSearchInstance.helper.setIndex(indexName).search();\n },\n stalledSearchDelay(stalledSearchDelay) {\n // private InstantSearch.js API:\n this.instantSearchInstance._stalledSearchDelay = stalledSearchDelay;\n },\n routing() {\n throw new Error(\n 'routing configuration can not be changed dynamically at this point.' +\n '\\n\\n' +\n 'Please open a new issue: https://github.com/algolia/vue-instantsearch/issues/new?template=feature.md'\n );\n },\n searchFunction(searchFunction) {\n // private InstantSearch.js API:\n this.instantSearchInstance._searchFunction = searchFunction;\n },\n middlewares: {\n immediate: true,\n handler(next, prev) {\n (prev || [])\n .filter(middleware => (next || []).indexOf(middleware) === -1)\n .forEach(middlewareToRemove => {\n this.instantSearchInstance.unuse(middlewareToRemove);\n });\n\n (next || [])\n .filter(middleware => (prev || []).indexOf(middleware) === -1)\n .forEach(middlewareToAdd => {\n this.instantSearchInstance.use(middlewareToAdd);\n });\n },\n },\n },\n created() {\n const searchClient = this.instantSearchInstance.client;\n if (typeof searchClient.addAlgoliaAgent === 'function') {\n searchClient.addAlgoliaAgent(`Vue (${vueVersion})`);\n searchClient.addAlgoliaAgent(`Vue InstantSearch (${version})`);\n }\n },\n mounted() {\n // from the documentation: https://vuejs.org/v2/api/#mounted\n // \"Note that mounted does not guarantee that all child components have also been mounted. If you want to\n // wait until the entire view has been rendered, you can use vm.$nextTick inside of mounted\"\n this.$nextTick(() => {\n if (!this.instantSearchInstance.started) {\n this.instantSearchInstance.start();\n }\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.instantSearchInstance.started) {\n this.instantSearchInstance.dispose();\n }\n\n // a hydrated instance will no longer be hydrated once disposed, and starts from scratch\n this.instantSearchInstance.__initialSearchResults = undefined;\n },\n },\n component\n );\n","import instantsearch from 'instantsearch.js/es';\nimport { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { warn } from '../util/warn';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nconst oldApiWarning = `Vue InstantSearch: You used the prop api-key or app-id.\nThese have been replaced by search-client.\n\nSee more info here: https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-search-client`;\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearch',\n props: {\n searchClient: {\n type: Object,\n required: true,\n },\n insightsClient: {\n type: Function,\n default: undefined,\n },\n indexName: {\n type: String,\n required: true,\n },\n routing: {\n default: undefined,\n validator(value) {\n if (\n typeof value === 'boolean' ||\n (!value.router && !value.stateMapping)\n ) {\n warn(\n 'The `routing` option expects an object with `router` and/or `stateMapping`.\\n\\nSee https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-routing'\n );\n return false;\n }\n return true;\n },\n },\n stalledSearchDelay: {\n type: Number,\n default: undefined,\n },\n searchFunction: {\n type: Function,\n default: undefined,\n },\n initialUiState: {\n type: Object,\n default: undefined,\n },\n apiKey: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n appId: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n middlewares: {\n type: Array,\n default: null,\n },\n },\n data() {\n return {\n instantSearchInstance: instantsearch({\n searchClient: this.searchClient,\n insightsClient: this.insightsClient,\n indexName: this.indexName,\n routing: this.routing,\n stalledSearchDelay: this.stalledSearchDelay,\n searchFunction: this.searchFunction,\n initialUiState: this.initialUiState,\n }),\n };\n },\n render: renderCompat(function(h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: false,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","import { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearchSsr',\n inject: {\n $_ais_ssrInstantSearchInstance: {\n default() {\n throw new Error('`createServerRootMixin` is required when using SSR.');\n },\n },\n },\n data() {\n return {\n instantSearchInstance: this.$_ais_ssrInstantSearchInstance,\n };\n },\n render: renderCompat(function(h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: true,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n\n <slot\n v-if=\"showPrevious\"\n name=\"loadPrevious\"\n :refine-previous=\"refinePrevious\"\n :page=\"state.results.page\"\n :is-first-page=\"state.isFirstPage\"\n >\n <button\n :class=\"[suit('loadPrevious'), state.isFirstPage && suit('loadPrevious', 'disabled')]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >Show previous results</button>\n </slot>\n\n <slot\n :items=\"items\"\n :results=\"state.results\"\n :is-last-page=\"state.isLastPage\"\n :refine-previous=\"refinePrevious\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, index) in items\"\n :class=\"suit('item')\"\n :key=\"item.objectID\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ index }}</slot>\n </li>\n </ol>\n\n <slot\n name=\"loadMore\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :page=\"state.results.page\"\n :is-last-page=\"state.isLastPage\"\n >\n <button\n :class=\"[suit('loadMore'), state.isLastPage && suit('loadMore', 'disabled')]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >Show more results</button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisInfiniteHits',\n mixins: [\n createWidgetMixin({ 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()\"\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 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 :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(), !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 emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\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 emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div\n v-if=\"getSlot('header')\"\n :class=\"suit('header')\"\n >\n <slot\n name=\"header\"\n :has-refinements=\"canRefine\"\n />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div\n v-if=\"getSlot('footer')\"\n :class=\"suit('footer')\"\n >\n <slot\n name=\"footer\"\n :has-refinements=\"canRefine\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div\n v-if=\"getSlot('header')\"\n :class=\"suit('header')\"\n >\n <slot\n name=\"header\"\n :has-refinements=\"canRefine\"\n />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div\n v-if=\"getSlot('footer')\"\n :class=\"suit('footer')\"\n >\n <slot\n name=\"footer\"\n :has-refinements=\"canRefine\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\">\n <a\n :class=\"suit('link')\"\n :href=\"algoliaUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"search by Algolia\"\n >\n <svg\n style=\"height: 1.2em; width: auto\"\n :class=\"[suit('logo'), suit('', theme)]\"\n viewBox=\"0 0 168 24\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5D6494'\"\n d=\"M6.97 6.68V8.3a4.47 4.47 0 0 0-2.42-.67 2.2 2.2 0 0 0-1.38.4c-.34.26-.5.6-.5 1.02 0 .43.16.77.49 1.03.33.25.83.53 1.51.83a7.04 7.04 0 0 1 1.9 1.08c.34.24.58.54.73.89.15.34.23.74.23 1.18 0 .95-.33 1.7-1 2.24a4 4 0 0 1-2.6.81 5.71 5.71 0 0 1-2.94-.68v-1.71c.84.63 1.81.94 2.92.94.58 0 1.05-.14 1.39-.4.34-.28.5-.65.5-1.13 0-.29-.1-.55-.3-.8a2.2 2.2 0 0 0-.65-.53 23.03 23.03 0 0 0-1.64-.78 13.67 13.67 0 0 1-1.11-.64c-.12-.1-.28-.22-.46-.4a1.72 1.72 0 0 1-.39-.5 4.46 4.46 0 0 1-.22-.6c-.07-.23-.1-.48-.1-.75 0-.91.33-1.63 1-2.17a4 4 0 0 1 2.57-.8c.97 0 1.8.18 2.47.52zm7.47 5.7v-.3a2.26 2.26 0 0 0-.5-1.44c-.3-.35-.74-.53-1.32-.53-.53 0-.99.2-1.37.58-.38.39-.62.95-.72 1.68h3.91zm1 2.79v1.4c-.6.34-1.38.51-2.36.51a4.02 4.02 0 0 1-3-1.13 4.04 4.04 0 0 1-1.11-2.97c0-1.3.34-2.32 1.02-3.06a3.38 3.38 0 0 1 2.6-1.1c1.03 0 1.85.32 2.46.96.6.64.9 1.57.9 2.78 0 .33-.03.68-.09 1.04h-5.31c.1.7.4 1.24.89 1.61.49.38 1.1.56 1.85.56.86 0 1.58-.2 2.15-.6zm6.61-1.78h-1.21c-.6 0-1.05.12-1.35.36-.3.23-.46.53-.46.89 0 .37.12.66.36.88.23.2.57.32 1.02.32.5 0 .9-.15 1.2-.43.3-.28.44-.65.44-1.1v-.92zm-4.07-2.55V9.33a4.96 4.96 0 0 1 2.5-.55c2.1 0 3.17 1.03 3.17 3.08V17H22.1v-.96c-.42.68-1.15 1.02-2.19 1.02-.76 0-1.38-.22-1.84-.66-.46-.44-.7-1-.7-1.68 0-.78.3-1.38.88-1.81.59-.43 1.4-.65 2.46-.65h1.34v-.46c0-.55-.13-.97-.4-1.25-.26-.29-.7-.43-1.32-.43-.86 0-1.65.24-2.35.72zm9.34-1.93v1.42c.39-1 1.1-1.5 2.12-1.5.15 0 .31.02.5.05v1.53c-.23-.1-.48-.14-.76-.14-.54 0-.99.24-1.34.71a2.8 2.8 0 0 0-.52 1.71V17h-1.57V8.91h1.57zm5 4.09a3 3 0 0 0 .76 2.01c.47.53 1.14.8 2 .8.64 0 1.24-.18 1.8-.53v1.4c-.53.32-1.2.48-2 .48a3.98 3.98 0 0 1-4.17-4.18c0-1.16.38-2.15 1.14-2.98a4 4 0 0 1 3.1-1.23c.7 0 1.34.15 1.92.44v1.44a3.24 3.24 0 0 0-1.77-.5A2.65 2.65 0 0 0 32.33 13zm7.92-7.28v4.58c.46-1 1.3-1.5 2.5-1.5.8 0 1.42.24 1.9.73.48.5.72 1.17.72 2.05V17H43.8v-5.1c0-.56-.14-.99-.43-1.29-.28-.3-.65-.45-1.1-.45-.54 0-1 .2-1.42.6-.4.4-.61 1.02-.61 1.85V17h-1.56V5.72h1.56zM55.2 15.74c.6 0 1.1-.25 1.5-.76.4-.5.6-1.16.6-1.95 0-.92-.2-1.62-.6-2.12-.4-.5-.92-.74-1.55-.74-.56 0-1.05.22-1.5.67-.44.45-.66 1.13-.66 2.06 0 .96.22 1.67.64 2.14.43.47.95.7 1.57.7zM53 5.72v4.42a2.74 2.74 0 0 1 2.43-1.34c1.03 0 1.86.38 2.51 1.15.65.76.97 1.78.97 3.05 0 1.13-.3 2.1-.92 2.9-.62.81-1.47 1.21-2.54 1.21s-1.9-.45-2.46-1.34V17h-1.58V5.72H53zm9.9 11.1l-3.22-7.9h1.74l1 2.62 1.26 3.42c.1-.32.48-1.46 1.15-3.42l.91-2.63h1.66l-2.92 7.87c-.78 2.07-1.96 3.1-3.56 3.1-.28 0-.53-.02-.73-.07v-1.34c.17.04.35.06.54.06 1.03 0 1.76-.57 2.17-1.7z\"\n />\n <path\n fill=\"#5468FF\"\n d=\"M78.99.94h16.6a2.97 2.97 0 0 1 2.96 2.96v16.6a2.97 2.97 0 0 1-2.97 2.96h-16.6a2.97 2.97 0 0 1-2.96-2.96V3.9A2.96 2.96 0 0 1 79 .94\"\n />\n <path\n fill=\"#FFF\"\n d=\"M89.63 5.97v-.78a.98.98 0 0 0-.98-.97h-2.28a.98.98 0 0 0-.97.97V6c0 .09.08.15.17.13a7.13 7.13 0 0 1 3.9-.02c.08.02.16-.04.16-.13m-6.25 1L83 6.6a.98.98 0 0 0-1.38 0l-.46.46a.97.97 0 0 0 0 1.38l.38.39c.06.06.15.04.2-.02a7.49 7.49 0 0 1 1.63-1.62c.07-.04.08-.14.02-.2m4.16 2.45v3.34c0 .1.1.17.2.12l2.97-1.54c.06-.03.08-.12.05-.18a3.7 3.7 0 0 0-3.08-1.87c-.07 0-.14.06-.14.13m0 8.05a4.49 4.49 0 1 1 0-8.98 4.49 4.49 0 0 1 0 8.98m0-10.85a6.37 6.37 0 1 0 0 12.74 6.37 6.37 0 0 0 0-12.74\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5468FF'\"\n d=\"M120.92 18.8c-4.38.02-4.38-3.54-4.38-4.1V1.36l2.67-.42v13.25c0 .32 0 2.36 1.71 2.37v2.24zm-10.84-2.18c.82 0 1.43-.04 1.85-.12v-2.72a5.48 5.48 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.11-.44.28-.58.49a.93.93 0 0 0-.22.65c0 .63.22 1 .61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.62.11 2.23.33.6.22 1.09.53 1.44.92.36.4.61.92.76 1.48.16.56.23 1.17.23 1.85v6.87c-.4.1-1.03.2-1.86.32-.84.12-1.78.18-2.82.18-.69 0-1.32-.07-1.9-.2a4 4 0 0 1-1.46-.63c-.4-.3-.72-.67-.96-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.39-1.53.26-.45.6-.82 1.04-1.1.45-.3.95-.5 1.54-.62a8.8 8.8 0 0 1 3.79.05v-.44c0-.3-.04-.6-.11-.87a1.78 1.78 0 0 0-1.1-1.22c-.31-.12-.7-.2-1.15-.2a9.75 9.75 0 0 0-2.95.46l-.33-2.19c.34-.12.84-.23 1.48-.35.65-.12 1.34-.18 2.08-.18zm52.84 9.63c.82 0 1.43-.05 1.85-.13V13.7a5.42 5.42 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.12-.44.28-.58.5a.93.93 0 0 0-.22.65c0 .63.22.99.61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.63.11 2.23.33.6.22 1.1.53 1.45.92.35.39.6.92.76 1.48.15.56.23 1.18.23 1.85v6.88c-.41.08-1.03.19-1.87.31-.83.12-1.77.18-2.81.18-.7 0-1.33-.06-1.9-.2a4 4 0 0 1-1.47-.63c-.4-.3-.72-.67-.95-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.38-1.53.26-.45.61-.82 1.05-1.1.44-.3.95-.5 1.53-.62a8.8 8.8 0 0 1 3.8.05v-.43c0-.31-.04-.6-.12-.88-.07-.28-.2-.52-.38-.73a1.78 1.78 0 0 0-.73-.5c-.3-.1-.68-.2-1.14-.2a9.85 9.85 0 0 0-2.95.47l-.32-2.19a11.63 11.63 0 0 1 3.55-.53zm-8.03-1.27a1.62 1.62 0 0 0 0-3.24 1.62 1.62 0 1 0 0 3.24zm1.35 13.22h-2.7V7.27l2.7-.42V18.8zm-4.72 0c-4.38.02-4.38-3.54-4.38-4.1l-.01-13.34 2.67-.42v13.25c0 .32 0 2.36 1.72 2.37v2.24zm-8.7-5.9a4.7 4.7 0 0 0-.74-2.79 2.4 2.4 0 0 0-2.07-1 2.4 2.4 0 0 0-2.06 1 4.7 4.7 0 0 0-.74 2.8c0 1.16.25 1.94.74 2.62a2.4 2.4 0 0 0 2.07 1.02c.88 0 1.57-.34 2.07-1.02.49-.68.73-1.46.73-2.63zm2.74 0a6.46 6.46 0 0 1-1.52 4.23c-.49.53-1.07.94-1.76 1.22-.68.29-1.73.45-2.26.45-.53 0-1.58-.15-2.25-.45a5.1 5.1 0 0 1-2.88-3.13 7.3 7.3 0 0 1-.01-4.84 5.13 5.13 0 0 1 2.9-3.1 5.67 5.67 0 0 1 2.22-.42c.81 0 1.56.14 2.24.42.69.29 1.28.69 1.75 1.22.49.52.87 1.15 1.14 1.89a7 7 0 0 1 .43 2.5zm-20.14 0c0 1.11.25 2.36.74 2.88.5.52 1.13.78 1.91.78a4.07 4.07 0 0 0 2.12-.6V9.33c-.19-.04-.99-.2-1.76-.23a2.67 2.67 0 0 0-2.23 1 4.73 4.73 0 0 0-.78 2.8zm7.44 5.27c0 1.82-.46 3.16-1.4 4-.94.85-2.37 1.27-4.3 1.27-.7 0-2.17-.13-3.34-.4l.43-2.11c.98.2 2.27.26 2.95.26 1.08 0 1.84-.22 2.3-.66.46-.43.68-1.08.68-1.94v-.44a5.2 5.2 0 0 1-2.54.6 5.6 5.6 0 0 1-2.01-.36 4.2 4.2 0 0 1-2.58-2.71 9.88 9.88 0 0 1 .02-5.35 4.92 4.92 0 0 1 2.93-2.96 6.6 6.6 0 0 1 2.43-.46 19.64 19.64 0 0 1 4.43.66v10.6z\"\n />\n </svg>\n </a>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPoweredBy',\n mixins: [createSuitMixin({ name: 'PoweredBy' })],\n props: {\n theme: {\n default: 'light',\n validator(value) {\n return ['light', 'dark'].indexOf(value) !== -1;\n },\n },\n },\n computed: {\n algoliaUrl() {\n return (\n 'https://www.algolia.com/?' +\n 'utm_source=vue-instantsearch&' +\n 'utm_medium=website&' +\n `utm_content=${location ? location.hostname : ''}&` +\n 'utm_campaign=poweredby'\n );\n },\n },\n};\n</script>\n","<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()\"\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 default: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n 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(), !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 default: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n 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\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin({ 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 <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\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin({ 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 in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n required\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"$emit('input', $event.target.value); $emit('update:modelValue', $event.target.value)\"\n ref=\"input\"\n >\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"(!value && !modelValue) || (showLoadingIndicator && shouldShowLoadingIndicator)\"\n >\n <slot name=\"reset-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n role=\"img\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n transform=\"translate(1 1)\"\n stroke-width=\"2\"\n >\n <circle\n stroke-opacity=\".5\"\n cx=\"18\"\n cy=\"18\"\n r=\"18\"\n />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <form\n action=\"\"\n role=\"search\"\n novalidate\n :class=\"suit('form')\"\n @submit.prevent=\"onFormSubmit\"\n @reset.prevent=\"onFormReset\"\n >\n <!-- :value/@input allows us to pass v-model to the component in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n required\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"$emit('input', $event.target.value); $emit('update:modelValue', $event.target.value)\"\n ref=\"input\"\n >\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"(!value && !modelValue) || (showLoadingIndicator && shouldShowLoadingIndicator)\"\n >\n <slot name=\"reset-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n role=\"img\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n transform=\"translate(1 1)\"\n stroke-width=\"2\"\n >\n <circle\n stroke-opacity=\".5\"\n cx=\"18\"\n cy=\"18\"\n r=\"18\"\n />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[\n suit(),\n !state.canRefine && suit('','noRefinement')\n ]\"\n v-if=\"state\"\n >\n <slot\n :items=\"items\"\n :refine=\"refine\"\n :search-for-items=\"state.searchForItems\"\n :search-for-items-query=\"searchForFacetValuesQuery\"\n :toggle-show-more=\"toggleShowMore\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :createURL=\"state.createURL\"\n :is-from-search=\"state.isFromSearch\"\n :can-refine=\"state.canRefine\"\n :send-event=\"state.sendEvent\"\n >\n <div\n :class=\"suit('searchBox')\"\n v-if=\"searchable\"\n >\n <search-input\n v-model=\"searchForFacetValues\"\n :placeholder=\"searchablePlaceholder\"\n :class-names=\"classNames\"\n />\n </div>\n <slot\n name=\"noResults\"\n :query=\"searchForFacetValues\"\n v-if=\"state.isFromSearch && items.length === 0\"\n >\n <div :class=\"suit('noResults')\">No results.</div>\n </slot>\n <ul :class=\"suit('list')\">\n <li\n :class=\"[\n suit('item'), item.isRefined && suit('item', 'selected')]\"\n v-for=\"item in items\"\n :key=\"item.value\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"refine(item.value)\"\n >\n <span\n v-if=\"searchable\"\n :class=\"suit('labelText')\"\n >\n <ais-highlight\n attribute=\"item\"\n :hit=\"item\"\n />\n </span>\n <span\n v-else\n :class=\"suit('labelText')\"\n >{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </label>\n </slot>\n </li>\n </ul>\n <button\n :class=\"[\n suit('showMore'),\n {\n [suit('showMore', 'disabled')]: !state.canToggleShowMore,\n }\n ]\"\n @click=\"toggleShowMore\"\n v-if=\"showMore\"\n :disabled=\"!state.canToggleShowMore\"\n >\n <slot\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >Show {{ state.isShowingMore ? 'less' : 'more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\nimport SearchInput from './SearchInput.vue';\nimport AisHighlight from './Highlight.vue';\n\nconst noop = () => {};\n\nexport default {\n name: 'AisRefinementList',\n components: { SearchInput, AisHighlight },\n mixins: [\n createSuitMixin({ name: 'RefinementList' }),\n createWidgetMixin({ 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","<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:\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 :class=\"suit()\"\n v-if=\"state && state.state && state.results\"\n >\n <slot v-bind=\"stateResults\">\n <p>\n Use this component to have a different layout based on a certain state.\n </p>\n <p>\n Fill in the slot, and get access to the following things:\n </p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</pre>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport connectStateResults from '../connectors/connectStateResults';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin({ 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 <template\n v-slot:loading-indicator\n v-if=\"isVue3\"\n >\n <slot\n name=\"loading-indicator\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n\n <template\n v-slot:submit-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"submit-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n\n <template\n v-slot:reset-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"reset-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"reset-icon\"\n slot=\"reset-icon\"\n />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin({ 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 modelValue: {\n type: String,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <div\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 <template\n v-slot:loading-indicator\n v-if=\"isVue3\"\n >\n <slot\n name=\"loading-indicator\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n\n <template\n v-slot:submit-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"submit-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n\n <template\n v-slot:reset-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"reset-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"reset-icon\"\n slot=\"reset-icon\"\n />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin({ 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 modelValue: {\n type: String,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_snippetResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisSnippet',\n mixins: [createSuitMixin({ name: 'Snippet' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <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 :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()\"\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(), !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\"\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","<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 { connectDynamicWidgets } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3, renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nfunction getWidgetAttribute(vnode) {\n const props = isVue3\n ? vnode.props\n : vnode.componentOptions && vnode.componentOptions.propsData;\n if (props) {\n if (props.attribute) {\n return props.attribute;\n }\n if (Array.isArray(props.attributes)) {\n return props.attributes[0];\n }\n }\n\n let children;\n if (isVue3) {\n children =\n vnode.children && vnode.children.default && vnode.children.default();\n } else {\n children =\n vnode.componentOptions && vnode.componentOptions.children\n ? vnode.componentOptions.children\n : vnode.children;\n }\n\n if (Array.isArray(children)) {\n // return first child with a truthy attribute\n return children.reduce(\n (acc, curr) => acc || getWidgetAttribute(curr),\n undefined\n );\n }\n\n return undefined;\n}\n\nexport default {\n name: 'AisDynamicWidgets',\n mixins: [\n createWidgetMixin({ connector: connectDynamicWidgets }),\n createSuitMixin({ name: 'DynamicWidgets' }),\n ],\n props: {\n transformItems: {\n type: Function,\n default: undefined,\n },\n facets: {\n type: Array,\n default: undefined,\n },\n maxValuesPerFacet: {\n type: Number,\n default: undefined,\n },\n },\n render: renderCompat(function(h) {\n const components = new Map();\n\n (getDefaultSlot(this) || []).forEach(vnode => {\n const attribute = getWidgetAttribute(vnode);\n if (attribute) {\n components.set(\n attribute,\n h('div', { key: attribute, class: [this.suit('widget')] }, [vnode])\n );\n }\n });\n\n // by default, render everything, but hidden so that the routing doesn't disappear\n if (!this.state) {\n const allComponents = [];\n components.forEach(component => allComponents.push(component));\n\n return h(\n 'div',\n _objectSpread(\n {\n class: [this.suit()],\n },\n { attrs: { hidden: true } }\n ),\n allComponents\n );\n }\n\n return h(\n 'div',\n { class: [this.suit()] },\n this.state.attributesToRender.map(attribute => components.get(attribute))\n );\n }),\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n facets: this.facets,\n maxValuesPerFacet: this.maxValuesPerFacet,\n // we do not pass \"widgets\" to the connector, since Vue is in charge of rendering\n widgets: [],\n };\n },\n },\n};\n","import AisDynamicWidgets from './DynamicWidgets';\nimport { warn } from '../util/warn';\n\n// @MAJOR remove this file\nexport default Object.assign({}, AisDynamicWidgets, {\n name: 'AisExperimentalDynamicWidgets',\n mounted() {\n warn('Use AisDynamicWidgets instead of AisExperimentalDynamicWidgets.');\n },\n});\n","/* eslint import/namespace: ['error', { allowComputed: true }]*/\n\nimport * as widgets from './widgets';\n\nexport const plugin = {\n install(localVue) {\n Object.keys(widgets).forEach(widgetName => {\n localVue.component(widgets[widgetName].name, widgets[widgetName]);\n });\n },\n};\n","import instantsearch from 'instantsearch.js/es';\nimport { isVue3, isVue2, Vue2, createSSRApp } from './vue-compat';\nimport { warn } from './warn';\n\nfunction walkIndex(indexWidget, visit) {\n visit(indexWidget);\n\n return indexWidget.getWidgets().forEach(widget => {\n if (widget.$$type !== 'ais.index') return;\n visit(widget);\n walkIndex(widget, visit);\n });\n}\n\nfunction searchOnlyWithDerivedHelpers(helper) {\n return new Promise((resolve, reject) => {\n helper.searchOnlyWithDerivedHelpers();\n\n // we assume all derived helpers resolve at least in the same tick\n helper.derivedHelpers[0].on('result', () => {\n resolve();\n });\n\n helper.derivedHelpers.forEach(derivedHelper =>\n derivedHelper.on('error', e => {\n reject(e);\n })\n );\n });\n}\n\nfunction defaultCloneComponent(componentInstance, { mixins = [] } = {}) {\n const options = {\n serverPrefetch: undefined,\n fetch: undefined,\n _base: undefined,\n name: 'ais-ssr-root-component',\n };\n\n let app;\n\n if (isVue3) {\n const appOptions = Object.assign({}, componentInstance.$options, options);\n appOptions.mixins = [...mixins, ...appOptions.mixins];\n app = createSSRApp(appOptions);\n if (componentInstance.$router) {\n app.use(componentInstance.$router);\n }\n if (componentInstance.$store) {\n app.use(componentInstance.$store);\n }\n } else {\n // copy over global Vue APIs\n options.router = componentInstance.$router;\n options.store = componentInstance.$store;\n\n const Extended = componentInstance.$vnode\n ? componentInstance.$vnode.componentOptions.Ctor.extend(options)\n : Vue2.component(\n options.name,\n Object.assign({}, componentInstance.$options, options)\n );\n\n app = new Extended({\n propsData: componentInstance.$options.propsData,\n mixins: [...mixins],\n });\n }\n\n // https://stackoverflow.com/a/48195006/3185307\n app.$slots = componentInstance.$slots;\n app.$root = componentInstance.$root;\n if (isVue2) {\n app.$options.serverPrefetch = [];\n }\n\n return app;\n}\n\nfunction augmentInstantSearch(instantSearchOptions, cloneComponent) {\n const search = instantsearch(instantSearchOptions);\n\n let initialResults;\n\n /**\n * main API for SSR, called in serverPrefetch of a root component which contains instantsearch\n * @param {Object} props the object including `component` and `renderToString`\n * @param {Object} props.component the calling component's `this`\n * @param {Function} props.renderToString the function to render componentInstance to string\n * @returns {Promise} result of the search, to save for .hydrate\n */\n search.findResultsState = function({ component, renderToString }) {\n if (!renderToString) {\n throw new Error(\n 'findResultsState requires `renderToString: (component) => Promise<string>` in the first argument.'\n );\n }\n\n let app;\n let instance;\n\n return Promise.resolve()\n .then(() => {\n app = cloneComponent(component, {\n mixins: [\n {\n beforeCreate() {\n if (component.$nuxt) {\n // In case of Nuxt (3), we ensure the context is shared between\n // the real and cloned component\n this.$nuxt = component.$nuxt;\n }\n },\n created() {\n instance = this.instantsearch;\n\n instance.start();\n // although we use start for initializing the main index,\n // we don't want to send search requests yet\n instance.started = false;\n },\n },\n ],\n });\n })\n .then(() => renderToString(app))\n .then(() => searchOnlyWithDerivedHelpers(instance.mainHelper))\n .then(() => {\n initialResults = {};\n walkIndex(instance.mainIndex, widget => {\n const { _state, _rawResults } = widget.getResults();\n\n initialResults[widget.getIndexId()] = {\n // copy just the values of SearchParameters, not the functions\n state: Object.keys(_state).reduce((acc, key) => {\n // eslint-disable-next-line no-param-reassign\n acc[key] = _state[key];\n return acc;\n }, {}),\n results: _rawResults,\n };\n });\n\n search.hydrate(initialResults);\n return search.getState();\n });\n };\n\n /**\n * @returns {Promise} result state to serialize and enter into .hydrate\n */\n search.getState = function() {\n if (!initialResults) {\n throw new Error('You need to wait for findResultsState to finish');\n }\n return initialResults;\n };\n\n /**\n * make sure correct data is available in each widget's state.\n * called in widget mixin with (this.widget, this)\n *\n * @param {object} widget The widget instance\n * @param {object} parent The local parent index\n * @returns {void}\n */\n search.__forceRender = function(widget, parent) {\n const results = parent.getResults();\n\n // this happens when a different InstantSearch gets rendered initially,\n // after the hydrate finished. There's thus no initial results available.\n if (results === null) {\n return;\n }\n\n const state = results._state;\n\n const localHelper = parent.getHelper();\n // helper gets created in init, but that means it doesn't get the injected\n // parameters, because those are from the lastResults\n localHelper.state = state;\n\n widget.render({\n helper: localHelper,\n results,\n scopedResults: parent.getScopedResults(),\n parent,\n state,\n templatesConfig: {},\n createURL: parent.createURL,\n instantSearchInstance: search,\n searchMetadata: {\n isSearchStalled: false,\n },\n });\n };\n\n /**\n * Called both in server\n * @param {object} results a map of indexId: SearchResults\n * @returns {void}\n */\n search.hydrate = function(results) {\n if (!results) {\n warn(\n 'The result of `findResultsState()` needs to be passed to `hydrate()`.'\n );\n return;\n }\n\n search._initialResults = results;\n\n search.start();\n search.started = false;\n };\n return search;\n}\n\nexport function createServerRootMixin(instantSearchOptions = {}) {\n const { $cloneComponent = defaultCloneComponent } = instantSearchOptions;\n\n const search = augmentInstantSearch(instantSearchOptions, $cloneComponent);\n\n // put this in the user's root Vue instance\n // we can then reuse that InstantSearch instance seamlessly from `ais-instant-search-ssr`\n const rootMixin = {\n provide() {\n return {\n $_ais_ssrInstantSearchInstance: this.instantsearch,\n };\n },\n data() {\n return {\n // this is in data, so that the real & cloned render do not share\n // the same instantsearch instance.\n instantsearch: search,\n };\n },\n };\n\n return rootMixin;\n}\n"],"names":["suit","widgetName","element","modifier","Error","const","elements","push","join","createSuitMixin","ref","props","classNames","type","Object","default","undefined","methods","className","name","userClassName","this","isVue2","isVue3","renderCompat","fn","h","tag","children","attrs","flatProps","assign","Vue.h","call","getDefaultSlot","component","$slots","cache","Set","warn","message","has","add","console","createWidgetMixin","inject","instantSearchInstance","from","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","_initialResults","started","__forceRender","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","mixins","connectAutocomplete","escapeHTML","Boolean","required","computed","_createVNode","_ctx","_createBlock","class","_renderSlot","refine","currentRefinement","indices","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","mitt","provide","canRefine","on","value","updateCanRefine","all","clear","createPanelConsumerMixin","emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","isLastItem","index","items","length","createURL","href","onClick","item","key","label","aria-hidden","connectClearRefinements","hasRefinements","excludedAttributes","includedAttributes","disabled","inheritAttrs","connectConfigure","searchParameters","$attrs","render","slot","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","capitalize","toString","charAt","toLocaleUpperCase","slice","refinements","refinement","level","Number","$props","count","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","canToggleShowMore","isShowingMore","toggleShowMore","sendEvent","htmlUnescapes","&amp;","&lt;","&gt;","&quot;","&#39;","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","TextNode","context","slots","highlightedTagName","parsedHighlights","$data","AisHighlighter","highlighted-tag-name","highlight-property","pre-tag","post-tag","connectHitsWithInsights","hits","insights","itemIndex","objectID","connectHitsPerPage","hasNoResults","selected","find","handleChange","onChange","connectIndex","indexWidget","$_ais_getParentIndex","indexName","indexId","_objectSpread","target","i","arguments","ownKeys","keys","getOwnPropertySymbols","concat","filter","sym","getOwnPropertyDescriptor","enumerable","_defineProperty","obj","defineProperty","configurable","writable","createInstantSearchComponent","$_ais_instantSearchInstance","searchClient","helper","setClient","search","setIndex","stalledSearchDelay","_stalledSearchDelay","routing","searchFunction","_searchFunction","middlewares","next","prev","middleware","indexOf","middlewareToRemove","unuse","middlewareToAdd","use","client","addAlgoliaAgent","vueVersion","version","mounted","$nextTick","start","dispose","__initialSearchResults","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","page","results","isFirstPage","isLastPage","connectMenu","showShowMoreButton","isRefined","$event","currentTarget","connectNumericMenu","checked","connectPagination","nbPages","padding","totalPages","showFirst","showLast","showNext","emits","p","Math","min","max","$emit","nbHits","pages","aria-label","getSlot","theme","algoliaUrl","location","hostname","fill","d","rel","style","viewBox","connectQueryRules","trackedFilters","transformRuleContexts","range","connectRange","precision","minInput","maxInput","updated","step","pow","values","minValue","Infinity","minRange","maxValue","maxRange","pick","first","second","onSubmit","placeholder","connectRatingMenu","xmlns","id","xlink:href","stars","full","n","width","height","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","submitTitle","resetTitle","modelValue","query","onFormSubmit","$refs","input","blur","onFormReset","fillRule","fill-rule","transform","stroke-width","stroke-opacity","cx","cy","r","attributeName","to","dur","repeatCount","action","role","novalidate","onReset","_createCommentVNode","autocorrect","autocapitalize","autocomplete","spellcheck","maxlength","onFocus","onBlur","onInput","title","hidden","stroke","noop","SearchInput","AisHighlight","connectRefinementList","searchable","searchablePlaceholder","operator","searchForFacetValuesQuery","searchForFacetValues","get","set","searchForItems","_highlightResult","highlighted","escapeFacetValues","searchForItemsQuery","isFromSearch","class-names","connectStateResults","renderFn","unmountFn","init","resultsCopy","stateCopy","stateResults","connectSearchBox","localValue","isControlled","model","val","isSearchStalled","show-loading-indicator","should-show-loading-indicator","submit-title","reset-title","connectSortBy","options","connectStats","_mergeProps","lastResults","_Fragment","nbSortedHits","toLocaleString","processingTimeMS","connectToggleRefinement","off","connectVoiceSearch","searchAsYouSpeak","buttonTitle","disabledButtonTitle","buttonSvgAttrs","strokeWidth","strokeLinecap","strokeLinejoin","errorNotAllowed","voiceListeningState","status","errorCode","rootSlotProps","isBrowserSupported","isListening","toggleListening","innerSlotProps","transcript","isSpeechFinal","handleClick","event","x1","y1","x2","y2","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","connectRelevantSort","isRelevantSorted","isVirtualReplica","getWidgetAttribute","vnode","reduce","acc","curr","connectDynamicWidgets","facets","maxValuesPerFacet","Map","allComponents","attributesToRender","widgets","AisDynamicWidgets","plugin","install","localVue","walkIndex","visit","getWidgets","$$type","searchOnlyWithDerivedHelpers","Promise","resolve","reject","derivedHelpers","derivedHelper","e","defaultCloneComponent","componentInstance","app","serverPrefetch","fetch","_base","appOptions","createSSRApp","$router","$store","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","initialResults","findResultsState","instance","renderToString","then","beforeCreate","$nuxt","mainHelper","getResults","getIndexId","_state","_rawResults","hydrate","getState","parent","localHelper","getHelper","scopedResults","getScopedResults","templatesConfig","searchMetadata","createServerRootMixin","$cloneComponent"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/util/suit.js","../../src/mixins/suit.js","../../src/util/polyfills.js","../../src/util/vue-compat/index-vue3.js","../../src/util/warn.js","../../src/mixins/widget.js","../../src/components/Autocomplete.vue","../../src/components/Autocomplete.vue?vue&type=template&id=e7c95fd0&lang.js","../../src/mixins/panel.js","../../src/components/Breadcrumb.vue","../../src/components/Breadcrumb.vue?vue&type=template&id=6f46de9a&lang.js","../../src/components/ClearRefinements.vue","../../src/components/ClearRefinements.vue?vue&type=template&id=410a3aaa&lang.js","../../src/components/Configure.js","../../src/components/ConfigureRelatedItems.js","../../src/components/CurrentRefinements.vue","../../src/components/CurrentRefinements.vue?vue&type=template&id=4f1917ff&lang.js","../../src/components/HierarchicalMenuList.vue","../../src/components/HierarchicalMenuList.vue?vue&type=template&id=0435b314&lang.js","../../src/components/HierarchicalMenu.vue","../../src/components/HierarchicalMenu.vue?vue&type=template&id=4361a0b8&lang.js","../../src/util/unescape.js","../../src/util/parseAlgoliaHit.js","../../src/components/Highlighter.vue","../../src/components/Highlighter.vue?vue&type=template&id=92153c3e&lang.js","../../src/components/Highlight.vue","../../src/components/Highlight.vue?vue&type=template&id=300b0ab4&lang.js","../../src/components/Hits.vue","../../src/components/Hits.vue?vue&type=template&id=ef242920&lang.js","../../src/components/HitsPerPage.vue","../../src/components/HitsPerPage.vue?vue&type=template&id=74f3ac28&lang.js","../../src/components/Index.js","../../src/util/createInstantSearchComponent.js","../../src/components/InstantSearch.js","../../src/components/InstantSearchSsr.js","../../src/components/InfiniteHits.vue","../../src/components/InfiniteHits.vue?vue&type=template&id=dcfb64b8&lang.js","../../src/components/Menu.vue","../../src/components/Menu.vue?vue&type=template&id=9bcc0be2&lang.js","../../src/components/MenuSelect.vue","../../src/components/MenuSelect.vue?vue&type=template&id=694477eb&lang.js","../../src/components/NumericMenu.vue","../../src/components/NumericMenu.vue?vue&type=template&id=160fae0c&lang.js","../../src/components/Pagination.vue","../../src/components/Pagination.vue?vue&type=template&id=849a166c&lang.js","../../src/components/Panel.vue","../../src/components/Panel.vue?vue&type=template&id=d32d57f8&lang.js","../../src/components/PoweredBy.vue","../../src/components/PoweredBy.vue?vue&type=template&id=3e8d7a5b&lang.js","../../src/components/QueryRuleContext.js","../../src/components/QueryRuleCustomData.vue","../../src/components/QueryRuleCustomData.vue?vue&type=template&id=e4da0782&lang.js","../../src/components/RangeInput.vue","../../src/components/RangeInput.vue?vue&type=template&id=1e17783d&lang.js","../../src/components/RatingMenu.vue","../../src/components/RatingMenu.vue?vue&type=template&id=9254de68&lang.js","../../src/components/SearchInput.vue","../../src/components/SearchInput.vue?vue&type=template&id=2eed8ffc&lang.js","../../src/components/RefinementList.vue","../../src/components/RefinementList.vue?vue&type=template&id=28927239&lang.js","../../src/connectors/connectStateResults.js","../../src/components/StateResults.vue","../../src/components/StateResults.vue?vue&type=template&id=5992f3d5&lang.js","../../src/components/SearchBox.vue","../../src/components/SearchBox.vue?vue&type=template&id=27029d83&lang.js","../../src/components/Snippet.vue","../../src/components/Snippet.vue?vue&type=template&id=eb4966c6&lang.js","../../src/components/SortBy.vue","../../src/components/SortBy.vue?vue&type=template&id=b69b3b76&lang.js","../../src/components/Stats.vue","../../src/components/Stats.vue?vue&type=template&id=7337491f&lang.js","../../src/components/ToggleRefinement.vue","../../src/components/ToggleRefinement.vue?vue&type=template&id=14e4586f&lang.js","../../src/components/VoiceSearch.vue","../../src/components/VoiceSearch.vue?vue&type=template&id=24b0f67a&lang.js","../../src/components/RelevantSort.vue","../../src/components/RelevantSort.vue?vue&type=template&id=257b248b&lang.js","../../src/components/DynamicWidgets.js","../../src/components/ExperimentalDynamicWidgets.js","../../src/plugin.js","../../src/util/createServerRootMixin.js"],"sourcesContent":["/**\n * Create class names like ais-widgetName-element--modifier\n *\n * @param {string} widgetName first part\n * @param {string} element part separated by -\n * @param {string} modifier final part, separated by --\n *\n * @returns {string} the composed class name\n */\nexport default function suit(widgetName, element, modifier) {\n if (!widgetName) {\n throw new Error('You need to provide `widgetName` in your data');\n }\n\n const elements = [`ais-${widgetName}`];\n\n if (element) {\n elements.push(`-${element}`);\n }\n\n if (modifier) {\n elements.push(`--${modifier}`);\n }\n\n return elements.join('');\n}\n","import suit from '../util/suit';\n\nexport const createSuitMixin = ({ name }) => ({\n props: {\n classNames: {\n type: Object,\n default: undefined,\n },\n },\n methods: {\n suit(element, modifier) {\n const className = suit(name, element, modifier);\n const userClassName = this.classNames && this.classNames[className];\n if (userClassName) {\n return [className, userClassName].join(' ');\n }\n return className;\n },\n },\n});\n","/* eslint-disable */\n\n// source: @babel/plugin-proposal-object-rest-spread@7.2.0\n// prettier-ignore\nexport function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\n// source: @babel/plugin-proposal-object-rest-spread@7.2.0\n// prettier-ignore\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n","import * as Vue from 'vue';\n\nconst isVue2 = false;\nconst isVue3 = true;\nconst Vue2 = undefined;\n\nexport { createApp, createSSRApp, h, version, nextTick } from 'vue';\nexport { Vue, Vue2, isVue2, isVue3 };\n\nexport function renderCompat(fn) {\n function h(tag, props, children) {\n if (typeof props === 'object' && (props.attrs || props.props)) {\n // In vue 3, we no longer wrap with `attrs` or `props` key.\n const flatProps = Object.assign({}, props, props.attrs, props.props);\n delete flatProps.attrs;\n delete flatProps.props;\n\n return Vue.h(tag, flatProps, children);\n }\n\n return Vue.h(tag, props, children);\n }\n\n return function() {\n return fn.call(this, h);\n };\n}\n\nexport function getDefaultSlot(component) {\n return component.$slots.default && component.$slots.default();\n}\n","const cache = new Set();\n\nexport function warn(message) {\n if (cache.has(message)) return;\n cache.add(message);\n // eslint-disable-next-line no-console\n console.warn(message);\n}\n","import { _objectSpread } from '../util/polyfills';\nimport { isVue3 } from '../util/vue-compat';\nimport { warn } from '../util/warn';\n\nexport const createWidgetMixin = (\n { connector } = {},\n additionalProperties = {}\n) => ({\n inject: {\n instantSearchInstance: {\n from: '$_ais_instantSearchInstance',\n default() {\n const tag = this.$options._componentTag;\n throw new TypeError(\n `It looks like you forgot to wrap your Algolia search component \"<${tag}>\" inside of an \"<ais-instant-search>\" component.`\n );\n },\n },\n getParentIndex: {\n from: '$_ais_getParentIndex',\n default() {\n return () => this.instantSearchInstance.mainIndex;\n },\n },\n },\n data() {\n return {\n state: null,\n };\n },\n created() {\n if (typeof connector === 'function') {\n this.factory = connector(this.updateState, () => {});\n this.widget = _objectSpread(\n this.factory(this.widgetParams),\n additionalProperties\n );\n this.getParentIndex().addWidgets([this.widget]);\n\n if (\n this.instantSearchInstance._initialResults &&\n !this.instantSearchInstance.started\n ) {\n if (typeof this.instantSearchInstance.__forceRender !== 'function') {\n throw new Error(\n 'You are using server side rendering with <ais-instant-search> instead of <ais-instant-search-ssr>.'\n );\n }\n this.instantSearchInstance.__forceRender(\n this.widget,\n this.getParentIndex()\n );\n }\n } else if (connector !== true) {\n warn(\n `You are using the InstantSearch widget mixin, but didn't provide a connector.\nWhile this is technically possible, and will give you access to the Helper,\nit's not the recommended way of making custom components.\n\nIf you want to disable this message, pass { connector: true } to the mixin.\n\nRead more on using connectors: https://alg.li/vue-custom`\n );\n }\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.widget) {\n this.getParentIndex().removeWidgets([this.widget]);\n }\n },\n watch: {\n widgetParams: {\n handler(nextWidgetParams) {\n this.state = null;\n this.getParentIndex().removeWidgets([this.widget]);\n this.widget = _objectSpread(\n this.factory(nextWidgetParams),\n additionalProperties\n );\n this.getParentIndex().addWidgets([this.widget]);\n },\n deep: true,\n },\n },\n methods: {\n updateState(state = {}, isFirstRender) {\n if (!isFirstRender) {\n // Avoid updating the state on first render\n // otherwise there will be a flash of placeholder data\n this.state = state;\n }\n },\n },\n});\n","<template>\n <div\n :class=\"suit()\"\n v-if=\"state\"\n >\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>This widget doesn't render anything without a filled in default slot.</p>\n <p>query, function to refine and results are provided.</p>\n <pre>refine: Function</pre>\n <pre>currentRefinement: \"{{ state.currentRefinement }}\"</pre>\n <details>\n <summary><code>indices</code>:</summary>\n <pre>{{ state.indices }}</pre>\n </details>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisAutocomplete',\n mixins: [\n createWidgetMixin(\n {\n connector: connectAutocomplete,\n },\n {\n $$widgetType: 'ais.autocomplete',\n }\n ),\n createSuitMixin({ name: 'Autocomplete' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"suit()\"\n v-if=\"state\"\n >\n <slot\n :refine=\"state.refine\"\n :current-refinement=\"state.currentRefinement\"\n :indices=\"state.indices\"\n >\n <p>This widget doesn't render anything without a filled in default slot.</p>\n <p>query, function to refine and results are provided.</p>\n <pre>refine: Function</pre>\n <pre>currentRefinement: \"{{ state.currentRefinement }}\"</pre>\n <details>\n <summary><code>indices</code>:</summary>\n <pre>{{ state.indices }}</pre>\n </details>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectAutocomplete } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisAutocomplete',\n mixins: [\n createWidgetMixin(\n {\n connector: connectAutocomplete,\n },\n {\n $$widgetType: 'ais.autocomplete',\n }\n ),\n createSuitMixin({ name: 'Autocomplete' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n computed: {\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n };\n },\n },\n};\n</script>\n","import { isVue3 } from '../util/vue-compat';\nimport mitt from 'mitt';\n\nexport const PANEL_EMITTER_NAMESPACE = 'instantSearchPanelEmitter';\nexport const PANEL_CHANGE_EVENT = 'PANEL_CHANGE_EVENT';\n\nexport const createPanelProviderMixin = () => ({\n props: {\n emitter: {\n type: Object,\n required: false,\n default() {\n return mitt();\n },\n },\n },\n provide() {\n return {\n [PANEL_EMITTER_NAMESPACE]: this.emitter,\n };\n },\n data() {\n return {\n canRefine: true,\n };\n },\n created() {\n this.emitter.on(PANEL_CHANGE_EVENT, value => {\n this.updateCanRefine(value);\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n this.emitter.all.clear();\n },\n methods: {\n updateCanRefine(value) {\n this.canRefine = value;\n },\n },\n});\n\nexport const createPanelConsumerMixin = ({ 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 this.hasAlreadyEmitted = true;\n }\n },\n },\n },\n});\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li :class=\"[suit('item'), !state.items.length && suit('item', 'selected')]\">\n <a\n v-if=\"Boolean(state.items.length)\"\n :href=\"state.createURL()\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine()\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n <span v-else>\n <slot name=\"rootLabel\">Home</slot>\n </span>\n </li>\n <li\n v-for=\"(item, index) in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), isLastItem(index) && suit('item', 'selected')]\"\n >\n <span\n :class=\"suit('separator')\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">></slot>\n </span>\n <a\n v-if=\"!isLastItem(index)\"\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >{{ item.label }}</a>\n <span v-else>{{ item.label }}</span>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisBreadcrumb',\n mixins: [\n createWidgetMixin(\n {\n connector: connectBreadcrumb,\n },\n {\n $$widgetType: 'ais.breadcrumb',\n }\n ),\n createPanelConsumerMixin({\n 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(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li :class=\"[suit('item'), !state.items.length && suit('item', 'selected')]\">\n <a\n v-if=\"Boolean(state.items.length)\"\n :href=\"state.createURL()\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine()\"\n >\n <slot name=\"rootLabel\">Home</slot>\n </a>\n <span v-else>\n <slot name=\"rootLabel\">Home</slot>\n </span>\n </li>\n <li\n v-for=\"(item, index) in state.items\"\n :key=\"item.label\"\n :class=\"[suit('item'), isLastItem(index) && suit('item', 'selected')]\"\n >\n <span\n :class=\"suit('separator')\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">></slot>\n </span>\n <a\n v-if=\"!isLastItem(index)\"\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >{{ item.label }}</a>\n <span v-else>{{ item.label }}</span>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectBreadcrumb } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisBreadcrumb',\n mixins: [\n createWidgetMixin(\n {\n connector: connectBreadcrumb,\n },\n {\n $$widgetType: 'ais.breadcrumb',\n }\n ),\n createPanelConsumerMixin({\n 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(\n {\n connector: connectClearRefinements,\n },\n {\n $$widgetType: 'ais.clearRefinements',\n }\n ),\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","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :can-refine=\"canRefine\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n >\n <button\n type=\"reset\"\n :class=\"[suit('button'), !canRefine && suit('button', 'disabled')]\"\n :disabled=\"!canRefine\"\n @click.prevent=\"state.refine\"\n >\n <slot name=\"resetLabel\">Clear refinements</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectClearRefinements } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisClearRefinements',\n mixins: [\n createWidgetMixin(\n {\n connector: connectClearRefinements,\n },\n {\n $$widgetType: 'ais.clearRefinements',\n }\n ),\n createPanelConsumerMixin({\n 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';\nimport { isVue3, renderCompat } from '../util/vue-compat';\n\nexport default {\n inheritAttrs: false,\n name: 'AisConfigure',\n mixins: [\n createSuitMixin({ name: 'Configure' }),\n createWidgetMixin(\n {\n connector: connectConfigure,\n },\n {\n $$widgetType: 'ais.configure',\n }\n ),\n ],\n computed: {\n widgetParams() {\n return {\n searchParameters: this.$attrs,\n };\n },\n },\n render: renderCompat(function(h) {\n const slot = isVue3 ? this.$slots.default : this.$scopedSlots.default;\n\n if (!this.state || !slot) {\n return null;\n }\n\n return h(\n 'div',\n {\n class: this.suit(),\n },\n [\n slot({\n refine: this.state.refine,\n searchParameters: this.state.widgetParams.searchParameters,\n }),\n ]\n );\n }),\n};\n","import { createWidgetMixin } from '../mixins/widget';\nimport { EXPERIMENTAL_connectConfigureRelatedItems } from 'instantsearch.js/es/connectors';\n\nexport default {\n inheritAttrs: false,\n name: 'AisExperimentalConfigureRelatedItems',\n mixins: [\n createWidgetMixin(\n {\n connector: EXPERIMENTAL_connectConfigureRelatedItems,\n },\n {\n $$widgetType: 'ais.configureRelatedItems',\n }\n ),\n ],\n props: {\n hit: {\n type: Object,\n required: true,\n },\n matchingPatterns: {\n type: Object,\n required: true,\n },\n transformSearchParameters: {\n type: Function,\n required: false,\n },\n },\n computed: {\n widgetParams() {\n return {\n hit: this.hit,\n matchingPatterns: this.matchingPatterns,\n transformSearchParameters: this.transformSearchParameters,\n };\n },\n },\n render() {\n return null;\n },\n};\n","<template>\n <div\n :class=\"[suit(), noRefinement && suit('','noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :refine=\"state.refine\"\n :items=\"state.items\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.attribute\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :refine=\"item.refine\"\n :item=\"item\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('label')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{ refinement.label }}</q>\n <template v-else>\n {{ refinement.label }}\n </template>\n </span>\n <button\n :class=\"suit('delete')\"\n @click=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin(\n {\n connector: connectCurrentRefinements,\n },\n {\n $$widgetType: 'ais.currentRefinements',\n }\n ),\n createPanelConsumerMixin({\n 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 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 <div\n :class=\"[suit(), noRefinement && suit('','noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :refine=\"state.refine\"\n :items=\"state.items\"\n :createURL=\"state.createURL\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.attribute\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :refine=\"item.refine\"\n :item=\"item\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('label')\">{{ capitalize(item.label) }}: </span>\n <span\n v-for=\"refinement in item.refinements\"\n :key=\"createItemKey(refinement)\"\n :class=\"suit('category')\"\n >\n <slot\n name=\"refinement\"\n :refine=\"item.refine\"\n :refinement=\"refinement\"\n :createURL=\"state.createURL\"\n >\n <span :class=\"suit('categoryLabel')\">\n <q v-if=\"refinement.attribute === 'query'\">{{ refinement.label }}</q>\n <template v-else>\n {{ refinement.label }}\n </template>\n </span>\n <button\n :class=\"suit('delete')\"\n @click=\"item.refine(refinement)\"\n >\n ✕\n </button>\n </slot>\n </span>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectCurrentRefinements } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisCurrentRefinements',\n mixins: [\n createSuitMixin({ name: 'CurrentRefinements' }),\n createWidgetMixin(\n {\n connector: connectCurrentRefinements,\n },\n {\n $$widgetType: 'ais.currentRefinements',\n }\n ),\n createPanelConsumerMixin({\n 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 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 <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(\n {\n connector: connectHierarchicalMenu,\n },\n {\n $$widgetType: 'ais.hierarchicalMenu',\n }\n ),\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","<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(\n {\n connector: connectHierarchicalMenu,\n },\n {\n $$widgetType: 'ais.hierarchicalMenu',\n }\n ),\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 '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n};\n\n/** Used to match HTML entities and HTML characters. */\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, &amp; pebbles');\n * // => 'fred, barney, & pebbles'\n */\nexport function unescape(string) {\n return string && reHasEscapedHtml.test(string)\n ? string.replace(reEscapedHtml, character => htmlUnescapes[character])\n : string;\n}\n","// copied from React InstantSearch\nimport { getPropertyByPath } from 'instantsearch.js/es/lib/utils';\nimport { unescape } from '../util/unescape';\n\nconst TAG_PLACEHOLDER = {\n highlightPreTag: '__ais-highlight__',\n highlightPostTag: '__/ais-highlight__',\n};\n\n/**\n * Parses an highlighted attribute into an array of objects with the string value, and\n * a boolean that indicated if this part is highlighted.\n *\n * @param {string} preTag - string used to identify the start of an highlighted value\n * @param {string} postTag - string used to identify the end of an highlighted value\n * @param {string} highlightedValue - highlighted attribute as returned by Algolia highlight feature\n * @return {object[]} - An array of {value: string, isHighlighted: boolean}.\n */\nfunction parseHighlightedAttribute({ preTag, postTag, highlightedValue = '' }) {\n const splitByPreTag = highlightedValue.split(preTag);\n const firstValue = splitByPreTag.shift();\n const elements =\n firstValue === '' ? [] : [{ value: firstValue, isHighlighted: false }];\n\n if (postTag === preTag) {\n let isHighlighted = true;\n splitByPreTag.forEach(split => {\n elements.push({ value: split, isHighlighted });\n isHighlighted = !isHighlighted;\n });\n } else {\n splitByPreTag.forEach(split => {\n const splitByPostTag = split.split(postTag);\n\n elements.push({\n value: splitByPostTag[0],\n isHighlighted: true,\n });\n\n if (splitByPostTag[1] !== '') {\n elements.push({\n // Vue removes nodes which are just a single space (vuejs/vue#9208),\n // we replace this by two spaces, which does not have an impact,\n // unless someone would have `white-space: pre` on the highlights\n value: splitByPostTag[1] === ' ' ? ' ' : splitByPostTag[1],\n isHighlighted: false,\n });\n }\n });\n }\n\n return elements;\n}\n\n/**\n * Find an highlighted attribute given an `attribute` and an `highlightProperty`, parses it,\n * and provided an array of objects with the string value and a boolean if this\n * value is highlighted.\n *\n * In order to use this feature, highlight must be activated in the configuration of\n * the index. The `preTag` and `postTag` attributes are respectively highlightPreTag and\n * highlightPostTag in Algolia configuration.\n *\n * @param {string} preTag - string used to identify the start of an highlighted value\n * @param {string} postTag - string used to identify the end of an highlighted value\n * @param {string} highlightProperty - the property that contains the highlight structure in the results\n * @param {string} attribute - the highlighted attribute to look for\n * @param {object} hit - the actual hit returned by Algolia.\n * @return {object[]} - An array of {value: string, isHighlighted: boolean}.\n */\nexport function parseAlgoliaHit({\n preTag = TAG_PLACEHOLDER.highlightPreTag,\n postTag = TAG_PLACEHOLDER.highlightPostTag,\n highlightProperty,\n attribute,\n hit,\n}) {\n if (!hit) throw new Error('`hit`, the matching record, must be provided');\n\n const highlightObject =\n getPropertyByPath(hit[highlightProperty], attribute) || {};\n\n if (Array.isArray(highlightObject)) {\n return highlightObject.map(item =>\n parseHighlightedAttribute({\n preTag,\n postTag,\n highlightedValue: unescape(item.value),\n })\n );\n }\n\n return parseHighlightedAttribute({\n preTag,\n postTag,\n highlightedValue: unescape(highlightObject.value),\n });\n}\n","<template>\n <span :class=\"suit()\">\n <component\n v-for=\"({ value, isHighlighted }, index) in parsedHighlights\"\n :class=\"[isHighlighted && suit('highlighted')]\"\n :key=\"index\"\n :is=\"isHighlighted ? highlightedTagName : TextNode\"\n >{{ value }}</component>\n </span>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\n },\n };\n\nexport default {\n name: 'AisHighlighter',\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n suit: {\n type: Function,\n required: true,\n },\n highlightProperty: {\n type: String,\n required: true,\n },\n preTag: {\n type: String,\n required: true,\n },\n postTag: {\n type: String,\n required: true,\n },\n },\n data() {\n return { TextNode };\n },\n computed: {\n parsedHighlights() {\n return parseAlgoliaHit({\n attribute: this.attribute,\n hit: this.hit,\n highlightProperty: this.highlightProperty,\n preTag: this.preTag,\n postTag: this.postTag,\n });\n },\n },\n};\n</script>\n","<template>\n <span :class=\"suit()\">\n <component\n v-for=\"({ value, isHighlighted }, index) in parsedHighlights\"\n :class=\"[isHighlighted && suit('highlighted')]\"\n :key=\"index\"\n :is=\"isHighlighted ? highlightedTagName : TextNode\"\n >{{ value }}</component>\n </span>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { parseAlgoliaHit } from '../util/parseAlgoliaHit';\n\nconst TextNode = isVue3\n ? (props, context) => context.slots.default()\n : {\n functional: true,\n render(createElement, context) {\n const slots = context.slots();\n return slots.default;\n },\n };\n\nexport default {\n name: 'AisHighlighter',\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n suit: {\n type: Function,\n required: true,\n },\n highlightProperty: {\n type: String,\n required: true,\n },\n preTag: {\n type: String,\n required: true,\n },\n postTag: {\n type: String,\n required: true,\n },\n },\n data() {\n return { TextNode };\n },\n computed: {\n parsedHighlights() {\n return parseAlgoliaHit({\n attribute: this.attribute,\n hit: this.hit,\n highlightProperty: this.highlightProperty,\n preTag: this.preTag,\n postTag: this.postTag,\n });\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_highlightResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisHighlight',\n mixins: [createSuitMixin({ name: 'Highlight' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_highlightResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisHighlight',\n mixins: [createSuitMixin({ name: 'Highlight' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :items=\"items\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, itemIndex) in items\"\n :key=\"item.objectID\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"itemIndex\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ itemIndex }}</slot>\n </li>\n </ol>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectHitsWithInsights,\n },\n {\n $$widgetType: 'ais.hits',\n }\n ),\n createSuitMixin({ name: 'Hits' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n items() {\n return this.state.hits;\n },\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :items=\"items\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, itemIndex) in items\"\n :key=\"item.objectID\"\n :class=\"suit('item')\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"itemIndex\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ itemIndex }}</slot>\n </li>\n </ol>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectHitsWithInsights,\n },\n {\n $$widgetType: 'ais.hits',\n }\n ),\n createSuitMixin({ name: 'Hits' }),\n ],\n props: {\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n },\n computed: {\n items() {\n return this.state.hits;\n },\n widgetParams() {\n return {\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :items=\"state.items\"\n :refine=\"state.refine\"\n :hasNoResults=\"state.hasNoResults\"\n >\n <select\n :class=\"suit('select')\"\n v-model=\"selected\"\n @change=\"handleChange\"\n >\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n >{{ item.label }}</option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectHitsPerPage } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisHitsPerPage',\n mixins: [\n createSuitMixin({ name: 'HitsPerPage' }),\n createWidgetMixin(\n {\n connector: connectHitsPerPage,\n },\n {\n $$widgetType: 'ais.hitsPerPage',\n }\n ),\n createPanelConsumerMixin({\n 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","<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(\n {\n connector: connectHitsPerPage,\n },\n {\n $$widgetType: 'ais.hitsPerPage',\n }\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 data() {\n return {\n selected: this.items.find(item => item.default === true).value,\n };\n },\n computed: {\n widgetParams() {\n return {\n items: this.items,\n transformItems: this.transformItems,\n };\n },\n },\n methods: {\n handleChange() {\n this.state.refine(this.selected);\n },\n },\n};\n</script>\n","import { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport indexWidget from 'instantsearch.js/es/widgets/index/index';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\n// wrapped in a dummy function, since indexWidget doesn't render\nconst connectIndex = () => indexWidget;\n\nexport default {\n name: 'AisIndex',\n mixins: [\n createSuitMixin({ name: 'Index' }),\n createWidgetMixin(\n { connector: connectIndex },\n {\n $$widgetType: 'ais.index',\n }\n ),\n ],\n provide() {\n return {\n // The widget is created & registered by widgetMixin, accessor is needed\n // because provide is not reactive.\n $_ais_getParentIndex: () => this.widget,\n };\n },\n props: {\n indexName: {\n type: String,\n required: true,\n },\n indexId: {\n type: String,\n required: false,\n },\n },\n render: renderCompat(function(h) {\n return h('div', {}, getDefaultSlot(this));\n }),\n computed: {\n widgetParams() {\n return {\n indexName: this.indexName,\n indexId: this.indexId,\n };\n },\n },\n};\n","import { createSuitMixin } from '../mixins/suit';\nimport { version } from '../../package.json'; // rollup does pick only what needed from json\nimport { _objectSpread } from './polyfills';\nimport { isVue3, version as vueVersion } from './vue-compat';\n\nexport const createInstantSearchComponent = component =>\n _objectSpread(\n {\n mixins: [createSuitMixin({ name: 'InstantSearch' })],\n provide() {\n return {\n $_ais_instantSearchInstance: this.instantSearchInstance,\n };\n },\n watch: {\n searchClient(searchClient) {\n this.instantSearchInstance.helper.setClient(searchClient).search();\n },\n indexName(indexName) {\n this.instantSearchInstance.helper.setIndex(indexName).search();\n },\n stalledSearchDelay(stalledSearchDelay) {\n // private InstantSearch.js API:\n this.instantSearchInstance._stalledSearchDelay = stalledSearchDelay;\n },\n routing() {\n throw new Error(\n 'routing configuration can not be changed dynamically at this point.' +\n '\\n\\n' +\n 'Please open a new issue: https://github.com/algolia/vue-instantsearch/issues/new?template=feature.md'\n );\n },\n searchFunction(searchFunction) {\n // private InstantSearch.js API:\n this.instantSearchInstance._searchFunction = searchFunction;\n },\n middlewares: {\n immediate: true,\n handler(next, prev) {\n (prev || [])\n .filter(middleware => (next || []).indexOf(middleware) === -1)\n .forEach(middlewareToRemove => {\n this.instantSearchInstance.unuse(middlewareToRemove);\n });\n\n (next || [])\n .filter(middleware => (prev || []).indexOf(middleware) === -1)\n .forEach(middlewareToAdd => {\n this.instantSearchInstance.use(middlewareToAdd);\n });\n },\n },\n },\n created() {\n const searchClient = this.instantSearchInstance.client;\n if (typeof searchClient.addAlgoliaAgent === 'function') {\n searchClient.addAlgoliaAgent(`Vue (${vueVersion})`);\n searchClient.addAlgoliaAgent(`Vue InstantSearch (${version})`);\n }\n },\n mounted() {\n // from the documentation: https://vuejs.org/v2/api/#mounted\n // \"Note that mounted does not guarantee that all child components have also been mounted. If you want to\n // wait until the entire view has been rendered, you can use vm.$nextTick inside of mounted\"\n this.$nextTick(() => {\n if (!this.instantSearchInstance.started) {\n this.instantSearchInstance.start();\n }\n });\n },\n [isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {\n if (this.instantSearchInstance.started) {\n this.instantSearchInstance.dispose();\n }\n\n // a hydrated instance will no longer be hydrated once disposed, and starts from scratch\n this.instantSearchInstance.__initialSearchResults = undefined;\n },\n },\n component\n );\n","import instantsearch from 'instantsearch.js/es';\nimport { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { warn } from '../util/warn';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nconst oldApiWarning = `Vue InstantSearch: You used the prop api-key or app-id.\nThese have been replaced by search-client.\n\nSee more info here: https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-search-client`;\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearch',\n props: {\n searchClient: {\n type: Object,\n required: true,\n },\n insightsClient: {\n type: Function,\n default: undefined,\n },\n indexName: {\n type: String,\n required: true,\n },\n routing: {\n default: undefined,\n validator(value) {\n if (\n typeof value === 'boolean' ||\n (!value.router && !value.stateMapping)\n ) {\n warn(\n 'The `routing` option expects an object with `router` and/or `stateMapping`.\\n\\nSee https://www.algolia.com/doc/api-reference/widgets/instantsearch/vue/#widget-param-routing'\n );\n return false;\n }\n return true;\n },\n },\n stalledSearchDelay: {\n type: Number,\n default: undefined,\n },\n searchFunction: {\n type: Function,\n default: undefined,\n },\n initialUiState: {\n type: Object,\n default: undefined,\n },\n apiKey: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n appId: {\n type: String,\n default: undefined,\n validator(value) {\n if (value) {\n warn(oldApiWarning);\n }\n return false;\n },\n },\n middlewares: {\n type: Array,\n default: null,\n },\n },\n data() {\n return {\n instantSearchInstance: instantsearch({\n searchClient: this.searchClient,\n insightsClient: this.insightsClient,\n indexName: this.indexName,\n routing: this.routing,\n stalledSearchDelay: this.stalledSearchDelay,\n searchFunction: this.searchFunction,\n initialUiState: this.initialUiState,\n }),\n };\n },\n render: renderCompat(function(h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: false,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","import { createInstantSearchComponent } from '../util/createInstantSearchComponent';\nimport { renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nexport default createInstantSearchComponent({\n name: 'AisInstantSearchSsr',\n inject: {\n $_ais_ssrInstantSearchInstance: {\n default() {\n throw new Error('`createServerRootMixin` is required when using SSR.');\n },\n },\n },\n data() {\n return {\n instantSearchInstance: this.$_ais_ssrInstantSearchInstance,\n };\n },\n render: renderCompat(function(h) {\n return h(\n 'div',\n {\n class: {\n [this.suit()]: true,\n [this.suit('', 'ssr')]: true,\n },\n },\n getDefaultSlot(this)\n );\n }),\n});\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n\n <slot\n v-if=\"showPrevious\"\n name=\"loadPrevious\"\n :refine-previous=\"refinePrevious\"\n :page=\"state.results.page\"\n :is-first-page=\"state.isFirstPage\"\n >\n <button\n :class=\"[suit('loadPrevious'), state.isFirstPage && suit('loadPrevious', 'disabled')]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >Show previous results</button>\n </slot>\n\n <slot\n :items=\"items\"\n :results=\"state.results\"\n :is-last-page=\"state.isLastPage\"\n :refine-previous=\"refinePrevious\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, index) in items\"\n :class=\"suit('item')\"\n :key=\"item.objectID\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ index }}</slot>\n </li>\n </ol>\n\n <slot\n name=\"loadMore\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :page=\"state.results.page\"\n :is-last-page=\"state.isLastPage\"\n >\n <button\n :class=\"[suit('loadMore'), state.isLastPage && suit('loadMore', 'disabled')]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >Show more results</button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisInfiniteHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectInfiniteHitsWithInsights,\n },\n {\n $$widgetType: 'ais.infiniteHits',\n }\n ),\n createSuitMixin({ name: 'InfiniteHits' }),\n ],\n props: {\n showPrevious: {\n type: Boolean,\n default: false,\n },\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n cache: {\n type: Object,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n showPrevious: this.showPrevious,\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n cache: this.cache,\n };\n },\n items() {\n // Fixes InstantSearch.js connectors API: every list\n // of things must be called `items`\n return this.state.hits;\n },\n },\n methods: {\n refinePrevious() {\n this.state.showPrevious();\n },\n refineNext() {\n this.state.showMore();\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n\n <slot\n v-if=\"showPrevious\"\n name=\"loadPrevious\"\n :refine-previous=\"refinePrevious\"\n :page=\"state.results.page\"\n :is-first-page=\"state.isFirstPage\"\n >\n <button\n :class=\"[suit('loadPrevious'), state.isFirstPage && suit('loadPrevious', 'disabled')]\"\n :disabled=\"state.isFirstPage\"\n @click=\"refinePrevious()\"\n >Show previous results</button>\n </slot>\n\n <slot\n :items=\"items\"\n :results=\"state.results\"\n :is-last-page=\"state.isLastPage\"\n :refine-previous=\"refinePrevious\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :insights=\"state.insights\"\n :send-event=\"state.sendEvent\"\n >\n <ol :class=\"suit('list')\">\n <li\n v-for=\"(item, index) in items\"\n :class=\"suit('item')\"\n :key=\"item.objectID\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :index=\"index\"\n :insights=\"state.insights\"\n >objectID: {{ item.objectID }}, index: {{ index }}</slot>\n </li>\n </ol>\n\n <slot\n name=\"loadMore\"\n :refine-next=\"refineNext\"\n :refine=\"refineNext\"\n :page=\"state.results.page\"\n :is-last-page=\"state.isLastPage\"\n >\n <button\n :class=\"[suit('loadMore'), state.isLastPage && suit('loadMore', 'disabled')]\"\n :disabled=\"state.isLastPage\"\n @click=\"refineNext()\"\n >Show more results</button>\n </slot>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectInfiniteHitsWithInsights } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisInfiniteHits',\n mixins: [\n createWidgetMixin(\n {\n connector: connectInfiniteHitsWithInsights,\n },\n {\n $$widgetType: 'ais.infiniteHits',\n }\n ),\n createSuitMixin({ name: 'InfiniteHits' }),\n ],\n props: {\n showPrevious: {\n type: Boolean,\n default: false,\n },\n escapeHTML: {\n type: Boolean,\n default: true,\n },\n transformItems: {\n type: Function,\n default: undefined,\n },\n cache: {\n type: Object,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n showPrevious: this.showPrevious,\n escapeHTML: this.escapeHTML,\n transformItems: this.transformItems,\n cache: this.cache,\n };\n },\n items() {\n // Fixes InstantSearch.js connectors API: every list\n // of things must be called `items`\n return this.state.hits;\n },\n },\n methods: {\n refinePrevious() {\n this.state.showPrevious();\n },\n refineNext() {\n this.state.showMore();\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n\n <button\n v-if=\"showShowMoreButton\"\n :class=\"[suit('showMore'), !state.canToggleShowMore && suit('showMore', 'disabled')]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >{{ state.isShowingMore ? 'Show less' : 'Show more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisMenu',\n mixins: [\n createSuitMixin({ name: 'Menu' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menu',\n }\n ),\n createPanelConsumerMixin({\n 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 v-if=\"state\"\n :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :refine=\"state.refine\"\n :createURL=\"state.createURL\"\n :toggle-show-more=\"state.toggleShowMore\"\n :send-event=\"state.sendEvent\"\n >\n <ul :class=\"suit('list')\">\n <li\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"[suit('item'), item.isRefined && suit('item', 'selected')]\"\n >\n <a\n :href=\"state.createURL(item.value)\"\n :class=\"suit('link')\"\n @click.prevent=\"state.refine(item.value)\"\n >\n <span :class=\"suit('label')\">{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n\n <button\n v-if=\"showShowMoreButton\"\n :class=\"[suit('showMore'), !state.canToggleShowMore && suit('showMore', 'disabled')]\"\n :disabled=\"!state.canToggleShowMore\"\n @click.prevent=\"state.toggleShowMore()\"\n >\n <slot\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >{{ state.isShowingMore ? 'Show less' : 'Show more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisMenu',\n mixins: [\n createSuitMixin({ name: 'Menu' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menu',\n }\n ),\n createPanelConsumerMixin({\n 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(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menuSelect',\n }\n ),\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 :class=\"[suit(), !state.canRefine && suit('', 'noRefinement')]\"\n v-if=\"state\"\n >\n <slot\n :items=\"state.items\"\n :can-refine=\"state.canRefine\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :send-event=\"state.sendEvent\"\n >\n <select\n :class=\"suit('select')\"\n @change=\"refine($event.currentTarget.value)\"\n >\n <option\n :class=\"suit('option')\"\n value=\"\"\n >\n <slot name=\"defaultOption\">See all</slot>\n </option>\n <option\n v-for=\"item in state.items\"\n :key=\"item.value\"\n :class=\"suit('option')\"\n :value=\"item.value\"\n :selected=\"item.isRefined\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n >{{ item.label }} ({{ item.count }})</slot>\n </option>\n </select>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisMenuSelect',\n mixins: [\n createSuitMixin({ name: 'MenuSelect' }),\n createWidgetMixin(\n { connector: connectMenu },\n {\n $$widgetType: 'ais.menuSelect',\n }\n ),\n createPanelConsumerMixin({\n 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(\n {\n connector: connectNumericMenu,\n },\n {\n $$widgetType: 'ais.numericMenu',\n }\n ),\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(), !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(\n {\n connector: connectNumericMenu,\n },\n {\n $$widgetType: 'ais.numericMenu',\n }\n ),\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', 'page')]: true,\n [suit('item', 'selected')]: state.currentRefinement === page\n }\"\n v-for=\"page in state.pages\"\n :key=\"page\"\n >\n <slot\n name=\"item\"\n :page=\"page\"\n :createURL=\"() => state.createURL(page)\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(page)\"\n >\n <a\n :class=\"suit('link')\"\n :href=\"state.createURL(page)\"\n @click.prevent=\"refine(page)\"\n >{{ page + 1 }}</a>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','nextPage')]: true,\n [suit('item','disabled')]: state.isLastPage\n }\"\n v-if=\"showNext\"\n >\n <slot\n name=\"next\"\n :createURL=\"() => state.createURL(state.currentRefinement + 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.currentRefinement + 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Next\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Next\"\n >›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','lastPage')]: true,\n [suit('item','disabled')]: state.isLastPage,\n }\"\n v-if=\"showLast\"\n >\n <slot\n name=\"last\"\n :createURL=\"() => state.createURL(state.nbPages - 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.nbPages - 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Last\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.prevent=\"refine(state.nbPages - 1)\"\n >››</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Last\"\n >››</span>\n </template>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectPagination } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPagination',\n mixins: [\n createSuitMixin({ name: 'Pagination' }),\n createWidgetMixin(\n {\n connector: connectPagination,\n },\n {\n $$widgetType: 'ais.pagination',\n }\n ),\n createPanelConsumerMixin({\n 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 emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n :current-refinement=\"state.currentRefinement\"\n :nb-hits=\"state.nbHits\"\n :nb-pages=\"state.nbPages\"\n :pages=\"state.pages\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n >\n <ul :class=\"suit('list')\">\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'firstPage')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n }\"\n v-if=\"showFirst\"\n >\n <slot\n name=\"first\"\n :createURL=\"() => state.createURL(0)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(0)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"First\"\n :href=\"state.createURL(0)\"\n @click.prevent=\"refine(0)\"\n >‹‹</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"First\"\n >‹‹</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'previousPage')]: true,\n [suit('item', 'disabled')]: state.isFirstPage,\n }\"\n v-if=\"showPrevious\"\n >\n <slot\n name=\"previous\"\n :createURL=\"() => state.createURL(state.currentRefinement - 1)\"\n :is-first-page=\"state.isFirstPage\"\n :refine=\"() => refine(state.currentRefinement - 1)\"\n >\n <template v-if=\"!state.isFirstPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Previous\"\n :href=\"state.createURL(state.currentRefinement - 1)\"\n @click.prevent=\"refine(state.currentRefinement - 1)\"\n >‹</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Previous\"\n >‹</span>\n </template>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item', 'page')]: true,\n [suit('item', 'selected')]: state.currentRefinement === page\n }\"\n v-for=\"page in state.pages\"\n :key=\"page\"\n >\n <slot\n name=\"item\"\n :page=\"page\"\n :createURL=\"() => state.createURL(page)\"\n :is-first-page=\"state.isFirstPage\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(page)\"\n >\n <a\n :class=\"suit('link')\"\n :href=\"state.createURL(page)\"\n @click.prevent=\"refine(page)\"\n >{{ page + 1 }}</a>\n </slot>\n </li>\n\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','nextPage')]: true,\n [suit('item','disabled')]: state.isLastPage\n }\"\n v-if=\"showNext\"\n >\n <slot\n name=\"next\"\n :createURL=\"() => state.createURL(state.currentRefinement + 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.currentRefinement + 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Next\"\n :href=\"state.createURL(state.currentRefinement + 1)\"\n @click.prevent=\"refine(state.currentRefinement + 1)\"\n >›</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Next\"\n >›</span>\n </template>\n </slot>\n </li>\n <li\n :class=\"{\n [suit('item')]: true,\n [suit('item','lastPage')]: true,\n [suit('item','disabled')]: state.isLastPage,\n }\"\n v-if=\"showLast\"\n >\n <slot\n name=\"last\"\n :createURL=\"() => state.createURL(state.nbPages - 1)\"\n :is-last-page=\"state.isLastPage\"\n :refine=\"() => refine(state.nbPages - 1)\"\n >\n <template v-if=\"!state.isLastPage\">\n <a\n :class=\"suit('link')\"\n aria-label=\"Last\"\n :href=\"state.createURL(state.nbPages - 1)\"\n @click.prevent=\"refine(state.nbPages - 1)\"\n >››</a>\n </template>\n <template v-else>\n <span\n :class=\"suit('link')\"\n aria-label=\"Last\"\n >››</span>\n </template>\n </slot>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectPagination } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPagination',\n mixins: [\n createSuitMixin({ name: 'Pagination' }),\n createWidgetMixin(\n {\n connector: connectPagination,\n },\n {\n $$widgetType: 'ais.pagination',\n }\n ),\n createPanelConsumerMixin({\n 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 emits: ['page-change'],\n methods: {\n refine(page) {\n const p = Math.min(Math.max(page, 0), this.state.nbPages - 1);\n this.state.refine(p);\n // TODO: do this in a general way\n this.$emit('page-change', p);\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div\n v-if=\"getSlot('header')\"\n :class=\"suit('header')\"\n >\n <slot\n name=\"header\"\n :has-refinements=\"canRefine\"\n />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div\n v-if=\"getSlot('footer')\"\n :class=\"suit('footer')\"\n >\n <slot\n name=\"footer\"\n :has-refinements=\"canRefine\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"[suit(), !canRefine && suit('', 'noRefinement')]\">\n <div\n v-if=\"getSlot('header')\"\n :class=\"suit('header')\"\n >\n <slot\n name=\"header\"\n :has-refinements=\"canRefine\"\n />\n </div>\n <div :class=\"suit('body')\">\n <slot :has-refinements=\"canRefine\" />\n </div>\n <div\n v-if=\"getSlot('footer')\"\n :class=\"suit('footer')\"\n >\n <slot\n name=\"footer\"\n :has-refinements=\"canRefine\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport { isVue3 } from '../util/vue-compat';\nimport { createPanelProviderMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPanel',\n mixins: [createSuitMixin({ name: 'Panel' }), createPanelProviderMixin()],\n methods: {\n getSlot(name) {\n return isVue3\n ? this.$slots[name]\n : this.$slots[name] || this.$scopedSlots[name];\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\">\n <a\n :class=\"suit('link')\"\n :href=\"algoliaUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"search by Algolia\"\n >\n <svg\n style=\"height: 1.2em; width: auto\"\n :class=\"[suit('logo'), suit('', theme)]\"\n viewBox=\"0 0 168 24\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5D6494'\"\n d=\"M6.97 6.68V8.3a4.47 4.47 0 0 0-2.42-.67 2.2 2.2 0 0 0-1.38.4c-.34.26-.5.6-.5 1.02 0 .43.16.77.49 1.03.33.25.83.53 1.51.83a7.04 7.04 0 0 1 1.9 1.08c.34.24.58.54.73.89.15.34.23.74.23 1.18 0 .95-.33 1.7-1 2.24a4 4 0 0 1-2.6.81 5.71 5.71 0 0 1-2.94-.68v-1.71c.84.63 1.81.94 2.92.94.58 0 1.05-.14 1.39-.4.34-.28.5-.65.5-1.13 0-.29-.1-.55-.3-.8a2.2 2.2 0 0 0-.65-.53 23.03 23.03 0 0 0-1.64-.78 13.67 13.67 0 0 1-1.11-.64c-.12-.1-.28-.22-.46-.4a1.72 1.72 0 0 1-.39-.5 4.46 4.46 0 0 1-.22-.6c-.07-.23-.1-.48-.1-.75 0-.91.33-1.63 1-2.17a4 4 0 0 1 2.57-.8c.97 0 1.8.18 2.47.52zm7.47 5.7v-.3a2.26 2.26 0 0 0-.5-1.44c-.3-.35-.74-.53-1.32-.53-.53 0-.99.2-1.37.58-.38.39-.62.95-.72 1.68h3.91zm1 2.79v1.4c-.6.34-1.38.51-2.36.51a4.02 4.02 0 0 1-3-1.13 4.04 4.04 0 0 1-1.11-2.97c0-1.3.34-2.32 1.02-3.06a3.38 3.38 0 0 1 2.6-1.1c1.03 0 1.85.32 2.46.96.6.64.9 1.57.9 2.78 0 .33-.03.68-.09 1.04h-5.31c.1.7.4 1.24.89 1.61.49.38 1.1.56 1.85.56.86 0 1.58-.2 2.15-.6zm6.61-1.78h-1.21c-.6 0-1.05.12-1.35.36-.3.23-.46.53-.46.89 0 .37.12.66.36.88.23.2.57.32 1.02.32.5 0 .9-.15 1.2-.43.3-.28.44-.65.44-1.1v-.92zm-4.07-2.55V9.33a4.96 4.96 0 0 1 2.5-.55c2.1 0 3.17 1.03 3.17 3.08V17H22.1v-.96c-.42.68-1.15 1.02-2.19 1.02-.76 0-1.38-.22-1.84-.66-.46-.44-.7-1-.7-1.68 0-.78.3-1.38.88-1.81.59-.43 1.4-.65 2.46-.65h1.34v-.46c0-.55-.13-.97-.4-1.25-.26-.29-.7-.43-1.32-.43-.86 0-1.65.24-2.35.72zm9.34-1.93v1.42c.39-1 1.1-1.5 2.12-1.5.15 0 .31.02.5.05v1.53c-.23-.1-.48-.14-.76-.14-.54 0-.99.24-1.34.71a2.8 2.8 0 0 0-.52 1.71V17h-1.57V8.91h1.57zm5 4.09a3 3 0 0 0 .76 2.01c.47.53 1.14.8 2 .8.64 0 1.24-.18 1.8-.53v1.4c-.53.32-1.2.48-2 .48a3.98 3.98 0 0 1-4.17-4.18c0-1.16.38-2.15 1.14-2.98a4 4 0 0 1 3.1-1.23c.7 0 1.34.15 1.92.44v1.44a3.24 3.24 0 0 0-1.77-.5A2.65 2.65 0 0 0 32.33 13zm7.92-7.28v4.58c.46-1 1.3-1.5 2.5-1.5.8 0 1.42.24 1.9.73.48.5.72 1.17.72 2.05V17H43.8v-5.1c0-.56-.14-.99-.43-1.29-.28-.3-.65-.45-1.1-.45-.54 0-1 .2-1.42.6-.4.4-.61 1.02-.61 1.85V17h-1.56V5.72h1.56zM55.2 15.74c.6 0 1.1-.25 1.5-.76.4-.5.6-1.16.6-1.95 0-.92-.2-1.62-.6-2.12-.4-.5-.92-.74-1.55-.74-.56 0-1.05.22-1.5.67-.44.45-.66 1.13-.66 2.06 0 .96.22 1.67.64 2.14.43.47.95.7 1.57.7zM53 5.72v4.42a2.74 2.74 0 0 1 2.43-1.34c1.03 0 1.86.38 2.51 1.15.65.76.97 1.78.97 3.05 0 1.13-.3 2.1-.92 2.9-.62.81-1.47 1.21-2.54 1.21s-1.9-.45-2.46-1.34V17h-1.58V5.72H53zm9.9 11.1l-3.22-7.9h1.74l1 2.62 1.26 3.42c.1-.32.48-1.46 1.15-3.42l.91-2.63h1.66l-2.92 7.87c-.78 2.07-1.96 3.1-3.56 3.1-.28 0-.53-.02-.73-.07v-1.34c.17.04.35.06.54.06 1.03 0 1.76-.57 2.17-1.7z\"\n />\n <path\n fill=\"#5468FF\"\n d=\"M78.99.94h16.6a2.97 2.97 0 0 1 2.96 2.96v16.6a2.97 2.97 0 0 1-2.97 2.96h-16.6a2.97 2.97 0 0 1-2.96-2.96V3.9A2.96 2.96 0 0 1 79 .94\"\n />\n <path\n fill=\"#FFF\"\n d=\"M89.63 5.97v-.78a.98.98 0 0 0-.98-.97h-2.28a.98.98 0 0 0-.97.97V6c0 .09.08.15.17.13a7.13 7.13 0 0 1 3.9-.02c.08.02.16-.04.16-.13m-6.25 1L83 6.6a.98.98 0 0 0-1.38 0l-.46.46a.97.97 0 0 0 0 1.38l.38.39c.06.06.15.04.2-.02a7.49 7.49 0 0 1 1.63-1.62c.07-.04.08-.14.02-.2m4.16 2.45v3.34c0 .1.1.17.2.12l2.97-1.54c.06-.03.08-.12.05-.18a3.7 3.7 0 0 0-3.08-1.87c-.07 0-.14.06-.14.13m0 8.05a4.49 4.49 0 1 1 0-8.98 4.49 4.49 0 0 1 0 8.98m0-10.85a6.37 6.37 0 1 0 0 12.74 6.37 6.37 0 0 0 0-12.74\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5468FF'\"\n d=\"M120.92 18.8c-4.38.02-4.38-3.54-4.38-4.1V1.36l2.67-.42v13.25c0 .32 0 2.36 1.71 2.37v2.24zm-10.84-2.18c.82 0 1.43-.04 1.85-.12v-2.72a5.48 5.48 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.11-.44.28-.58.49a.93.93 0 0 0-.22.65c0 .63.22 1 .61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.62.11 2.23.33.6.22 1.09.53 1.44.92.36.4.61.92.76 1.48.16.56.23 1.17.23 1.85v6.87c-.4.1-1.03.2-1.86.32-.84.12-1.78.18-2.82.18-.69 0-1.32-.07-1.9-.2a4 4 0 0 1-1.46-.63c-.4-.3-.72-.67-.96-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.39-1.53.26-.45.6-.82 1.04-1.1.45-.3.95-.5 1.54-.62a8.8 8.8 0 0 1 3.79.05v-.44c0-.3-.04-.6-.11-.87a1.78 1.78 0 0 0-1.1-1.22c-.31-.12-.7-.2-1.15-.2a9.75 9.75 0 0 0-2.95.46l-.33-2.19c.34-.12.84-.23 1.48-.35.65-.12 1.34-.18 2.08-.18zm52.84 9.63c.82 0 1.43-.05 1.85-.13V13.7a5.42 5.42 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.12-.44.28-.58.5a.93.93 0 0 0-.22.65c0 .63.22.99.61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.63.11 2.23.33.6.22 1.1.53 1.45.92.35.39.6.92.76 1.48.15.56.23 1.18.23 1.85v6.88c-.41.08-1.03.19-1.87.31-.83.12-1.77.18-2.81.18-.7 0-1.33-.06-1.9-.2a4 4 0 0 1-1.47-.63c-.4-.3-.72-.67-.95-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.38-1.53.26-.45.61-.82 1.05-1.1.44-.3.95-.5 1.53-.62a8.8 8.8 0 0 1 3.8.05v-.43c0-.31-.04-.6-.12-.88-.07-.28-.2-.52-.38-.73a1.78 1.78 0 0 0-.73-.5c-.3-.1-.68-.2-1.14-.2a9.85 9.85 0 0 0-2.95.47l-.32-2.19a11.63 11.63 0 0 1 3.55-.53zm-8.03-1.27a1.62 1.62 0 0 0 0-3.24 1.62 1.62 0 1 0 0 3.24zm1.35 13.22h-2.7V7.27l2.7-.42V18.8zm-4.72 0c-4.38.02-4.38-3.54-4.38-4.1l-.01-13.34 2.67-.42v13.25c0 .32 0 2.36 1.72 2.37v2.24zm-8.7-5.9a4.7 4.7 0 0 0-.74-2.79 2.4 2.4 0 0 0-2.07-1 2.4 2.4 0 0 0-2.06 1 4.7 4.7 0 0 0-.74 2.8c0 1.16.25 1.94.74 2.62a2.4 2.4 0 0 0 2.07 1.02c.88 0 1.57-.34 2.07-1.02.49-.68.73-1.46.73-2.63zm2.74 0a6.46 6.46 0 0 1-1.52 4.23c-.49.53-1.07.94-1.76 1.22-.68.29-1.73.45-2.26.45-.53 0-1.58-.15-2.25-.45a5.1 5.1 0 0 1-2.88-3.13 7.3 7.3 0 0 1-.01-4.84 5.13 5.13 0 0 1 2.9-3.1 5.67 5.67 0 0 1 2.22-.42c.81 0 1.56.14 2.24.42.69.29 1.28.69 1.75 1.22.49.52.87 1.15 1.14 1.89a7 7 0 0 1 .43 2.5zm-20.14 0c0 1.11.25 2.36.74 2.88.5.52 1.13.78 1.91.78a4.07 4.07 0 0 0 2.12-.6V9.33c-.19-.04-.99-.2-1.76-.23a2.67 2.67 0 0 0-2.23 1 4.73 4.73 0 0 0-.78 2.8zm7.44 5.27c0 1.82-.46 3.16-1.4 4-.94.85-2.37 1.27-4.3 1.27-.7 0-2.17-.13-3.34-.4l.43-2.11c.98.2 2.27.26 2.95.26 1.08 0 1.84-.22 2.3-.66.46-.43.68-1.08.68-1.94v-.44a5.2 5.2 0 0 1-2.54.6 5.6 5.6 0 0 1-2.01-.36 4.2 4.2 0 0 1-2.58-2.71 9.88 9.88 0 0 1 .02-5.35 4.92 4.92 0 0 1 2.93-2.96 6.6 6.6 0 0 1 2.43-.46 19.64 19.64 0 0 1 4.43.66v10.6z\"\n />\n </svg>\n </a>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPoweredBy',\n mixins: [createSuitMixin({ name: 'PoweredBy' })],\n props: {\n theme: {\n default: 'light',\n validator(value) {\n return ['light', 'dark'].indexOf(value) !== -1;\n },\n },\n },\n computed: {\n algoliaUrl() {\n return (\n 'https://www.algolia.com/?' +\n 'utm_source=vue-instantsearch&' +\n 'utm_medium=website&' +\n `utm_content=${location ? location.hostname : ''}&` +\n 'utm_campaign=poweredby'\n );\n },\n },\n};\n</script>\n","<template>\n <div :class=\"suit()\">\n <a\n :class=\"suit('link')\"\n :href=\"algoliaUrl\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"search by Algolia\"\n >\n <svg\n style=\"height: 1.2em; width: auto\"\n :class=\"[suit('logo'), suit('', theme)]\"\n viewBox=\"0 0 168 24\"\n >\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5D6494'\"\n d=\"M6.97 6.68V8.3a4.47 4.47 0 0 0-2.42-.67 2.2 2.2 0 0 0-1.38.4c-.34.26-.5.6-.5 1.02 0 .43.16.77.49 1.03.33.25.83.53 1.51.83a7.04 7.04 0 0 1 1.9 1.08c.34.24.58.54.73.89.15.34.23.74.23 1.18 0 .95-.33 1.7-1 2.24a4 4 0 0 1-2.6.81 5.71 5.71 0 0 1-2.94-.68v-1.71c.84.63 1.81.94 2.92.94.58 0 1.05-.14 1.39-.4.34-.28.5-.65.5-1.13 0-.29-.1-.55-.3-.8a2.2 2.2 0 0 0-.65-.53 23.03 23.03 0 0 0-1.64-.78 13.67 13.67 0 0 1-1.11-.64c-.12-.1-.28-.22-.46-.4a1.72 1.72 0 0 1-.39-.5 4.46 4.46 0 0 1-.22-.6c-.07-.23-.1-.48-.1-.75 0-.91.33-1.63 1-2.17a4 4 0 0 1 2.57-.8c.97 0 1.8.18 2.47.52zm7.47 5.7v-.3a2.26 2.26 0 0 0-.5-1.44c-.3-.35-.74-.53-1.32-.53-.53 0-.99.2-1.37.58-.38.39-.62.95-.72 1.68h3.91zm1 2.79v1.4c-.6.34-1.38.51-2.36.51a4.02 4.02 0 0 1-3-1.13 4.04 4.04 0 0 1-1.11-2.97c0-1.3.34-2.32 1.02-3.06a3.38 3.38 0 0 1 2.6-1.1c1.03 0 1.85.32 2.46.96.6.64.9 1.57.9 2.78 0 .33-.03.68-.09 1.04h-5.31c.1.7.4 1.24.89 1.61.49.38 1.1.56 1.85.56.86 0 1.58-.2 2.15-.6zm6.61-1.78h-1.21c-.6 0-1.05.12-1.35.36-.3.23-.46.53-.46.89 0 .37.12.66.36.88.23.2.57.32 1.02.32.5 0 .9-.15 1.2-.43.3-.28.44-.65.44-1.1v-.92zm-4.07-2.55V9.33a4.96 4.96 0 0 1 2.5-.55c2.1 0 3.17 1.03 3.17 3.08V17H22.1v-.96c-.42.68-1.15 1.02-2.19 1.02-.76 0-1.38-.22-1.84-.66-.46-.44-.7-1-.7-1.68 0-.78.3-1.38.88-1.81.59-.43 1.4-.65 2.46-.65h1.34v-.46c0-.55-.13-.97-.4-1.25-.26-.29-.7-.43-1.32-.43-.86 0-1.65.24-2.35.72zm9.34-1.93v1.42c.39-1 1.1-1.5 2.12-1.5.15 0 .31.02.5.05v1.53c-.23-.1-.48-.14-.76-.14-.54 0-.99.24-1.34.71a2.8 2.8 0 0 0-.52 1.71V17h-1.57V8.91h1.57zm5 4.09a3 3 0 0 0 .76 2.01c.47.53 1.14.8 2 .8.64 0 1.24-.18 1.8-.53v1.4c-.53.32-1.2.48-2 .48a3.98 3.98 0 0 1-4.17-4.18c0-1.16.38-2.15 1.14-2.98a4 4 0 0 1 3.1-1.23c.7 0 1.34.15 1.92.44v1.44a3.24 3.24 0 0 0-1.77-.5A2.65 2.65 0 0 0 32.33 13zm7.92-7.28v4.58c.46-1 1.3-1.5 2.5-1.5.8 0 1.42.24 1.9.73.48.5.72 1.17.72 2.05V17H43.8v-5.1c0-.56-.14-.99-.43-1.29-.28-.3-.65-.45-1.1-.45-.54 0-1 .2-1.42.6-.4.4-.61 1.02-.61 1.85V17h-1.56V5.72h1.56zM55.2 15.74c.6 0 1.1-.25 1.5-.76.4-.5.6-1.16.6-1.95 0-.92-.2-1.62-.6-2.12-.4-.5-.92-.74-1.55-.74-.56 0-1.05.22-1.5.67-.44.45-.66 1.13-.66 2.06 0 .96.22 1.67.64 2.14.43.47.95.7 1.57.7zM53 5.72v4.42a2.74 2.74 0 0 1 2.43-1.34c1.03 0 1.86.38 2.51 1.15.65.76.97 1.78.97 3.05 0 1.13-.3 2.1-.92 2.9-.62.81-1.47 1.21-2.54 1.21s-1.9-.45-2.46-1.34V17h-1.58V5.72H53zm9.9 11.1l-3.22-7.9h1.74l1 2.62 1.26 3.42c.1-.32.48-1.46 1.15-3.42l.91-2.63h1.66l-2.92 7.87c-.78 2.07-1.96 3.1-3.56 3.1-.28 0-.53-.02-.73-.07v-1.34c.17.04.35.06.54.06 1.03 0 1.76-.57 2.17-1.7z\"\n />\n <path\n fill=\"#5468FF\"\n d=\"M78.99.94h16.6a2.97 2.97 0 0 1 2.96 2.96v16.6a2.97 2.97 0 0 1-2.97 2.96h-16.6a2.97 2.97 0 0 1-2.96-2.96V3.9A2.96 2.96 0 0 1 79 .94\"\n />\n <path\n fill=\"#FFF\"\n d=\"M89.63 5.97v-.78a.98.98 0 0 0-.98-.97h-2.28a.98.98 0 0 0-.97.97V6c0 .09.08.15.17.13a7.13 7.13 0 0 1 3.9-.02c.08.02.16-.04.16-.13m-6.25 1L83 6.6a.98.98 0 0 0-1.38 0l-.46.46a.97.97 0 0 0 0 1.38l.38.39c.06.06.15.04.2-.02a7.49 7.49 0 0 1 1.63-1.62c.07-.04.08-.14.02-.2m4.16 2.45v3.34c0 .1.1.17.2.12l2.97-1.54c.06-.03.08-.12.05-.18a3.7 3.7 0 0 0-3.08-1.87c-.07 0-.14.06-.14.13m0 8.05a4.49 4.49 0 1 1 0-8.98 4.49 4.49 0 0 1 0 8.98m0-10.85a6.37 6.37 0 1 0 0 12.74 6.37 6.37 0 0 0 0-12.74\"\n />\n <path\n :fill=\"theme === 'dark' ? '#FFF': '#5468FF'\"\n d=\"M120.92 18.8c-4.38.02-4.38-3.54-4.38-4.1V1.36l2.67-.42v13.25c0 .32 0 2.36 1.71 2.37v2.24zm-10.84-2.18c.82 0 1.43-.04 1.85-.12v-2.72a5.48 5.48 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.11-.44.28-.58.49a.93.93 0 0 0-.22.65c0 .63.22 1 .61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.62.11 2.23.33.6.22 1.09.53 1.44.92.36.4.61.92.76 1.48.16.56.23 1.17.23 1.85v6.87c-.4.1-1.03.2-1.86.32-.84.12-1.78.18-2.82.18-.69 0-1.32-.07-1.9-.2a4 4 0 0 1-1.46-.63c-.4-.3-.72-.67-.96-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.39-1.53.26-.45.6-.82 1.04-1.1.45-.3.95-.5 1.54-.62a8.8 8.8 0 0 1 3.79.05v-.44c0-.3-.04-.6-.11-.87a1.78 1.78 0 0 0-1.1-1.22c-.31-.12-.7-.2-1.15-.2a9.75 9.75 0 0 0-2.95.46l-.33-2.19c.34-.12.84-.23 1.48-.35.65-.12 1.34-.18 2.08-.18zm52.84 9.63c.82 0 1.43-.05 1.85-.13V13.7a5.42 5.42 0 0 0-1.57-.2c-.3 0-.6.02-.9.07-.3.04-.57.12-.81.24-.24.12-.44.28-.58.5a.93.93 0 0 0-.22.65c0 .63.22.99.61 1.23.4.24.94.36 1.62.36zm-.23-9.7c.88 0 1.63.11 2.23.33.6.22 1.1.53 1.45.92.35.39.6.92.76 1.48.15.56.23 1.18.23 1.85v6.88c-.41.08-1.03.19-1.87.31-.83.12-1.77.18-2.81.18-.7 0-1.33-.06-1.9-.2a4 4 0 0 1-1.47-.63c-.4-.3-.72-.67-.95-1.13a4.3 4.3 0 0 1-.34-1.8c0-.66.13-1.08.38-1.53.26-.45.61-.82 1.05-1.1.44-.3.95-.5 1.53-.62a8.8 8.8 0 0 1 3.8.05v-.43c0-.31-.04-.6-.12-.88-.07-.28-.2-.52-.38-.73a1.78 1.78 0 0 0-.73-.5c-.3-.1-.68-.2-1.14-.2a9.85 9.85 0 0 0-2.95.47l-.32-2.19a11.63 11.63 0 0 1 3.55-.53zm-8.03-1.27a1.62 1.62 0 0 0 0-3.24 1.62 1.62 0 1 0 0 3.24zm1.35 13.22h-2.7V7.27l2.7-.42V18.8zm-4.72 0c-4.38.02-4.38-3.54-4.38-4.1l-.01-13.34 2.67-.42v13.25c0 .32 0 2.36 1.72 2.37v2.24zm-8.7-5.9a4.7 4.7 0 0 0-.74-2.79 2.4 2.4 0 0 0-2.07-1 2.4 2.4 0 0 0-2.06 1 4.7 4.7 0 0 0-.74 2.8c0 1.16.25 1.94.74 2.62a2.4 2.4 0 0 0 2.07 1.02c.88 0 1.57-.34 2.07-1.02.49-.68.73-1.46.73-2.63zm2.74 0a6.46 6.46 0 0 1-1.52 4.23c-.49.53-1.07.94-1.76 1.22-.68.29-1.73.45-2.26.45-.53 0-1.58-.15-2.25-.45a5.1 5.1 0 0 1-2.88-3.13 7.3 7.3 0 0 1-.01-4.84 5.13 5.13 0 0 1 2.9-3.1 5.67 5.67 0 0 1 2.22-.42c.81 0 1.56.14 2.24.42.69.29 1.28.69 1.75 1.22.49.52.87 1.15 1.14 1.89a7 7 0 0 1 .43 2.5zm-20.14 0c0 1.11.25 2.36.74 2.88.5.52 1.13.78 1.91.78a4.07 4.07 0 0 0 2.12-.6V9.33c-.19-.04-.99-.2-1.76-.23a2.67 2.67 0 0 0-2.23 1 4.73 4.73 0 0 0-.78 2.8zm7.44 5.27c0 1.82-.46 3.16-1.4 4-.94.85-2.37 1.27-4.3 1.27-.7 0-2.17-.13-3.34-.4l.43-2.11c.98.2 2.27.26 2.95.26 1.08 0 1.84-.22 2.3-.66.46-.43.68-1.08.68-1.94v-.44a5.2 5.2 0 0 1-2.54.6 5.6 5.6 0 0 1-2.01-.36 4.2 4.2 0 0 1-2.58-2.71 9.88 9.88 0 0 1 .02-5.35 4.92 4.92 0 0 1 2.93-2.96 6.6 6.6 0 0 1 2.43-.46 19.64 19.64 0 0 1 4.43.66v10.6z\"\n />\n </svg>\n </a>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisPoweredBy',\n mixins: [createSuitMixin({ name: 'PoweredBy' })],\n props: {\n theme: {\n default: 'light',\n validator(value) {\n return ['light', 'dark'].indexOf(value) !== -1;\n },\n },\n },\n computed: {\n algoliaUrl() {\n return (\n 'https://www.algolia.com/?' +\n 'utm_source=vue-instantsearch&' +\n 'utm_medium=website&' +\n `utm_content=${location ? location.hostname : ''}&` +\n 'utm_campaign=poweredby'\n );\n },\n },\n};\n</script>\n","import { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nexport default {\n name: 'AisQueryRuleContext',\n mixins: [\n createSuitMixin({ name: 'QueryRuleContext' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleContext',\n }\n ),\n ],\n props: {\n trackedFilters: {\n type: Object,\n required: true,\n },\n transformRuleContexts: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n trackedFilters: this.trackedFilters,\n transformRuleContexts: this.transformRuleContexts,\n };\n },\n },\n render() {\n return null;\n },\n};\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot :items=\"state.items\">\n <div\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n >\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nexport default {\n name: 'AisQueryRuleCustomData',\n mixins: [\n createSuitMixin({ name: 'QueryRuleCustomData' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleCustomData',\n }\n ),\n ],\n props: {\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot :items=\"state.items\">\n <div\n v-for=\"(item, key) in state.items\"\n :key=\"key\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n >\n <pre>{{ item }}</pre>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectQueryRules } from 'instantsearch.js/es/connectors';\n\nexport default {\n name: 'AisQueryRuleCustomData',\n mixins: [\n createSuitMixin({ name: 'QueryRuleCustomData' }),\n createWidgetMixin(\n {\n connector: connectQueryRules,\n },\n {\n $$widgetType: 'ais.queryRuleCustomData',\n }\n ),\n ],\n props: {\n transformItems: {\n type: Function,\n required: false,\n default: undefined,\n },\n },\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n };\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !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(\n {\n connector: connectRange,\n },\n {\n $$widgetType: 'ais.rangeInput',\n }\n ),\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: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n 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(), !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(\n {\n connector: connectRange,\n },\n {\n $$widgetType: 'ais.rangeInput',\n }\n ),\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: undefined,\n },\n max: {\n type: Number,\n required: false,\n default: undefined,\n },\n precision: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n data() {\n return {\n minInput: undefined,\n maxInput: undefined,\n };\n },\n updated() {\n this.minInput = undefined;\n this.maxInput = undefined;\n },\n computed: {\n widgetParams() {\n return {\n attribute: this.attribute,\n min: this.min,\n max: this.max,\n precision: this.precision,\n };\n },\n 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\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin(\n {\n connector: connectRatingMenu,\n },\n {\n $$widgetType: 'ais.ratingMenu',\n }\n ),\n createPanelConsumerMixin({\n 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 <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\">&amp; Up</slot>\n </span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </a>\n </li>\n </ul>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRatingMenu } from 'instantsearch.js/es/connectors';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisRatingMenu',\n mixins: [\n createSuitMixin({ name: 'RatingMenu' }),\n createWidgetMixin(\n {\n connector: connectRatingMenu,\n },\n {\n $$widgetType: 'ais.ratingMenu',\n }\n ),\n createPanelConsumerMixin({\n 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 in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n required\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"$emit('input', $event.target.value); $emit('update:modelValue', $event.target.value)\"\n ref=\"input\"\n >\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"(!value && !modelValue) || (showLoadingIndicator && shouldShowLoadingIndicator)\"\n >\n <slot name=\"reset-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n role=\"img\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n transform=\"translate(1 1)\"\n stroke-width=\"2\"\n >\n <circle\n stroke-opacity=\".5\"\n cx=\"18\"\n cy=\"18\"\n r=\"18\"\n />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <form\n action=\"\"\n role=\"search\"\n novalidate\n :class=\"suit('form')\"\n @submit.prevent=\"onFormSubmit\"\n @reset.prevent=\"onFormReset\"\n >\n <!-- :value/@input allows us to pass v-model to the component in v2 -->\n <!-- :modelValue/@update:modelValue allows us to pass v-model to the component in v3 -->\n <input\n type=\"search\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n required\n maxlength=\"512\"\n aria-label=\"Search\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :class=\"suit('input')\"\n :value=\"value || modelValue\"\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @input=\"$emit('input', $event.target.value); $emit('update:modelValue', $event.target.value)\"\n ref=\"input\"\n >\n <button\n type=\"submit\"\n :title=\"submitTitle\"\n :class=\"suit('submit')\"\n :hidden=\"showLoadingIndicator && shouldShowLoadingIndicator\"\n >\n <slot name=\"submit-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 40 40\"\n :class=\"suit('submitIcon')\"\n >\n <path\n d=\"M26.804 29.01c-2.832 2.34-6.465 3.746-10.426 3.746C7.333 32.756 0 25.424 0 16.378 0 7.333 7.333 0 16.378 0c9.046 0 16.378 7.333 16.378 16.378 0 3.96-1.406 7.594-3.746 10.426l10.534 10.534c.607.607.61 1.59-.004 2.202-.61.61-1.597.61-2.202.004L26.804 29.01zm-10.426.627c7.323 0 13.26-5.936 13.26-13.26 0-7.32-5.937-13.257-13.26-13.257C9.056 3.12 3.12 9.056 3.12 16.378c0 7.323 5.936 13.26 13.258 13.26z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <button\n type=\"reset\"\n :title=\"resetTitle\"\n :class=\"suit('reset')\"\n :hidden=\"(!value && !modelValue) || (showLoadingIndicator && shouldShowLoadingIndicator)\"\n >\n <slot name=\"reset-icon\">\n <svg\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 20 20\"\n :class=\"suit('resetIcon')\"\n >\n <path\n d=\"M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z\"\n fillRule=\"evenodd\"\n />\n </svg>\n </slot>\n </button>\n\n <span\n v-if=\"showLoadingIndicator\"\n :hidden=\"!shouldShowLoadingIndicator\"\n :class=\"suit('loadingIndicator')\"\n >\n <slot name=\"loading-indicator\">\n <svg\n role=\"img\"\n aria-label=\"Results are loading\"\n width=\"16\"\n height=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"#444\"\n viewBox=\"0 0 38 38\"\n :class=\"suit('loadingIcon')\"\n >\n <g\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <g\n transform=\"translate(1 1)\"\n stroke-width=\"2\"\n >\n <circle\n stroke-opacity=\".5\"\n cx=\"18\"\n cy=\"18\"\n r=\"18\"\n />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n </slot>\n </span>\n </form>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'SearchInput',\n mixins: [createSuitMixin({ name: 'SearchBox' })],\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n shouldShowLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n required: false,\n default: undefined,\n },\n modelValue: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['input', 'update:modelValue', 'blur', 'focus', 'reset'],\n data() {\n return {\n query: '',\n };\n },\n methods: {\n onFormSubmit() {\n const input = this.$refs.input;\n input.blur();\n },\n onFormReset() {\n this.$emit('input', '');\n this.$emit('update:modelValue', '');\n this.$emit('reset');\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"[\n suit(),\n !state.canRefine && suit('','noRefinement')\n ]\"\n v-if=\"state\"\n >\n <slot\n :items=\"items\"\n :refine=\"refine\"\n :search-for-items=\"state.searchForItems\"\n :search-for-items-query=\"searchForFacetValuesQuery\"\n :toggle-show-more=\"toggleShowMore\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :createURL=\"state.createURL\"\n :is-from-search=\"state.isFromSearch\"\n :can-refine=\"state.canRefine\"\n :send-event=\"state.sendEvent\"\n >\n <div\n :class=\"suit('searchBox')\"\n v-if=\"searchable\"\n >\n <search-input\n v-model=\"searchForFacetValues\"\n :placeholder=\"searchablePlaceholder\"\n :class-names=\"classNames\"\n />\n </div>\n <slot\n name=\"noResults\"\n :query=\"searchForFacetValues\"\n v-if=\"state.isFromSearch && items.length === 0\"\n >\n <div :class=\"suit('noResults')\">No results.</div>\n </slot>\n <ul :class=\"suit('list')\">\n <li\n :class=\"[\n suit('item'), item.isRefined && suit('item', 'selected')]\"\n v-for=\"item in items\"\n :key=\"item.value\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"refine(item.value)\"\n >\n <span\n v-if=\"searchable\"\n :class=\"suit('labelText')\"\n >\n <ais-highlight\n attribute=\"item\"\n :hit=\"item\"\n />\n </span>\n <span\n v-else\n :class=\"suit('labelText')\"\n >{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </label>\n </slot>\n </li>\n </ul>\n <button\n :class=\"[\n suit('showMore'),\n {\n [suit('showMore', 'disabled')]: !state.canToggleShowMore,\n }\n ]\"\n @click=\"toggleShowMore\"\n v-if=\"showMore\"\n :disabled=\"!state.canToggleShowMore\"\n >\n <slot\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >Show {{ state.isShowingMore ? 'less' : 'more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\nimport SearchInput from './SearchInput.vue';\nimport AisHighlight from './Highlight.vue';\n\nconst noop = () => {};\n\nexport default {\n name: 'AisRefinementList',\n components: { SearchInput, AisHighlight },\n mixins: [\n createSuitMixin({ name: 'RefinementList' }),\n createWidgetMixin(\n {\n connector: connectRefinementList,\n },\n {\n $$widgetType: 'ais.refinementList',\n }\n ),\n createPanelConsumerMixin({\n 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","<template>\n <div\n :class=\"[\n suit(),\n !state.canRefine && suit('','noRefinement')\n ]\"\n v-if=\"state\"\n >\n <slot\n :items=\"items\"\n :refine=\"refine\"\n :search-for-items=\"state.searchForItems\"\n :search-for-items-query=\"searchForFacetValuesQuery\"\n :toggle-show-more=\"toggleShowMore\"\n :can-toggle-show-more=\"state.canToggleShowMore\"\n :is-showing-more=\"state.isShowingMore\"\n :createURL=\"state.createURL\"\n :is-from-search=\"state.isFromSearch\"\n :can-refine=\"state.canRefine\"\n :send-event=\"state.sendEvent\"\n >\n <div\n :class=\"suit('searchBox')\"\n v-if=\"searchable\"\n >\n <search-input\n v-model=\"searchForFacetValues\"\n :placeholder=\"searchablePlaceholder\"\n :class-names=\"classNames\"\n />\n </div>\n <slot\n name=\"noResults\"\n :query=\"searchForFacetValues\"\n v-if=\"state.isFromSearch && items.length === 0\"\n >\n <div :class=\"suit('noResults')\">No results.</div>\n </slot>\n <ul :class=\"suit('list')\">\n <li\n :class=\"[\n suit('item'), item.isRefined && suit('item', 'selected')]\"\n v-for=\"item in items\"\n :key=\"item.value\"\n >\n <slot\n name=\"item\"\n :item=\"item\"\n :refine=\"refine\"\n :createURL=\"state.createURL\"\n >\n <label :class=\"suit('label')\">\n <input\n :class=\"suit('checkbox')\"\n type=\"checkbox\"\n :value=\"item.value\"\n :checked=\"item.isRefined\"\n @change=\"refine(item.value)\"\n >\n <span\n v-if=\"searchable\"\n :class=\"suit('labelText')\"\n >\n <ais-highlight\n attribute=\"item\"\n :hit=\"item\"\n />\n </span>\n <span\n v-else\n :class=\"suit('labelText')\"\n >{{ item.label }}</span>\n <span :class=\"suit('count')\">{{ item.count }}</span>\n </label>\n </slot>\n </li>\n </ul>\n <button\n :class=\"[\n suit('showMore'),\n {\n [suit('showMore', 'disabled')]: !state.canToggleShowMore,\n }\n ]\"\n @click=\"toggleShowMore\"\n v-if=\"showMore\"\n :disabled=\"!state.canToggleShowMore\"\n >\n <slot\n name=\"showMoreLabel\"\n :is-showing-more=\"state.isShowingMore\"\n >Show {{ state.isShowingMore ? 'less' : 'more' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createPanelConsumerMixin } from '../mixins/panel';\nimport { createSuitMixin } from '../mixins/suit';\nimport { connectRefinementList } from 'instantsearch.js/es/connectors';\nimport SearchInput from './SearchInput.vue';\nimport AisHighlight from './Highlight.vue';\n\nconst noop = () => {};\n\nexport default {\n name: 'AisRefinementList',\n components: { SearchInput, AisHighlight },\n mixins: [\n createSuitMixin({ name: 'RefinementList' }),\n createWidgetMixin(\n {\n connector: connectRefinementList,\n },\n {\n $$widgetType: 'ais.refinementList',\n }\n ),\n createPanelConsumerMixin({\n 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:\n </p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</pre>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport connectStateResults from '../connectors/connectStateResults';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin(\n {\n connector: connectStateResults,\n },\n {\n $$widgetType: 'ais.stateResults',\n }\n ),\n createSuitMixin({ name: 'StateResults' }),\n ],\n computed: {\n stateResults() {\n // @MAJOR: replace v-bind=\"stateResults\" with :state=\"state.state\" :results=\"state.results\"\n const { state, results } = this.state;\n return _objectSpread({}, results, { results, state });\n },\n },\n};\n</script>\n","<template>\n <div\n :class=\"suit()\"\n v-if=\"state && state.state && state.results\"\n >\n <slot v-bind=\"stateResults\">\n <p>\n Use this component to have a different layout based on a certain state.\n </p>\n <p>\n Fill in the slot, and get access to the following things:\n </p>\n <pre>results: {{ Object.keys(state.results) }}</pre>\n <pre>state: {{ Object.keys(state.state) }}</pre>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { _objectSpread } from '../util/polyfills';\nimport connectStateResults from '../connectors/connectStateResults';\n\nexport default {\n name: 'AisStateResults',\n mixins: [\n createWidgetMixin(\n {\n connector: connectStateResults,\n },\n {\n $$widgetType: 'ais.stateResults',\n }\n ),\n createSuitMixin({ name: 'StateResults' }),\n ],\n computed: {\n stateResults() {\n // @MAJOR: replace v-bind=\"stateResults\" with :state=\"state.state\" :results=\"state.results\"\n const { state, results } = this.state;\n return _objectSpread({}, results, { results, state });\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n :current-refinement=\"currentRefinement\"\n :is-search-stalled=\"state.isSearchStalled\"\n :refine=\"state.refine\"\n >\n <search-input\n @focus=\"$emit('focus', $event)\"\n @blur=\"$emit('blur', $event)\"\n @reset=\"$emit('reset')\"\n :placeholder=\"placeholder\"\n :autofocus=\"autofocus\"\n :show-loading-indicator=\"showLoadingIndicator\"\n :should-show-loading-indicator=\"state.isSearchStalled\"\n :submit-title=\"submitTitle\"\n :reset-title=\"resetTitle\"\n :class-names=\"classNames\"\n v-model=\"currentRefinement\"\n >\n <template\n v-slot:loading-indicator\n v-if=\"isVue3\"\n >\n <slot\n name=\"loading-indicator\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n\n <template\n v-slot:submit-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"submit-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n\n <template\n v-slot:reset-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"reset-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"reset-icon\"\n slot=\"reset-icon\"\n />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin(\n {\n connector: connectSearchBox,\n },\n {\n $$widgetType: 'ais.searchBox',\n }\n ),\n createSuitMixin({ name: 'SearchBox' }),\n ],\n components: {\n SearchInput,\n },\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: String,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <div\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 <template\n v-slot:loading-indicator\n v-if=\"isVue3\"\n >\n <slot\n name=\"loading-indicator\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"loading-indicator\"\n slot=\"loading-indicator\"\n />\n\n <template\n v-slot:submit-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"submit-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"submit-icon\"\n slot=\"submit-icon\"\n />\n\n <template\n v-slot:reset-icon\n v-if=\"isVue3\"\n >\n <slot\n name=\"reset-icon\"\n />\n </template>\n <slot\n v-if=\"isVue2\"\n name=\"reset-icon\"\n slot=\"reset-icon\"\n />\n </search-input>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectSearchBox } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { isVue3, isVue2 } from '../util/vue-compat';\nimport SearchInput from './SearchInput.vue';\n\nexport default {\n name: 'AisSearchBox',\n mixins: [\n createWidgetMixin(\n {\n connector: connectSearchBox,\n },\n {\n $$widgetType: 'ais.searchBox',\n }\n ),\n createSuitMixin({ name: 'SearchBox' }),\n ],\n components: {\n SearchInput,\n },\n props: {\n placeholder: {\n type: String,\n default: 'Search here…',\n },\n autofocus: {\n type: Boolean,\n default: false,\n },\n showLoadingIndicator: {\n type: Boolean,\n default: false,\n },\n submitTitle: {\n type: String,\n default: 'Search',\n },\n resetTitle: {\n type: String,\n default: 'Clear',\n },\n value: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: String,\n default: undefined,\n },\n },\n data() {\n return {\n localValue: '',\n isVue2,\n isVue3,\n };\n },\n computed: {\n isControlled() {\n return (\n typeof this.value !== 'undefined' ||\n typeof this.modelValue !== 'undefined'\n );\n },\n model() {\n return this.value || this.modelValue;\n },\n currentRefinement: {\n get() {\n // if the input is controlled, but not up to date\n // this means it didn't search, and we should pretend it was `set`\n if (this.isControlled && this.model !== this.localValue) {\n // eslint-disable-next-line vue/no-side-effects-in-computed-properties\n this.localValue = this.model;\n this.$emit('input', this.model);\n this.$emit('update:modelValue', this.model);\n this.state.refine(this.model);\n }\n return this.model || this.state.query || '';\n },\n set(val) {\n this.localValue = val;\n this.state.refine(val);\n if (this.isControlled) {\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n }\n },\n },\n },\n};\n</script>\n","<template>\n <ais-highlighter\n :hit=\"hit\"\n :attribute=\"attribute\"\n :highlighted-tag-name=\"highlightedTagName\"\n :suit=\"suit\"\n highlight-property=\"_snippetResult\"\n pre-tag=\"<mark>\"\n post-tag=\"</mark>\"\n />\n</template>\n\n<script>\nimport { createSuitMixin } from '../mixins/suit';\nimport AisHighlighter from './Highlighter.vue';\n\nexport default {\n name: 'AisSnippet',\n mixins: [createSuitMixin({ name: 'Snippet' })],\n components: { AisHighlighter },\n props: {\n hit: {\n type: Object,\n required: true,\n },\n attribute: {\n type: String,\n required: true,\n },\n highlightedTagName: {\n type: String,\n default: 'mark',\n },\n },\n};\n</script>\n","<template>\n <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(\n { connector: connectSortBy },\n {\n $$widgetType: 'ais.sortBy',\n }\n ),\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 :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(\n { connector: connectSortBy },\n {\n $$widgetType: 'ais.sortBy',\n }\n ),\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(\n { connector: connectStats },\n {\n $$widgetType: 'ais.stats',\n }\n ),\n createSuitMixin({ name: 'Stats' }),\n ],\n computed: {\n widgetParams() {\n return {};\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"suit()\"\n >\n <slot\n v-bind=\"state\"\n :results=\"state.instantSearchInstance.helper.lastResults\"\n >\n <span :class=\"suit('text')\"><template v-if=\"state.areHitsSorted\">{{ state.nbSortedHits.toLocaleString() }} relevant results sorted out of {{ state.nbHits.toLocaleString() }}</template><template v-else>{{ state.nbHits.toLocaleString() }} results</template> found in {{ state.processingTimeMS.toLocaleString() }}ms</span>\n </slot>\n </div>\n</template>\n\n<script>\nimport { createWidgetMixin } from '../mixins/widget';\nimport { connectStats } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisStats',\n mixins: [\n createWidgetMixin(\n { connector: connectStats },\n {\n $$widgetType: 'ais.stats',\n }\n ),\n createSuitMixin({ name: 'Stats' }),\n ],\n computed: {\n widgetParams() {\n return {};\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state\"\n :class=\"[suit(), !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(\n {\n connector: connectToggleRefinement,\n },\n {\n $$widgetType: 'ais.toggleRefinement',\n }\n ),\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(), !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(\n {\n connector: connectToggleRefinement,\n },\n {\n $$widgetType: 'ais.toggleRefinement',\n }\n ),\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(\n {\n connector: connectVoiceSearch,\n },\n {\n $$widgetType: 'ais.voiceSearch',\n }\n ),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n 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\"\n :class=\"suit()\"\n >\n <slot v-bind=\"rootSlotProps\">\n <button\n type=\"button\"\n :class=\"suit('button')\"\n :title=\"state.isBrowserSupported ? buttonTitle : disabledButtonTitle\"\n :disabled=\"!state.isBrowserSupported\"\n @click=\"handleClick\"\n >\n <slot\n name=\"buttonText\"\n v-bind=\"innerSlotProps\"\n >\n <svg\n v-bind=\"buttonSvgAttrs\"\n v-if=\"errorNotAllowed\"\n >\n <line\n x1=\"1\"\n y1=\"1\"\n x2=\"23\"\n y2=\"23\"\n />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\" />\n <path d=\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\" />\n <line\n x1=\"12\"\n y1=\"19\"\n x2=\"12\"\n y2=\"23\"\n />\n <line\n x1=\"8\"\n y1=\"23\"\n x2=\"16\"\n y2=\"23\"\n />\n </svg>\n <svg\n v-bind=\"buttonSvgAttrs\"\n v-else\n >\n <path\n d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"\n :fill=\"state.isListening ? 'currentColor' : 'none'\"\n />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line\n x1=\"12\"\n y1=\"19\"\n x2=\"12\"\n y2=\"23\"\n />\n <line\n x1=\"8\"\n y1=\"23\"\n x2=\"16\"\n y2=\"23\"\n />\n </svg>\n </slot>\n </button>\n <div :class=\"suit('status')\">\n <slot\n name=\"status\"\n v-bind=\"innerSlotProps\"\n >\n <p>{{ state.voiceListeningState.transcript }}</p>\n </slot>\n </div>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectVoiceSearch } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { createWidgetMixin } from '../mixins/widget';\n\nexport default {\n name: 'AisVoiceSearch',\n mixins: [\n createWidgetMixin(\n {\n connector: connectVoiceSearch,\n },\n {\n $$widgetType: 'ais.voiceSearch',\n }\n ),\n createSuitMixin({ name: 'VoiceSearch' }),\n ],\n props: {\n searchAsYouSpeak: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n 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(\n {\n connector: connectRelevantSort,\n },\n {\n $$widgetType: 'ais.relevantSort',\n }\n ),\n ],\n methods: {\n refine() {\n if (this.state.isRelevantSorted) {\n this.state.refine(0);\n } else {\n this.state.refine(undefined);\n }\n },\n },\n};\n</script>\n","<template>\n <div\n v-if=\"state && state.isVirtualReplica\"\n :class=\"suit()\"\n >\n <slot\n :is-relevant-sorted=\"state.isRelevantSorted\"\n :refine=\"state.refine\"\n >\n <div :class=\"suit('text')\">\n <slot\n name=\"text\"\n :is-relevant-sorted=\"state.isRelevantSorted\"\n />\n </div>\n <button\n type=\"button\"\n :class=\"suit('button')\"\n @click=\"refine()\"\n >\n <slot\n name=\"button\"\n :is-relevant-sorted=\"state.isRelevantSorted\"\n >{{ state.isRelevantSorted ? 'See all results' : 'See relevant results' }}</slot>\n </button>\n </slot>\n </div>\n</template>\n\n<script>\nimport { connectRelevantSort } from 'instantsearch.js/es/connectors';\nimport { createWidgetMixin } from '../mixins/widget';\nimport { createSuitMixin } from '../mixins/suit';\n\nexport default {\n name: 'AisRelevantSort',\n mixins: [\n createSuitMixin({ name: 'RelevantSort' }),\n createWidgetMixin(\n {\n connector: connectRelevantSort,\n },\n {\n $$widgetType: 'ais.relevantSort',\n }\n ),\n ],\n methods: {\n refine() {\n if (this.state.isRelevantSorted) {\n this.state.refine(0);\n } else {\n this.state.refine(undefined);\n }\n },\n },\n};\n</script>\n","import { createWidgetMixin } from '../mixins/widget';\nimport { connectDynamicWidgets } from 'instantsearch.js/es/connectors';\nimport { createSuitMixin } from '../mixins/suit';\nimport { _objectSpread } from '../util/polyfills';\nimport { isVue3, renderCompat, getDefaultSlot } from '../util/vue-compat';\n\nfunction getWidgetAttribute(vnode) {\n const props = isVue3\n ? vnode.props\n : vnode.componentOptions && vnode.componentOptions.propsData;\n if (props) {\n if (props.attribute) {\n return props.attribute;\n }\n if (Array.isArray(props.attributes)) {\n return props.attributes[0];\n }\n }\n\n let children;\n if (isVue3) {\n children =\n vnode.children && vnode.children.default && vnode.children.default();\n } else {\n children =\n vnode.componentOptions && vnode.componentOptions.children\n ? vnode.componentOptions.children\n : vnode.children;\n }\n\n if (Array.isArray(children)) {\n // return first child with a truthy attribute\n return children.reduce(\n (acc, curr) => acc || getWidgetAttribute(curr),\n undefined\n );\n }\n\n return undefined;\n}\n\nexport default {\n name: 'AisDynamicWidgets',\n mixins: [\n createWidgetMixin(\n {\n connector: connectDynamicWidgets,\n },\n {\n $$widgetType: 'ais.dynamicWidgets',\n }\n ),\n createSuitMixin({ name: 'DynamicWidgets' }),\n ],\n props: {\n transformItems: {\n type: Function,\n default: undefined,\n },\n facets: {\n type: Array,\n default: undefined,\n },\n maxValuesPerFacet: {\n type: Number,\n default: undefined,\n },\n },\n render: renderCompat(function(h) {\n const components = new Map();\n\n (getDefaultSlot(this) || []).forEach(vnode => {\n const attribute = getWidgetAttribute(vnode);\n if (attribute) {\n components.set(\n attribute,\n h('div', { key: attribute, class: [this.suit('widget')] }, [vnode])\n );\n }\n });\n\n // by default, render everything, but hidden so that the routing doesn't disappear\n if (!this.state) {\n const allComponents = [];\n components.forEach(component => allComponents.push(component));\n\n return h(\n 'div',\n _objectSpread(\n {\n class: [this.suit()],\n },\n { attrs: { hidden: true } }\n ),\n allComponents\n );\n }\n\n return h(\n 'div',\n { class: [this.suit()] },\n this.state.attributesToRender.map(attribute => components.get(attribute))\n );\n }),\n computed: {\n widgetParams() {\n return {\n transformItems: this.transformItems,\n facets: this.facets,\n maxValuesPerFacet: this.maxValuesPerFacet,\n // we do not pass \"widgets\" to the connector, since Vue is in charge of rendering\n widgets: [],\n };\n },\n },\n};\n","import AisDynamicWidgets from './DynamicWidgets';\nimport { warn } from '../util/warn';\n\n// @MAJOR remove this file\nexport default Object.assign({}, AisDynamicWidgets, {\n name: 'AisExperimentalDynamicWidgets',\n mounted() {\n warn('Use AisDynamicWidgets instead of AisExperimentalDynamicWidgets.');\n },\n});\n","/* eslint import/namespace: ['error', { allowComputed: true }]*/\n\nimport * as widgets from './widgets';\n\nexport const plugin = {\n install(localVue) {\n Object.keys(widgets).forEach(widgetName => {\n localVue.component(widgets[widgetName].name, widgets[widgetName]);\n });\n },\n};\n","import instantsearch from 'instantsearch.js/es';\nimport { isVue3, isVue2, Vue2, createSSRApp } from './vue-compat';\nimport { warn } from './warn';\n\nfunction walkIndex(indexWidget, visit) {\n visit(indexWidget);\n\n return indexWidget.getWidgets().forEach(widget => {\n if (widget.$$type !== 'ais.index') return;\n visit(widget);\n walkIndex(widget, visit);\n });\n}\n\nfunction searchOnlyWithDerivedHelpers(helper) {\n return new Promise((resolve, reject) => {\n helper.searchOnlyWithDerivedHelpers();\n\n // we assume all derived helpers resolve at least in the same tick\n helper.derivedHelpers[0].on('result', () => {\n resolve();\n });\n\n helper.derivedHelpers.forEach(derivedHelper =>\n derivedHelper.on('error', e => {\n reject(e);\n })\n );\n });\n}\n\nfunction defaultCloneComponent(componentInstance, { mixins = [] } = {}) {\n const options = {\n serverPrefetch: undefined,\n fetch: undefined,\n _base: undefined,\n name: 'ais-ssr-root-component',\n };\n\n let app;\n\n if (isVue3) {\n const appOptions = Object.assign({}, componentInstance.$options, options);\n appOptions.mixins = [...mixins, ...(appOptions.mixins || [])];\n app = createSSRApp(appOptions);\n if (componentInstance.$router) {\n app.use(componentInstance.$router);\n }\n if (componentInstance.$store) {\n app.use(componentInstance.$store);\n }\n } else {\n // copy over global Vue APIs\n options.router = componentInstance.$router;\n options.store = componentInstance.$store;\n\n const Extended = componentInstance.$vnode\n ? componentInstance.$vnode.componentOptions.Ctor.extend(options)\n : Vue2.component(\n options.name,\n Object.assign({}, componentInstance.$options, options)\n );\n\n app = new Extended({\n propsData: componentInstance.$options.propsData,\n mixins: [...mixins],\n });\n }\n\n // https://stackoverflow.com/a/48195006/3185307\n app.$slots = componentInstance.$slots;\n app.$root = componentInstance.$root;\n if (isVue2) {\n app.$options.serverPrefetch = [];\n }\n\n return app;\n}\n\nfunction augmentInstantSearch(instantSearchOptions, cloneComponent) {\n const search = instantsearch(instantSearchOptions);\n\n let initialResults;\n\n /**\n * main API for SSR, called in serverPrefetch of a root component which contains instantsearch\n * @param {Object} props the object including `component` and `renderToString`\n * @param {Object} props.component the calling component's `this`\n * @param {Function} props.renderToString the function to render componentInstance to string\n * @returns {Promise} result of the search, to save for .hydrate\n */\n search.findResultsState = function({ component, renderToString }) {\n if (!renderToString) {\n throw new Error(\n 'findResultsState requires `renderToString: (component) => Promise<string>` in the first argument.'\n );\n }\n\n let app;\n let instance;\n\n return Promise.resolve()\n .then(() => {\n app = cloneComponent(component, {\n mixins: [\n {\n beforeCreate() {\n if (component.$nuxt) {\n // In case of Nuxt (3), we ensure the context is shared between\n // the real and cloned component\n this.$nuxt = component.$nuxt;\n }\n },\n created() {\n instance = this.instantsearch;\n\n instance.start();\n // although we use start for initializing the main index,\n // we don't want to send search requests yet\n instance.started = false;\n },\n },\n ],\n });\n })\n .then(() => renderToString(app))\n .then(() => searchOnlyWithDerivedHelpers(instance.mainHelper))\n .then(() => {\n initialResults = {};\n walkIndex(instance.mainIndex, widget => {\n const { _state, _rawResults } = widget.getResults();\n\n initialResults[widget.getIndexId()] = {\n // copy just the values of SearchParameters, not the functions\n state: Object.keys(_state).reduce((acc, key) => {\n // eslint-disable-next-line no-param-reassign\n acc[key] = _state[key];\n return acc;\n }, {}),\n results: _rawResults,\n };\n });\n\n search.hydrate(initialResults);\n return search.getState();\n });\n };\n\n /**\n * @returns {Promise} result state to serialize and enter into .hydrate\n */\n search.getState = function() {\n if (!initialResults) {\n throw new Error('You need to wait for findResultsState to finish');\n }\n return initialResults;\n };\n\n /**\n * make sure correct data is available in each widget's state.\n * called in widget mixin with (this.widget, this)\n *\n * @param {object} widget The widget instance\n * @param {object} parent The local parent index\n * @returns {void}\n */\n search.__forceRender = function(widget, parent) {\n const results = parent.getResults();\n\n // this happens when a different InstantSearch gets rendered initially,\n // after the hydrate finished. There's thus no initial results available.\n if (results === null) {\n return;\n }\n\n const state = results._state;\n\n const localHelper = parent.getHelper();\n // helper gets created in init, but that means it doesn't get the injected\n // parameters, because those are from the lastResults\n localHelper.state = state;\n\n widget.render({\n helper: localHelper,\n results,\n scopedResults: parent.getScopedResults(),\n parent,\n state,\n templatesConfig: {},\n createURL: parent.createURL,\n instantSearchInstance: search,\n searchMetadata: {\n isSearchStalled: false,\n },\n });\n };\n\n /**\n * Called both in server\n * @param {object} results a map of indexId: SearchResults\n * @returns {void}\n */\n search.hydrate = function(results) {\n if (!results) {\n warn(\n 'The result of `findResultsState()` needs to be passed to `hydrate()`.'\n );\n return;\n }\n\n search._initialResults = results;\n\n search.start();\n search.started = false;\n };\n return search;\n}\n\nexport function createServerRootMixin(instantSearchOptions = {}) {\n const { $cloneComponent = defaultCloneComponent } = instantSearchOptions;\n\n const search = augmentInstantSearch(instantSearchOptions, $cloneComponent);\n\n // put this in the user's root Vue instance\n // we can then reuse that InstantSearch instance seamlessly from `ais-instant-search-ssr`\n const rootMixin = {\n provide() {\n return {\n $_ais_ssrInstantSearchInstance: this.instantsearch,\n };\n },\n data() {\n return {\n // this is in data, so that the real & cloned render do not share\n // the same instantsearch instance.\n instantsearch: search,\n };\n },\n };\n\n return rootMixin;\n}\n"],"names":["suit","widgetName","element","modifier","Error","const","elements","push","join","createSuitMixin","ref","props","classNames","type","Object","default","undefined","methods","className","name","userClassName","this","_objectSpread","target","i","arguments","length","source","ownKeys","keys","getOwnPropertySymbols","concat","filter","sym","getOwnPropertyDescriptor","enumerable","forEach","key","_defineProperty","obj","value","defineProperty","configurable","writable","isVue2","isVue3","renderCompat","fn","h","tag","children","attrs","flatProps","assign","Vue.h","call","getDefaultSlot","component","$slots","cache","Set","warn","message","has","add","console","createWidgetMixin","additionalProperties","inject","instantSearchInstance","from","$options","_componentTag","TypeError","getParentIndex","mainIndex","data","state","created","connector","factory","updateState","widget","widgetParams","addWidgets","_initialResults","started","__forceRender","removeWidgets","watch","handler","nextWidgetParams","deep","isFirstRender","mixins","connectAutocomplete","$$widgetType","escapeHTML","Boolean","required","computed","_createVNode","_ctx","_createBlock","class","_renderSlot","refine","currentRefinement","indices","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","PANEL_EMITTER_NAMESPACE","PANEL_CHANGE_EVENT","createPanelProviderMixin","emitter","mitt","provide","canRefine","on","updateCanRefine","all","clear","createPanelConsumerMixin","emit","hasAlreadyEmitted","immediate","nextState","previousState","previousCanRefine","mapStateToCanRefine","nextCanRefine","connectBreadcrumb","attributes","Array","separator","String","rootPath","transformItems","Function","isLastItem","index","items","createURL","href","onClick","item","label","aria-hidden","connectClearRefinements","hasRefinements","excludedAttributes","includedAttributes","disabled","inheritAttrs","connectConfigure","searchParameters","$attrs","render","slot","EXPERIMENTAL_connectConfigureRelatedItems","hit","matchingPatterns","transformSearchParameters","connectCurrentRefinements","noRefinement","createItemKey","attribute","capitalize","toString","charAt","toLocaleUpperCase","slice","refinements","refinement","level","Number","$props","count","connectHierarchicalMenu","components","HierarchicalMenuList","limit","showMoreLimit","showMore","sortBy","showParentLevel","canToggleShowMore","isShowingMore","toggleShowMore","sendEvent","htmlUnescapes","&amp;","&lt;","&gt;","&quot;","&#39;","reEscapedHtml","reHasEscapedHtml","RegExp","unescape","string","test","replace","character","TAG_PLACEHOLDER","highlightPreTag","highlightPostTag","parseHighlightedAttribute","splitByPreTag","highlightedValue","split","preTag","firstValue","shift","isHighlighted","postTag","let","splitByPostTag","parseAlgoliaHit","highlightObject","getPropertyByPath","highlightProperty","isArray","map","TextNode","context","slots","highlightedTagName","parsedHighlights","$data","AisHighlighter","highlighted-tag-name","highlight-property","pre-tag","post-tag","connectHitsWithInsights","hits","insights","itemIndex","objectID","connectHitsPerPage","hasNoResults","selected","find","handleChange","onChange","connectIndex","indexWidget","$_ais_getParentIndex","indexName","indexId","createInstantSearchComponent","$_ais_instantSearchInstance","searchClient","helper","setClient","search","setIndex","stalledSearchDelay","_stalledSearchDelay","routing","searchFunction","_searchFunction","middlewares","next","prev","middleware","indexOf","middlewareToRemove","unuse","middlewareToAdd","use","client","addAlgoliaAgent","vueVersion","version","mounted","$nextTick","start","dispose","__initialSearchResults","oldApiWarning","insightsClient","validator","router","stateMapping","initialUiState","apiKey","appId","instantsearch","$_ais_ssrInstantSearchInstance","connectInfiniteHitsWithInsights","showPrevious","refinePrevious","refineNext","page","results","isFirstPage","isLastPage","connectMenu","showShowMoreButton","isRefined","$event","currentTarget","connectNumericMenu","checked","connectPagination","nbPages","padding","totalPages","showFirst","showLast","showNext","emits","p","Math","min","max","$emit","nbHits","pages","aria-label","getSlot","theme","algoliaUrl","location","hostname","fill","d","rel","style","viewBox","connectQueryRules","trackedFilters","transformRuleContexts","range","connectRange","precision","minInput","maxInput","updated","step","pow","values","minValue","Infinity","minRange","maxValue","maxRange","pick","first","second","onSubmit","placeholder","connectRatingMenu","xmlns","id","xlink:href","stars","full","n","width","height","autofocus","showLoadingIndicator","shouldShowLoadingIndicator","submitTitle","resetTitle","modelValue","query","onFormSubmit","$refs","input","blur","onFormReset","fillRule","fill-rule","transform","stroke-width","stroke-opacity","cx","cy","r","attributeName","to","dur","repeatCount","action","role","novalidate","onReset","_createCommentVNode","autocorrect","autocapitalize","autocomplete","spellcheck","maxlength","onFocus","onBlur","onInput","title","hidden","stroke","noop","SearchInput","AisHighlight","connectRefinementList","searchable","searchablePlaceholder","operator","searchForFacetValuesQuery","searchForFacetValues","get","set","searchForItems","_highlightResult","highlighted","escapeFacetValues","searchForItemsQuery","isFromSearch","class-names","connectStateResults","renderFn","unmountFn","init","resultsCopy","stateCopy","stateResults","connectSearchBox","localValue","isControlled","model","val","isSearchStalled","show-loading-indicator","should-show-loading-indicator","submit-title","reset-title","connectSortBy","options","connectStats","_mergeProps","lastResults","_Fragment","nbSortedHits","toLocaleString","processingTimeMS","connectToggleRefinement","off","connectVoiceSearch","searchAsYouSpeak","buttonTitle","disabledButtonTitle","buttonSvgAttrs","strokeWidth","strokeLinecap","strokeLinejoin","errorNotAllowed","voiceListeningState","status","errorCode","rootSlotProps","isBrowserSupported","isListening","toggleListening","innerSlotProps","transcript","isSpeechFinal","handleClick","event","x1","y1","x2","y2","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","connectRelevantSort","isRelevantSorted","isVirtualReplica","getWidgetAttribute","vnode","reduce","acc","curr","connectDynamicWidgets","facets","maxValuesPerFacet","Map","allComponents","attributesToRender","widgets","AisDynamicWidgets","plugin","install","localVue","walkIndex","visit","getWidgets","$$type","searchOnlyWithDerivedHelpers","Promise","resolve","reject","derivedHelpers","derivedHelper","e","defaultCloneComponent","componentInstance","app","serverPrefetch","fetch","_base","appOptions","createSSRApp","$router","$store","$root","augmentInstantSearch","instantSearchOptions","cloneComponent","initialResults","findResultsState","instance","renderToString","then","beforeCreate","$nuxt","mainHelper","getResults","getIndexId","_state","_rawResults","hydrate","getState","parent","localHelper","getHelper","scopedResults","getScopedResults","templatesConfig","searchMetadata","createServerRootMixin","$cloneComponent"],"mappings":"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"}