@cludosearch/cludo-search-components 1.0.32

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 (255) hide show
  1. package/README.md +26 -0
  2. package/dist/components/controls/cludo-search-controls.d.ts +5 -0
  3. package/dist/components/controls/cludo-search-controls.d.ts.map +1 -0
  4. package/dist/components/controls/facets/base-facet.d.ts +27 -0
  5. package/dist/components/controls/facets/base-facet.d.ts.map +1 -0
  6. package/dist/components/controls/facets/checkbox-facet.d.ts +4 -0
  7. package/dist/components/controls/facets/checkbox-facet.d.ts.map +1 -0
  8. package/dist/components/controls/facets/elements/clear-all-facets.d.ts +8 -0
  9. package/dist/components/controls/facets/elements/clear-all-facets.d.ts.map +1 -0
  10. package/dist/components/controls/facets/elements/current-facets.d.ts +11 -0
  11. package/dist/components/controls/facets/elements/current-facets.d.ts.map +1 -0
  12. package/dist/components/controls/facets/elements/facet-header.d.ts +11 -0
  13. package/dist/components/controls/facets/elements/facet-header.d.ts.map +1 -0
  14. package/dist/components/controls/facets/elements/facet-items-list.d.ts +12 -0
  15. package/dist/components/controls/facets/elements/facet-items-list.d.ts.map +1 -0
  16. package/dist/components/controls/facets/elements/facet-search.d.ts +10 -0
  17. package/dist/components/controls/facets/elements/facet-search.d.ts.map +1 -0
  18. package/dist/components/controls/facets/facet-group/facet-group.d.ts +7 -0
  19. package/dist/components/controls/facets/facet-group/facet-group.d.ts.map +1 -0
  20. package/dist/components/controls/facets/items/checkbox-facet-item.d.ts +4 -0
  21. package/dist/components/controls/facets/items/checkbox-facet-item.d.ts.map +1 -0
  22. package/dist/components/controls/facets/items/clear-checkbox-facet-item.d.ts +8 -0
  23. package/dist/components/controls/facets/items/clear-checkbox-facet-item.d.ts.map +1 -0
  24. package/dist/components/controls/facets/items/clear-facet-item.d.ts +9 -0
  25. package/dist/components/controls/facets/items/clear-facet-item.d.ts.map +1 -0
  26. package/dist/components/controls/facets/items/radio-facet-item.d.ts +4 -0
  27. package/dist/components/controls/facets/items/radio-facet-item.d.ts.map +1 -0
  28. package/dist/components/controls/facets/items/standard-facet-item.d.ts +5 -0
  29. package/dist/components/controls/facets/items/standard-facet-item.d.ts.map +1 -0
  30. package/dist/components/controls/facets/radio-facet.d.ts +4 -0
  31. package/dist/components/controls/facets/radio-facet.d.ts.map +1 -0
  32. package/dist/components/controls/facets/standard-facet.d.ts +4 -0
  33. package/dist/components/controls/facets/standard-facet.d.ts.map +1 -0
  34. package/dist/components/controls/inputs/buttons-list-input.d.ts +4 -0
  35. package/dist/components/controls/inputs/buttons-list-input.d.ts.map +1 -0
  36. package/dist/components/controls/inputs/dropdown-input.d.ts +5 -0
  37. package/dist/components/controls/inputs/dropdown-input.d.ts.map +1 -0
  38. package/dist/components/controls/sort-picker/cludo-sort-picker.d.ts +7 -0
  39. package/dist/components/controls/sort-picker/cludo-sort-picker.d.ts.map +1 -0
  40. package/dist/components/elements/banner-group/banner-group.d.ts +3 -0
  41. package/dist/components/elements/banner-group/banner-group.d.ts.map +1 -0
  42. package/dist/components/elements/banner.d.ts +7 -0
  43. package/dist/components/elements/banner.d.ts.map +1 -0
  44. package/dist/components/elements/cludo-highlighted-text.d.ts +7 -0
  45. package/dist/components/elements/cludo-highlighted-text.d.ts.map +1 -0
  46. package/dist/components/elements/fragment-highlight/fragment-highlight.d.ts +6 -0
  47. package/dist/components/elements/fragment-highlight/fragment-highlight.d.ts.map +1 -0
  48. package/dist/components/elements/fragment-highlight-group/fragment-highlight-group.d.ts +12 -0
  49. package/dist/components/elements/fragment-highlight-group/fragment-highlight-group.d.ts.map +1 -0
  50. package/dist/components/elements/result-badge.d.ts +9 -0
  51. package/dist/components/elements/result-badge.d.ts.map +1 -0
  52. package/dist/components/elements/result-breadcrumbs.d.ts +13 -0
  53. package/dist/components/elements/result-breadcrumbs.d.ts.map +1 -0
  54. package/dist/components/elements/result-description.d.ts +12 -0
  55. package/dist/components/elements/result-description.d.ts.map +1 -0
  56. package/dist/components/elements/result-image.d.ts +9 -0
  57. package/dist/components/elements/result-image.d.ts.map +1 -0
  58. package/dist/components/elements/result-link.d.ts +16 -0
  59. package/dist/components/elements/result-link.d.ts.map +1 -0
  60. package/dist/components/elements/result-title.d.ts +9 -0
  61. package/dist/components/elements/result-title.d.ts.map +1 -0
  62. package/dist/components/elements/result-url.d.ts +8 -0
  63. package/dist/components/elements/result-url.d.ts.map +1 -0
  64. package/dist/components/forms/cludo-autocomplete-container.d.ts +3 -0
  65. package/dist/components/forms/cludo-autocomplete-container.d.ts.map +1 -0
  66. package/dist/components/forms/cludo-results-container.d.ts +6 -0
  67. package/dist/components/forms/cludo-results-container.d.ts.map +1 -0
  68. package/dist/components/forms/cludo-search-form.d.ts +5 -0
  69. package/dist/components/forms/cludo-search-form.d.ts.map +1 -0
  70. package/dist/components/forms/cludo-search-input.d.ts +3 -0
  71. package/dist/components/forms/cludo-search-input.d.ts.map +1 -0
  72. package/dist/components/forms/search-input.d.ts +16 -0
  73. package/dist/components/forms/search-input.d.ts.map +1 -0
  74. package/dist/components/icons/base-icon.d.ts +15 -0
  75. package/dist/components/icons/base-icon.d.ts.map +1 -0
  76. package/dist/components/icons/close-icon.d.ts +4 -0
  77. package/dist/components/icons/close-icon.d.ts.map +1 -0
  78. package/dist/components/icons/search-icon.d.ts +4 -0
  79. package/dist/components/icons/search-icon.d.ts.map +1 -0
  80. package/dist/components/results/cludo-load-more.d.ts +9 -0
  81. package/dist/components/results/cludo-load-more.d.ts.map +1 -0
  82. package/dist/components/results/cludo-loader.d.ts +5 -0
  83. package/dist/components/results/cludo-loader.d.ts.map +1 -0
  84. package/dist/components/results/cludo-search-results.d.ts +5 -0
  85. package/dist/components/results/cludo-search-results.d.ts.map +1 -0
  86. package/dist/components/results/header/did-you-mean.d.ts +7 -0
  87. package/dist/components/results/header/did-you-mean.d.ts.map +1 -0
  88. package/dist/components/results/header/generative-response/generative-response-icon.d.ts +4 -0
  89. package/dist/components/results/header/generative-response/generative-response-icon.d.ts.map +1 -0
  90. package/dist/components/results/header/generative-response/generative-response-loader.d.ts +6 -0
  91. package/dist/components/results/header/generative-response/generative-response-loader.d.ts.map +1 -0
  92. package/dist/components/results/header/generative-response/generative-response-module-content.d.ts +6 -0
  93. package/dist/components/results/header/generative-response/generative-response-module-content.d.ts.map +1 -0
  94. package/dist/components/results/header/generative-response/generative-response-module-error-message.d.ts +3 -0
  95. package/dist/components/results/header/generative-response/generative-response-module-error-message.d.ts.map +1 -0
  96. package/dist/components/results/header/generative-response/generative-response-module.d.ts +4 -0
  97. package/dist/components/results/header/generative-response/generative-response-module.d.ts.map +1 -0
  98. package/dist/components/results/header/result-count.d.ts +7 -0
  99. package/dist/components/results/header/result-count.d.ts.map +1 -0
  100. package/dist/components/results/header/results-summary.d.ts +7 -0
  101. package/dist/components/results/header/results-summary.d.ts.map +1 -0
  102. package/dist/components/results/items/custom-result.d.ts +11 -0
  103. package/dist/components/results/items/custom-result.d.ts.map +1 -0
  104. package/dist/components/results/items/standard-result.d.ts +14 -0
  105. package/dist/components/results/items/standard-result.d.ts.map +1 -0
  106. package/dist/components/results/list/results-list.d.ts +13 -0
  107. package/dist/components/results/list/results-list.d.ts.map +1 -0
  108. package/dist/components/results/load-more-results.d.ts +8 -0
  109. package/dist/components/results/load-more-results.d.ts.map +1 -0
  110. package/dist/components/results/pagination/pagination.d.ts +15 -0
  111. package/dist/components/results/pagination/pagination.d.ts.map +1 -0
  112. package/dist/components/results/pagination/results-per-page.d.ts +9 -0
  113. package/dist/components/results/pagination/results-per-page.d.ts.map +1 -0
  114. package/dist/components/sayt/cludo-search-autocomplete.d.ts +3 -0
  115. package/dist/components/sayt/cludo-search-autocomplete.d.ts.map +1 -0
  116. package/dist/components/sayt/items/sayt-categorized-result.d.ts +4 -0
  117. package/dist/components/sayt/items/sayt-categorized-result.d.ts.map +1 -0
  118. package/dist/components/sayt/items/sayt-recent-search.d.ts +9 -0
  119. package/dist/components/sayt/items/sayt-recent-search.d.ts.map +1 -0
  120. package/dist/components/sayt/items/sayt-result.d.ts +11 -0
  121. package/dist/components/sayt/items/sayt-result.d.ts.map +1 -0
  122. package/dist/components/sayt/items/sayt-suggestion.d.ts +9 -0
  123. package/dist/components/sayt/items/sayt-suggestion.d.ts.map +1 -0
  124. package/dist/components/types/types.d.ts +84 -0
  125. package/dist/components/types/types.d.ts.map +1 -0
  126. package/dist/components/utility/list-layout.d.ts +9 -0
  127. package/dist/components/utility/list-layout.d.ts.map +1 -0
  128. package/dist/components/utility/pseudo-link.d.ts +8 -0
  129. package/dist/components/utility/pseudo-link.d.ts.map +1 -0
  130. package/dist/components/wrapper/cludo-wrapper.d.ts +14 -0
  131. package/dist/components/wrapper/cludo-wrapper.d.ts.map +1 -0
  132. package/dist/context.d.ts +6 -0
  133. package/dist/context.d.ts.map +1 -0
  134. package/dist/hooks/use-autocomplete.d.ts +37 -0
  135. package/dist/hooks/use-autocomplete.d.ts.map +1 -0
  136. package/dist/hooks/use-banners.d.ts +9 -0
  137. package/dist/hooks/use-banners.d.ts.map +1 -0
  138. package/dist/hooks/use-cludo-context.d.ts +6 -0
  139. package/dist/hooks/use-cludo-context.d.ts.map +1 -0
  140. package/dist/hooks/use-endless-scroll.d.ts +7 -0
  141. package/dist/hooks/use-endless-scroll.d.ts.map +1 -0
  142. package/dist/hooks/use-event-subscription.d.ts +8 -0
  143. package/dist/hooks/use-event-subscription.d.ts.map +1 -0
  144. package/dist/hooks/use-facet-group.d.ts +15 -0
  145. package/dist/hooks/use-facet-group.d.ts.map +1 -0
  146. package/dist/hooks/use-facet.d.ts +17 -0
  147. package/dist/hooks/use-facet.d.ts.map +1 -0
  148. package/dist/hooks/use-generative-response.d.ts +13 -0
  149. package/dist/hooks/use-generative-response.d.ts.map +1 -0
  150. package/dist/hooks/use-pagination.d.ts +15 -0
  151. package/dist/hooks/use-pagination.d.ts.map +1 -0
  152. package/dist/hooks/use-search-input.d.ts +12 -0
  153. package/dist/hooks/use-search-input.d.ts.map +1 -0
  154. package/dist/hooks/use-search-results.d.ts +42 -0
  155. package/dist/hooks/use-search-results.d.ts.map +1 -0
  156. package/dist/hooks/use-sort-by.d.ts +16 -0
  157. package/dist/hooks/use-sort-by.d.ts.map +1 -0
  158. package/dist/hooks/use-typing-effect.d.ts +5 -0
  159. package/dist/hooks/use-typing-effect.d.ts.map +1 -0
  160. package/dist/index.d.ts +65 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.html +12 -0
  163. package/dist/main.js +2 -0
  164. package/dist/main.js.map +1 -0
  165. package/dist/service-worker.js +2 -0
  166. package/dist/service-worker.js.map +1 -0
  167. package/dist/stories/Autocomplete.stories.d.ts +8 -0
  168. package/dist/stories/Autocomplete.stories.d.ts.map +1 -0
  169. package/dist/stories/CheckboxFacet.stories.d.ts +7 -0
  170. package/dist/stories/CheckboxFacet.stories.d.ts.map +1 -0
  171. package/dist/stories/ClearAllFacets.stories.d.ts +7 -0
  172. package/dist/stories/ClearAllFacets.stories.d.ts.map +1 -0
  173. package/dist/stories/CurrentFacets.stories.d.ts +7 -0
  174. package/dist/stories/CurrentFacets.stories.d.ts.map +1 -0
  175. package/dist/stories/CustomResult.stories.d.ts +7 -0
  176. package/dist/stories/CustomResult.stories.d.ts.map +1 -0
  177. package/dist/stories/DidYouMean.stories.d.ts +7 -0
  178. package/dist/stories/DidYouMean.stories.d.ts.map +1 -0
  179. package/dist/stories/EndlessScroll.stories.d.ts +8 -0
  180. package/dist/stories/EndlessScroll.stories.d.ts.map +1 -0
  181. package/dist/stories/FacetGroup.stories.d.ts +7 -0
  182. package/dist/stories/FacetGroup.stories.d.ts.map +1 -0
  183. package/dist/stories/LoadMoreResults.stories.d.ts +7 -0
  184. package/dist/stories/LoadMoreResults.stories.d.ts.map +1 -0
  185. package/dist/stories/Pagination.stories.d.ts +7 -0
  186. package/dist/stories/Pagination.stories.d.ts.map +1 -0
  187. package/dist/stories/RadioFacet.stories.d.ts +7 -0
  188. package/dist/stories/RadioFacet.stories.d.ts.map +1 -0
  189. package/dist/stories/ResultBadge.stories.d.ts +7 -0
  190. package/dist/stories/ResultBadge.stories.d.ts.map +1 -0
  191. package/dist/stories/ResultCount.stories.d.ts +7 -0
  192. package/dist/stories/ResultCount.stories.d.ts.map +1 -0
  193. package/dist/stories/ResultDescription.stories.d.ts +7 -0
  194. package/dist/stories/ResultDescription.stories.d.ts.map +1 -0
  195. package/dist/stories/ResultImage.stories.d.ts +7 -0
  196. package/dist/stories/ResultImage.stories.d.ts.map +1 -0
  197. package/dist/stories/ResultLink.stories.d.ts +7 -0
  198. package/dist/stories/ResultLink.stories.d.ts.map +1 -0
  199. package/dist/stories/ResultTitle.stories.d.ts +7 -0
  200. package/dist/stories/ResultTitle.stories.d.ts.map +1 -0
  201. package/dist/stories/ResultUrl.stories.d.ts +7 -0
  202. package/dist/stories/ResultUrl.stories.d.ts.map +1 -0
  203. package/dist/stories/ResultsList.stories.d.ts +7 -0
  204. package/dist/stories/ResultsList.stories.d.ts.map +1 -0
  205. package/dist/stories/ResultsPerPage.stories.d.ts +7 -0
  206. package/dist/stories/ResultsPerPage.stories.d.ts.map +1 -0
  207. package/dist/stories/StandardFacet.stories.d.ts +12 -0
  208. package/dist/stories/StandardFacet.stories.d.ts.map +1 -0
  209. package/dist/stories/StandardResult.stories.d.ts +7 -0
  210. package/dist/stories/StandardResult.stories.d.ts.map +1 -0
  211. package/dist/stories/utils/mock-data-config.d.ts +10 -0
  212. package/dist/stories/utils/mock-data-config.d.ts.map +1 -0
  213. package/dist/stories/utils/mock-data-utilities.d.ts +7 -0
  214. package/dist/stories/utils/mock-data-utilities.d.ts.map +1 -0
  215. package/dist/stories-local/ReactCore-CluLab.stories.d.ts +8 -0
  216. package/dist/stories-local/ReactCore-CluLab.stories.d.ts.map +1 -0
  217. package/dist/types/control-types.d.ts +15 -0
  218. package/dist/types/control-types.d.ts.map +1 -0
  219. package/dist/types/conversation-types.d.ts +69 -0
  220. package/dist/types/conversation-types.d.ts.map +1 -0
  221. package/dist/types/theme-types.d.ts +19 -0
  222. package/dist/types/theme-types.d.ts.map +1 -0
  223. package/dist/types/tracking-types.d.ts +67 -0
  224. package/dist/types/tracking-types.d.ts.map +1 -0
  225. package/dist/types/translation-types.d.ts +14 -0
  226. package/dist/types/translation-types.d.ts.map +1 -0
  227. package/dist/types/trending-pages-types.d.ts +10 -0
  228. package/dist/types/trending-pages-types.d.ts.map +1 -0
  229. package/dist/utils/cludo-instance-controller.d.ts +56 -0
  230. package/dist/utils/cludo-instance-controller.d.ts.map +1 -0
  231. package/dist/utils/cludo-search-context.d.ts +88 -0
  232. package/dist/utils/cludo-search-context.d.ts.map +1 -0
  233. package/dist/utils/components-controller.d.ts +77 -0
  234. package/dist/utils/components-controller.d.ts.map +1 -0
  235. package/dist/utils/context-utils.d.ts +4 -0
  236. package/dist/utils/context-utils.d.ts.map +1 -0
  237. package/dist/utils/event-controller.d.ts +98 -0
  238. package/dist/utils/event-controller.d.ts.map +1 -0
  239. package/dist/utils/facet-utils.d.ts +7 -0
  240. package/dist/utils/facet-utils.d.ts.map +1 -0
  241. package/dist/utils/http-utils.d.ts +3 -0
  242. package/dist/utils/http-utils.d.ts.map +1 -0
  243. package/dist/utils/instantiator.d.ts +8 -0
  244. package/dist/utils/instantiator.d.ts.map +1 -0
  245. package/dist/utils/models/instantiator-types.d.ts +235 -0
  246. package/dist/utils/models/instantiator-types.d.ts.map +1 -0
  247. package/dist/utils/models/mock-support-assistant-config.d.ts +69 -0
  248. package/dist/utils/models/mock-support-assistant-config.d.ts.map +1 -0
  249. package/dist/utils/result-utils.d.ts +25 -0
  250. package/dist/utils/result-utils.d.ts.map +1 -0
  251. package/dist/utils/theme-provider.d.ts +12 -0
  252. package/dist/utils/theme-provider.d.ts.map +1 -0
  253. package/dist/workbox-9a84fccb.js +2 -0
  254. package/dist/workbox-9a84fccb.js.map +1 -0
  255. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","mappings":"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","sources":["webpack://@cludosearch/cludo-search-components/webpack/universalModuleDefinition","webpack://@cludosearch/cludo-search-components/./node_modules/@cludosearch/cludo-api-client/dist/interfaces/api/public-settings.interface.js","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-icon.scss","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-loader.scss","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-module.scss","webpack://@cludosearch/cludo-search-components/./src/styles/all.scss","webpack://@cludosearch/cludo-search-components/./node_modules/css-loader/dist/runtime/api.js","webpack://@cludosearch/cludo-search-components/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://@cludosearch/cludo-search-components/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://@cludosearch/cludo-search-components/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://@cludosearch/cludo-search-components/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://@cludosearch/cludo-search-components/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://@cludosearch/cludo-search-components/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://@cludosearch/cludo-search-components/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://@cludosearch/cludo-search-components/webpack/bootstrap","webpack://@cludosearch/cludo-search-components/webpack/runtime/compat get default export","webpack://@cludosearch/cludo-search-components/webpack/runtime/define property getters","webpack://@cludosearch/cludo-search-components/webpack/runtime/hasOwnProperty shorthand","webpack://@cludosearch/cludo-search-components/webpack/runtime/make namespace object","webpack://@cludosearch/cludo-search-components/webpack/runtime/nonce","webpack://@cludosearch/cludo-search-components/./src/styles/all.scss?859d","webpack://@cludosearch/cludo-search-components/external commonjs \"react\"","webpack://@cludosearch/cludo-search-components/./src/context.tsx","webpack://@cludosearch/cludo-search-components/./src/utils/result-utils.ts","webpack://@cludosearch/cludo-search-components/./src/components/elements/result-link.tsx","webpack://@cludosearch/cludo-search-components/./src/utils/context-utils.ts","webpack://@cludosearch/cludo-search-components/./src/utils/theme-provider.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/items/custom-result.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/result-title.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/fragment-highlight/fragment-highlight.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/fragment-highlight-group/fragment-highlight-group.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/result-description.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/result-url.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/result-badge.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/items/standard-result.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-cludo-context.ts","webpack://@cludosearch/cludo-search-components/./src/hooks/use-event-subscription.ts","webpack://@cludosearch/cludo-search-components/./src/hooks/use-pagination.ts","webpack://@cludosearch/cludo-search-components/./src/components/results/pagination/pagination.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/banner.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-banners.ts","webpack://@cludosearch/cludo-search-components/./src/components/elements/banner-group/banner-group.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-search-results.ts","webpack://@cludosearch/cludo-search-components/./src/components/results/header/did-you-mean.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/header/result-count.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/header/results-summary.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/cludo-loader.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/list/results-list.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/cludo-load-more.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/load-more-results.tsx","webpack://@cludosearch/cludo-search-components/./src/components/types/types.ts","webpack://@cludosearch/cludo-search-components/./src/components/results/cludo-search-results.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/cludo-highlighted-text.tsx","webpack://@cludosearch/cludo-search-components/./src/components/sayt/items/sayt-result.tsx","webpack://@cludosearch/cludo-search-components/./src/components/sayt/items/sayt-suggestion.tsx","webpack://@cludosearch/cludo-search-components/./src/components/sayt/items/sayt-recent-search.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-autocomplete.ts","webpack://@cludosearch/cludo-search-components/./src/components/sayt/cludo-search-autocomplete.tsx","webpack://@cludosearch/cludo-search-components/./src/utils/cludo-search-context.ts","webpack://@cludosearch/cludo-search-components/external commonjs \"react-dom\"","webpack://@cludosearch/cludo-search-components/./src/utils/components-controller.tsx","webpack://@cludosearch/cludo-search-components/./src/utils/event-controller.ts","webpack://@cludosearch/cludo-search-components/./src/utils/cludo-instance-controller.ts","webpack://@cludosearch/cludo-search-components/./src/hooks/use-sort-by.ts","webpack://@cludosearch/cludo-search-components/./src/components/controls/sort-picker/cludo-sort-picker.tsx","webpack://@cludosearch/cludo-search-components/./src/components/utility/pseudo-link.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-facet.ts","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/items/standard-facet-item.tsx","webpack://@cludosearch/cludo-search-components/./src/utils/facet-utils.ts","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/elements/facet-header.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/elements/facet-search.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/elements/facet-items-list.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/base-facet.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/standard-facet.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-facet-group.ts","webpack://@cludosearch/cludo-search-components/./src/components/controls/cludo-search-controls.tsx","webpack://@cludosearch/cludo-search-components/./src/utils/instantiator.ts","webpack://@cludosearch/cludo-search-components/./src/components/controls/inputs/dropdown-input.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/pagination/results-per-page.tsx","webpack://@cludosearch/cludo-search-components/./src/components/sayt/items/sayt-categorized-result.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/facet-group/facet-group.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/items/checkbox-facet-item.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/checkbox-facet.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/items/radio-facet-item.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/radio-facet.tsx","webpack://@cludosearch/cludo-search-components/./src/components/icons/base-icon.tsx","webpack://@cludosearch/cludo-search-components/./src/components/icons/close-icon.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/elements/current-facets.tsx","webpack://@cludosearch/cludo-search-components/./src/components/controls/facets/elements/clear-all-facets.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/result-image.tsx","webpack://@cludosearch/cludo-search-components/./src/components/elements/result-breadcrumbs.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-typing-effect.ts","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-module-content.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-module-error-message.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-loader.scss?1902","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-loader.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-icon.scss?1599","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-icon.tsx","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-module.scss?9806","webpack://@cludosearch/cludo-search-components/./src/components/results/header/generative-response/generative-response-module.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-generative-response.ts","webpack://@cludosearch/cludo-search-components/./src/utils/http-utils.ts","webpack://@cludosearch/cludo-search-components/./src/components/wrapper/cludo-wrapper.tsx","webpack://@cludosearch/cludo-search-components/./src/components/forms/cludo-autocomplete-container.tsx","webpack://@cludosearch/cludo-search-components/./src/components/forms/cludo-results-container.tsx","webpack://@cludosearch/cludo-search-components/./src/components/forms/cludo-search-input.tsx","webpack://@cludosearch/cludo-search-components/./src/components/forms/cludo-search-form.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-search-input.ts","webpack://@cludosearch/cludo-search-components/./src/components/icons/search-icon.tsx","webpack://@cludosearch/cludo-search-components/./src/components/forms/search-input.tsx","webpack://@cludosearch/cludo-search-components/./src/hooks/use-endless-scroll.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"@cludosearch/cludo-search-components\"] = factory();\n\telse\n\t\troot[\"@cludosearch/cludo-search-components\"] = factory();\n})(this, () => {\nreturn ","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.CludoFeature = void 0;\r\n/** Feature values associated with subscription digest */\r\nvar CludoFeature;\r\n(function (CludoFeature) {\r\n CludoFeature[\"AdvancedIntents\"] = \"advanced insights\";\r\n CludoFeature[\"Intents\"] = \"basic insights\";\r\n CludoFeature[\"Sayt\"] = \"sayt\";\r\n CludoFeature[\"AnalyticsFilters\"] = \"analytics filters\";\r\n CludoFeature[\"VoiceSearches\"] = \"voice search\";\r\n CludoFeature[\"InstantSuggestions\"] = \"instant suggestions\";\r\n CludoFeature[\"Advanced404Analytics\"] = \"advanced 404 analytics\";\r\n CludoFeature[\"BannerStatistics\"] = \"banner statistics\";\r\n CludoFeature[\"RelatedSearches\"] = \"related searches\";\r\n CludoFeature[\"Basic404\"] = \"basic 404\";\r\n CludoFeature[\"IntelligentRanking\"] = \"intelligent rankings (ml)\";\r\n CludoFeature[\"GranularPermissions\"] = \"granular permissions\";\r\n CludoFeature[\"TimeScheduledBanner\"] = \"time-scheduled banners\";\r\n CludoFeature[\"GeoData\"] = \"geo analytics\";\r\n CludoFeature[\"DeviceData\"] = \"device analytics\";\r\n CludoFeature[\"AsyncCrawlingOneThousandPagesCrawledEveryDays\"] = \"async crawling 1000 pages crawled every day\";\r\n CludoFeature[\"AsyncCrawlingTwoThousandPagesCrawledEveryTwoDays\"] = \"async crawling 2000 pages crawled every 2 days\";\r\n CludoFeature[\"AsyncCrawlingThreeThousandPagesCrawledEveryThreeDays\"] = \"async crawling 3000 pages crawled every 3 days\";\r\n CludoFeature[\"AsyncCrawlingFourThousandPagesCrawledEveryFourDays\"] = \"async crawling 4000 pages crawled every 4 days\";\r\n CludoFeature[\"AsyncCrawlingFiveThousandPagesCrawledEveryFiveDays\"] = \"async crawling 5000 pages crawled every 5 days\";\r\n CludoFeature[\"AsyncCrawlingSixThousandPagesCrawledEverySixDays\"] = \"async crawling 6000 pages crawled every 6 days\";\r\n CludoFeature[\"AsyncCrawlingSevenThousandPagesCrawledEverySevenDays\"] = \"async crawling 7000 pages crawled every 7 days\";\r\n CludoFeature[\"WebContentHighlighter\"] = \"web content highlighter\";\r\n CludoFeature[\"Audiences\"] = \"audiences\";\r\n})(CludoFeature = exports.CludoFeature || (exports.CludoFeature = {}));\r\n//# sourceMappingURL=public-settings.interface.js.map","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.cludo-theme-basic{--spacer-1: 4px;--spacer-2: 8px;--spacer-3: 12px;--spacer-4: 20px;--spacer-5: 30px;--spacer-6: 50px;--font-size-xs: 10px;--font-size-sm: 12px;--font-size-md: 14px;--font-size-lg: 16px;--font-size-xl: 20px;--border-radius-button: 4px;--border-radius-card: 12px;--font-color-black: #101828;--font-color-white: #ffffff;--font-color-gray: #344054;--font-color-highlight: #9E77ED;--font-family-default: system-ui, sans-serif;--font-family-header: system-ui, sans-serif;--bg-color-white: #fff;--bg-color-gray-light: #f1f4f9;--bg-color-gray-medium: #D1D7E2;--bg-color-gray-dark: #A3B0C6;--bg-color-accent-primary-light: #D0C3F1;--bg-color-accent-primary-medium: #9E77ED;--bg-color-accent-primary-dark: #6941C6;--bg-color-accent-secondary-light: #e4809c;--bg-color-accent-secondary-medium: #d72f5c;--bg-color-accent-secondary-dark: #72112b;--box-shadow-card: 0 0 20px 4px rgba(0,0,0,.1)}.cludo-generative-ai__icon-container{height:32px;min-width:32px;border-radius:16px;display:flex;align-items:center;justify-content:center;margin-right:20px;background-color:var(--bg-color-accent-primary-dark)}.cludo-generative-ai__icon.chat_gpt{-webkit-mask:url(https://customer.cludo.com/assets/mycludo/support-widget/icons/chat_gpt_sm.svg) center/18px 18px no-repeat;mask:url(https://customer.cludo.com/assets/mycludo/support-widget/icons/chat_gpt_sm.svg) center/18px 18px no-repeat;display:block;height:18px;width:18px;background-color:#fff}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/variables.scss\",\"webpack://./src/components/results/header/generative-response/generative-response-icon.scss\"],\"names\":[],\"mappings\":\"AAeA,mBACI,eAAA,CACA,eAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CAEA,oBAAA,CACA,oBAAA,CACA,oBAAA,CACA,oBAAA,CACA,oBAAA,CAEA,2BAAA,CACA,0BAAA,CAEA,2BAAA,CACA,2BAAA,CACA,0BAAA,CACA,+BAAA,CAEA,4CAAA,CACA,2CAAA,CAEA,sBAAA,CACA,8BAAA,CACA,+BAAA,CACA,6BAAA,CACA,wCAAA,CACA,yCAAA,CACA,uCAAA,CACA,0CAAA,CACA,2CAAA,CACA,yCAAA,CAEA,8CAAA,CC9CA,qCACF,WAAA,CACA,cAAA,CACA,kBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,iBAAA,CACA,oDAXU,CAcX,oCACC,2HAAA,CACA,mHAAA,CACA,aAAA,CACA,WAAA,CACA,UAAA,CACA,qBAAA\",\"sourcesContent\":[\"// ABOUT THIS FILE\\r\\n// Variables here must be scoped to classes that correspond to a theme name.\\r\\n// Consumers can enter a theme name in the `cssTheme` config option to apply\\r\\n// these scoped variables to Cludo components.\\r\\n//\\r\\n// Furthermore, these same variables can be added on the consuming client in \\r\\n// a more specific scope i.e.\\r\\n// :root {\\r\\n// .cludo-theme-basic { /* variables go here */ }\\r\\n// .my-custom-theme { /* variables go here */ }\\r\\n// }\\r\\n//\\r\\n// This allows consumers to create new themes themselves or override the \\r\\n// Cludo-provided themes defined here\\r\\n\\r\\n.cludo-theme-basic {\\r\\n --spacer-1: 4px;\\r\\n --spacer-2: 8px;\\r\\n --spacer-3: 12px;\\r\\n --spacer-4: 20px;\\r\\n --spacer-5: 30px;\\r\\n --spacer-6: 50px;\\r\\n\\r\\n --font-size-xs: 10px;\\r\\n --font-size-sm: 12px;\\r\\n --font-size-md: 14px;\\r\\n --font-size-lg: 16px;\\r\\n --font-size-xl: 20px;\\r\\n\\r\\n --border-radius-button: 4px;\\r\\n --border-radius-card: 12px;\\r\\n\\r\\n --font-color-black: #101828;\\r\\n --font-color-white: #ffffff;\\r\\n --font-color-gray: #344054;\\r\\n --font-color-highlight: #9E77ED;\\r\\n \\r\\n --font-family-default: system-ui, sans-serif;\\r\\n --font-family-header: system-ui, sans-serif;\\r\\n\\r\\n --bg-color-white: #fff;\\r\\n --bg-color-gray-light: #f1f4f9;\\r\\n --bg-color-gray-medium: #D1D7E2;\\r\\n --bg-color-gray-dark: #A3B0C6;\\r\\n --bg-color-accent-primary-light: #D0C3F1;\\r\\n --bg-color-accent-primary-medium: #9E77ED;\\r\\n --bg-color-accent-primary-dark: #6941C6;\\r\\n --bg-color-accent-secondary-light: #e4809c;\\r\\n --bg-color-accent-secondary-medium: #d72f5c;\\r\\n --bg-color-accent-secondary-dark: #72112b;\\r\\n\\r\\n --box-shadow-card: 0 0 20px 4px rgba(0,0,0,.1);\\r\\n}\\r\\n\",\"@import '../../../../styles/variables.scss';\\r\\n\\r\\n$pri-color: var(--bg-color-accent-primary-dark);\\r\\n\\r\\n.cludo-generative-ai {\\r\\n &__icon-container {\\r\\n\\t\\theight: 32px;\\r\\n\\t\\tmin-width: 32px;\\r\\n\\t\\tborder-radius: 16px;\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\talign-items: center;\\r\\n\\t\\tjustify-content: center;\\r\\n\\t\\tmargin-right: 20px;\\r\\n\\t\\tbackground-color: $pri-color;\\r\\n\\t}\\r\\n\\r\\n\\t&__icon.chat_gpt {\\r\\n\\t\\t-webkit-mask: url(https://customer.cludo.com/assets/mycludo/support-widget/icons/chat_gpt_sm.svg) center/18px 18px no-repeat;\\r\\n\\t\\tmask: url(https://customer.cludo.com/assets/mycludo/support-widget/icons/chat_gpt_sm.svg) center/18px 18px no-repeat;\\r\\n\\t\\tdisplay: block;\\r\\n\\t\\theight: 18px;\\r\\n\\t\\twidth: 18px;\\r\\n\\t\\tbackground-color: #fff;\\r\\n\\t}\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.typing{height:100%;display:flex;align-items:center}.typing__dot{float:left;width:3px;height:3px;margin:0 2px;background:#000;border-radius:50%;opacity:0;animation:loadingFade 1s infinite}.typing__dot:nth-child(1){animation-delay:0s}.typing__dot:nth-child(2){animation-delay:.2s}.typing__dot:nth-child(3){animation-delay:.4s}@keyframes loadingFade{0%{opacity:0}50%{opacity:.8}100%{opacity:0}}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/results/header/generative-response/generative-response-loader.scss\"],\"names\":[],\"mappings\":\"AAAA,QACC,WAAA,CACA,YAAA,CACA,kBAAA,CAGD,aACC,UAAA,CACA,SAAA,CACA,UAAA,CACA,YAAA,CACA,eAAA,CACA,iBAAA,CACA,SAAA,CACA,iCAAA,CAGD,0BACC,kBAAA,CAGD,0BACC,mBAAA,CAGD,0BACC,mBAAA,CAGD,uBACC,GACC,SAAA,CAED,IACC,UAAA,CAED,KACC,SAAA,CAAA\",\"sourcesContent\":[\".typing {\\r\\n\\theight: 100%;\\r\\n\\tdisplay: flex;\\r\\n\\talign-items: center;\\r\\n}\\r\\n\\r\\n.typing__dot {\\r\\n\\tfloat: left;\\r\\n\\twidth: 3px;\\r\\n\\theight: 3px;\\r\\n\\tmargin: 0 2px;\\r\\n\\tbackground: #000;\\r\\n\\tborder-radius: 50%;\\r\\n\\topacity: 0;\\r\\n\\tanimation: loadingFade 1s infinite;\\r\\n}\\r\\n\\r\\n.typing__dot:nth-child(1) {\\r\\n\\tanimation-delay: 0s;\\r\\n}\\r\\n\\r\\n.typing__dot:nth-child(2) {\\r\\n\\tanimation-delay: 0.2s;\\r\\n}\\r\\n\\r\\n.typing__dot:nth-child(3) {\\r\\n\\tanimation-delay: 0.4s;\\r\\n}\\r\\n\\r\\n@keyframes loadingFade {\\r\\n\\t0% {\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n\\t50% {\\r\\n\\t\\topacity: 0.8;\\r\\n\\t}\\r\\n\\t100% {\\r\\n\\t\\topacity: 0;\\r\\n\\t}\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.cludo-theme-basic{--spacer-1: 4px;--spacer-2: 8px;--spacer-3: 12px;--spacer-4: 20px;--spacer-5: 30px;--spacer-6: 50px;--font-size-xs: 10px;--font-size-sm: 12px;--font-size-md: 14px;--font-size-lg: 16px;--font-size-xl: 20px;--border-radius-button: 4px;--border-radius-card: 12px;--font-color-black: #101828;--font-color-white: #ffffff;--font-color-gray: #344054;--font-color-highlight: #9E77ED;--font-family-default: system-ui, sans-serif;--font-family-header: system-ui, sans-serif;--bg-color-white: #fff;--bg-color-gray-light: #f1f4f9;--bg-color-gray-medium: #D1D7E2;--bg-color-gray-dark: #A3B0C6;--bg-color-accent-primary-light: #D0C3F1;--bg-color-accent-primary-medium: #9E77ED;--bg-color-accent-primary-dark: #6941C6;--bg-color-accent-secondary-light: #e4809c;--bg-color-accent-secondary-medium: #d72f5c;--bg-color-accent-secondary-dark: #72112b;--box-shadow-card: 0 0 20px 4px rgba(0,0,0,.1)}.cludo-generative-ai{font-family:var(--font-family-default);border-radius:var(--border-radius-card);margin-bottom:var(--spacer-4);box-shadow:var(--box-shadow-card);background-color:var(--bg-color-gray-light);border:1px solid var(--bg-color-accent-primary-dark);animation:rollout .6s forwards}.cludo-generative-ai__answer-container{display:flex;padding:var(--spacer-4) var(--spacer-5) var(--spacer-4) var(--spacer-4)}.cludo-generative-ai__answer{padding-top:5px}.cludo-generative-ai__answer p{margin-top:0;margin-bottom:14px;word-break:break-word}.cludo-generative-ai__answer a{word-break:break-word}@keyframes rollout{0%{opacity:0%}100%{opacity:100%}}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/variables.scss\",\"webpack://./src/components/results/header/generative-response/generative-response-module.scss\"],\"names\":[],\"mappings\":\"AAeA,mBACI,eAAA,CACA,eAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CACA,gBAAA,CAEA,oBAAA,CACA,oBAAA,CACA,oBAAA,CACA,oBAAA,CACA,oBAAA,CAEA,2BAAA,CACA,0BAAA,CAEA,2BAAA,CACA,2BAAA,CACA,0BAAA,CACA,+BAAA,CAEA,4CAAA,CACA,2CAAA,CAEA,sBAAA,CACA,8BAAA,CACA,+BAAA,CACA,6BAAA,CACA,wCAAA,CACA,yCAAA,CACA,uCAAA,CACA,0CAAA,CACA,2CAAA,CACA,yCAAA,CAEA,8CAAA,CCjDJ,qBACI,sCAAA,CACH,uCAAA,CACA,6BAAA,CACG,iCAAA,CACH,2CAAA,CACA,oDAAA,CACA,8BAAA,CAEA,uCACC,YAAA,CACA,uEAAA,CAGD,6BACC,eAAA,CACA,+BACC,YAAA,CACA,kBAAA,CACA,qBAAA,CAED,+BACC,qBAAA,CAKH,mBACC,GACC,UAAA,CAED,KACC,YAAA,CAAA\",\"sourcesContent\":[\"// ABOUT THIS FILE\\r\\n// Variables here must be scoped to classes that correspond to a theme name.\\r\\n// Consumers can enter a theme name in the `cssTheme` config option to apply\\r\\n// these scoped variables to Cludo components.\\r\\n//\\r\\n// Furthermore, these same variables can be added on the consuming client in \\r\\n// a more specific scope i.e.\\r\\n// :root {\\r\\n// .cludo-theme-basic { /* variables go here */ }\\r\\n// .my-custom-theme { /* variables go here */ }\\r\\n// }\\r\\n//\\r\\n// This allows consumers to create new themes themselves or override the \\r\\n// Cludo-provided themes defined here\\r\\n\\r\\n.cludo-theme-basic {\\r\\n --spacer-1: 4px;\\r\\n --spacer-2: 8px;\\r\\n --spacer-3: 12px;\\r\\n --spacer-4: 20px;\\r\\n --spacer-5: 30px;\\r\\n --spacer-6: 50px;\\r\\n\\r\\n --font-size-xs: 10px;\\r\\n --font-size-sm: 12px;\\r\\n --font-size-md: 14px;\\r\\n --font-size-lg: 16px;\\r\\n --font-size-xl: 20px;\\r\\n\\r\\n --border-radius-button: 4px;\\r\\n --border-radius-card: 12px;\\r\\n\\r\\n --font-color-black: #101828;\\r\\n --font-color-white: #ffffff;\\r\\n --font-color-gray: #344054;\\r\\n --font-color-highlight: #9E77ED;\\r\\n \\r\\n --font-family-default: system-ui, sans-serif;\\r\\n --font-family-header: system-ui, sans-serif;\\r\\n\\r\\n --bg-color-white: #fff;\\r\\n --bg-color-gray-light: #f1f4f9;\\r\\n --bg-color-gray-medium: #D1D7E2;\\r\\n --bg-color-gray-dark: #A3B0C6;\\r\\n --bg-color-accent-primary-light: #D0C3F1;\\r\\n --bg-color-accent-primary-medium: #9E77ED;\\r\\n --bg-color-accent-primary-dark: #6941C6;\\r\\n --bg-color-accent-secondary-light: #e4809c;\\r\\n --bg-color-accent-secondary-medium: #d72f5c;\\r\\n --bg-color-accent-secondary-dark: #72112b;\\r\\n\\r\\n --box-shadow-card: 0 0 20px 4px rgba(0,0,0,.1);\\r\\n}\\r\\n\",\"@import '../../../../styles/variables.scss';\\r\\n\\r\\n.cludo-generative-ai {\\r\\n font-family: var(--font-family-default);\\r\\n\\tborder-radius: var(--border-radius-card);\\r\\n\\tmargin-bottom: var(--spacer-4);\\r\\n box-shadow: var(--box-shadow-card);\\r\\n\\tbackground-color: var(--bg-color-gray-light);\\r\\n\\tborder: 1px solid var(--bg-color-accent-primary-dark);\\r\\n\\tanimation: rollout 0.6s forwards;\\r\\n\\r\\n\\t&__answer-container {\\r\\n\\t\\tdisplay: flex;\\r\\n\\t\\tpadding: var(--spacer-4) var(--spacer-5) var(--spacer-4) var(--spacer-4);\\r\\n\\t}\\r\\n\\r\\n\\t&__answer {\\r\\n\\t\\tpadding-top: 5px;\\r\\n\\t\\tp {\\r\\n\\t\\t\\tmargin-top: 0;\\r\\n\\t\\t\\tmargin-bottom: 14px;\\r\\n\\t\\t\\tword-break: break-word;\\r\\n\\t\\t}\\r\\n\\t\\ta {\\r\\n\\t\\t\\tword-break: break-word;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes rollout {\\r\\n\\t0% {\\r\\n\\t\\topacity: 0%;\\r\\n\\t}\\r\\n\\t100% {\\r\\n\\t\\topacity: 100%;\\r\\n\\t}\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.cludo-font-size-xs,.cludo-theme-current-facets-btn,.cludo-theme-facet-count,.cludo-theme-result-badge{font-size:var(--font-size-xs)}.cludo-font-size-sm,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-result-url{font-size:var(--font-size-sm)}.cludo-font-size-md,.cludo-theme-current-facets,.cludo-theme-facet-option,.cludo-theme-result-description{font-size:var(--font-size-md)}.cludo-font-size-lg,.cludo-theme-result-title{font-size:var(--font-size-lg)}.cludo-font-size-xl{font-size:var(--font-size-xl)}.cludo-font-color-black,.cludo-theme-facet-option,.cludo-theme-btn-gray,.cludo-theme-result-title{color:var(--font-color-black)}.cludo-font-color-white,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{color:var(--font-color-white)}.cludo-font-color-gray,.cludo-theme-result-badge,.cludo-theme-result-description{color:var(--font-color-gray)}.cludo-font-color-highlight,.cludo-theme-result-url{color:var(--font-color-highlight)}.cludo-font-family-default,.cludo-theme-current-facets,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-result-badge,.cludo-theme-result-url,.cludo-theme-result-description,.cludo-theme-result-title{font-family:var(--font-family-default)}.cludo-font-family-header{font-family:var(--font-family-header)}.cludo-font-weight-bold,.cludo-theme-current-facets-btn,.cludo-theme-icon-btn-secondary,.cludo-theme-result-badge,.cludo-theme-result-url,.cludo-theme-result-title{font-weight:bold}.cludo-font-weight-normal{font-weight:normal}.cludo-text-decoration-none,.cludo-theme-facet-option,.cludo-theme-result-link{text-decoration:none}.cludo-border-none{border:0}.cludo-bg-color-white{background-color:var(--bg-color-white)}.cludo-bg-color-gray-light,.cludo-theme-facet-count,.cludo-theme-btn-gray{background-color:var(--bg-color-gray-light)}.cludo-bg-color-gray-medium,.cludo-theme-current-facets-btn,.cludo-theme-current-facets{background-color:var(--bg-color-gray-medium)}.cludo-bg-color-gray-dark{background-color:var(--bg-color-gray-dark)}.cludo-bg-color-accent-primary-light,.cludo-theme-result-badge{background-color:var(--bg-color-accent-primary-light)}.cludo-bg-color-accent-primary-medium{background-color:var(--bg-color-accent-primary-medium)}.cludo-bg-color-accent-primary-dark{background-color:var(--bg-color-accent-primary-dark)}.cludo-bg-color-accent-secondary-light{background-color:var(--bg-color-accent-secondary-light)}.cludo-bg-color-accent-secondary-medium,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{background-color:var(--bg-color-accent-secondary-medium)}.cludo-bg-color-accent-secondary-dark{background-color:var(--bg-color-accent-secondary-dark)}.cludo-bg-hover-white:hover{background-color:var(--bg-color-white)}.cludo-bg-hover-gray-light:hover,.cludo-theme-facet-option:hover,.cludo-theme-result-link:hover{background-color:var(--bg-color-gray-light)}.cludo-bg-hover-gray-medium:hover,.cludo-theme-fragment-highlight:hover,.cludo-theme-btn-gray:hover{background-color:var(--bg-color-gray-medium)}.cludo-bg-hover-gray-dark:hover,.cludo-theme-current-facets-btn:hover{background-color:var(--bg-color-gray-dark)}.cludo-bg-hover-accent-primary-light:hover{background-color:var(--bg-color-accent-primary-light)}.cludo-bg-hover-accent-primary-medium:hover{background-color:var(--bg-color-accent-primary-medium)}.cludo-bg-hover-accent-primary-dark:hover{background-color:var(--bg-color-accent-primary-dark)}.cludo-bg-hover-accent-secondary-light:hover{background-color:var(--bg-color-accent-secondary-light)}.cludo-bg-hover-accent-secondary-medium:hover{background-color:var(--bg-color-accent-secondary-medium)}.cludo-bg-hover-accent-secondary-dark:hover,.cludo-theme-btn-accent-secondary:hover,.cludo-theme-icon-btn-secondary:hover,.cludo-theme-btn-accent-secondary-inactive:hover{background-color:var(--bg-color-accent-secondary-dark)}.cludo-m-0{margin:0}.cludo-m-1{margin:var(--spacer-1)}.cludo-m-2{margin:var(--spacer-2)}.cludo-m-3{margin:var(--spacer-3)}.cludo-m-4{margin:var(--spacer-4)}.cludo-m-5{margin:var(--spacer-5)}.cludo-mb-0{margin-bottom:0}.cludo-mb-1{margin-bottom:var(--spacer-1)}.cludo-mb-2,.cludo-theme-current-facets{margin-bottom:var(--spacer-2)}.cludo-mb-3,.cludo-theme-searchbar,.cludo-theme-result-badge,.cludo-theme-result-url,.cludo-theme-result-description{margin-bottom:var(--spacer-3)}.cludo-mb-4,.cludo-theme-result-title{margin-bottom:var(--spacer-4)}.cludo-mb-5{margin-bottom:var(--spacer-5)}.cludo-mt-0,.cludo-theme-result-url,.cludo-theme-result-description,.cludo-theme-result-title{margin-top:0}.cludo-mt-1{margin-top:var(--spacer-1)}.cludo-mt-2{margin-top:var(--spacer-2)}.cludo-mt-3{margin-top:var(--spacer-3)}.cludo-mt-4{margin-top:var(--spacer-4)}.cludo-mt-5{margin-top:var(--spacer-5)}.cludo-mr-0{margin-right:0}.cludo-mr-1{margin-right:var(--spacer-1)}.cludo-mr-2,.cludo-theme-current-facets{margin-right:var(--spacer-2)}.cludo-mr-3{margin-right:var(--spacer-3)}.cludo-mr-4{margin-right:var(--spacer-4)}.cludo-mr-5{margin-right:var(--spacer-5)}.cludo-ml-0{margin-left:0}.cludo-ml-1,.cludo-theme-current-facets-btn{margin-left:var(--spacer-1)}.cludo-ml-2,.cludo-theme-facet-count{margin-left:var(--spacer-2)}.cludo-ml-3{margin-left:var(--spacer-3)}.cludo-ml-4{margin-left:var(--spacer-4)}.cludo-ml-5{margin-left:var(--spacer-5)}.cludo-mx-0{margin-left:0;margin-right:0}.cludo-mx-1{margin-left:var(--spacer-1);margin-right:var(--spacer-1)}.cludo-mx-2{margin-left:var(--spacer-2);margin-right:var(--spacer-2)}.cludo-mx-3{margin-left:var(--spacer-3);margin-right:var(--spacer-3)}.cludo-mx-4{margin-left:var(--spacer-4);margin-right:var(--spacer-4)}.cludo-mx-5{margin-left:var(--spacer-5);margin-right:var(--spacer-5)}.cludo-my-0{margin-bottom:0;margin-top:0}.cludo-my-1{margin-bottom:var(--spacer-1);margin-top:var(--spacer-1)}.cludo-my-2{margin-bottom:var(--spacer-2);margin-top:var(--spacer-2)}.cludo-my-3{margin-bottom:var(--spacer-3);margin-top:var(--spacer-3)}.cludo-my-4{margin-bottom:var(--spacer-4);margin-top:var(--spacer-4)}.cludo-my-5{margin-bottom:var(--spacer-5);margin-top:var(--spacer-5)}.cludo-p-0{padding:0}.cludo-p-1,.cludo-theme-current-facets-btn,.cludo-theme-facet-option,.cludo-theme-searchbar{padding:var(--spacer-1)}.cludo-p-2,.cludo-theme-icon-btn-secondary{padding:var(--spacer-2)}.cludo-p-3{padding:var(--spacer-3)}.cludo-p-4,.cludo-theme-result-link{padding:var(--spacer-4)}.cludo-p-5{padding:var(--spacer-5)}.cludo-pb-0{padding-bottom:0}.cludo-pb-1{padding-bottom:var(--spacer-1)}.cludo-pb-2{padding-bottom:var(--spacer-2)}.cludo-pb-3{padding-bottom:var(--spacer-3)}.cludo-pb-4{padding-bottom:var(--spacer-4)}.cludo-pb-5{padding-bottom:var(--spacer-5)}.cludo-pt-0{padding-top:0}.cludo-pt-1{padding-top:var(--spacer-1)}.cludo-pt-2{padding-top:var(--spacer-2)}.cludo-pt-3{padding-top:var(--spacer-3)}.cludo-pt-4{padding-top:var(--spacer-4)}.cludo-pt-5{padding-top:var(--spacer-5)}.cludo-pr-0{padding-right:0}.cludo-pr-1{padding-right:var(--spacer-1)}.cludo-pr-2{padding-right:var(--spacer-2)}.cludo-pr-3{padding-right:var(--spacer-3)}.cludo-pr-4{padding-right:var(--spacer-4)}.cludo-pr-5{padding-right:var(--spacer-5)}.cludo-pl-0{padding-left:0}.cludo-pl-1{padding-left:var(--spacer-1)}.cludo-pl-2{padding-left:var(--spacer-2)}.cludo-pl-3{padding-left:var(--spacer-3)}.cludo-pl-4{padding-left:var(--spacer-4)}.cludo-pl-5{padding-left:var(--spacer-5)}.cludo-px-0{padding-left:0;padding-right:0}.cludo-px-1,.cludo-theme-facet-count{padding-left:var(--spacer-1);padding-right:var(--spacer-1)}.cludo-px-2,.cludo-theme-current-facets,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{padding-left:var(--spacer-2);padding-right:var(--spacer-2)}.cludo-px-3,.cludo-theme-result-badge{padding-left:var(--spacer-3);padding-right:var(--spacer-3)}.cludo-px-4{padding-left:var(--spacer-4);padding-right:var(--spacer-4)}.cludo-px-5{padding-left:var(--spacer-5);padding-right:var(--spacer-5)}.cludo-py-0{padding-bottom:0;padding-top:0}.cludo-py-1,.cludo-theme-current-facets{padding-bottom:var(--spacer-1);padding-top:var(--spacer-1)}.cludo-py-2,.cludo-theme-result-badge{padding-bottom:var(--spacer-2);padding-top:var(--spacer-2)}.cludo-py-3{padding-bottom:var(--spacer-3);padding-top:var(--spacer-3)}.cludo-py-4{padding-bottom:var(--spacer-4);padding-top:var(--spacer-4)}.cludo-py-5{padding-bottom:var(--spacer-5);padding-top:var(--spacer-5)}.cludo-display-block,.cludo-theme-result-link{display:block}.cludo-display-inline-block,.cludo-theme-result-badge{display:inline-block}.cludo-display-flex,.cludo-theme-current-facets,.cludo-theme-facet-option,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{display:flex}.cludo-display-inline-flex,.cludo-theme-facet-count{display:inline-flex}.cludo-display-none{display:none}.cludo-flex-wrap{flex-wrap:wrap}.cludo-justify-content-between{justify-content:space-between}.cludo-justify-content-around{justify-content:space-around}.cludo-justify-content-start{justify-content:flex-start}.cludo-justify-content-center,.cludo-theme-facet-count,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{justify-content:center}.cludo-justify-content-end{justify-content:flex-end}.cludo-align-items-start,.cludo-theme-current-facets{align-items:flex-start}.cludo-align-items-center,.cludo-theme-facet-count,.cludo-theme-facet-option,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{align-items:center}.cludo-align-items-end{align-items:flex-end}.cludo-box-shadow-card,.cludo-theme-results-list{box-shadow:var(--box-shadow-card)}.cludo-border-radius-button,.cludo-theme-current-facets-btn,.cludo-theme-current-facets,.cludo-theme-facet-count,.cludo-theme-facet-option,.cludo-theme-searchbar,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-result-badge{border-radius:var(--border-radius-button)}.cludo-border-radius-card,.cludo-theme-results-list{border-radius:var(--border-radius-card)}.cludo-overflow-hidden,.cludo-theme-results-list{overflow:hidden}.cludo-width-sm{width:30px}.cludo-width-100,.cludo-theme-searchbar{width:100%}.cludo-height-xs,.cludo-theme-facet-count{height:18px}.cludo-height-sm,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{height:30px}.cludo-height-100,.cludo-theme-result-link{height:100%}.cludo-min-height-sm,.cludo-theme-current-facets{min-height:30px}.cludo-border-0,.cludo-theme-current-facets-btn,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{border:0}.cludo-list-style-none{list-style:none}.cludo-cursor-pointer,.cludo-theme-current-facets-btn,.cludo-theme-facet-option,.cludo-theme-btn,.cludo-theme-btn-gray,.cludo-theme-btn-accent-secondary,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-accent-secondary-inactive{cursor:pointer}.cludo-cursor-default,.cludo-theme-btn-accent-secondary-inactive{cursor:default}.cludo-border-box,.cludo-theme-current-facets,.cludo-theme-result-link{box-sizing:border-box}.cludo-opacity-70,.cludo-theme-btn-accent-secondary-inactive{opacity:.7}.cludo-pointer-events-none,.cludo-theme-btn-accent-secondary-inactive{pointer-events:none}.cludo-hidden{display:none}.cludo-line-height-2{line-height:2}.cludo-border-1-neutral,.cludo-theme-searchbar{border:1px solid var(--bg-color-gray-medium)}.cludo-row{display:flex}.cludo-flex-grow-1{flex-grow:1}.cludo-ellipsis-after:after,.cludo-theme-fragment-highlight:after{content:\"... \"}.cludo-col-in-grid-1{width:100%}.cludo-col-1{width:8.3333333333%}.cludo-col-in-grid-2{width:50%}.cludo-col-2{width:16.6666666667%}.cludo-col-in-grid-3{width:33.3333333333%}.cludo-col-3{width:25%}.cludo-col-in-grid-4{width:25%}.cludo-col-4{width:33.3333333333%}.cludo-col-in-grid-5{width:20%}.cludo-col-5{width:41.6666666667%}.cludo-col-in-grid-6{width:16.6666666667%}.cludo-col-6{width:50%}.cludo-col-in-grid-7{width:14.2857142857%}.cludo-col-7{width:58.3333333333%}.cludo-col-in-grid-8{width:12.5%}.cludo-col-8{width:66.6666666667%}.cludo-col-in-grid-9{width:11.1111111111%}.cludo-col-9{width:75%}.cludo-col-in-grid-10{width:10%}.cludo-col-10{width:83.3333333333%}.cludo-col-in-grid-11{width:9.0909090909%}.cludo-col-11{width:91.6666666667%}.cludo-col-in-grid-12{width:8.3333333333%}.cludo-col-12{width:100%}.cludo-font-size-xs,.cludo-theme-result-badge,.cludo-theme-facet-count,.cludo-theme-current-facets-btn{font-size:var(--font-size-xs)}.cludo-font-size-sm,.cludo-theme-result-url,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray{font-size:var(--font-size-sm)}.cludo-font-size-md,.cludo-theme-result-description,.cludo-theme-facet-option,.cludo-theme-current-facets{font-size:var(--font-size-md)}.cludo-font-size-lg,.cludo-theme-result-title{font-size:var(--font-size-lg)}.cludo-font-size-xl{font-size:var(--font-size-xl)}.cludo-font-color-black,.cludo-theme-result-title,.cludo-theme-btn-gray,.cludo-theme-facet-option{color:var(--font-color-black)}.cludo-font-color-white,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary{color:var(--font-color-white)}.cludo-font-color-gray,.cludo-theme-result-description,.cludo-theme-result-badge{color:var(--font-color-gray)}.cludo-font-color-highlight,.cludo-theme-result-url{color:var(--font-color-highlight)}.cludo-font-family-default,.cludo-theme-result-title,.cludo-theme-result-description,.cludo-theme-result-url,.cludo-theme-result-badge,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-current-facets{font-family:var(--font-family-default)}.cludo-font-family-header{font-family:var(--font-family-header)}.cludo-font-weight-bold,.cludo-theme-result-title,.cludo-theme-result-url,.cludo-theme-result-badge,.cludo-theme-icon-btn-secondary,.cludo-theme-current-facets-btn{font-weight:bold}.cludo-font-weight-normal{font-weight:normal}.cludo-text-decoration-none,.cludo-theme-result-link,.cludo-theme-facet-option{text-decoration:none}.cludo-border-none{border:0}.cludo-bg-color-white{background-color:var(--bg-color-white)}.cludo-bg-color-gray-light,.cludo-theme-btn-gray,.cludo-theme-facet-count{background-color:var(--bg-color-gray-light)}.cludo-bg-color-gray-medium,.cludo-theme-current-facets,.cludo-theme-current-facets-btn{background-color:var(--bg-color-gray-medium)}.cludo-bg-color-gray-dark{background-color:var(--bg-color-gray-dark)}.cludo-bg-color-accent-primary-light,.cludo-theme-result-badge{background-color:var(--bg-color-accent-primary-light)}.cludo-bg-color-accent-primary-medium{background-color:var(--bg-color-accent-primary-medium)}.cludo-bg-color-accent-primary-dark{background-color:var(--bg-color-accent-primary-dark)}.cludo-bg-color-accent-secondary-light{background-color:var(--bg-color-accent-secondary-light)}.cludo-bg-color-accent-secondary-medium,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary{background-color:var(--bg-color-accent-secondary-medium)}.cludo-bg-color-accent-secondary-dark{background-color:var(--bg-color-accent-secondary-dark)}.cludo-bg-hover-white:hover{background-color:var(--bg-color-white)}.cludo-bg-hover-gray-light:hover,.cludo-theme-result-link:hover,.cludo-theme-facet-option:hover{background-color:var(--bg-color-gray-light)}.cludo-bg-hover-gray-medium:hover,.cludo-theme-btn-gray:hover,.cludo-theme-fragment-highlight:hover{background-color:var(--bg-color-gray-medium)}.cludo-bg-hover-gray-dark:hover,.cludo-theme-current-facets-btn:hover{background-color:var(--bg-color-gray-dark)}.cludo-bg-hover-accent-primary-light:hover{background-color:var(--bg-color-accent-primary-light)}.cludo-bg-hover-accent-primary-medium:hover{background-color:var(--bg-color-accent-primary-medium)}.cludo-bg-hover-accent-primary-dark:hover{background-color:var(--bg-color-accent-primary-dark)}.cludo-bg-hover-accent-secondary-light:hover{background-color:var(--bg-color-accent-secondary-light)}.cludo-bg-hover-accent-secondary-medium:hover{background-color:var(--bg-color-accent-secondary-medium)}.cludo-bg-hover-accent-secondary-dark:hover,.cludo-theme-btn-accent-secondary:hover,.cludo-theme-btn-accent-secondary-inactive:hover,.cludo-theme-icon-btn-secondary:hover{background-color:var(--bg-color-accent-secondary-dark)}.cludo-m-0{margin:0}.cludo-m-1{margin:var(--spacer-1)}.cludo-m-2{margin:var(--spacer-2)}.cludo-m-3{margin:var(--spacer-3)}.cludo-m-4{margin:var(--spacer-4)}.cludo-m-5{margin:var(--spacer-5)}.cludo-mb-0{margin-bottom:0}.cludo-mb-1{margin-bottom:var(--spacer-1)}.cludo-mb-2,.cludo-theme-current-facets{margin-bottom:var(--spacer-2)}.cludo-mb-3,.cludo-theme-result-description,.cludo-theme-result-url,.cludo-theme-result-badge,.cludo-theme-searchbar{margin-bottom:var(--spacer-3)}.cludo-mb-4,.cludo-theme-result-title{margin-bottom:var(--spacer-4)}.cludo-mb-5{margin-bottom:var(--spacer-5)}.cludo-mt-0,.cludo-theme-result-title,.cludo-theme-result-description,.cludo-theme-result-url{margin-top:0}.cludo-mt-1{margin-top:var(--spacer-1)}.cludo-mt-2{margin-top:var(--spacer-2)}.cludo-mt-3{margin-top:var(--spacer-3)}.cludo-mt-4{margin-top:var(--spacer-4)}.cludo-mt-5{margin-top:var(--spacer-5)}.cludo-mr-0{margin-right:0}.cludo-mr-1{margin-right:var(--spacer-1)}.cludo-mr-2,.cludo-theme-current-facets{margin-right:var(--spacer-2)}.cludo-mr-3{margin-right:var(--spacer-3)}.cludo-mr-4{margin-right:var(--spacer-4)}.cludo-mr-5{margin-right:var(--spacer-5)}.cludo-ml-0{margin-left:0}.cludo-ml-1,.cludo-theme-current-facets-btn{margin-left:var(--spacer-1)}.cludo-ml-2,.cludo-theme-facet-count{margin-left:var(--spacer-2)}.cludo-ml-3{margin-left:var(--spacer-3)}.cludo-ml-4{margin-left:var(--spacer-4)}.cludo-ml-5{margin-left:var(--spacer-5)}.cludo-mx-0{margin-left:0;margin-right:0}.cludo-mx-1{margin-left:var(--spacer-1);margin-right:var(--spacer-1)}.cludo-mx-2{margin-left:var(--spacer-2);margin-right:var(--spacer-2)}.cludo-mx-3{margin-left:var(--spacer-3);margin-right:var(--spacer-3)}.cludo-mx-4{margin-left:var(--spacer-4);margin-right:var(--spacer-4)}.cludo-mx-5{margin-left:var(--spacer-5);margin-right:var(--spacer-5)}.cludo-my-0{margin-bottom:0;margin-top:0}.cludo-my-1{margin-bottom:var(--spacer-1);margin-top:var(--spacer-1)}.cludo-my-2{margin-bottom:var(--spacer-2);margin-top:var(--spacer-2)}.cludo-my-3{margin-bottom:var(--spacer-3);margin-top:var(--spacer-3)}.cludo-my-4{margin-bottom:var(--spacer-4);margin-top:var(--spacer-4)}.cludo-my-5{margin-bottom:var(--spacer-5);margin-top:var(--spacer-5)}.cludo-p-0{padding:0}.cludo-p-1,.cludo-theme-searchbar,.cludo-theme-facet-option,.cludo-theme-current-facets-btn{padding:var(--spacer-1)}.cludo-p-2,.cludo-theme-icon-btn-secondary{padding:var(--spacer-2)}.cludo-p-3{padding:var(--spacer-3)}.cludo-p-4,.cludo-theme-result-link{padding:var(--spacer-4)}.cludo-p-5{padding:var(--spacer-5)}.cludo-pb-0{padding-bottom:0}.cludo-pb-1{padding-bottom:var(--spacer-1)}.cludo-pb-2{padding-bottom:var(--spacer-2)}.cludo-pb-3{padding-bottom:var(--spacer-3)}.cludo-pb-4{padding-bottom:var(--spacer-4)}.cludo-pb-5{padding-bottom:var(--spacer-5)}.cludo-pt-0{padding-top:0}.cludo-pt-1{padding-top:var(--spacer-1)}.cludo-pt-2{padding-top:var(--spacer-2)}.cludo-pt-3{padding-top:var(--spacer-3)}.cludo-pt-4{padding-top:var(--spacer-4)}.cludo-pt-5{padding-top:var(--spacer-5)}.cludo-pr-0{padding-right:0}.cludo-pr-1{padding-right:var(--spacer-1)}.cludo-pr-2{padding-right:var(--spacer-2)}.cludo-pr-3{padding-right:var(--spacer-3)}.cludo-pr-4{padding-right:var(--spacer-4)}.cludo-pr-5{padding-right:var(--spacer-5)}.cludo-pl-0{padding-left:0}.cludo-pl-1{padding-left:var(--spacer-1)}.cludo-pl-2{padding-left:var(--spacer-2)}.cludo-pl-3{padding-left:var(--spacer-3)}.cludo-pl-4{padding-left:var(--spacer-4)}.cludo-pl-5{padding-left:var(--spacer-5)}.cludo-px-0{padding-left:0;padding-right:0}.cludo-px-1,.cludo-theme-facet-count{padding-left:var(--spacer-1);padding-right:var(--spacer-1)}.cludo-px-2,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-current-facets{padding-left:var(--spacer-2);padding-right:var(--spacer-2)}.cludo-px-3,.cludo-theme-result-badge{padding-left:var(--spacer-3);padding-right:var(--spacer-3)}.cludo-px-4{padding-left:var(--spacer-4);padding-right:var(--spacer-4)}.cludo-px-5{padding-left:var(--spacer-5);padding-right:var(--spacer-5)}.cludo-py-0{padding-bottom:0;padding-top:0}.cludo-py-1,.cludo-theme-current-facets{padding-bottom:var(--spacer-1);padding-top:var(--spacer-1)}.cludo-py-2,.cludo-theme-result-badge{padding-bottom:var(--spacer-2);padding-top:var(--spacer-2)}.cludo-py-3{padding-bottom:var(--spacer-3);padding-top:var(--spacer-3)}.cludo-py-4{padding-bottom:var(--spacer-4);padding-top:var(--spacer-4)}.cludo-py-5{padding-bottom:var(--spacer-5);padding-top:var(--spacer-5)}.cludo-display-block,.cludo-theme-result-link{display:block}.cludo-display-inline-block,.cludo-theme-result-badge{display:inline-block}.cludo-display-flex,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-facet-option,.cludo-theme-current-facets{display:flex}.cludo-display-inline-flex,.cludo-theme-facet-count{display:inline-flex}.cludo-display-none{display:none}.cludo-flex-wrap{flex-wrap:wrap}.cludo-justify-content-between{justify-content:space-between}.cludo-justify-content-around{justify-content:space-around}.cludo-justify-content-start{justify-content:flex-start}.cludo-justify-content-center,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-facet-count{justify-content:center}.cludo-justify-content-end{justify-content:flex-end}.cludo-align-items-start,.cludo-theme-current-facets{align-items:flex-start}.cludo-align-items-center,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-facet-option,.cludo-theme-facet-count{align-items:center}.cludo-align-items-end{align-items:flex-end}.cludo-box-shadow-card,.cludo-theme-results-list{box-shadow:var(--box-shadow-card)}.cludo-border-radius-button,.cludo-theme-result-badge,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-searchbar,.cludo-theme-facet-option,.cludo-theme-facet-count,.cludo-theme-current-facets,.cludo-theme-current-facets-btn{border-radius:var(--border-radius-button)}.cludo-border-radius-card,.cludo-theme-results-list{border-radius:var(--border-radius-card)}.cludo-overflow-hidden,.cludo-theme-results-list{overflow:hidden}.cludo-width-sm{width:30px}.cludo-width-100,.cludo-theme-searchbar{width:100%}.cludo-height-xs,.cludo-theme-facet-count{height:18px}.cludo-height-sm,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray{height:30px}.cludo-height-100,.cludo-theme-result-link{height:100%}.cludo-min-height-sm,.cludo-theme-current-facets{min-height:30px}.cludo-border-0,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-current-facets-btn{border:0}.cludo-list-style-none{list-style:none}.cludo-cursor-pointer,.cludo-theme-btn,.cludo-theme-btn-accent-secondary,.cludo-theme-btn-accent-secondary-inactive,.cludo-theme-icon-btn-secondary,.cludo-theme-btn-gray,.cludo-theme-facet-option,.cludo-theme-current-facets-btn{cursor:pointer}.cludo-cursor-default,.cludo-theme-btn-accent-secondary-inactive{cursor:default}.cludo-border-box,.cludo-theme-result-link,.cludo-theme-current-facets{box-sizing:border-box}.cludo-opacity-70,.cludo-theme-btn-accent-secondary-inactive{opacity:.7}.cludo-pointer-events-none,.cludo-theme-btn-accent-secondary-inactive{pointer-events:none}.cludo-hidden{display:none}.cludo-line-height-2{line-height:2}.cludo-border-1-neutral,.cludo-theme-searchbar{border:1px solid var(--bg-color-gray-medium)}.cludo-row{display:flex}.cludo-flex-grow-1{flex-grow:1}.cludo-ellipsis-after:after,.cludo-theme-fragment-highlight:after{content:\"... \"}.cludo-col-in-grid-1{width:100%}.cludo-col-1{width:8.3333333333%}.cludo-col-in-grid-2{width:50%}.cludo-col-2{width:16.6666666667%}.cludo-col-in-grid-3{width:33.3333333333%}.cludo-col-3{width:25%}.cludo-col-in-grid-4{width:25%}.cludo-col-4{width:33.3333333333%}.cludo-col-in-grid-5{width:20%}.cludo-col-5{width:41.6666666667%}.cludo-col-in-grid-6{width:16.6666666667%}.cludo-col-6{width:50%}.cludo-col-in-grid-7{width:14.2857142857%}.cludo-col-7{width:58.3333333333%}.cludo-col-in-grid-8{width:12.5%}.cludo-col-8{width:66.6666666667%}.cludo-col-in-grid-9{width:11.1111111111%}.cludo-col-9{width:75%}.cludo-col-in-grid-10{width:10%}.cludo-col-10{width:83.3333333333%}.cludo-col-in-grid-11{width:9.0909090909%}.cludo-col-11{width:91.6666666667%}.cludo-col-in-grid-12{width:8.3333333333%}.cludo-col-12{width:100%}.cludo-theme-basic{--spacer-1: 4px;--spacer-2: 8px;--spacer-3: 12px;--spacer-4: 20px;--spacer-5: 30px;--spacer-6: 50px;--font-size-xs: 10px;--font-size-sm: 12px;--font-size-md: 14px;--font-size-lg: 16px;--font-size-xl: 20px;--border-radius-button: 4px;--border-radius-card: 12px;--font-color-black: #101828;--font-color-white: #ffffff;--font-color-gray: #344054;--font-color-highlight: #9E77ED;--font-family-default: system-ui, sans-serif;--font-family-header: system-ui, sans-serif;--bg-color-white: #fff;--bg-color-gray-light: #f1f4f9;--bg-color-gray-medium: #D1D7E2;--bg-color-gray-dark: #A3B0C6;--bg-color-accent-primary-light: #D0C3F1;--bg-color-accent-primary-medium: #9E77ED;--bg-color-accent-primary-dark: #6941C6;--bg-color-accent-secondary-light: #e4809c;--bg-color-accent-secondary-medium: #d72f5c;--bg-color-accent-secondary-dark: #72112b;--box-shadow-card: 0 0 20px 4px rgba(0,0,0,.1)}#cludo-back-to-top{display:none}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/utility.scss\",\"webpack://./src/styles/variables.scss\",\"webpack://./src/styles/reset.scss\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"// ABOUT THIS FILE\\r\\n// These utility classes can be used (and should be used, whenever possible)\\r\\n// to apply single style rules to our components. Also, whenever possible, utility\\r\\n// classes should use variables from variables.scss so that any changes or overrides\\r\\n// to those variables in a theme defined by a consumer willget applied to our components\\r\\n// through these utility classes (check the 'about' section in variables.scss for\\r\\n// more info).\\r\\n//\\r\\n// FUTURE\\r\\n// We may consider replacing these utility classes with a pre-built css library like Tailwind\\r\\n\\r\\n.cludo {\\r\\n &-font-size {\\r\\n &-xs {\\r\\n font-size: var(--font-size-xs);\\r\\n }\\r\\n &-sm {\\r\\n font-size: var(--font-size-sm);\\r\\n }\\r\\n &-md {\\r\\n font-size: var(--font-size-md);\\r\\n }\\r\\n &-lg {\\r\\n font-size: var(--font-size-lg);\\r\\n }\\r\\n &-xl {\\r\\n font-size: var(--font-size-xl);\\r\\n }\\r\\n }\\r\\n\\r\\n &-font-color {\\r\\n &-black {\\r\\n color: var(--font-color-black);\\r\\n }\\r\\n &-white {\\r\\n color: var(--font-color-white);\\r\\n }\\r\\n &-gray {\\r\\n color: var(--font-color-gray);\\r\\n }\\r\\n &-highlight {\\r\\n color: var(--font-color-highlight);\\r\\n }\\r\\n }\\r\\n\\r\\n &-font-family {\\r\\n &-default {\\r\\n font-family: var(--font-family-default);\\r\\n }\\r\\n &-header {\\r\\n font-family: var(--font-family-header);\\r\\n }\\r\\n }\\r\\n\\r\\n &-font-weight {\\r\\n &-bold {\\r\\n font-weight: bold;\\r\\n }\\r\\n &-normal {\\r\\n font-weight: normal;\\r\\n }\\r\\n }\\r\\n\\r\\n &-text-decoration {\\r\\n &-none {\\r\\n text-decoration: none;\\r\\n }\\r\\n }\\r\\n\\r\\n &-border {\\r\\n &-none {\\r\\n border: 0;\\r\\n }\\r\\n }\\r\\n\\r\\n &-bg-color {\\r\\n &-white {\\r\\n background-color: var(--bg-color-white);\\r\\n }\\r\\n &-gray-light {\\r\\n background-color: var(--bg-color-gray-light);\\r\\n }\\r\\n &-gray-medium {\\r\\n background-color: var(--bg-color-gray-medium);\\r\\n }\\r\\n &-gray-dark {\\r\\n background-color: var(--bg-color-gray-dark);\\r\\n }\\r\\n &-accent-primary-light {\\r\\n background-color: var(--bg-color-accent-primary-light);\\r\\n }\\r\\n &-accent-primary-medium {\\r\\n background-color: var(--bg-color-accent-primary-medium);\\r\\n }\\r\\n &-accent-primary-dark {\\r\\n background-color: var(--bg-color-accent-primary-dark);\\r\\n }\\r\\n &-accent-secondary-light {\\r\\n background-color: var(--bg-color-accent-secondary-light);\\r\\n }\\r\\n &-accent-secondary-medium {\\r\\n background-color: var(--bg-color-accent-secondary-medium);\\r\\n }\\r\\n &-accent-secondary-dark {\\r\\n background-color: var(--bg-color-accent-secondary-dark);\\r\\n }\\r\\n }\\r\\n\\r\\n &-bg-hover {\\r\\n &-white {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-white);\\r\\n }\\r\\n }\\r\\n &-gray-light {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-gray-light);\\r\\n }\\r\\n }\\r\\n &-gray-medium {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-gray-medium);\\r\\n }\\r\\n }\\r\\n &-gray-dark {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-gray-dark);\\r\\n }\\r\\n }\\r\\n &-accent-primary-light {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-accent-primary-light);\\r\\n }\\r\\n }\\r\\n &-accent-primary-medium {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-accent-primary-medium);\\r\\n }\\r\\n }\\r\\n &-accent-primary-dark {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-accent-primary-dark);\\r\\n }\\r\\n }\\r\\n &-accent-secondary-light {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-accent-secondary-light);\\r\\n }\\r\\n }\\r\\n &-accent-secondary-medium {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-accent-secondary-medium);\\r\\n }\\r\\n }\\r\\n &-accent-secondary-dark {\\r\\n &:hover {\\r\\n background-color: var(--bg-color-accent-secondary-dark);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n &-m {\\r\\n &-0 {\\r\\n margin: 0;\\r\\n }\\r\\n &-1 {\\r\\n margin: var(--spacer-1);\\r\\n }\\r\\n &-2 {\\r\\n margin: var(--spacer-2);\\r\\n }\\r\\n &-3 {\\r\\n margin: var(--spacer-3);\\r\\n }\\r\\n &-4 {\\r\\n margin: var(--spacer-4);\\r\\n }\\r\\n &-5 {\\r\\n margin: var(--spacer-5);\\r\\n }\\r\\n &b-0 {\\r\\n margin-bottom: 0;\\r\\n }\\r\\n &b-1 {\\r\\n margin-bottom: var(--spacer-1);\\r\\n }\\r\\n &b-2 {\\r\\n margin-bottom: var(--spacer-2);\\r\\n }\\r\\n &b-3 {\\r\\n margin-bottom: var(--spacer-3);\\r\\n }\\r\\n &b-4 {\\r\\n margin-bottom: var(--spacer-4);\\r\\n }\\r\\n &b-5 {\\r\\n margin-bottom: var(--spacer-5);\\r\\n }\\r\\n &t-0 {\\r\\n margin-top: 0;\\r\\n }\\r\\n &t-1 {\\r\\n margin-top: var(--spacer-1);\\r\\n }\\r\\n &t-2 {\\r\\n margin-top: var(--spacer-2);\\r\\n }\\r\\n &t-3 {\\r\\n margin-top: var(--spacer-3);\\r\\n }\\r\\n &t-4 {\\r\\n margin-top: var(--spacer-4);\\r\\n }\\r\\n &t-5 {\\r\\n margin-top: var(--spacer-5);\\r\\n }\\r\\n &r-0 {\\r\\n margin-right: 0;\\r\\n }\\r\\n &r-1 {\\r\\n margin-right: var(--spacer-1);\\r\\n }\\r\\n &r-2 {\\r\\n margin-right: var(--spacer-2);\\r\\n }\\r\\n &r-3 {\\r\\n margin-right: var(--spacer-3);\\r\\n }\\r\\n &r-4 {\\r\\n margin-right: var(--spacer-4);\\r\\n }\\r\\n &r-5 {\\r\\n margin-right: var(--spacer-5);\\r\\n }\\r\\n &l-0 {\\r\\n margin-left: 0;\\r\\n }\\r\\n &l-1 {\\r\\n margin-left: var(--spacer-1);\\r\\n }\\r\\n &l-2 {\\r\\n margin-left: var(--spacer-2);\\r\\n }\\r\\n &l-3 {\\r\\n margin-left: var(--spacer-3);\\r\\n }\\r\\n &l-4 {\\r\\n margin-left: var(--spacer-4);\\r\\n }\\r\\n &l-5 {\\r\\n margin-left: var(--spacer-5);\\r\\n }\\r\\n &x-0 {\\r\\n margin-left: 0;\\r\\n margin-right: 0;\\r\\n }\\r\\n &x-1 {\\r\\n margin-left: var(--spacer-1);\\r\\n margin-right: var(--spacer-1);\\r\\n }\\r\\n &x-2 {\\r\\n margin-left: var(--spacer-2);\\r\\n margin-right: var(--spacer-2);\\r\\n }\\r\\n &x-3 {\\r\\n margin-left: var(--spacer-3);\\r\\n margin-right: var(--spacer-3);\\r\\n }\\r\\n &x-4 {\\r\\n margin-left: var(--spacer-4);\\r\\n margin-right: var(--spacer-4);\\r\\n }\\r\\n &x-5 {\\r\\n margin-left: var(--spacer-5);\\r\\n margin-right: var(--spacer-5);\\r\\n }\\r\\n &y-0 {\\r\\n margin-bottom: 0;\\r\\n margin-top: 0;\\r\\n }\\r\\n &y-1 {\\r\\n margin-bottom: var(--spacer-1);\\r\\n margin-top: var(--spacer-1);\\r\\n }\\r\\n &y-2 {\\r\\n margin-bottom: var(--spacer-2);\\r\\n margin-top: var(--spacer-2);\\r\\n }\\r\\n &y-3 {\\r\\n margin-bottom: var(--spacer-3);\\r\\n margin-top: var(--spacer-3);\\r\\n }\\r\\n &y-4 {\\r\\n margin-bottom: var(--spacer-4);\\r\\n margin-top: var(--spacer-4);\\r\\n }\\r\\n &y-5 {\\r\\n margin-bottom: var(--spacer-5);\\r\\n margin-top: var(--spacer-5);\\r\\n }\\r\\n }\\r\\n\\r\\n &-p {\\r\\n &-0 {\\r\\n padding: 0;\\r\\n }\\r\\n &-1 {\\r\\n padding: var(--spacer-1);\\r\\n }\\r\\n &-2 {\\r\\n padding: var(--spacer-2);\\r\\n }\\r\\n &-3 {\\r\\n padding: var(--spacer-3);\\r\\n }\\r\\n &-4 {\\r\\n padding: var(--spacer-4);\\r\\n }\\r\\n &-5 {\\r\\n padding: var(--spacer-5);\\r\\n }\\r\\n &b-0 {\\r\\n padding-bottom: 0;\\r\\n }\\r\\n &b-1 {\\r\\n padding-bottom: var(--spacer-1);\\r\\n }\\r\\n &b-2 {\\r\\n padding-bottom: var(--spacer-2);\\r\\n }\\r\\n &b-3 {\\r\\n padding-bottom: var(--spacer-3);\\r\\n }\\r\\n &b-4 {\\r\\n padding-bottom: var(--spacer-4);\\r\\n }\\r\\n &b-5 {\\r\\n padding-bottom: var(--spacer-5);\\r\\n }\\r\\n &t-0 {\\r\\n padding-top: 0;\\r\\n }\\r\\n &t-1 {\\r\\n padding-top: var(--spacer-1);\\r\\n }\\r\\n &t-2 {\\r\\n padding-top: var(--spacer-2);\\r\\n }\\r\\n &t-3 {\\r\\n padding-top: var(--spacer-3);\\r\\n }\\r\\n &t-4 {\\r\\n padding-top: var(--spacer-4);\\r\\n }\\r\\n &t-5 {\\r\\n padding-top: var(--spacer-5);\\r\\n }\\r\\n &r-0 {\\r\\n padding-right: 0;\\r\\n }\\r\\n &r-1 {\\r\\n padding-right: var(--spacer-1);\\r\\n }\\r\\n &r-2 {\\r\\n padding-right: var(--spacer-2);\\r\\n }\\r\\n &r-3 {\\r\\n padding-right: var(--spacer-3);\\r\\n }\\r\\n &r-4 {\\r\\n padding-right: var(--spacer-4);\\r\\n }\\r\\n &r-5 {\\r\\n padding-right: var(--spacer-5);\\r\\n }\\r\\n &l-0 {\\r\\n padding-left: 0;\\r\\n }\\r\\n &l-1 {\\r\\n padding-left: var(--spacer-1);\\r\\n }\\r\\n &l-2 {\\r\\n padding-left: var(--spacer-2);\\r\\n }\\r\\n &l-3 {\\r\\n padding-left: var(--spacer-3);\\r\\n }\\r\\n &l-4 {\\r\\n padding-left: var(--spacer-4);\\r\\n }\\r\\n &l-5 {\\r\\n padding-left: var(--spacer-5);\\r\\n }\\r\\n &x-0 {\\r\\n padding-left: 0;\\r\\n padding-right: 0;\\r\\n }\\r\\n &x-1 {\\r\\n padding-left: var(--spacer-1);\\r\\n padding-right: var(--spacer-1);\\r\\n }\\r\\n &x-2 {\\r\\n padding-left: var(--spacer-2);\\r\\n padding-right: var(--spacer-2);\\r\\n }\\r\\n &x-3 {\\r\\n padding-left: var(--spacer-3);\\r\\n padding-right: var(--spacer-3);\\r\\n }\\r\\n &x-4 {\\r\\n padding-left: var(--spacer-4);\\r\\n padding-right: var(--spacer-4);\\r\\n }\\r\\n &x-5 {\\r\\n padding-left: var(--spacer-5);\\r\\n padding-right: var(--spacer-5);\\r\\n }\\r\\n &y-0 {\\r\\n padding-bottom: 0;\\r\\n padding-top: 0;\\r\\n }\\r\\n &y-1 {\\r\\n padding-bottom: var(--spacer-1);\\r\\n padding-top: var(--spacer-1);\\r\\n }\\r\\n &y-2 {\\r\\n padding-bottom: var(--spacer-2);\\r\\n padding-top: var(--spacer-2);\\r\\n }\\r\\n &y-3 {\\r\\n padding-bottom: var(--spacer-3);\\r\\n padding-top: var(--spacer-3);\\r\\n }\\r\\n &y-4 {\\r\\n padding-bottom: var(--spacer-4);\\r\\n padding-top: var(--spacer-4);\\r\\n }\\r\\n &y-5 {\\r\\n padding-bottom: var(--spacer-5);\\r\\n padding-top: var(--spacer-5);\\r\\n }\\r\\n }\\r\\n\\r\\n &-display {\\r\\n &-block {\\r\\n display: block;\\r\\n }\\r\\n &-inline-block {\\r\\n display: inline-block;\\r\\n }\\r\\n &-flex {\\r\\n display: flex;\\r\\n }\\r\\n &-inline-flex {\\r\\n display: inline-flex;\\r\\n }\\r\\n &-none {\\r\\n display: none;\\r\\n }\\r\\n }\\r\\n\\r\\n &-flex-wrap {\\r\\n flex-wrap: wrap;\\r\\n }\\r\\n\\r\\n &-justify-content {\\r\\n &-between {\\r\\n justify-content: space-between;\\r\\n }\\r\\n &-around {\\r\\n justify-content: space-around;\\r\\n }\\r\\n &-start {\\r\\n justify-content: flex-start;\\r\\n }\\r\\n &-center {\\r\\n justify-content: center;\\r\\n }\\r\\n &-end {\\r\\n justify-content: flex-end;\\r\\n }\\r\\n }\\r\\n\\r\\n &-align-items {\\r\\n &-start {\\r\\n align-items: flex-start;\\r\\n }\\r\\n &-center {\\r\\n align-items: center;\\r\\n }\\r\\n &-end {\\r\\n align-items: flex-end;\\r\\n }\\r\\n }\\r\\n\\r\\n &-box-shadow {\\r\\n &-card {\\r\\n box-shadow: var(--box-shadow-card);\\r\\n }\\r\\n }\\r\\n\\r\\n &-border-radius {\\r\\n &-button {\\r\\n border-radius: var(--border-radius-button);\\r\\n }\\r\\n &-card {\\r\\n border-radius: var(--border-radius-card);\\r\\n }\\r\\n }\\r\\n\\r\\n &-overflow {\\r\\n &-hidden {\\r\\n overflow: hidden;\\r\\n }\\r\\n }\\r\\n\\r\\n &-width {\\r\\n &-sm {\\r\\n width: 30px;\\r\\n }\\r\\n &-100 {\\r\\n width: 100%;\\r\\n }\\r\\n }\\r\\n\\r\\n &-height {\\r\\n &-xs {\\r\\n height: 18px;\\r\\n }\\r\\n &-sm {\\r\\n height: 30px;\\r\\n }\\r\\n &-100 {\\r\\n height: 100%;\\r\\n }\\r\\n }\\r\\n \\r\\n &-min-height {\\r\\n &-sm {\\r\\n min-height: 30px;\\r\\n }\\r\\n }\\r\\n\\r\\n &-border {\\r\\n &-0 {\\r\\n border: 0;\\r\\n }\\r\\n }\\r\\n\\r\\n &-list-style {\\r\\n &-none {\\r\\n list-style: none;\\r\\n }\\r\\n }\\r\\n\\r\\n &-cursor-pointer {\\r\\n cursor: pointer;\\r\\n }\\r\\n\\r\\n &-cursor-default {\\r\\n cursor: default;\\r\\n }\\r\\n\\r\\n &-border-box {\\r\\n box-sizing: border-box;\\r\\n }\\r\\n\\r\\n &-opacity-70 {\\r\\n opacity: .7;\\r\\n }\\r\\n\\r\\n &-pointer-events-none {\\r\\n pointer-events: none;\\r\\n }\\r\\n\\r\\n &-hidden {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n &-line-height-2 {\\r\\n line-height: 2;\\r\\n }\\r\\n\\r\\n &-border-1-neutral {\\r\\n border: 1px solid var(--bg-color-gray-medium);\\r\\n }\\r\\n\\r\\n &-row {\\r\\n display: flex;\\r\\n }\\r\\n\\r\\n &-flex-grow-1 {\\r\\n flex-grow: 1;\\r\\n }\\r\\n\\r\\n &-ellipsis-after {\\r\\n &:after {\\r\\n content: '... ';\\r\\n }\\r\\n }\\r\\n\\r\\n @for $cols from 1 through 12 {\\r\\n &-col-in-grid-#{$cols} {\\r\\n width: calc(100% / $cols); \\r\\n }\\r\\n &-col-#{$cols} {\\r\\n width: calc(($cols / 12) * 100%);\\r\\n }\\r\\n }\\r\\n}\",\"// ABOUT THIS FILE\\r\\n// Variables here must be scoped to classes that correspond to a theme name.\\r\\n// Consumers can enter a theme name in the `cssTheme` config option to apply\\r\\n// these scoped variables to Cludo components.\\r\\n//\\r\\n// Furthermore, these same variables can be added on the consuming client in \\r\\n// a more specific scope i.e.\\r\\n// :root {\\r\\n// .cludo-theme-basic { /* variables go here */ }\\r\\n// .my-custom-theme { /* variables go here */ }\\r\\n// }\\r\\n//\\r\\n// This allows consumers to create new themes themselves or override the \\r\\n// Cludo-provided themes defined here\\r\\n\\r\\n.cludo-theme-basic {\\r\\n --spacer-1: 4px;\\r\\n --spacer-2: 8px;\\r\\n --spacer-3: 12px;\\r\\n --spacer-4: 20px;\\r\\n --spacer-5: 30px;\\r\\n --spacer-6: 50px;\\r\\n\\r\\n --font-size-xs: 10px;\\r\\n --font-size-sm: 12px;\\r\\n --font-size-md: 14px;\\r\\n --font-size-lg: 16px;\\r\\n --font-size-xl: 20px;\\r\\n\\r\\n --border-radius-button: 4px;\\r\\n --border-radius-card: 12px;\\r\\n\\r\\n --font-color-black: #101828;\\r\\n --font-color-white: #ffffff;\\r\\n --font-color-gray: #344054;\\r\\n --font-color-highlight: #9E77ED;\\r\\n \\r\\n --font-family-default: system-ui, sans-serif;\\r\\n --font-family-header: system-ui, sans-serif;\\r\\n\\r\\n --bg-color-white: #fff;\\r\\n --bg-color-gray-light: #f1f4f9;\\r\\n --bg-color-gray-medium: #D1D7E2;\\r\\n --bg-color-gray-dark: #A3B0C6;\\r\\n --bg-color-accent-primary-light: #D0C3F1;\\r\\n --bg-color-accent-primary-medium: #9E77ED;\\r\\n --bg-color-accent-primary-dark: #6941C6;\\r\\n --bg-color-accent-secondary-light: #e4809c;\\r\\n --bg-color-accent-secondary-medium: #d72f5c;\\r\\n --bg-color-accent-secondary-dark: #72112b;\\r\\n\\r\\n --box-shadow-card: 0 0 20px 4px rgba(0,0,0,.1);\\r\\n}\\r\\n\",\"// ADD STYLE RESETS AS A LAST RESORT.\\r\\n//\\r\\n// This is meant as an escape hatch to help control some of the ways Core JS controls the UI.\\r\\n// Ideally, changes should be made in Core JS, but sometimes tiny changes can have larger side\\r\\n// effects, so resets can be used here to control styles.\\r\\n\\r\\n#cludo-back-to-top {\\r\\n display: none;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./all.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./all.scss\";\n export default content && content.locals ? content.locals : undefined;\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","import React from \"react\";\r\n\r\nimport { EventController } from './utils/event-controller';\r\nimport { CludoSearchContext } from \"./utils/cludo-search-context\";\r\n\r\n// Provider and Consumer are connected through their \"parent\" context\r\nexport const CludoContext = React.createContext<CludoSearchContext>({} as any);\r\nexport const EventControllerContext = React.createContext<EventController>({} as any);\r\n","import { TypedDocument } from \"@cludosearch/cludo-api-client/dist/interfaces/api/search.interface\";\r\nimport { AutocompleteResult, AutocompleteTopHit } from \"../components/types/types\";\r\nimport { FacetMap, TopHit } from \"../types/core-script-types\";\r\n\r\nexport const MISSING_FIELD = 'MISSING FIELD';\r\n\r\nexport function getUrl(result: TypedDocument): string {\r\n return result.Fields['Url'].Value;\r\n}\r\n\r\nexport function hasField(result: TypedDocument, fieldName: string): boolean {\r\n return (result.FieldNames.indexOf(fieldName) !== -1);\r\n}\r\n\r\nexport function getFieldValue(result: TypedDocument, fieldName: string, maxWords?: number, wordDelim = ' '): string {\r\n if (!hasField(result, fieldName)) {\r\n return MISSING_FIELD;\r\n }\r\n \r\n let value = result.Fields[fieldName].Value;\r\n if (maxWords && maxWords > 0) {\r\n let words = value.split(wordDelim);\r\n if (words.length > maxWords) {\r\n value = words.slice(0, maxWords).join(wordDelim);\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function getFieldValues(result: TypedDocument, fieldName: string): string[] {\r\n if (!hasField(result, fieldName)) {\r\n return [MISSING_FIELD];\r\n }\r\n return result.Fields[fieldName].Values;\r\n}\r\n\r\n/** Helper function similar to what is used in Razor templates */\r\nexport function getHighlightsOrValues(result: TypedDocument, fieldName: string, maxWords?: number, wordDelim = ' ', delim: string = '...'): string {\r\n if (!hasField(result, fieldName)) {\r\n return MISSING_FIELD;\r\n }\r\n return getHighlightsOrValuesArray(result, fieldName, maxWords, wordDelim).join(delim);\r\n}\r\n\r\n/** Helper function to get an array of description fragments for a result */\r\nexport function getHighlightsOrValuesArray(result: TypedDocument, fieldName: string, maxWords?: number, wordDelim = ' '): string[] {\r\n return (result.Fields[fieldName]?.Highlights?.length > 0) ?\r\n trimArrayToMaxWords(result.Fields[fieldName].Highlights, maxWords) :\r\n [getFieldValue(result, fieldName, maxWords, wordDelim)];\r\n}\r\n\r\n/** Helper for getHighlightsOrValuesArray function to trim array of strings to max words */\r\nfunction trimArrayToMaxWords(values: string[], maxWords?: number) {\r\n let returnValues = [...values];\r\n if (maxWords) {\r\n let wordCount = 0;\r\n for (let i = 0; i < returnValues.length; i++) {\r\n let stringArray = returnValues[i].split(' ');\r\n wordCount += stringArray.length;\r\n if (wordCount > maxWords) {\r\n returnValues.splice(i);\r\n return returnValues;\r\n }\r\n }\r\n }\r\n return returnValues;\r\n}\r\n\r\n/** Returns an object that can be used for setting inner HTML */\r\nexport function getFormattedHTML(val: string) {\r\n return {__html: val};\r\n}\r\n\r\n/** Logs error message when result object missing from result widget components */\r\nexport function logMissingResultError(component: string): void {\r\n console.error(`No result provided to ${component} component. ${component} must receive a result through props or from a result context provider.`);\r\n}\r\n\r\n/** Checks if the selected element is an autocomplete item */\r\nexport function isAutocompleteItem(element: Element | null): boolean {\r\n if (!element) {\r\n return false;\r\n }\r\n return element.hasAttribute('data-cludo-autocomplete');\r\n}\r\n\r\n/** Extracts results from autocomplete top hit groups into a single array */\r\nexport function getAutocompleteResultsFromTopHits(categorizedResultGroups: AutocompleteTopHit[]): AutocompleteResult[] {\r\n let results: AutocompleteResult[] = [];\r\n categorizedResultGroups.forEach(resultGroup => {\r\n resultGroup.Values.forEach(resultValue => {\r\n results = results.concat(resultValue.Hits);\r\n })\r\n })\r\n return results;\r\n}\r\n\r\n/** Derive total number of results for individual categorized result categories from result counts in facet map */\r\nexport function getTopHitTotalCount<T extends TopHit | AutocompleteTopHit>(hit: T, facets: FacetMap) {\r\n return {\r\n Field: hit.Field,\r\n Values: hit.Values.map(hitValue => {\r\n const facetMatch = facets[hit.Field];\r\n const facetValueMatch = facetMatch?.Items?.find(value => value.Key === hitValue.Value);\r\n const count = facetValueMatch ? facetValueMatch.Count : 0;\r\n return {\r\n ...hitValue,\r\n AllCount: count\r\n }\r\n })\r\n } as T\r\n}","import React, { useContext, useEffect, useRef, useState} from \"react\";\r\nimport { CludoContext, EventControllerContext } from \"../../context\";\r\nimport { getFieldValue, getHighlightsOrValuesArray, hasField, logMissingResultError } from \"../../utils/result-utils\";\r\nimport { getLinkFragmentUrlPart } from \"../../utils/context-utils\";\r\nimport { EventController } from \"../../utils/event-controller\";\r\nimport { ResultContext } from \"../results/items/custom-result\";\r\nimport { BaseResultProps } from \"../types/types\";\r\n\r\ninterface ResultLinkProps extends BaseResultProps {\r\n className?: string,\r\n children?: React.ReactNode,\r\n openNewTab?: boolean,\r\n autofocus?: boolean\r\n}\r\n\r\ninterface LinkContext {\r\n onFragmentHover: (fragmentStr?: string) => void;\r\n onFragmentSelect: () => void; \r\n}\r\n\r\nexport const LinkContext = React.createContext<LinkContext>({} as any);\r\n\r\nexport function ResultLink(props: ResultLinkProps) {\r\n const context = useContext(CludoContext);\r\n const eventController = useContext(EventControllerContext);\r\n const resultContext = useContext(ResultContext);\r\n\r\n const [fragmentUrlPart, setFragmentUrlPart] = useState('');\r\n\r\n const result = props.result || resultContext;\r\n if (!result) {\r\n logMissingResultError('ResultLink');\r\n return null;\r\n }\r\n \r\n const model = result;\r\n const eleClass = props.className ? props.className : '';\r\n const titleField = getFieldValue(result, '_type') === \"PageContent\" ? 'Title' : 'fc_Title';\r\n\r\n // Set URL based on hovered fragment or first fragment\r\n // OnHover/OnSelect callbacks passed down to children that can \r\n // optionally use them if WCH is enabled.\r\n let url = model.Fields['Url'].Value;\r\n let urlWithFragments = url;\r\n if (fragmentUrlPart) {\r\n urlWithFragments += fragmentUrlPart\r\n }\r\n\r\n const anchorElem = useRef<HTMLAnchorElement>(null);\r\n\r\n const onFragmentHover = (fragment?: string) => {\r\n const urlFragmentPart = (fragment) ? getLinkFragmentUrlPart(fragment, context) : '';\r\n setFragmentUrlPart(urlFragmentPart);\r\n }\r\n\r\n const onFragmentSelect = () => {\r\n if (anchorElem.current) {\r\n anchorElem.current.click();\r\n }\r\n }\r\n\r\n const LinkContextInstance = { \r\n onFragmentHover: onFragmentHover,\r\n onFragmentSelect: onFragmentSelect\r\n };\r\n\r\n // Autofocus the first result\r\n useEffect(() => {\r\n if (props.autofocus && anchorElem.current) {\r\n anchorElem.current.focus();\r\n }\r\n }, []);\r\n\r\n \r\n return (\r\n <a \r\n ref={anchorElem}\r\n href={urlWithFragments}\r\n data-cludo-result=\"searchresult\"\r\n data-cludo-index={model.ResultIndex}\r\n data-cludo-url={url}\r\n data-cludo-title={getFieldValue(result, titleField)}\r\n data-cludo-page={context.currentPage}\r\n className={eleClass}\r\n target={props.openNewTab ? '_blank' : ''}\r\n onKeyUp={(e) => onKeyUpHandler(e, eventController)}\r\n onClick={(e) => onClickHandler(e, eventController, anchorElem.current!)}\r\n >\r\n <LinkContext.Provider value={LinkContextInstance}>\r\n {props.children}\r\n </LinkContext.Provider>\r\n </a>\r\n )\r\n}\r\n\r\nfunction onKeyUpHandler(e: React.KeyboardEvent<HTMLAnchorElement>, eventController: EventController) {\r\n eventController.searchResultKeyUpEvent(e.nativeEvent);\r\n}\r\n\r\n/**\r\n * Handle click event on the anchor element -- sets web content highlighting properties and initiaties\r\n * click tracking\r\n * @param e \r\n * @param result \r\n * @param eventController \r\n * @param anchorElem \r\n */\r\nfunction onClickHandler(\r\n e: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\r\n eventController: EventController,\r\n anchorElem: HTMLElement) {\r\n eventController.searchResultTrackClickEventHandler(e.nativeEvent, anchorElem);\r\n}\r\n","import { CludoFeature } from \"@cludosearch/cludo-api-client/dist/interfaces/api/public-settings.interface\";\r\nimport { CludoSearchContext } from \"./cludo-search-context\";\r\n\r\n/** If WCH is enabled, return the formatted link fragment part to be appended on a result URL */\r\nexport function getLinkFragmentUrlPart(fragment: string, context: CludoSearchContext): string {\r\n const enableFragmentHighlights: boolean = context.isFeatureEnabled(CludoFeature.WebContentHighlighter);\r\n\r\n if (enableFragmentHighlights) {\r\n const fragmentToken = '#:~:text=';\r\n const innerText = fragment.replace(/<[^>]+>/g, '');\r\n const encodedText = encodeURIComponent(innerText);\r\n return fragmentToken + encodedText;\r\n }\r\n\r\n return '';\r\n}","import React, { useContext } from \"react\";\r\n\r\ninterface ThemeContextProps {\r\n // FUTURE: For now, we're just accepting a class name under which consumers can define\r\n // scoped css variables to apply themes. We decided this is a good way to start theming\r\n // as it allows consumers to use their own css/sass variables to create themes. In the future,\r\n // we should also look into supporting themes created with a typed JSON object that we \r\n // put into scope for the consumer.\r\n theme: string | undefined;\r\n}\r\n\r\ninterface ThemeProviderProps extends ThemeContextProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const ThemeContext = React.createContext<ThemeProviderProps>({} as any);\r\n\r\nexport function ThemeProvider(props: ThemeProviderProps) {\r\n\r\n return (\r\n props.theme?.length ?\r\n <ThemeContext.Provider value={props}>\r\n <div className={props.theme}>\r\n { props.children }\r\n </div>\r\n </ThemeContext.Provider> :\r\n\r\n <>{ props.children }</>\r\n )\r\n}\r\n\r\n\r\n// This function can be used by components to enter any classes they need to apply themes\r\n// plus any additional classes from the component's className prop and generate a single \r\n// class string for the component to use.\r\nexport function generateThemeCss(themeCss: string, disableTheme?: boolean, classNameProp?: string) {\r\n const themeContext = useContext(ThemeContext);\r\n let styles = themeContext && !disableTheme ? themeCss : '';\r\n styles += classNameProp ? ' ' + classNameProp : '';\r\n return styles;\r\n}","import React, { useContext } from \"react\";\r\nimport { TypedDocument } from \"../../../types/core-script-types\";\r\nimport { ResultItemBaseProps } from \"../../types/types\";\r\nimport { ResultLink } from \"../../elements/result-link\";\r\nimport { CludoContext } from \"../../../context\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\n\r\ntype CustomResultProps = ResultItemBaseProps & { \r\n children: React.ReactNode;\r\n wrapWithLink?: boolean;\r\n}\r\n\r\nexport const ResultContext = React.createContext<TypedDocument>({} as any);\r\n\r\nexport function CustomResult(props: CustomResultProps) {\r\n const context = useContext(CludoContext);\r\n const shouldAutoFocus = props.result.ResultIndex === 1\r\n && context.currentPage === 1\r\n && context.focusOnResultsAfterSearch;\r\n\r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-result-link', props.disableTheme, props.className);\r\n\r\n return (\r\n <ResultContext.Provider value={{...props.result}}>\r\n { props.wrapWithLink || typeof props.wrapWithLink === 'undefined' ? \r\n <ResultLink result={props.result} autofocus={shouldAutoFocus} className={themeCss}>\r\n { props.children }\r\n </ResultLink> : \r\n <div className={props.className}>\r\n { props.children }\r\n </div>\r\n }\r\n </ResultContext.Provider>\r\n )\r\n}\r\n\r\n","import React, { useContext } from \"react\";\r\nimport { BaseResultProps, HeadingLevel } from \"../types/types\";\r\nimport { ResultContext } from \"../results/items/custom-result\";\r\nimport { getFieldValue, logMissingResultError } from \"../../utils/result-utils\";\r\nimport { generateThemeCss } from \"../../utils/theme-provider\";\r\n\r\ninterface ResultTitleProps extends BaseResultProps {\r\n headingElement?: HeadingLevel;\r\n titleField?: string;\r\n}\r\n\r\nexport function ResultTitle(props: ResultTitleProps) {\r\n const resultContext = useContext(ResultContext);\r\n const result = props.result || resultContext;\r\n if (!result) {\r\n logMissingResultError('ResultTitle');\r\n return null;\r\n }\r\n \r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-result-title', props.disableTheme, props.className); \r\n \r\n const Heading = props.headingElement || 'h3';\r\n // Need to check if result is a document or webpage to determine which title field to use\r\n const fileType = getFieldValue(result, '_type');\r\n const titleField = props.titleField || ((fileType === \"PageContent\") ? 'Title' : 'fc_Title');\r\n const title = getFieldValue(result, titleField);\r\n\r\n return (\r\n <Heading className={themeCss}>\r\n { title }\r\n </Heading>\r\n )\r\n\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../../context\";\r\nimport { getFormattedHTML } from \"../../../utils/result-utils\";\r\nimport { CludoFeature } from \"@cludosearch/cludo-api-client/dist/interfaces/api/public-settings.interface\";\r\nimport { LinkContext } from \"../result-link\";\r\n\r\n/** FragmentHighlight component */\r\nexport function FragmentHighlight(props: { fragment: string }) {\r\n const context = useContext(CludoContext);\r\n const linkContext = useContext(LinkContext);\r\n\r\n const enableWCH = context.isFeatureEnabled(CludoFeature.WebContentHighlighter);; // TODO: Check if enabled for the current engine instead\r\n const classStr = enableWCH ? 'cludo-theme-fragment-highlight' : 'cludo-ellipsis-after';\r\n\r\n return (\r\n <span\r\n tabIndex={0}\r\n role=\"link\"\r\n className={classStr}\r\n onKeyDown={\r\n (e) => {\r\n if (e.code === 'Enter') {\r\n linkContext.onFragmentSelect()\r\n }\r\n }\r\n }\r\n onFocus={() => linkContext.onFragmentHover(props.fragment)}\r\n onMouseEnter={() => linkContext.onFragmentHover(props.fragment)}\r\n onMouseLeave={() => linkContext.onFragmentHover()}\r\n dangerouslySetInnerHTML={getFormattedHTML(props.fragment)}\r\n />\r\n )\r\n}\r\n","import React from \"react\";\r\nimport { TypedDocument } from \"@cludosearch/cludo-api-client/dist/interfaces/api/search.interface\";\r\nimport { hasField, getHighlightsOrValuesArray } from \"../../../utils/result-utils\";\r\nimport { FragmentHighlight } from \"../fragment-highlight/fragment-highlight\";\r\nimport { ThemeBaseProps } from \"../../types/types\";\r\n\r\ninterface FragmentHighlightGroupProps extends ThemeBaseProps {\r\n result: TypedDocument;\r\n maxFragments?: number;\r\n maxWords?: number;\r\n fieldName?: string;\r\n}\r\n\r\nexport function FragmentHighlightGroup(props: FragmentHighlightGroupProps) {\r\n let fragments = getFragmentsFromResult(props.result, props.maxWords, props.fieldName);\r\n if (props.maxFragments && props.maxFragments > 0) {\r\n fragments = fragments.slice(0, props.maxFragments);\r\n }\r\n\r\n return (\r\n <p className={props.className}>\r\n {fragments}\r\n </p>\r\n )\r\n}\r\n\r\n/** Get an array of FragmentHighlights */\r\nfunction getFragmentsFromResult(result: TypedDocument, maxWords?: number, field?: string): JSX.Element[] {\r\n const fieldName = field || (hasField(result, 'fc_Content') ? 'fc_Content' : 'Description');\r\n const fragments = getHighlightsOrValuesArray(result, fieldName, maxWords).map(\r\n (descriptionPart: string, i: number) => {\r\n return (\r\n <FragmentHighlight key={i} \r\n fragment={descriptionPart}\r\n />\r\n );\r\n }\r\n )\r\n\r\n return fragments;\r\n}\r\n","import React, { useContext } from \"react\";\r\nimport { ResultContext } from \"../results/items/custom-result\";\r\nimport { getFieldValue, getFormattedHTML, getHighlightsOrValues, hasField, logMissingResultError } from \"../../utils/result-utils\";\r\nimport { FragmentHighlightGroup } from \"./fragment-highlight-group/fragment-highlight-group\";\r\nimport { generateThemeCss } from \"../../utils/theme-provider\";\r\nimport { BaseResultProps } from \"../types/types\";\r\n\r\ninterface ResultDescriptionProps extends BaseResultProps {\r\n showRawText?: boolean;\r\n maxWordCount?: number;\r\n descriptionField?: string;\r\n highlightDelimiter?: string;\r\n makeHighlightsClickable?: boolean;\r\n}\r\n\r\nexport function ResultDescription(props: ResultDescriptionProps) {\r\n const resultContext = useContext(ResultContext);\r\n const result = props.result || resultContext;\r\n if (!result) {\r\n logMissingResultError('ResultDescription');\r\n return null;\r\n }\r\n\r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-result-description', props.disableTheme, props.className); \r\n \r\n const descriptionField = props.descriptionField || (hasField(result, 'fc_Content') ? 'fc_Content' : 'Description');\r\n\r\n if (props.makeHighlightsClickable) {\r\n return <FragmentHighlightGroup className={themeCss} result={result} fieldName={descriptionField} maxWords={props.maxWordCount} />\r\n }\r\n\r\n const description = props.showRawText ? \r\n getFieldValue(result, descriptionField, props.maxWordCount) : \r\n getHighlightsOrValues(result, descriptionField, props.maxWordCount, undefined, props.highlightDelimiter);\r\n\r\n return <p className={themeCss} dangerouslySetInnerHTML={getFormattedHTML(description)} />\r\n}","import React, { useContext } from \"react\";\r\nimport { ResultContext } from \"../results/items/custom-result\";\r\nimport { getFieldValue, logMissingResultError } from \"../../utils/result-utils\";\r\nimport { BaseResultProps } from \"../types/types\";\r\nimport { generateThemeCss } from \"../../utils/theme-provider\";\r\n\r\ninterface ResultUrlProps extends BaseResultProps {\r\n showRelativeUrl?: boolean;\r\n}\r\n\r\nexport function ResultUrl(props: ResultUrlProps) {\r\n const resultContext = useContext(ResultContext);\r\n const result = props.result || resultContext;\r\n if (!result) {\r\n logMissingResultError('ResultUrl');\r\n return null;\r\n }\r\n\r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-result-url', props.disableTheme, props.className);\r\n\r\n let url = getFieldValue(result, 'Url');\r\n if (props.showRelativeUrl) {\r\n const urlObj = new URL(url);\r\n url = urlObj.toString().substring(urlObj.origin.length)\r\n }\r\n\r\n return <div className={themeCss}>{ url }</div>\r\n\r\n}","import React, { useContext } from \"react\";\r\nimport { ResultContext } from \"../results/items/custom-result\";\r\nimport { MISSING_FIELD, getFieldValue, logMissingResultError } from \"../../utils/result-utils\";\r\nimport { generateThemeCss } from \"../../utils/theme-provider\";\r\nimport { BaseResultProps } from \"../types/types\";\r\n\r\ninterface ResultBadgeProps extends BaseResultProps {\r\n field?: string;\r\n text?: string;\r\n}\r\n\r\nconst DEFAULT_BADGE_FIELD = 'Category';\r\n\r\nexport function ResultBadge(props: ResultBadgeProps) {\r\n const resultContext = useContext(ResultContext);\r\n const result = props.result || resultContext;\r\n if (!result && !props.text) {\r\n logMissingResultError('ResultBadge');\r\n return null;\r\n }\r\n \r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-result-badge', props.disableTheme, props.className); \r\n\r\n const displayText = props.text || getFieldValue(result, props.field || DEFAULT_BADGE_FIELD);\r\n\r\n return displayText && displayText !== MISSING_FIELD ? \r\n <span className={themeCss}>{ displayText } </span> : null;\r\n}","import React, { useContext } from \"react\";\r\nimport { ResultItemBaseProps, StandardResultWidgetType } from \"../../types/types\";\r\nimport { CustomResult, ResultContext } from \"./custom-result\";\r\nimport { ResultTitle } from \"../../elements/result-title\";\r\nimport { ResultDescription } from \"../../elements/result-description\";\r\nimport { ResultUrl } from \"../../elements/result-url\";\r\nimport { ResultBadge } from \"../../elements/result-badge\";\r\n\r\nexport type StandardResultProps = ResultItemBaseProps & {\r\n hideTitle?: boolean;\r\n hideDescription?: boolean;\r\n hideUrl?: boolean;\r\n hideBadge?: boolean;\r\n badgeField?: string;\r\n order?: StandardResultWidgetType[];\r\n makeHighlightsClickable?: boolean;\r\n descriptionMaxWordCount?: number;\r\n}\r\n\r\nconst defaultOrder: StandardResultWidgetType[] = ['title', 'description', 'url', 'badge'];\r\n\r\nfunction generateRenderOrder(propOrder: StandardResultWidgetType[]) {\r\n const generatedOrder = propOrder.concat(\r\n defaultOrder.filter(el => (propOrder.indexOf(el) === -1))\r\n );\r\n return generatedOrder;\r\n}\r\n\r\nexport function StandardResult(props: StandardResultProps) {\r\n const propOrder = props.order || [];\r\n\r\n let renderOrder = generateRenderOrder(propOrder);\r\n\r\n // Set final render order to props order and fill in any missing widgets from default\r\n // Filter out hidden widgets from order\r\n renderOrder = renderOrder.filter(el => {\r\n return !((el === 'title' && props.hideTitle) ||\r\n (el === 'description' && props.hideDescription) ||\r\n (el === 'url' && props.hideUrl) ||\r\n (el === 'badge' && props.hideBadge));\r\n });\r\n // Create lookup map for widget keys and JSX elements\r\n const widgetMap = new Map<StandardResultWidgetType, React.ReactNode>(\r\n [\r\n [\"title\", <ResultTitle disableTheme={props.disableTheme}/>],\r\n [\"description\", <ResultDescription disableTheme={props.disableTheme} maxWordCount={props.descriptionMaxWordCount || 90} makeHighlightsClickable={props.makeHighlightsClickable}/>],\r\n [\"url\", <ResultUrl disableTheme={props.disableTheme}/>],\r\n [\"badge\", <ResultBadge disableTheme={props.disableTheme} field={props.badgeField || 'Category'}/>]\r\n ]\r\n );\r\n\r\n return (\r\n <CustomResult disableTheme={props.disableTheme} className={props.className} result={props.result}>\r\n {\r\n renderOrder.map((el, i) => \r\n <React.Fragment key={i}>\r\n { widgetMap.get(el) }\r\n </React.Fragment>\r\n )\r\n }\r\n </CustomResult>\r\n )\r\n}","import { useContext } from \"react\";\r\nimport { CludoContext, EventControllerContext } from \"../context\";\r\n\r\n/** Helper for accessing both CludoContext and EventControllerContext */\r\nexport function useCludoContext() {\r\n const context = useContext(CludoContext);\r\n const eventController = useContext(EventControllerContext);\r\n\r\n return { context: context, eventController: eventController };\r\n}\r\n","import { useContext, useEffect } from \"react\";\r\nimport { EventType } from \"../utils/components-controller\";\r\nimport { EventControllerContext } from \"../context\";\r\n\r\n\r\n/** When the event controller receives any provided events, run a callback function\r\n * @param callback Function to call when events have been processed\r\n * @param events Array of events to subscribe to. If none provided, the callback will fire for\r\n * all events\r\n */\r\nexport function useEventSubscriptions(callback: Function, events?: EventType[]) {\r\n const eventController = useContext(EventControllerContext);\r\n\r\n useEffect(() => {\r\n let subscriptions: number[] = [];\r\n if (eventController && Object.keys(eventController).length > 0) {\r\n if (!events) {\r\n subscriptions = [eventController.subscribeToAllEvents(() => callback())];\r\n } else {\r\n events.forEach(eventType => {\r\n subscriptions.push(eventController.subscribe(eventType, callback));\r\n });\r\n }\r\n }\r\n return () => {\r\n if (eventController && eventController.unsubscribe) {\r\n subscriptions.forEach(subscriptionId => eventController.unsubscribe(subscriptionId));\r\n }\r\n }\r\n \r\n }, [eventController]);\r\n}","import { useState } from \"react\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { useEventSubscriptions } from \"./use-event-subscription\";\r\n\r\nexport interface PaginationState {\r\n itemsPerPage: number;\r\n currentPage: number;\r\n maxPages: number;\r\n nextPageLabel: string;\r\n prevPageLabel: string;\r\n showPagination: boolean;\r\n showResultsPerPage: boolean;\r\n}\r\n\r\nexport interface PaginationDispatchers {\r\n goToPage: (pageNumber: number) => void;\r\n setPerPage: (perPage: number) => void;\r\n}\r\n\r\nexport function usePagination(): [PaginationState, PaginationDispatchers] {\r\n const { context, eventController } = useCludoContext();\r\n const searchResponse = context.storedSearchResponseData.cludoSearchResponse;\r\n\r\n // Derive state from CludoSearchContext\r\n const deriveState : () => PaginationState = () => {\r\n const resultsPerPage = context.resultsPerPage || 10;\r\n return {\r\n itemsPerPage: context.resultsPerPage || 10,\r\n currentPage: context.currentPage || 1,\r\n maxPages: Math.ceil(context.storedSearchResponseData?.cludoSearchResponse.ResultCount / resultsPerPage),\r\n nextPageLabel: context.translateProvider?.translate('next_page') || 'Next page',\r\n prevPageLabel: context.translateProvider?.translate('prev_page') || 'Previous page',\r\n showPagination: !(searchResponse.ResultCount < context.resultsPerPage || context.isEndlessScrollEnabled),\r\n showResultsPerPage: context.storedSearchResponseData.cludoSearchResponse.ResultCount > 0\r\n };\r\n }\r\n\r\n // Derive dispatchers from EventController\r\n // FUTURE: Investigate getting rid of bind here\r\n const deriveDispatchers : () => PaginationDispatchers = () => {\r\n return {\r\n goToPage: eventController?.goToPage?.bind(eventController) || (() => {}),\r\n setPerPage: eventController?.setPerPage?.bind(eventController) || (() => {})\r\n };\r\n }\r\n\r\n // When eventController changes, derive state and dispatchers again\r\n useEventSubscriptions(() => {\r\n setCludoState(deriveState());\r\n setCludoDispatchers(deriveDispatchers());\r\n });\r\n\r\n const [cludoState, setCludoState] = useState(deriveState());\r\n const [cludoDispatchers, setCludoDispatchers] = useState(deriveDispatchers());\r\n\r\n return [ cludoState, cludoDispatchers ];\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../../context\";\r\nimport { usePagination } from \"../../../hooks/use-pagination\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../../types/types\";\r\n\r\ninterface PaginationProps extends ThemeBaseProps {\r\n hidePrevious?: boolean,\r\n hideNext?: boolean,\r\n hideFirst?: boolean,\r\n hideLast?: boolean,\r\n previousButtonIcon?: React.ReactNode;\r\n nextButtonIcon?: React.ReactNode;\r\n firstButtonIcon?: React.ReactNode;\r\n lastButtonIcon?: React.ReactNode;\r\n} \r\n\r\n\r\nexport function Pagination(props: PaginationProps) {\r\n const [ paginationState, paginationDispatchers ] = usePagination();\r\n\r\n const previousButtonIcon = props.previousButtonIcon || '<';\r\n const nextButtonIcon = props.nextButtonIcon || '>';\r\n const firstButtonIcon = props.firstButtonIcon || '<<';\r\n const lastButtonIcon = props.lastButtonIcon || '>>';\r\n const startPage: number = (paginationState.currentPage <= 5) \r\n ? 1\r\n : (paginationState.currentPage >= paginationState.maxPages - 2\r\n ? paginationState.maxPages - 3\r\n : paginationState.currentPage - 2);\r\n\r\n const prevPageTranslation = paginationState.prevPageLabel;\r\n const nextPageTranslation = paginationState.nextPageLabel;\r\n \r\n // Set theme css\r\n const activeBtnCss = generateThemeCss('cludo-theme-btn-accent-secondary cludo-width-sm cludo-mr-2 cludo-my-1', props.disableTheme);\r\n const inactiveBtnCss = generateThemeCss('cludo-theme-btn-accent-secondary-inactive cludo-width-sm cludo-mr-2 cludo-my-1', props.disableTheme);\r\n\r\n function renderPageNumberButtons(startPage: number, maxPages: number) {\r\n const context = useContext(CludoContext);\r\n \r\n const currentPageNum = paginationState.currentPage || 1;\r\n let pageNumberButtons: JSX.Element[] = [];\r\n \r\n const pageTranslation = context.translateProvider.translate('general_page');\r\n \r\n for (let i = startPage; i <= maxPages && i <= startPage + 4; i++) {\r\n if (i === currentPageNum) {\r\n pageNumberButtons.push(\r\n <li key={i}>\r\n <button aria-label={'Current, ' + pageTranslation + ' ' + i} aria-current=\"true\" aria-disabled=\"true\" className={inactiveBtnCss}>\r\n {i}\r\n </button>\r\n </li>\r\n );\r\n } else {\r\n pageNumberButtons.push(\r\n <li key={i}>\r\n <button aria-label={pageTranslation + ' ' + i}\r\n className={activeBtnCss}\r\n onClick={() => { paginationDispatchers.goToPage(i) }}>\r\n {i}\r\n </button>\r\n </li>\r\n );\r\n }\r\n }\r\n return pageNumberButtons;\r\n }\r\n\r\n return (\r\n paginationState.showPagination ?\r\n <nav>\r\n <ul className={(props.className ? props.className + ' ' : '') + 'cludo-display-flex cludo-list-style-none cludo-p-0 cludo-m-0 cludo-flex-wrap'}>\r\n {/* First page button */}\r\n { (paginationState.currentPage !== 1) && !props.hideFirst ? \r\n <li>\r\n <button data-page=\"first\"\r\n className={activeBtnCss}\r\n aria-label=\"First page\"\r\n onClick={() => { paginationDispatchers.goToPage(1)}}\r\n >\r\n { firstButtonIcon }\r\n </button>\r\n </li> : null\r\n }\r\n {/* Previous page button */}\r\n { (paginationState.currentPage !== 1) && !props.hidePrevious ? \r\n <li>\r\n <button data-page=\"prev\"\r\n className={activeBtnCss}\r\n aria-label={prevPageTranslation}\r\n onClick={() => { paginationDispatchers.goToPage(paginationState.currentPage - 1)}}\r\n >\r\n { previousButtonIcon }\r\n </button>\r\n </li> : null\r\n }\r\n\r\n { renderPageNumberButtons(startPage, paginationState.maxPages ) }\r\n\r\n {/* Next page button */}\r\n { (paginationState.currentPage < paginationState.maxPages) && !props.hideNext ? \r\n <li>\r\n <button data-page=\"next\"\r\n className={activeBtnCss}\r\n aria-label={nextPageTranslation}\r\n onClick={() => { paginationDispatchers.goToPage(paginationState.currentPage + 1) }}\r\n >\r\n { nextButtonIcon }\r\n </button>\r\n </li> : null\r\n }\r\n {/* Last page button */}\r\n { (paginationState.currentPage < paginationState.maxPages) && !props.hideLast ? \r\n <li>\r\n <button data-page=\"last\"\r\n className={activeBtnCss}\r\n aria-label=\"Last page\"\r\n onClick={() => { paginationDispatchers.goToPage(paginationState.maxPages) }}\r\n >\r\n { lastButtonIcon }\r\n </button>\r\n </li> : null\r\n }\r\n </ul>\r\n </nav> : null\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { getFormattedHTML } from \"../../utils/result-utils\";\r\nimport { CludoContext, EventControllerContext } from \"../../context\";\r\nimport { CludoSearchContext } from \"../../utils/cludo-search-context\";\r\nimport { EventController } from \"../../utils/event-controller\";\r\nimport { BannerDefinition } from \"../../types/core-script-types\";\r\n\r\nexport interface BannerProps { banner: BannerDefinition }\r\n\r\nexport function Banner(props: BannerProps) {\r\n const context = useContext(CludoContext);\r\n const eventController = useContext(EventControllerContext);\r\n\r\n return (\r\n <div\r\n data-cludo-result=\"banner\"\r\n data-cludo-id={props.banner.Id}\r\n data-cludo-title={props.banner.Name}\r\n onClick={(e) => onBannerClick(e, props.banner, context, eventController)}\r\n className=\"cludo-banner\"\r\n role=\"banner\"\r\n dangerouslySetInnerHTML={\r\n getFormattedHTML(props.banner.Banner)\r\n }\r\n ></div>\r\n )\r\n}\r\n\r\nfunction onBannerClick(\r\n e: React.MouseEvent<HTMLElement>,\r\n banner: BannerDefinition,\r\n context: CludoSearchContext,\r\n eventController: EventController) {\r\n const target = e.currentTarget;\r\n const bannerLinks = target.querySelectorAll('a');\r\n const paramsPrefix = context.paramsPrefix;\r\n\r\n bannerLinks.forEach( link => {\r\n addBannerAttributesToAnchor(link, banner);\r\n if (decodeURIComponent(link.href).indexOf('#?' + paramsPrefix) !== -1) {\r\n link.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n eventController.linkToSearchClickEvent(link);\r\n })\r\n }\r\n })\r\n}\r\n\r\nfunction addBannerAttributesToAnchor(anchor: HTMLAnchorElement, banner: BannerDefinition) {\r\n const bannerId = String(banner.Id);\r\n const bannerTitle = banner.Name;\r\n\r\n anchor.setAttribute(\"data-cludo-result\", \"banner\");\r\n anchor.setAttribute(\"data-cludo-index\", \"1\");\r\n anchor.setAttribute(\"data-cludo-object-id\", bannerId);\r\n anchor.setAttribute(\"data-cludo-title\", bannerTitle);\r\n}","import { useState } from \"react\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { BannerDefinition } from \"../types/core-script-types\";\r\nimport { useEventSubscriptions } from \"./use-event-subscription\";\r\n\r\nexport interface BannersState {\r\n banners: BannerDefinition[];\r\n}\r\n\r\n/** Expose state for displaying banners\r\n * @returns cludoState object containing an array of currently active banners\r\n */\r\nexport function useBanners(): [BannersState] {\r\n const { context } = useCludoContext();\r\n\r\n // Derive state from CludoSearchContext\r\n const deriveState : () => BannersState = () => {\r\n return {\r\n banners: context.storedSearchResponseData?.cludoSearchResponse.Banners || [],\r\n }\r\n }\r\n\r\n // When eventController changes, derive state and dispatchers again\r\n useEventSubscriptions(() => setCludoState(deriveState()))\r\n\r\n const [cludoState, setCludoState] = useState(deriveState());\r\n\r\n return [ cludoState ];\r\n}","import React from \"react\";\r\nimport { Banner } from \"../banner\";\r\nimport { useBanners } from \"../../../hooks/use-banners\";\r\n\r\nexport function BannerGroup() {\r\n const [bannersState] = useBanners();\r\n const banners = bannersState.banners.map( (banner) => <Banner key={banner.Id} banner={banner} />);\r\n return (\r\n <div className=\"cludo-banner-group\">\r\n { banners }\r\n </div>\r\n )\r\n}","import { useState } from \"react\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { BannerDefinition, RelatedSearchDocument, TopHit, TypedDocument } from \"../types/core-script-types\";\r\nimport { Facets } from \"@cludosearch/cludo-api-client/dist/interfaces/api/search.interface\";\r\nimport { EndlessScrollOptions } from \"../utils/models/instantiator-types\";\r\nimport { useEventSubscriptions } from \"./use-event-subscription\";\r\n\r\ninterface SearchResultEndlessScrollOptions extends EndlessScrollOptions {\r\n isEnabled: boolean;\r\n}\r\n\r\nexport interface SearchResultsState {\r\n suggestions: string[];\r\n results: TypedDocument[];\r\n categorizedResults: TopHit[];\r\n resultsSummary: {\r\n resultCount: number;\r\n resultCountMessage: string;\r\n fixedQuery: string;\r\n facets: Facets;\r\n didYouMean: string;\r\n };\r\n paginationOptions: {\r\n itemsPerPage: number;\r\n currentPage: number;\r\n maxPages: number;\r\n };\r\n currentPage: number;\r\n resultCount: number;\r\n endlessScrollOptions: SearchResultEndlessScrollOptions;\r\n banners: BannerDefinition[];\r\n relatedSearches: RelatedSearchDocument[];\r\n isLoading: boolean;\r\n}\r\n\r\nexport interface SearchResultsDispatchers {\r\n loadMore: () => void;\r\n searchResultKeyUp: (e: KeyboardEvent) => void;\r\n linkToSearchClickEvent: (anchor: HTMLAnchorElement) => void;\r\n handleDidYouMeanSelect: (text: string) => void;\r\n searchResultTrackClickEventHandler: (e: MouseEvent | KeyboardEvent, target: HTMLElement) => void;\r\n}\r\n\r\n/** Expose state and dispatchers for displaying search results\r\n * @returns cludoState (search result data, metadata, and config values) and cludoDispatchers (load more results event)\r\n */\r\nexport function useSearchResults(): [SearchResultsState, SearchResultsDispatchers] {\r\n const { context, eventController } = useCludoContext();\r\n\r\n // Derive state from CludoSearchContext\r\n const deriveState : () => SearchResultsState = () => {\r\n const currentPage = context.currentPage || 1;\r\n const resultsPerPage = context.resultsPerPage || 10;\r\n const resultsSummary = {\r\n resultCount: context.storedSearchResponseData?.cludoSearchResponse?.ResultCount || 0,\r\n resultCountMessage: context.storedSearchResponseData?.cludoSearchResponse?.ResultCountMessage || '',\r\n fixedQuery: context.storedSearchResponseData?.cludoSearchResponse?.FixedQuery || '',\r\n facets: context.storedSearchResponseData?.cludoSearchResponse?.Facets,\r\n didYouMean: context.storedSearchResponseData?.cludoSearchResponse?.Suggestions[0] || '',\r\n };\r\n return {\r\n suggestions: context.storedSearchResponseData?.cludoSearchResponse?.Suggestions || [],\r\n results: context.storedSearchResponseData?.cludoSearchResponse?.TypedDocuments || [],\r\n categorizedResults: context.storedSearchResponseData?.cludoSearchResponse?.TopHits || [],\r\n resultsSummary: resultsSummary,\r\n paginationOptions: {\r\n itemsPerPage: context.resultsPerPage,\r\n currentPage: context.currentPage,\r\n maxPages: Math.ceil(context.storedSearchResponseData?.cludoSearchResponse?.ResultCount / resultsPerPage),\r\n },\r\n endlessScrollOptions: {\r\n isEnabled: context.isEndlessScrollEnabled,\r\n ...context.endlessScroll as EndlessScrollOptions\r\n },\r\n currentPage: currentPage,\r\n banners: context.storedSearchResponseData?.cludoSearchResponse?.Banners || [],\r\n relatedSearches: context.storedSearchResponseData?.cludoSearchResponse?.RelatedSearchDocuments || [],\r\n resultCount: context.storedSearchResponseData?.cludoSearchResponse?.ResultCount || 0,\r\n isLoading: context.isLoadingResults\r\n }\r\n };\r\n\r\n // Derive dispatchers from EventController\r\n // FUTURE: Investigate getting rid of bind here\r\n const deriveDispatchers : () => SearchResultsDispatchers = () => {\r\n return {\r\n loadMore: eventController?.endlessScrollLoadMore?.bind(eventController) || (() => {}),\r\n searchResultKeyUp: eventController?.searchResultKeyUpEvent?.bind(eventController) || (() => {}),\r\n linkToSearchClickEvent: eventController?.linkToSearchClickEvent?.bind(eventController) || (() => {}),\r\n handleDidYouMeanSelect: eventController?.handleDidYouMeanSelect?.bind(eventController) || (() => {}),\r\n searchResultTrackClickEventHandler: eventController?.searchResultTrackClickEventHandler?.bind(eventController) || (() => {})\r\n }\r\n }\r\n\r\n // When eventController changes, derive state and dispatchers again\r\n useEventSubscriptions(() => {\r\n setCludoState(deriveState());\r\n setCludoDispatchers(deriveDispatchers());\r\n });\r\n\r\n const [cludoState, setCludoState] = useState(deriveState());\r\n const [cludoDispatchers, setCludoDispatchers] = useState(deriveDispatchers());\r\n\r\n return [ cludoState, cludoDispatchers ];\r\n}","import React, { useContext } from 'react';\r\nimport { CludoContext, EventControllerContext } from '../../../context';\r\nimport { EventController } from '../../../utils/event-controller';\r\nimport { getFormattedHTML } from '../../../utils/result-utils';\r\nimport { useSearchResults } from '../../../hooks/use-search-results';\r\nimport { ThemeBaseProps } from '../../types/types';\r\nimport { generateThemeCss } from '../../../utils/theme-provider';\r\n\r\nexport interface DidYouMeanProps extends ThemeBaseProps {\r\n suggestedQuery?: string;\r\n}\r\n\r\nexport function DidYouMean(props: DidYouMeanProps) {\r\n const [ resultsState, resultsDispatchers ] = useSearchResults();\r\n const context = useContext(CludoContext);\r\n const eventController = useContext(EventControllerContext);\r\n const suggestedQuery = props.suggestedQuery || resultsState.resultsSummary.didYouMean;\r\n const didYouMeanInnerHTML = context.translateProvider.translate('did_you_mean', suggestedQuery);\r\n \r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-font-family-default cludo-font-size-md cludo-mb-2', props.disableTheme, props.className)\r\n\r\n return (\r\n <div className={themeCss + ' cludo-did-you-mean'}\r\n onClick={(e) => onDidYouMeanClick(e, suggestedQuery, eventController)}\r\n dangerouslySetInnerHTML={ suggestedQuery ? getFormattedHTML(didYouMeanInnerHTML) : { __html: '' } }\r\n />\r\n )\r\n}\r\n\r\nfunction onDidYouMeanClick(event: React.MouseEvent, suggestion: string, eventController: EventController) {\r\n const target = event.target;\r\n if (target instanceof HTMLElement) {\r\n\r\n // If we clicked on the anchor tag or its child, handle setting Did You Mean properties\r\n const anchorElem = target.closest('.cludo-did-you-mean > a');\r\n if (anchorElem) {\r\n // Prevent navigation\r\n event.preventDefault();\r\n \r\n // Call utility function which restores autocomplete and searches for the suggestion\r\n eventController.handleDidYouMeanSelect(suggestion);\r\n }\r\n }\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../../context\";\r\nimport { useSearchResults } from \"../../../hooks/use-search-results\";\r\nimport { ThemeBaseProps } from \"../../types/types\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\n\r\nexport interface ResultCountProps extends ThemeBaseProps {\r\n resultCount?: number;\r\n}\r\n\r\nexport function ResultCount(props: ResultCountProps) {\r\n const [ resultsState, resultsDispatchers ] = useSearchResults();\r\n const context = useContext(CludoContext);\r\n const resultCount = props.resultCount || resultsState.resultCount;\r\n const query = context.storedSearchResponseData.cludoSearchResponse.Query;\r\n \r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-font-family-default cludo-font-size-md cludo-mb-2', props.disableTheme, props.className)\r\n\r\n // Set result count message from combination of your search and total results translations\r\n const yourSearchMsg = \r\n context.translateProvider.translate('your_search_on', query);\r\n const totalMsg = \r\n resultCount === 1 ? \r\n context.translateProvider.translate('total_result', resultCount.toString()) :\r\n context.translateProvider.translate('total_results', resultCount.toString());\r\n const resultMsg = \r\n yourSearchMsg + \r\n (yourSearchMsg.length && totalMsg.length ? ' ' : '') + \r\n totalMsg;\r\n\r\n return (\r\n !resultsState.isLoading && query ? \r\n <span className={themeCss} aria-label=\"status\" dangerouslySetInnerHTML={ { __html: resultMsg }}></span> : null\r\n )\r\n}","import React from \"react\";\r\n\r\nimport { DidYouMean, DidYouMeanProps } from \"./did-you-mean\";\r\nimport { ResultCount, ResultCountProps } from \"./result-count\";\r\n\r\ntype ResultsSummaryProps = ResultCountProps & DidYouMeanProps;\r\n\r\nexport function ResultsSummary(props: ResultsSummaryProps) {\r\n return (\r\n <>\r\n <ResultCount {...(props)} />\r\n\r\n <DidYouMean suggestedQuery={props.suggestedQuery} />\r\n </>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../context\";\r\nimport { LoaderProps } from \"../types/types\";\r\n\r\n/** Default Search Results template */\r\nexport function CludoLoader(props: LoaderProps) {\r\n const context = useContext(CludoContext);\r\n const loadingAltText = context.translateProvider.translate('loading_results');\r\n return (\r\n <>\r\n {\r\n props.isLoading\r\n ? <img src=\"https://customer.cludo.com/img/loading.gif\" className=\"loading\" tabIndex={-1} alt={loadingAltText} />\r\n : <></>\r\n }\r\n </>\r\n )\r\n}","import React from \"react\";\r\nimport { TypedDocument } from \"../../../types/core-script-types\";\r\nimport { useSearchResults } from \"../../../hooks/use-search-results\";\r\nimport { StandardResult } from \"../items/standard-result\";\r\nimport { CssUnit, LayoutColumnOptions, ThemeBaseProps } from \"../../types/types\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\n\r\nexport type ResultsListProps = ThemeBaseProps & {\r\n results?: TypedDocument[];\r\n columns?: LayoutColumnOptions;\r\n columnsBreakpoint?: number;\r\n resultSpacing?: number;\r\n cssUnit?: CssUnit;\r\n template?: (result: TypedDocument) => React.ReactNode;\r\n}\r\n\r\nexport function ResultsList(props: ResultsListProps) {\r\n const [resultsState, resultsdispatchers] = useSearchResults();\r\n // Resolve props with defaults\r\n const templateFn = props.template || ((result: TypedDocument) => <StandardResult disableTheme={props.disableTheme} result={result} />)\r\n const results = props.results || resultsState.results;\r\n const columns = props.columns || 1;\r\n const resultSpacing = props.resultSpacing || 0;\r\n const cssUnit = props.cssUnit || 'px';\r\n\r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-results-list', props.disableTheme, props.className);\r\n\r\n const generateStyleOverrides = () => {\r\n let cssString = ``;\r\n // FUTURE: Offer discrete breakpoints (i.e. breakpoint-sm) possibly using a library like Tailwinds\r\n if (props.columnsBreakpoint) {\r\n cssString += `\r\n @media (max-width: ${props.columnsBreakpoint}${cssUnit}) {\r\n .cludo_result { width: 100% !important }\r\n }\r\n `\r\n }\r\n \r\n cssString += `\r\n .cludo_results-list { margin: -${resultSpacing/2}${cssUnit} }\r\n .cludo_result { padding: ${resultSpacing/2}${cssUnit} }\r\n `\r\n return cssString;\r\n }\r\n\r\n return (\r\n <>\r\n { results.length > 0 &&\r\n <div className={themeCss}>\r\n <ul className=\"cludo_results-list cludo-box-sizing cludo-display-flex cludo-flex-wrap cludo-list-style-none cludo-p-0\">\r\n <style>\r\n { generateStyleOverrides() }\r\n </style>\r\n { results.map((result, i) => \r\n <li key={i} className={\"cludo_result cludo-border-box cludo-col-in-grid-\" + columns}>\r\n { templateFn(result) }\r\n </li>\r\n )}\r\n </ul>\r\n </div>\r\n }\r\n </>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../context\";\r\nimport { ThemeBaseProps } from \"../types/types\";\r\n\r\ninterface LoadMoreProps extends ThemeBaseProps {\r\n onClick: () => void;\r\n label?: string;\r\n}\r\n\r\nexport function LoadMore(props: LoadMoreProps) {\r\n const context = useContext(CludoContext);\r\n\r\n const loadMoreStr: string = props.label || context.translateProvider.translate('load_more');\r\n\r\n return (\r\n <div id=\"cludo-load-more\">\r\n <button className={props.className} type=\"button\" onClick={props.onClick}>\r\n { loadMoreStr }\r\n </button>\r\n </div>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../context\";\r\nimport { useSearchResults } from \"../../hooks/use-search-results\";\r\nimport { usePagination } from \"../../hooks/use-pagination\";\r\nimport { LoadMore } from \"./cludo-load-more\";\r\nimport { generateThemeCss } from \"../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../types/types\";\r\n\r\ninterface LoadMoreResultsProps extends ThemeBaseProps { \r\n label?: string;\r\n}\r\n\r\nexport function LoadMoreResults(props: LoadMoreResultsProps) {\r\n const [searchResultsState, searchResultsDispatchers] = useSearchResults();\r\n const [ paginationState, paginationDispatchers ] = usePagination();\r\n const context = useContext(CludoContext);\r\n\r\n const loadMoreStr: string = props.label || context.translateProvider.translate('load_more');\r\n const showLoadMore = searchResultsState.endlessScrollOptions.isEnabled\r\n && searchResultsState.endlessScrollOptions?.stopAfterPage\r\n && searchResultsState.endlessScrollOptions?.stopAfterPage <= paginationState.currentPage\r\n && paginationState.currentPage !== paginationState.maxPages\r\n && !searchResultsState.isLoading;\r\n \r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-btn-accent-secondary cludo-font-size-sm cludo-font-weight-bold cludo-width-100 cludo-mt-3', props.disableTheme, props.className);\r\n\r\n return (\r\n showLoadMore ?\r\n <LoadMore className={themeCss} label={loadMoreStr} onClick={searchResultsDispatchers.loadMore}/> : null\r\n )\r\n}","import { TypedDocument } from \"@cludosearch/cludo-api-client/dist/interfaces/api/search.interface\";\r\nimport { ExternalFacet } from \"../../utils/cludo-search-context\";\r\nimport { SortOption } from \"../../utils/models/instantiator-types\";\r\nimport { CludoSearchResponseState, TopHit } from \"../../types/core-script-types\";\r\nimport { FacetMap } from \"../../types/core-script-types\";\r\n\r\ntype FormattedTextDisplayType = 'default' | 'highlight';\r\n\r\nexport type CssUnit = 'px'|'pt'|'pc'|'in'|'Q'|'mm'|'cm'|'em'|'rem'|'ex'|'ch'|'lh'|'rlh'|'vw'|'vh'|'vmin'|'vmax'|'vb'|'vi'|'svw'|'svh'|'lvh'|'lvw'|'dvw'|'dvh';\r\nexport type HeadingLevel = 'h1'|'h2'|'h3'|'h4'|'h5'|'h6';\r\nexport type LayoutColumnOptions = 1|2|3|4|5|6|7|8|9|10|11|12;\r\nexport type StandardResultWidgetType = 'title' | 'description' | 'url' | 'badge';\r\n\r\nexport enum AutocompleteItemType {\r\n Result = 'result',\r\n CategorizedResult = 'categorized-result',\r\n Suggestion = 'suggestion',\r\n RecentSearch = 'recent-search'\r\n}\r\n\r\nexport interface FormattedTextChunk {\r\n text: string;\r\n displayType: FormattedTextDisplayType;\r\n}\r\n\r\ninterface AutocompleteBaseItem {\r\n title: string;\r\n chunkedTitle: FormattedTextChunk[];\r\n}\r\n\r\nexport interface AutocompleteResult extends AutocompleteBaseItem {\r\n document: TypedDocument;\r\n}\r\n\r\nexport interface AutocompleteSuggestion extends AutocompleteBaseItem {}\r\n\r\nexport interface AutocompleteRecentSearch extends AutocompleteBaseItem {}\r\n\r\nexport interface AutocompleteTopHit {\r\n Field: string;\r\n Values: AutocompleteTopHitValue[];\r\n}\r\n\r\nexport interface AutocompleteTopHitValue {\r\n Value: string;\r\n Hits: AutocompleteResult[];\r\n AllCount?: number;\r\n}\r\n\r\nexport interface FormattedCludoAutocompleteResponse {\r\n query: string;\r\n facets?: FacetMap;\r\n totalResults?: number;\r\n totalSuggestions?: number;\r\n totalRecentSearches?: number;\r\n results?: AutocompleteResult[];\r\n suggestions?: AutocompleteSuggestion[];\r\n instantSuggestions?: AutocompleteSuggestion[];\r\n recentSearches?: AutocompleteRecentSearch[];\r\n categorizedResults?: AutocompleteTopHit[];\r\n}\r\n\r\nexport type CludoAutocompleteBaseProps = { \r\n data: FormattedCludoAutocompleteResponse,\r\n isLoading: boolean;\r\n};\r\n\r\nexport type ThemeBaseProps = { disableTheme?: boolean; className?: string; }\r\nexport type CludoFacetBaseProps = { facet: ExternalFacet };\r\nexport type CludoControlsBaseProps = { facets: ExternalFacet[]; sortItems: SortOption[]; };\r\nexport type ResultItemBaseProps = ThemeBaseProps & { result: TypedDocument }\r\nexport type BaseResultProps = ThemeBaseProps & { result?: TypedDocument }\r\n\r\nexport type LoaderProps = { isLoading: boolean }\r\n\r\nexport type CludoSearchResultsBaseProps = { cludoSearchResponse: CludoSearchResponseState };\r\nexport type CludoLoaderBaseProps = { isLoading: boolean };","import React from \"react\";\r\nimport { StandardResult } from \"./items/standard-result\";\r\nimport { Pagination } from \"./pagination/pagination\";\r\nimport { LoaderProps, ResultItemBaseProps } from \"../types/types\";\r\nimport { BannerGroup } from \"../elements/banner-group/banner-group\";\r\nimport { ResultsSummary } from \"./header/results-summary\";\r\nimport { SearchResultsCompositionOptions } from \"../../utils/models/instantiator-types\";\r\nimport { CludoLoader } from \"./cludo-loader\";\r\nimport { useSearchResults } from \"../../hooks/use-search-results\";\r\nimport { ResultsList, ResultsListProps } from \"./list/results-list\";\r\nimport { LoadMoreResults } from \"./load-more-results\";\r\n\r\n\r\n// Default search results template\r\nexport const CludoSearchResults = composeResults({});\r\n\r\nexport function composeResults(options: SearchResultsCompositionOptions): () => JSX.Element {\r\n const ResultComponent: React.ComponentType<ResultItemBaseProps> = options.result || StandardResult;\r\n const ListComponent: React.ComponentType<ResultsListProps> = options.list || ResultsList;\r\n const LoaderComponent: React.ComponentType<LoaderProps> = options.loader || CludoLoader;\r\n const PaginationComponent = options.pagination || Pagination;\r\n\r\n return () => {\r\n // Use custom hook to derive state and access relevant events\r\n const [ searchResultsState, searchResultsDispatchers ] = useSearchResults();\r\n\r\n const suggestion: string = searchResultsState.suggestions[0] ? searchResultsState.suggestions[0] : '';\r\n\r\n return (\r\n <>\r\n {/* Render header elements */}\r\n <ResultsSummary {...searchResultsState.resultsSummary} suggestedQuery={suggestion} />\r\n\r\n {/* Render banners */}\r\n <BannerGroup />\r\n \r\n <ListComponent template={(result) => <ResultComponent result={result} />} />\r\n\r\n <LoaderComponent isLoading={searchResultsState.isLoading} />\r\n\r\n <PaginationComponent />\r\n\r\n <LoadMoreResults />\r\n </>\r\n );\r\n }\r\n}","import React from \"react\";\r\nimport { FormattedTextChunk } from \"../types/types\";\r\n\r\nexport interface HighlightedTextProps { chunkedText: FormattedTextChunk[] }\r\n\r\nexport function HighlightedText(props: HighlightedTextProps) {\r\n return (\r\n <>\r\n {\r\n props.chunkedText.map((value: FormattedTextChunk, i: number) => {\r\n switch(value.displayType) {\r\n case 'highlight':\r\n return <strong key={i}>{ value.text }</strong>;\r\n default:\r\n return <span key={i}>{ value.text }</span>;\r\n }\r\n })\r\n }\r\n </>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { ResultLink } from \"../../elements/result-link\";\r\nimport { AutocompleteItemType, AutocompleteResult, ThemeBaseProps } from \"../../types/types\";\r\nimport { HighlightedText } from \"../../elements/cludo-highlighted-text\";\r\nimport { EventControllerContext } from \"../../../context\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\n\r\nexport interface SaytResultProps extends ThemeBaseProps {\r\n result: AutocompleteResult;\r\n isSelected: boolean;\r\n resultIndex: number;\r\n resultType?: AutocompleteItemType.Result | AutocompleteItemType.CategorizedResult;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport function SaytResult(props: SaytResultProps) {\r\n const eventController = useContext(EventControllerContext);\r\n const suggestionCSS = generateThemeCss(`cludo-p-2 cludo-font-family-default cludo-border-b-1-neutral cludo-border-b-solid cludo-border-radius-button cludo-cursor-pointer cludo-bg-hover-gray-light ${props.isSelected ? 'cludo-bg-color-gray-light' : 'cludo-bg-color-white'}`,\r\n props.disableTheme, props.className) + (props.isSelected ? ' active' : '');\r\n const resultChildren = props.children ?? <HighlightedText chunkedText={props.result.chunkedTitle}></HighlightedText>;\r\n const itemType = props.resultType || AutocompleteItemType.Result\r\n\r\n return (\r\n <li\r\n tabIndex={0}\r\n aria-selected={props.isSelected ? 'true' : 'false'}\r\n className={suggestionCSS}\r\n data-cludo-autocomplete={itemType}\r\n data-cludo-autocomplete-index={props.resultIndex}\r\n onClick={() => eventController.selectResult(props.result.document)}\r\n >\r\n <ResultLink result={props.result.document}>\r\n { resultChildren }\r\n </ResultLink>\r\n </li>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { HighlightedText } from \"../../elements/cludo-highlighted-text\";\r\nimport { AutocompleteItemType, AutocompleteSuggestion, ThemeBaseProps } from \"../../types/types\";\r\nimport { EventControllerContext } from \"../../../context\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\n\r\nexport interface SaytSuggestionProps extends ThemeBaseProps {\r\n suggestion: AutocompleteSuggestion;\r\n isSelected: boolean;\r\n suggestionIndex: number;\r\n}\r\n\r\nexport function SaytSuggestion(props: SaytSuggestionProps) {\r\n const eventController = useContext(EventControllerContext);\r\n\r\n const suggestionCSS = generateThemeCss(`cludo-p-2 cludo-font-family-default cludo-border-b-1-neutral cludo-border-b-solid cludo-border-radius-button cludo-cursor-pointer cludo-bg-hover-gray-light ${props.isSelected ? 'cludo-bg-color-gray-light' : 'cludo-bg-color-white'}`,\r\n props.disableTheme, props.className) + (props.isSelected ? ' active' : '')\r\n\r\n return (\r\n <li\r\n tabIndex={0}\r\n aria-selected={props.isSelected ? 'true' : 'false'}\r\n className={suggestionCSS}\r\n data-cludo-autocomplete={AutocompleteItemType.Suggestion}\r\n data-cludo-autocomplete-index={props.suggestionIndex}\r\n onClick={() =>eventController.selectSuggestion(props.suggestion.title, props.suggestionIndex)}\r\n >\r\n <HighlightedText chunkedText={props.suggestion.chunkedTitle}></HighlightedText>\r\n </li>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { HighlightedText } from \"../../elements/cludo-highlighted-text\";\r\nimport { AutocompleteItemType, AutocompleteSuggestion, ThemeBaseProps } from \"../../types/types\";\r\nimport { EventControllerContext } from \"../../../context\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\n\r\nexport interface SaytRecentSearchProps extends ThemeBaseProps {\r\n recentSearch: AutocompleteSuggestion;\r\n isSelected: boolean;\r\n recentSearchIndex: number;\r\n}\r\n\r\nexport function SaytRecentSearch(props: SaytRecentSearchProps) {\r\n const eventController = useContext(EventControllerContext);\r\n const suggestionCSS = generateThemeCss(`cludo-p-2 cludo-font-family-default cludo-border-b-1-neutral cludo-border-b-solid cludo-border-radius-button cludo-cursor-pointer cludo-bg-hover-gray-light ${props.isSelected ? 'cludo-bg-color-gray-light' : 'cludo-bg-color-white'}`,\r\n props.disableTheme, props.className) + (props.isSelected ? ' active' : '')\r\n return (\r\n <li\r\n tabIndex={0}\r\n aria-selected={props.isSelected ? 'true' : 'false'}\r\n className={suggestionCSS}\r\n data-cludo-autocomplete={AutocompleteItemType.RecentSearch}\r\n data-cludo-autocomplete-index={props.recentSearchIndex}\r\n onClick={() =>eventController.selectSuggestion(props.recentSearch.title, props.recentSearchIndex)}\r\n >\r\n <HighlightedText chunkedText={props.recentSearch.chunkedTitle}></HighlightedText>\r\n </li>\r\n )\r\n}","import { useRef, useState, useEffect } from \"react\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { AutocompleteResult, AutocompleteSuggestion, AutocompleteTopHit } from \"../components/types/types\";\r\nimport { getAutocompleteResultsFromTopHits, isAutocompleteItem } from \"../utils/result-utils\";\r\nimport { TopHit } from \"../types/core-script-types\";\r\n\r\nexport interface AutocompleteState {\r\n suggestions: AutocompleteSuggestion[];\r\n instantSuggestions: AutocompleteSuggestion[];\r\n results: AutocompleteResult[];\r\n recentSearches: AutocompleteSuggestion[];\r\n categorizedResults: AutocompleteTopHit[];\r\n selectedSuggestion: number;\r\n selectedResult: number;\r\n selectedRecentSearch: number;\r\n suggestionsTitle: string;\r\n resultsTitle: string;\r\n recentSearchesTitle: string;\r\n}\r\n\r\nexport interface AutocompleteDispatchers {\r\n /** Performs a request to retrieve autocomplete results for the given query */\r\n initiateAutocompleteRequest: (query: string) => void;\r\n /** Takes a keyboard input event and selects the next available autocomplete item */\r\n autocompleteSelectionNext: () => void;\r\n /** Takes a keyboard input event and selects the previous available autocomplete item */\r\n autocompleteSelectionPrev: () => void;\r\n /** Takes the currently active autocomplete item and performs a search (or clicks, if the item is a search result) */\r\n autocompleteSelect: () => void;\r\n /** Clears out stored autocomplete data */\r\n clear: () => void;\r\n}\r\n\r\n/** Expose state and handle mouse/keyboard input listening for an autocomplete component \r\n * @returns cludoState (all relevant autocomplete state properties) and cludoDispatchers (ability to kick off autocomplete requests by query)\r\n*/\r\nexport function useAutocomplete(): [AutocompleteState, AutocompleteDispatchers] {\r\n const { context, eventController } = useCludoContext();\r\n\r\n // Keep track of list index\r\n const selectedIndex = useRef(-1);\r\n\r\n // Autocomplete keyboard event handling -- get all autocomplete elements using data attributes\r\n const keydownListener = (key: string) => {\r\n const suggestions = context.storedAutocompleteResponse?.data.suggestions || [];\r\n const instantSuggestions = context.storedAutocompleteResponse?.data.instantSuggestions || [];\r\n const results = context.storedAutocompleteResponse?.data.results || [];\r\n const recentSearches = context.storedAutocompleteResponse?.data.recentSearches || [];\r\n const categorizedResults = getAutocompleteResultsFromTopHits(context.storedAutocompleteResponse?.data.categorizedResults || []);\r\n const listItems = document.querySelectorAll<HTMLLIElement>('[data-cludo-autocomplete]');\r\n let tempSelectedSuggestion, tempSelectedResult, tempSelectedRecentSearch;\r\n tempSelectedSuggestion = tempSelectedResult = tempSelectedRecentSearch = -1;\r\n let tempIndex = selectedIndex.current;\r\n const numSuggestions = listItems.length;\r\n // Handle search via enter key\r\n if (key === 'Enter' && tempIndex === -1) {\r\n eventController.search();\r\n } else if (listItems && listItems.length > 0) {\r\n if (key === 'ArrowKeyUp') {\r\n tempIndex = (tempIndex === -1) ? 0 : tempIndex;\r\n tempIndex = ((((tempIndex - 1) % numSuggestions) + numSuggestions) % numSuggestions);\r\n }\r\n if (key === 'ArrowKeyDown') {\r\n tempIndex = ((((tempIndex + 1) % numSuggestions) + numSuggestions) % numSuggestions);\r\n }\r\n // Update selectedIndex for sublists\r\n if (listItems[tempIndex]) {\r\n switch (listItems[tempIndex].getAttribute('data-cludo-autocomplete')) {\r\n case 'suggestion':\r\n tempSelectedSuggestion = parseInt(listItems[tempIndex].getAttribute('data-cludo-autocomplete-index') as string);\r\n const suggestion = suggestions[tempSelectedSuggestion] ?? instantSuggestions[tempSelectedSuggestion];\r\n if (key === 'Enter') {\r\n eventController.selectSuggestion(suggestion.title, tempSelectedSuggestion);\r\n }\r\n break;\r\n case 'result':\r\n tempSelectedResult = parseInt(listItems[tempIndex].getAttribute('data-cludo-autocomplete-index') as string);\r\n const result = results[tempSelectedResult];\r\n if (key === 'Enter') {\r\n eventController.selectResult(result.document);\r\n }\r\n break;\r\n case 'categorized-result':\r\n tempSelectedResult = parseInt(listItems[tempIndex].getAttribute('data-cludo-autocomplete-index') as string);\r\n const categorizedResult = categorizedResults[tempSelectedResult];\r\n if (key === 'Enter') {\r\n eventController.selectResult(categorizedResult.document);\r\n }\r\n break;\r\n case 'recent-search':\r\n tempSelectedRecentSearch = parseInt(listItems[tempIndex].getAttribute('data-cludo-autocomplete-index') as string);\r\n const recentSearch = recentSearches[tempSelectedRecentSearch];\r\n if (key === 'Enter') {\r\n eventController.selectRecentSearch(recentSearch.title, tempSelectedRecentSearch);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n selectedIndex.current = tempIndex;\r\n const newState: AutocompleteState = {\r\n ...deriveAutocompleteState(),\r\n selectedSuggestion: tempSelectedSuggestion,\r\n selectedResult: tempSelectedResult,\r\n selectedRecentSearch: tempSelectedRecentSearch\r\n }\r\n setAutocompleteState(newState)\r\n }\r\n\r\n const clearSelectedIndices = () => {\r\n selectedIndex.current = -1;\r\n const newState: AutocompleteState = {\r\n ...deriveAutocompleteState(),\r\n suggestions: context.storedAutocompleteResponse?.data.suggestions || [],\r\n results: context.storedAutocompleteResponse?.data.results || [],\r\n selectedSuggestion: -1,\r\n selectedResult: -1,\r\n selectedRecentSearch: -1\r\n }\r\n setAutocompleteState(newState)\r\n }\r\n\r\n // Attach keyboard event handlers \r\n useEffect(() => {\r\n const eventControllerIsDefined = Object.keys(eventController).length > 0;\r\n const keyboardNextSubscription = eventControllerIsDefined ? eventController.subscribe('autocompleteSelectionNext', () => { keydownListener('ArrowKeyDown')}) : -1;\r\n const keyboardPrevSubscription = eventControllerIsDefined ? eventController.subscribe('autocompleteSelectionPrev', () => { keydownListener('ArrowKeyUp')}) : -1;\r\n const keyboardEnterSubscription = eventControllerIsDefined ? eventController.subscribe('autocompleteSetSelection', () => { keydownListener('Enter')}) : -1;\r\n const autocompleteCompleteSubscription = eventControllerIsDefined ? eventController.subscribe('afterautocomplete', () => { clearSelectedIndices() }) : -1;\r\n\r\n return () => {\r\n if (eventControllerIsDefined) {\r\n eventController.unsubscribe(keyboardNextSubscription);\r\n eventController.unsubscribe(keyboardPrevSubscription);\r\n eventController.unsubscribe(keyboardEnterSubscription);\r\n eventController.unsubscribe(autocompleteCompleteSubscription);\r\n }\r\n }\r\n });\r\n\r\n // Initial autocomplete state\r\n const [autocompleteState, setAutocompleteState] = useState<AutocompleteState>({\r\n suggestions: [],\r\n instantSuggestions: context.storedAutocompleteResponse?.data.instantSuggestions || [],\r\n results: [],\r\n recentSearches: context.storedAutocompleteResponse?.data.recentSearches || [],\r\n categorizedResults: [],\r\n selectedSuggestion: -1,\r\n selectedResult: -1,\r\n selectedRecentSearch: -1,\r\n suggestionsTitle: context.translateProvider?.translate('template_suggestions') || '' || '',\r\n resultsTitle: context.translateProvider?.translate('template_search_results') || '',\r\n recentSearchesTitle: context.translateProvider?.translate('recent_searches_title') || ''\r\n });\r\n\r\n const initiateAutocompleteRequest = (query: string) => {\r\n return eventController.initiateAutocompleteRequest(query);\r\n }\r\n\r\n const autocompleteSelectionNext = () => {\r\n eventController.emitEvent('autocompleteSelectionNext', {});\r\n }\r\n\r\n const autocompleteSelectionPrev = () => {\r\n eventController.emitEvent('autocompleteSelectionPrev', {});\r\n }\r\n\r\n const clear = () => {\r\n eventController.clearAutocomplete();\r\n }\r\n\r\n const autocompleteSelect = () => {\r\n if (autocompleteState.selectedSuggestion !== -1) {\r\n eventController.selectSuggestion(autocompleteState.suggestions[autocompleteState.selectedSuggestion].title, autocompleteState.selectedSuggestion);\r\n }\r\n if (autocompleteState.selectedResult !== -1) {\r\n eventController.selectResult(autocompleteState.results[autocompleteState.selectedResult].document);\r\n }\r\n if (autocompleteState.selectedRecentSearch !== -1) {\r\n eventController.selectRecentSearch(autocompleteState.recentSearches[autocompleteState.selectedRecentSearch].title, autocompleteState.selectedRecentSearch);\r\n }\r\n }\r\n \r\n\r\n const autocompleteDispatchers: AutocompleteDispatchers = {\r\n initiateAutocompleteRequest,\r\n autocompleteSelectionNext,\r\n autocompleteSelectionPrev,\r\n autocompleteSelect,\r\n clear\r\n }\r\n\r\n const deriveAutocompleteState: () => AutocompleteState = () => {\r\n const newState: AutocompleteState = {\r\n ...autocompleteState,\r\n suggestions: context.storedAutocompleteResponse?.data.suggestions || [],\r\n instantSuggestions: context.storedAutocompleteResponse?.data.instantSuggestions || [],\r\n results: context.storedAutocompleteResponse?.data.results || [],\r\n recentSearches: context.storedAutocompleteResponse?.data.recentSearches || [],\r\n categorizedResults: context.storedAutocompleteResponse?.data.categorizedResults || [],\r\n suggestionsTitle: context.translateProvider?.translate('template_suggestions') || '' || '',\r\n resultsTitle: context.translateProvider?.translate('template_search_results') || '',\r\n recentSearchesTitle: context.translateProvider?.translate('recent_searches_title') || ''\r\n }\r\n\r\n return newState;\r\n }\r\n\r\n return [ autocompleteState, autocompleteDispatchers ];\r\n}\r\n\r\n/** Handle navigating and selecting autocomplete suggestions from a search input */\r\nexport const autocompleteHandleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, autocompleteDispatchers: AutocompleteDispatchers) => {\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n autocompleteDispatchers.autocompleteSelectionNext();\r\n break;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n autocompleteDispatchers.autocompleteSelectionPrev();\r\n break;\r\n case 'Enter':\r\n e.preventDefault();\r\n autocompleteDispatchers.autocompleteSelect();\r\n break;\r\n }\r\n}\r\n\r\n/** Handle clearing autocomplete state when the input loses focus */\r\nexport const autocompleteHandleInputBlur = (e: React.FocusEvent<HTMLInputElement>, autocompleteDispatchers: AutocompleteDispatchers) => {\r\n if (!isAutocompleteItem(e.relatedTarget)) {\r\n autocompleteDispatchers.clear();\r\n }\r\n}\r\n\r\n/** Handle initiating an autocomplete request when the input changes */\r\nexport const autocompleteHandleInputChange = (e: React.ChangeEvent<HTMLInputElement>, autocompleteDispatchers: AutocompleteDispatchers) => {\r\n autocompleteDispatchers.initiateAutocompleteRequest(e.target.value);\r\n}","import React from \"react\";\r\nimport { AutocompleteResult, AutocompleteSuggestion } from \"../types/types\";\r\nimport { SaytResult } from \"./items/sayt-result\";\r\nimport { SaytSuggestion } from \"./items/sayt-suggestion\";\r\nimport { SaytRecentSearch } from \"./items/sayt-recent-search\";\r\nimport { useAutocomplete } from \"../../hooks/use-autocomplete\";\r\n\r\n\r\nexport function CludoSearchAutocomplete() {\r\n const [autocompleteState] = useAutocomplete();\r\n const {\r\n suggestions,\r\n results,\r\n recentSearches,\r\n selectedSuggestion,\r\n selectedResult,\r\n selectedRecentSearch,\r\n suggestionsTitle,\r\n resultsTitle,\r\n recentSearchesTitle\r\n } = autocompleteState;\r\n\r\n return (\r\n <>\r\n { suggestions.length ? \r\n <>\r\n <h3>{ suggestionsTitle }</h3>\r\n <div className=\"section-divider\"></div>\r\n <ul className=\"cludo-search-autocomplete-suggestions\">\r\n {suggestions.map((suggestion: AutocompleteSuggestion, i: number) => {\r\n const isSelected = (i === selectedSuggestion);\r\n return <SaytSuggestion key={i} suggestion={suggestion} isSelected={isSelected} suggestionIndex={i} />\r\n })}\r\n </ul>\r\n </> :\r\n null\r\n }\r\n { results.length ?\r\n <>\r\n <h3>{ resultsTitle }</h3>\r\n <ul className=\"cludo-search-autocomplete-results\">\r\n {results.map((result: AutocompleteResult, i: number) => {\r\n const isSelected = (i === selectedResult);\r\n return <SaytResult key={i} result={result} isSelected={isSelected} resultIndex={i} />\r\n })}\r\n </ul>\r\n </> :\r\n null\r\n }\r\n { recentSearches.length ? \r\n <>\r\n <h3>{ recentSearchesTitle }</h3>\r\n <div className=\"section-divider\"></div>\r\n <ul className=\"cludo-search-autocomplete-recent-searches\">\r\n {recentSearches.map((recentSearch: AutocompleteSuggestion, i: number) => {\r\n const isSelected = (i === selectedRecentSearch);\r\n return <SaytRecentSearch key={i} recentSearch={recentSearch} isSelected={isSelected} recentSearchIndex={i}/>\r\n })}\r\n </ul>\r\n </> :\r\n null\r\n }\r\n </>\r\n );\r\n\r\n}","import { CludoFeature, InstantSuggestionsConfiguration } from \"@cludosearch/cludo-api-client/dist/interfaces/api/public-settings.interface\";\r\nimport { Facets, Facet, FacetValue, TypedDocument } from \"@cludosearch/cludo-api-client/dist/interfaces/api/search.interface\";\r\nimport { AutocompleteResult, AutocompleteSuggestion, AutocompleteTopHit, CludoAutocompleteBaseProps, CludoSearchResultsBaseProps, FormattedTextChunk } from \"../components/types/types\";\r\nimport { EndlessScrollOptions, SortOption } from \"./models/instantiator-types\";\r\nimport { getFieldValue, getTopHitTotalCount } from \"./result-utils\";\r\nimport { CludoSearch, SearchRequestParams, SortOrder, FacetMapRequest, CludoErrorState, CludoAutocompleteState, FilterMap, TopHit, TopHitValue } from \"../types/core-script-types\";\r\nimport { TranslateProvider } from \"../types/translation-types\";\r\n\r\n// just an idea for now -- potentially useful for simplifying access to features\r\n // TO-DO -- better name for ExternalFacet?\r\nexport interface ExternalFacet {\r\n allCount: number;\r\n hasSelection: boolean;\r\n key: string;\r\n missingCount?: number;\r\n values: FacetItem[];\r\n}\r\n\r\nexport interface FacetItem {\r\n facetName: string;\r\n value: string;\r\n isSelected: boolean;\r\n count?: number;\r\n}\r\n\r\n/**\r\n * This object is meant to provide access to the CludoSearch object properties, but modified such that:\r\n * - Only the properties that we intend to be public are accessible\r\n * - Properties that are poorly named have been renamed for clarity\r\n * - Properties that are not well-organized or well-structured have been transformed for ease of use\r\n */\r\nexport class CludoSearchContext {\r\n private _cludoSearch: CludoSearch;\r\n\r\n constructor(cludoSearch: CludoSearch) {\r\n this._cludoSearch = cludoSearch;\r\n }\r\n\r\n private get params(): SearchRequestParams {\r\n return this._cludoSearch.params;\r\n }\r\n\r\n public get customerId(): number {\r\n return this._cludoSearch.customerId;\r\n }\r\n\r\n public get engineId(): number {\r\n return this._cludoSearch.engineId;\r\n }\r\n\r\n public get query(): string {\r\n return this._cludoSearch.params.query;\r\n }\r\n\r\n public set query(query: string) {\r\n this._cludoSearch.params.query = query;\r\n }\r\n\r\n public get currentPage(): number {\r\n return this._cludoSearch.params.page;\r\n }\r\n\r\n public get resultsPerPage(): number {\r\n return this._cludoSearch.params.perPage;\r\n }\r\n\r\n public get sort(): SortOrder {\r\n return this._cludoSearch.params.sort;\r\n }\r\n\r\n public get sortItems(): SortOption[] {\r\n // default to empty array if not found\r\n return this._cludoSearch.clientTemplateSortOptions || [];\r\n }\r\n\r\n // FUTURE -- consider defining experience keys here (or potentially leave them up to the experience scripts)\r\n public get experienceConfigs(): { [key: string]: any } {\r\n return this._cludoSearch.websiteSettings.configurations;\r\n }\r\n\r\n public get translateProvider(): TranslateProvider {\r\n return this._cludoSearch.translateProvider;\r\n }\r\n\r\n public isFacetSelected(key: string, value: string): boolean {\r\n return (this.params.facets[key] && this.params.facets[key].indexOf(value) !== -1);\r\n }\r\n\r\n public isFilterSelected(key: string, value: string): boolean {\r\n return (this.params.filters[key] && this.params.filters[key].indexOf(value) !== -1);\r\n }\r\n\r\n private getSelectedMapItem<T extends FilterMap | FacetMapRequest>(arrayToCheck: T): T {\r\n const selected: T = {} as T;\r\n\r\n for(var item in arrayToCheck) {\r\n if (arrayToCheck[item].length) {\r\n selected[item] = arrayToCheck[item];\r\n }\r\n }\r\n \r\n return selected;\r\n }\r\n\r\n public get selectedFacets(){ return this.getSelectedMapItem(this.params.facets) };\r\n\r\n public get selectedFilters(){ return this.getSelectedMapItem(this.params.filters) };\r\n\r\n public get facets(): ExternalFacet[] {\r\n let facetMap: Facets = this.storedSearchResponseData.cludoSearchResponse.Facets;\r\n\r\n return Object.entries(facetMap).map(\r\n (facetMapItem: [string, Facet]) => {\r\n const facetKey: string = facetMapItem[0];\r\n const facetObj: Facet = facetMapItem[1];\r\n\r\n const facet: ExternalFacet = {\r\n key: facetKey,\r\n hasSelection: this.params.facets[facetKey] ? this.params.facets[facetKey].length > 0 : false,\r\n values: facetObj.Items.map((facetValue: FacetValue) => {\r\n return {\r\n facetName: facetKey,\r\n count: facetValue.Count,\r\n value: facetValue.Key,\r\n isSelected: this.isFacetSelected(facetKey, facetValue.Key)\r\n }\r\n }),\r\n allCount: facetObj.AllCount,\r\n missingCount: facetObj.MissingCount\r\n };\r\n\r\n return facet;\r\n }\r\n )\r\n }\r\n\r\n public get isLoadingResults(): boolean {\r\n return this._cludoSearch.isLoadingResults;\r\n }\r\n\r\n public get enabledFeatures(): CludoFeature[] {\r\n return this._cludoSearch.enabledFeatures;\r\n }\r\n\r\n public isFeatureEnabled(featureKey: CludoFeature): boolean {\r\n return this._cludoSearch.enabledFeatures.includes(featureKey);\r\n }\r\n\r\n public get endlessScroll(): EndlessScrollOptions | null {\r\n return this._cludoSearch.endlessScroll || null;\r\n }\r\n\r\n public set endlessScroll(options: EndlessScrollOptions) {\r\n this._cludoSearch.endlessScroll = options;\r\n }\r\n\r\n public get isEndlessScrollEnabled(): boolean {\r\n return this._cludoSearch.endlessScroll\r\n ? true\r\n : false;\r\n }\r\n\r\n public get isAutocompleteEnabled(): boolean {\r\n return this._cludoSearch.richAutocomplete;\r\n }\r\n\r\n public get paramsPrefix(): string {\r\n return this._cludoSearch.paramsPrefix;\r\n }\r\n\r\n public set linkFragment(fragmentText: string) {\r\n this._cludoSearch.linkFragment = fragmentText;\r\n }\r\n\r\n public get storedSearchResponseData(): CludoSearchResultsBaseProps {\r\n return { \r\n cludoSearchResponse: {\r\n ...this._cludoSearch.storedSearchResponseData,\r\n TopHits: this._cludoSearch.storedSearchResponseData.TopHits.map(hit => {\r\n return getTopHitTotalCount(hit, this._cludoSearch.storedSearchResponseData.Facets);\r\n }\r\n )\r\n }\r\n };\r\n }\r\n\r\n public get focusOnResultsAfterSearch(): boolean {\r\n return this._cludoSearch.focusOnResultsAfterSearch;\r\n }\r\n\r\n public get customEngineSettings(): {\r\n [featureConfigKey: string]: object,\r\n } {\r\n let customEngineSettings: {\r\n [featureConfigKey: string]: object\r\n } = {};\r\n\r\n try {\r\n customEngineSettings = JSON.parse(this._cludoSearch.websiteSettings.customEngineSettings) ?? customEngineSettings; \r\n } catch (error) {\r\n // TODO consider logging this error\r\n }\r\n\r\n if (!this._cludoSearch.websiteSettings.configurations) {\r\n return customEngineSettings;\r\n }\r\n\r\n // add feature keys from configuration\r\n const featureConfigKeys = Object.keys(this._cludoSearch.websiteSettings.configurations);\r\n\r\n featureConfigKeys.forEach((featureConfigKey: string) => {\r\n customEngineSettings[featureConfigKey] = this._cludoSearch.websiteSettings.configurations[featureConfigKey];\r\n });\r\n\r\n return customEngineSettings;\r\n }\r\n\r\n public get instantSuggestionsConfiguration(): InstantSuggestionsConfiguration | undefined {\r\n return this._cludoSearch.websiteSettings.instantSuggestionsConfiguration;\r\n }\r\n\r\n public get recentSearches(): string[] {\r\n return this._cludoSearch.recentSearches;\r\n }\r\n\r\n public get storedError(): CludoErrorState {\r\n return this._cludoSearch.storedError;\r\n }\r\n /**\r\n * Given a source string, and a search string, returns an array of\r\n * FormattedTextChunk objects marked as either \"default\" (no special handling\r\n * should be applied), or \"highlight\" (the first segment of the source string that matches\r\n * the search string, which can be formatted in a way to bring attention to the match)\r\n * @param input \r\n * @param needle \r\n * @returns \r\n */\r\n private chunkString(input: string, needle: string): FormattedTextChunk[] {\r\n const needleIndex: number = input.toLowerCase().indexOf(needle.toLowerCase());\r\n\r\n if (needleIndex === -1) {\r\n return [{\r\n text: input,\r\n displayType: 'default'\r\n }]\r\n }\r\n\r\n return [\r\n {\r\n text: input.substring(0, needleIndex),\r\n displayType: 'default'\r\n },\r\n {\r\n text: input.substring(needleIndex, needleIndex + needle.length),\r\n displayType: 'highlight'\r\n },\r\n {\r\n text: input.substring(needleIndex + needle.length),\r\n displayType: 'default'\r\n }\r\n ];\r\n }\r\n\r\n private mapTypedDocumentToResult(document: TypedDocument, query: string): AutocompleteResult {\r\n const title: string = getFieldValue(document, 'Title');\r\n\r\n return {\r\n title: title,\r\n chunkedTitle: this.chunkString(title, query),\r\n document: document\r\n };\r\n }\r\n \r\n private mapTypedDocumentToSuggestion(document: TypedDocument, query: string): AutocompleteSuggestion {\r\n const title: string = getFieldValue(document, 'Title');\r\n\r\n return {\r\n title: title,\r\n chunkedTitle: this.chunkString(title, query)\r\n };\r\n }\r\n\r\n private mapStringToSuggestion(str: string): AutocompleteSuggestion {\r\n return {\r\n title: str,\r\n chunkedTitle: this.chunkString(str, '')\r\n }\r\n }\r\n\r\n private mapTopHitsToCategorizedResults(hit: TopHit, query: string): AutocompleteTopHit {\r\n return {\r\n Field: hit.Field,\r\n Values: hit.Values.map(value => this.mapHitValuesToResults(value, query))\r\n }\r\n }\r\n\r\n private mapHitValuesToResults(value: TopHitValue, query: string) {\r\n return {\r\n Value: value.Value,\r\n Hits: value.Hits.map(document => {\r\n return this.mapTypedDocumentToResult(document, query);\r\n })\r\n }\r\n }\r\n\r\n public get storedAutocompleteResponse(): CludoAutocompleteBaseProps {\r\n const coreAutocompleteData: CludoAutocompleteState = this._cludoSearch.storedAutocompleteResponse;\r\n\r\n return {\r\n data: {\r\n query: coreAutocompleteData.cludoAutocompleteResponse.query,\r\n facets: coreAutocompleteData.cludoAutocompleteResponse.facets,\r\n totalResults: coreAutocompleteData.cludoAutocompleteResponse.totalResults,\r\n totalSuggestions: coreAutocompleteData.cludoAutocompleteResponse.totalSuggestions,\r\n totalRecentSearches: coreAutocompleteData.cludoAutocompleteResponse.totalRecentSearches,\r\n results: coreAutocompleteData.cludoAutocompleteResponse.results\r\n ?.map((document: TypedDocument) => this.mapTypedDocumentToResult(document, coreAutocompleteData.cludoAutocompleteResponse.query)),\r\n suggestions: coreAutocompleteData.cludoAutocompleteResponse.suggestions\r\n ?.map((document: TypedDocument) => this.mapTypedDocumentToSuggestion(document, coreAutocompleteData.cludoAutocompleteResponse.query)),\r\n instantSuggestions: coreAutocompleteData.cludoAutocompleteResponse.instantSuggestions\r\n ?.map((document: TypedDocument) => this.mapTypedDocumentToSuggestion(document, coreAutocompleteData.cludoAutocompleteResponse.query)),\r\n recentSearches: coreAutocompleteData.cludoAutocompleteResponse.recentSearches\r\n ?.map((search: string) => this.mapStringToSuggestion(search)),\r\n categorizedResults: coreAutocompleteData.cludoAutocompleteResponse.topHits\r\n ?.map((hit: TopHit) => {\r\n const mappedHit = this.mapTopHitsToCategorizedResults(hit, coreAutocompleteData.cludoAutocompleteResponse.query);\r\n const hitWithCount = getTopHitTotalCount(mappedHit, coreAutocompleteData.cludoAutocompleteResponse.facets);\r\n return hitWithCount;\r\n })\r\n },\r\n isLoading: coreAutocompleteData.isLoading\r\n }\r\n }\r\n\r\n public get isTrackedSession(): boolean {\r\n return this._cludoSearch.isTrackedSession !== 0;\r\n }\r\n\r\n public set canUserBeTracked(canUserBeTracked: () => boolean) {\r\n this._cludoSearch.canUserBeTracked = canUserBeTracked;\r\n }\r\n\r\n public get queryId(): string {\r\n return this._cludoSearch.queryId;\r\n }\r\n\r\n public get sessionId(): string {\r\n return this._cludoSearch.getSessionId();\r\n }\r\n\r\n public get querySessionId(): string {\r\n return this._cludoSearch.querySessionId;\r\n }\r\n\r\n public get deviceType(): string {\r\n return this._cludoSearch.deviceType;\r\n }\r\n\r\n public get traits(): string[] {\r\n const traits = this._cludoSearch.getTraitsFromStorage();\r\n return traits ? traits : [];\r\n }\r\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-dom\");","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { CludoSearchContext } from \"./cludo-search-context\";\r\nimport { CludoContext, EventControllerContext } from \"../context\";\r\nimport { EventController } from \"./event-controller\";\r\nimport { CludoSearch } from \"../types/core-script-types\";\r\nimport { ThemeProvider } from \"./theme-provider\";\r\nimport \"../styles/all.scss\";\r\n\r\ninterface ManagedComponent {\r\n component: React.ComponentType;\r\n elem: HTMLElement | null;\r\n elemSelector?: string;\r\n observedEventTypes: EventType[];\r\n}\r\n\r\nexport type EventType = 'beforesearch'\r\n| 'aftersearch'\r\n| 'beforeredirect'\r\n| 'afterautocomplete'\r\n| 'autocompleteSelectionNext'\r\n| 'autocompleteSelectionPrev'\r\n| 'autocompleteSetSelection'\r\n| 'afterinputfocus'\r\n| 'error';\r\n\r\nexport enum TemplateType {\r\n Results = 'results',\r\n Autocomplete = 'autocomplete',\r\n Controls = 'controls',\r\n Loader = 'loader'\r\n}\r\n\r\n/**\r\n * This object provides a way to manage tracked components; it exposes\r\n * - methods for registering standard components (registerSearchResultsTemplate, registerFacetsTemplate, etc.)\r\n * - a method for registering generic components (registerTemplate)\r\n * - an interface to notify the components that an event has occurred in the core script, and allow them to handle events\r\n */\r\nexport class ComponentsController {\r\n private managedComponents: ManagedComponent[] = [];\r\n private _searchContext: CludoSearchContext;\r\n private _cssTheme: string | undefined;\r\n public events: EventController;\r\n\r\n constructor(\r\n cludoSearch: CludoSearch,\r\n searchContext: CludoSearchContext,\r\n cssTheme?: string\r\n ) {\r\n this._searchContext = searchContext;\r\n this.events = new EventController(cludoSearch, searchContext);\r\n this._cssTheme = cssTheme;\r\n }\r\n\r\n /**\r\n * Register a search results component; will be updated on search events\r\n * @param component\r\n * @param element HTMLElement reference or CSS selector\r\n */\r\n public registerSearchResultsComponent(\r\n component: React.ComponentType,\r\n element: HTMLElement | string): void {\r\n this.addManagedComponent(\r\n component,\r\n element\r\n );\r\n }\r\n\r\n /**\r\n * Register a controls template; will be updated on search events\r\n * \r\n * Controls, by default, contains facets and sort-picker components\r\n * @param component\r\n * @param element HTMLElement reference or CSS selector\r\n */\r\n public registerControlsComponent(\r\n component: React.ComponentType,\r\n element: HTMLElement | string): void {\r\n this.addManagedComponent(\r\n component,\r\n element\r\n );\r\n }\r\n\r\n /**\r\n * Register an autocomplete template; will be updated on afterautocomplete events\r\n * @param component\r\n * @param element HTMLElement reference or CSS selector\r\n */\r\n public registerAutocompleteComponent(\r\n component: React.ComponentType,\r\n element: HTMLElement | string): void {\r\n this.addManagedComponent(\r\n component,\r\n element,\r\n ['afterautocomplete', 'afterinputfocus']\r\n );\r\n }\r\n\r\n /**\r\n * \r\n * @param component\r\n * @param element HTMLElement reference or CSS selector\r\n * @param observedEventTypes The list of event types that trigger an update of props; if not specified, \r\n * all events are treated as relevant\r\n */\r\n public registerComponent(\r\n component: React.ComponentType,\r\n element: HTMLElement | string,\r\n observedEventTypes: EventType[] = []\r\n ): void {\r\n this.addManagedComponent(\r\n component,\r\n element,\r\n observedEventTypes,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Adds a managed component to the array stored in the managedComponents property\r\n * @param component\r\n * @param element\r\n * @param elemSelector\r\n * @param observedEventTypes \r\n */\r\n private addManagedComponent(\r\n component: React.ComponentType,\r\n element: HTMLElement | string,\r\n observedEventTypes: EventType[] = [],\r\n renderImmediately: boolean = false\r\n ): void {\r\n const resolvedElement: HTMLElement | null =\r\n (typeof element === 'string')\r\n ? document.querySelector(element)\r\n : element;\r\n\r\n const resolvedSelector: string | undefined =\r\n (typeof element === 'string')\r\n ? element\r\n : undefined;\r\n\r\n const managedComponent: ManagedComponent = {\r\n component: component,\r\n elem: resolvedElement,\r\n elemSelector: resolvedSelector,\r\n observedEventTypes: observedEventTypes,\r\n } \r\n\r\n this.managedComponents.push(managedComponent);\r\n\r\n if (renderImmediately) {\r\n this.renderComponent(managedComponent);\r\n }\r\n }\r\n\r\n /**\r\n * Processes an event from the core script\r\n * \r\n * - Emits the event to any subscribing components\r\n * \r\n * @param type\r\n * @param data \r\n * @param callbackFnc \r\n */\r\n public processEvent(type: EventType, data?: any, callbackFnc?: () => void): void {\r\n this.events.emitEvent(type, data);\r\n\r\n this.managedComponents\r\n .filter((component: ManagedComponent) => component.observedEventTypes.length === 0 || component.observedEventTypes.includes(type))\r\n .forEach((component: ManagedComponent) => this.renderComponent(component));\r\n\r\n if (callbackFnc) {\r\n callbackFnc();\r\n }\r\n }\r\n\r\n /**\r\n * Renders a managed component\r\n * @param component\r\n */\r\n private renderComponent(component: ManagedComponent): void {\r\n const RenderedComponent = component.component;\r\n\r\n // try to grab a reference to the element if it wasn't found on mount\r\n if (!component.elem) {\r\n component.elem = document.querySelector(component.elemSelector!);\r\n }\r\n\r\n // if element still found, skip -- React would throw an error\r\n if (!component.elem) { return; }\r\n \r\n ReactDOM.render(\r\n <React.StrictMode>\r\n <CludoContext.Provider value={this._searchContext}>\r\n <EventControllerContext.Provider value={this.events}>\r\n <ThemeProvider theme={this._cssTheme}>\r\n <RenderedComponent />\r\n </ThemeProvider>\r\n </EventControllerContext.Provider>\r\n </CludoContext.Provider>\r\n </React.StrictMode>,\r\n component.elem,\r\n () => {}\r\n );\r\n }\r\n}","import { ChatRequestBody, ChatResponse, ChatFeedbackData } from \"../types/conversation-types\";\r\nimport { CludoSearch, FilterMap, TypedDocument } from \"../types/core-script-types\";\r\nimport { QueryLogObject, ClickLogObject, ChatClickLog } from \"../types/tracking-types\";\r\nimport { TrendingPagesResponse } from \"../types/trending-pages-types\";\r\nimport { CludoSearchContext } from \"./cludo-search-context\";\r\nimport { EventType } from \"./components-controller\";\r\n\r\ninterface CallbackMeta {\r\n id: number;\r\n type: EventType;\r\n fnc: Function;\r\n}\r\n\r\nexport class EventController {\r\n private _cludoSearch: CludoSearch;\r\n private _searchContext: CludoSearchContext;\r\n\r\n private keyedSubscriptions: CallbackMeta[] = [];\r\n\r\n private _curSubscriptionIndex: number = 1;\r\n\r\n constructor(\r\n cludoSearch: CludoSearch,\r\n searchContext: CludoSearchContext) {\r\n this._cludoSearch = cludoSearch;\r\n this._searchContext = searchContext;\r\n }\r\n\r\n /**\r\n * Registers a callback function to be called whenever a\r\n * trigger of a certain type (beforesearch, aftersearch, etc) occurs\r\n * @param key \r\n * @param callback \r\n * @returns Subscription id -- necessary for unsubscribing\r\n */\r\n public subscribe(type: EventType, callback: Function): number {\r\n const subscriptionId: number = this._curSubscriptionIndex++;\r\n\r\n this.keyedSubscriptions.push({\r\n id: subscriptionId,\r\n type: type,\r\n fnc: callback,\r\n });\r\n\r\n return subscriptionId; \r\n }\r\n\r\n /**\r\n * Registers a callback function to be called whenever any trigger occurs\r\n * @param callback \r\n * @returns Subscription id -- necessary for unsubscribing\r\n */\r\n public subscribeToAllEvents(callback: Function): number {\r\n const subscriptionId: number = this._curSubscriptionIndex++;\r\n const allEventTypes: EventType[] = [\r\n 'afterautocomplete',\r\n 'aftersearch',\r\n 'autocompleteSelectionNext',\r\n 'autocompleteSelectionPrev',\r\n 'autocompleteSetSelection',\r\n 'beforeredirect',\r\n 'beforesearch',\r\n 'error'\r\n ]\r\n\r\n // Subscribe to all with the same subscription ID\r\n allEventTypes.forEach( (type: EventType) => {\r\n this.keyedSubscriptions.push({\r\n id: subscriptionId,\r\n type: type,\r\n fnc: callback\r\n });\r\n });\r\n\r\n return subscriptionId;\r\n }\r\n\r\n /**\r\n * Unregisters a previously defined callback\r\n * @param subscriptionId\r\n */\r\n public unsubscribe(subscriptionId: number): void {\r\n this.keyedSubscriptions =\r\n this.keyedSubscriptions.filter(\r\n // keep all subscriptions that don't match the passed sub id\r\n (sub: CallbackMeta) => sub.id !== subscriptionId);\r\n }\r\n\r\n /**\r\n * Emits an event that will then be transmitted via the callbacks to all subscribers for the specific type\r\n * @param key \r\n * @param data \r\n */\r\n public emitEvent(key: EventType, data: any): void {\r\n this.executeCallbacksForType(key, data);\r\n }\r\n\r\n // FUTURE -- might be possible to better type the payload object\r\n private executeCallbacksForType(eventType: EventType, payload: any): void {\r\n this.subscribersForType(eventType)\r\n .forEach((callback: CallbackMeta) => {\r\n // call the provided function and pass the payload object as a param\r\n callback.fnc(payload);\r\n });\r\n }\r\n\r\n private subscribersForType(eventType: EventType): CallbackMeta[] {\r\n return this.keyedSubscriptions.filter(\r\n (callback: CallbackMeta) => callback.type === eventType\r\n );\r\n }\r\n\r\n public search(query?: string): void {\r\n if (query) {\r\n this._cludoSearch.params.query = query;\r\n }\r\n this._cludoSearch.search();\r\n }\r\n\r\n public clearResults(): void {\r\n this._cludoSearch.clearStoredSearchResponseData();\r\n }\r\n\r\n //#region results\r\n public get searchResultKeyUpEvent(): (e: KeyboardEvent) => void {\r\n return this._cludoSearch.searchResultKeyUpEvent;\r\n }\r\n\r\n public get searchResultTrackClickEventHandler(): (e: MouseEvent | KeyboardEvent, target?: HTMLElement) => void {\r\n return this._cludoSearch.searchResultTrackClickEventHandler;\r\n }\r\n\r\n public get linkToSearchClickEvent(): (anchor: HTMLAnchorElement) => void {\r\n return this._cludoSearch.linkToSearchClickEvent;\r\n }\r\n //#endregion\r\n\r\n //#region facets\r\n public selectFacet(field: string, value: string, multi: boolean = false): void {\r\n this._cludoSearch.facet(field, value, multi);\r\n }\r\n\r\n public deselectFacet(field: string, value: string): void {\r\n this._cludoSearch.clearFacet(field, value);\r\n }\r\n\r\n public clearFacet(field: string): void {\r\n this._cludoSearch.clearFacetByName(field);\r\n }\r\n\r\n public clearAllFacets(): void {\r\n this._cludoSearch.clearAllFacetsAndSearch();\r\n }\r\n\r\n private setRangeFacetMap<T extends string | number>(facetKey: string, field: string, from: T, to: T): void {\r\n this._cludoSearch.params.facets[facetKey] = [field, from.toString(), to.toString()];\r\n }\r\n\r\n private clearRangeFacetMap(facetKey: string): void {\r\n this._cludoSearch.clearFacetByName(facetKey);\r\n }\r\n\r\n public setDateRangeFacet = (field: string, from: string, to: string) => this.setRangeFacetMap<string>('date', field, from, to);\r\n\r\n public setNumberRangeFacet = (field: string, from: number, to: number) => this.setRangeFacetMap<number>('range', field, from, to);\r\n\r\n public clearDateRangeFacet = () => {this.clearRangeFacetMap('date')};\r\n\r\n public clearNumberRangeFacet = () => {this.clearRangeFacetMap('range')};\r\n\r\n // #region filters\r\n\r\n public setFilter(facetKey: string, value: string[]): void {\r\n this._cludoSearch.filter(facetKey, value);\r\n }\r\n\r\n public setFilters(filters: FilterMap): void {\r\n this._cludoSearch.params.filters = filters;\r\n }\r\n\r\n public clearAllFilters(): void {\r\n this._cludoSearch.clearAllFilters();\r\n }\r\n\r\n // #endregion\r\n\r\n // replacement for handleFacetValueClick, onFacetValueClick\r\n public toggleFacetValue(facetField: string, facetValue: string): void {\r\n if (!this._searchContext.isFacetSelected(facetField, facetValue)) {\r\n this.selectFacet(facetField, facetValue);\r\n } else {\r\n this.deselectFacet(facetField, facetValue);\r\n }\r\n }\r\n //#endregion\r\n\r\n //#region did you mean\r\n private set didYouMean(didYouMeanText: string) {\r\n this._cludoSearch.didYouMean = didYouMeanText;\r\n }\r\n\r\n public handleDidYouMeanSelect(didYouMeanText: string): void {\r\n this.didYouMean = didYouMeanText;\r\n\r\n this._cludoSearch.setDidYouMean();\r\n }\r\n //#endregion\r\n\r\n //#region pagination\r\n public goToPage(pageNumber: number): void {\r\n this._cludoSearch.page(pageNumber, true);\r\n }\r\n public setPerPage(perPage: number): void {\r\n this._cludoSearch.params.perPage = perPage;\r\n this._cludoSearch.page(1);\r\n }\r\n //#endregion\r\n\r\n //#region sort\r\n /** Clears sorting parameters and performs a search */\r\n public clearSortOrder(): void {\r\n this._cludoSearch.clearSortOrder();\r\n }\r\n\r\n /** Clears sorting parameters */\r\n public clearSortParams(): void {\r\n this._cludoSearch.clearSortParams();\r\n }\r\n\r\n /** Augments current sort order with passed arguments and performs a search */\r\n public addToSortOrder(field: string, dir: string): void {\r\n this._cludoSearch.setSortOrder(field, dir);\r\n }\r\n\r\n /** Sets the sort order according to passed arguments and performs a search */\r\n public setSortOrder(field: string, dir: string): void {\r\n this.clearSortParams();\r\n this.addToSortOrder(field, dir);\r\n }\r\n //#endregion\r\n\r\n // #region autocomplete\r\n /** Performs an autocomplete request which, when complete, updates the list of autocomplete items */\r\n public initiateAutocompleteRequest(query: string): void {\r\n // FUTURE: Debouncing is handled within CoreJS in this function. Consider optionally ignoring it in the core script and handling debouncing in the component\r\n this._cludoSearch.autocompleteByQuery(query);\r\n }\r\n\r\n public selectSuggestion(suggestion: string, suggestionIndex: number) {\r\n this._cludoSearch.autocompleteSetSelectedSuggestion(suggestion, suggestionIndex);\r\n }\r\n\r\n public selectResult(result: TypedDocument) {\r\n this._cludoSearch.autocompleteSetSelectedResult(result);\r\n }\r\n\r\n public selectRecentSearch(recentSearch: string, recentSearchIndex: number) {\r\n this._cludoSearch.autocompleteSetSelectedRecentSearch(recentSearch, recentSearchIndex);\r\n }\r\n\r\n public clearRecentSearches() {\r\n this._cludoSearch.clearRecentSearches();\r\n }\r\n\r\n public clearAutocomplete() {\r\n this._cludoSearch.autocompleteRestoreClient();\r\n }\r\n // #endregion\r\n\r\n // #region endless scroll\r\n public endlessScrollLoadMore(): void {\r\n this._cludoSearch.endlessScrollLoadMoreClickEvent();\r\n }\r\n // #endregion\r\n\r\n // #region tracking\r\n /** Refer to https://docs.cludo.com/#tracking_queries for Query Log properties */\r\n public trackQuery(queryLog: QueryLogObject) {\r\n return this._cludoSearch.trackQuery(queryLog);\r\n }\r\n\r\n /** Refer to https://docs.cludo.com/#tracking_clicks for Click Log properties */\r\n public trackClick(clickLog: ClickLogObject) {\r\n return this._cludoSearch.trackClick(clickLog);\r\n }\r\n\r\n /** Sends a click log associated with a chat result */\r\n public trackChatClick(clickLog: ChatClickLog) {\r\n return this._cludoSearch.trackChatClick(clickLog);\r\n }\r\n // #endregion\r\n\r\n // #region Conversations\r\n\r\n /** Get conversations from storage */\r\n public getConversations(): any[] {\r\n return this._cludoSearch.conversationService.getConversationsFromStorage();\r\n }\r\n\r\n /** Store conversations */\r\n public storeConversations(conversations: any): void {\r\n this._cludoSearch.conversationService.storeConversations(conversations);\r\n }\r\n\r\n /** Send a question to our QA service */\r\n public sendQuestion(customerId: number, engineId: number, requestBody: ChatRequestBody, controller: AbortController): Promise<ChatResponse> {\r\n return this._cludoSearch.conversationService.sendQuestion(customerId, engineId, requestBody, controller);\r\n }\r\n\r\n /** Send feedback data regarding an exchange */\r\n public sendChatFeedbackData(customerId: number, engineId: number, feedbackData: ChatFeedbackData): Promise<void> {\r\n return this._cludoSearch.conversationService.sendFeedbackData(customerId, engineId, feedbackData);\r\n }\r\n \r\n // #endregion\r\n\r\n // #region Trending pages\r\n \r\n /** Get trending pages for the current customer/engine */\r\n public getTrendingPages(daysBack: number, limit?: number, timezone?: string): Promise<TrendingPagesResponse> {\r\n return this._cludoSearch.getTrendingPages(daysBack, limit, timezone);\r\n }\r\n\r\n /** Get popular pages for the current customer/engine */\r\n public getPopularPages(daysBack: number, limit?: number, timezone?: string): Promise<TrendingPagesResponse> {\r\n return this._cludoSearch.getPopularPages(daysBack, limit, timezone);\r\n }\r\n\r\n // #endregion\r\n}","import { CludoSearch, FilterMap } from \"../types/core-script-types\";\r\nimport { StringOverrideKeys, SupportedLanguage } from \"../types/translation-types\";\r\nimport { CludoSearchContext } from \"./cludo-search-context\";\r\nimport { ComponentsController, TemplateType } from \"./components-controller\";\r\nimport { CoreScriptStringOverrides } from \"./models/instantiator-types\";\r\n\r\n/**\r\n * Abstraction layer for interacting with the core Cludo script\r\n * \r\n * Provides public functions that are available to consumers and seals away internal functions that should not be callable\r\n */\r\nexport class CludoInstanceController {\r\n \r\n private _cludoSearch: CludoSearch;\r\n\r\n // TO-DO -- maybe there is a better name for this property?\r\n public instance: CludoSearchContext;\r\n\r\n public components: ComponentsController;\r\n\r\n constructor(cludoSearch: CludoSearch, cssTheme?: string) {\r\n this._cludoSearch = cludoSearch;\r\n\r\n this.instance = new CludoSearchContext(this._cludoSearch);\r\n this.components = new ComponentsController(this._cludoSearch, this.instance, cssTheme);\r\n }\r\n\r\n // FUTURE -- provide \"on init\" callback\r\n \r\n /**\r\n * Trigger a new search, which includes\r\n * - ensuring that the observed input values reflect the query value\r\n * - resets the page number\r\n * - resets the facets\r\n * - restores autocomplete\r\n * - restores endless scroll\r\n * - resets sort\r\n * \r\n * FUTURE -- provide a one-time callback specific to this search call\r\n */\r\n public search(): void {\r\n this._cludoSearch.search();\r\n }\r\n\r\n // Below methods intentionally all return an instance of the CludoSearchController class\r\n // so that the method calls can be chained\r\n\r\n /**\r\n * Registers a component for a specific type of widget\r\n * @param widgetType \r\n * @param widgetComponent \r\n * @returns Instance of CludoInstanceController (to allow chaining of calls)\r\n */\r\n public addWidget(\r\n widgetType: TemplateType,\r\n widgetComponent: React.ComponentType,\r\n element: HTMLElement | string\r\n ): CludoInstanceController {\r\n switch(widgetType) {\r\n case TemplateType.Results:\r\n this.components.registerSearchResultsComponent(\r\n widgetComponent,\r\n element);\r\n case TemplateType.Controls:\r\n this.components.registerControlsComponent(\r\n widgetComponent,\r\n element);\r\n case TemplateType.Autocomplete:\r\n this.components.registerAutocompleteComponent(\r\n widgetComponent,\r\n element);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Override the translation for a given token and language\r\n * @param key The translation token to assign\r\n * @param value The value of the translation\r\n * @param language The language the translation should override\r\n * @returns Instance of CludoInstanceController (to allow chaining of calls)\r\n */\r\n public setOverrideString(key: StringOverrideKeys, value: string, language: SupportedLanguage): CludoInstanceController {\r\n const languageSpecificTranslationSet = this._cludoSearch.translateProvider.translations[language];\r\n\r\n if (languageSpecificTranslationSet) {\r\n languageSpecificTranslationSet[key] = value;\r\n }\r\n \r\n return this;\r\n }\r\n \r\n /**\r\n * Assign a collection of override strings for the current language\r\n * @param overrides The collection of override strings for the current language\r\n * @returns Instance of CludoInstanceController (to allow chaining of calls)\r\n */\r\n public setOverrideStrings(overrides: CoreScriptStringOverrides): CludoInstanceController {\r\n const language = this.instance.translateProvider.language;\r\n Object.keys(overrides).map( (key) => {\r\n const value = overrides[key];\r\n if (key && value) {\r\n this.setOverrideString(key as StringOverrideKeys, value, language)\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Assigns the current language for the Cludo instance\r\n * @param language The language to set as the current language\r\n */\r\n public setLanguage(language: SupportedLanguage): CludoInstanceController {\r\n this.instance.translateProvider.language = language;\r\n\r\n return this;\r\n }\r\n\r\n // FUTURE -- consider adding chainable utility functions for updating the CludoSearch options\r\n // Potential options:\r\n // setAutocompleteOptions(options: AutocompleteInitializationOptions): CludoInstanceController\r\n // addCallback(type: CallbackType, callback: Function): CludoInstanceController\r\n}","import { useState } from \"react\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { SortOrder } from \"../types/core-script-types\";\r\nimport { SortOption } from \"../utils/models/instantiator-types\";\r\nimport { useEventSubscriptions } from \"./use-event-subscription\";\r\n\r\nexport interface SortByState {\r\n sortOrder: SortOrder;\r\n sortItems: SortOption[];\r\n}\r\n\r\nexport interface SortByDispatchers {\r\n setSortOrder: (field: string, direction: string) => void;\r\n addToSortOrder: (field: string, direction: string) => void;\r\n clearSortOrder: () => void;\r\n}\r\n\r\n/** Expose state and dispatchers for controlling sorting \r\n * @returns cludoState (sortOrder, sortItems) and cludoDispatchers (events for setting/clearing sort order)\r\n*/\r\nexport function useSortBy(): [SortByState, SortByDispatchers] {\r\n const { context, eventController } = useCludoContext();\r\n\r\n // Derive state from CludoSearchContext\r\n const deriveState : () => SortByState = () => {\r\n return {\r\n sortOrder: context.sort || {},\r\n sortItems: context.sortItems || [],\r\n }\r\n };\r\n\r\n // Derive dispatchers from EventController\r\n // FUTURE: Investigate getting rid of bind here\r\n const deriveDispatchers : () => SortByDispatchers = () => {\r\n return {\r\n setSortOrder: eventController?.setSortOrder?.bind(eventController) || (() => {}),\r\n addToSortOrder: eventController?.addToSortOrder?.bind(eventController) || (() => {}),\r\n clearSortOrder: eventController?.clearSortOrder?.bind(eventController) || (() => {}),\r\n\r\n }\r\n }\r\n\r\n // When eventController changes, derive state and dispatchers again\r\n useEventSubscriptions(() => {\r\n setCludoState(deriveState());\r\n setCludoDispatchers(deriveDispatchers());\r\n });\r\n\r\n const [cludoState, setCludoState] = useState(deriveState());\r\n const [cludoDispatchers, setCludoDispatchers] = useState(deriveDispatchers());\r\n\r\n return [ cludoState, cludoDispatchers ];\r\n}","import React from 'react';\r\nimport { useSortBy } from '../../../hooks/use-sort-by';\r\n\r\n/** Props interface */\r\nexport type CludoSortBaseProps = {\r\n relevanceLabel?: string;\r\n}\r\n\r\nexport function CludoSortPicker(props: CludoSortBaseProps) {\r\n\r\n const [sortByState, sortByDispatchers] = useSortBy();\r\n\r\n // If set to nothing, keep translation to be Relevance\r\n const relTranslation = (props.relevanceLabel) ? props.relevanceLabel : 'Relevance';\r\n\r\n // Length of sort object\r\n let sortObject = Object.keys(sortByState.sortOrder);\r\n // If sort is active\r\n let sortActive = sortObject.length > 0;\r\n // Active class for relevance field\r\n let relActive = (sortActive) ? undefined : 'active';\r\n\r\n return (\r\n <div className='cludo-sort-picker'>\r\n <ul className=\"cludo-sort-picker-list\">\r\n <li className={`cludo-sort-picker-item ${relActive}`}>\r\n <a onClick={() => sortByDispatchers.clearSortOrder() }>{relTranslation}</a>\r\n </li>\r\n\r\n {sortByState.sortItems.map(sortItem => {\r\n const isActive =\r\n (sortActive && (sortObject[0] == sortItem.key) && sortByState.sortOrder[sortItem.key] == sortItem.direction)\r\n ? 'active'\r\n : undefined;\r\n\r\n return (\r\n <li className={`cludo-sort-picker-item ${isActive}`}\r\n key={sortItem.key + sortItem.direction}>\r\n <a onClick={() => sortByDispatchers.setSortOrder(sortItem.key, sortItem.direction) }>\r\n {sortItem.displayText}\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n )\r\n}\r\n\r\n","import React, { PropsWithChildren } from \"react\";\r\n\r\ninterface PseudoLinkProps {\r\n className: string;\r\n onClick: () => void;\r\n}\r\n\r\nexport function PseudoLink(props: PropsWithChildren<PseudoLinkProps>) {\r\n const interceptClick: (event: React.MouseEvent) => void =\r\n (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n props.onClick();\r\n }\r\n\r\n return (\r\n <a className={props.className} href=\"#\"\r\n onClick={(e) => interceptClick(e) }>\r\n { props.children}\r\n </a>\r\n )\r\n}","import { useState } from \"react\";\r\nimport { ExternalFacet } from \"../utils/cludo-search-context\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { useEventSubscriptions } from \"./use-event-subscription\";\r\n\r\nexport interface FacetState {\r\n facet: ExternalFacet | null;\r\n}\r\n\r\nexport interface FacetDispatchers {\r\n selectFacet: (value: string, multi?: boolean) => void;\r\n deselectFacet: (value: string) => void;\r\n toggleFacetValue: (value: string) => void;\r\n clearFacet: () => void;\r\n setDateRangeFacet: (from: string, to: string) => void;\r\n setNumberRangeFacet: (from: number, to: number) => void;\r\n}\r\n\r\n/** Expose data and dispatchers for a facet component \r\n * @returns cludoState (data of facet for inputted facet field) and cludoDispatchers (select, deselect, and toggle facet events)\r\n*/\r\nexport function useFacet(facetField: string) : [FacetState, FacetDispatchers] {\r\n const { context, eventController } = useCludoContext();\r\n\r\n // Derive state from CludoSearchContext\r\n const deriveState : () => FacetState = () => {\r\n const facet = context?.facets?.find(facet => facet.key === facetField) || null;\r\n return {\r\n facet\r\n }\r\n }\r\n\r\n // Derive dispatchers from EventController\r\n // FUTURE: Investigate getting rid of bind here\r\n const deriveDispatchers : () => FacetDispatchers = () => {\r\n return {\r\n selectFacet: eventController?.selectFacet?.bind(eventController, facetField) || (() => {}),\r\n deselectFacet: eventController?.deselectFacet?.bind(eventController, facetField) || (() => {}),\r\n toggleFacetValue: eventController?.toggleFacetValue?.bind(eventController, facetField) || (() => {}),\r\n clearFacet: eventController?.clearFacet?.bind(eventController, facetField) || (() => {}),\r\n setDateRangeFacet: eventController?.setDateRangeFacet?.bind(eventController, facetField) || (() => {}),\r\n setNumberRangeFacet: eventController?.setNumberRangeFacet?.bind(eventController, facetField) || (() => {})\r\n }\r\n }\r\n\r\n // When eventController changes, derive state and dispatchers again\r\n useEventSubscriptions(() => {\r\n setCludoState(deriveState());\r\n setCludoDispatchers(deriveDispatchers());\r\n });\r\n\r\n const [cludoState, setCludoState] = useState(deriveState());\r\n const [cludoDispatchers, setCludoDispatchers] = useState(deriveDispatchers());\r\n\r\n return [ cludoState, cludoDispatchers ];\r\n}","import React from \"react\";\r\nimport { PseudoLink } from \"../../../utility/pseudo-link\";\r\nimport { FacetItemProps } from \"../base-facet\";\r\nimport { useFacet } from \"../../../../hooks/use-facet\";\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\n\r\n/** Renders a single facet item */\r\nexport function StandardFacetItem(props: FacetItemProps) {\r\n const [facetState, facetDispatchers] = useFacet(props.facetItem.facetName);\r\n\r\n // Set theme css\r\n const optionThemeCss = generateThemeCss('cludo-theme-facet-option', props.disableTheme, props.className);\r\n const activeThemeCss = generateThemeCss('cludo-theme-facet-option cludo-font-weight-bold', props.disableTheme, props.className) + ' cludo-active';\r\n const countThemeCss = generateThemeCss('cludo-theme-facet-count', props.disableTheme, props.className);\r\n\r\n const valueClass = props.facetItem.isSelected ?\r\n activeThemeCss :\r\n optionThemeCss;\r\n\r\n const handleFacetClick = () => {\r\n facetDispatchers.toggleFacetValue(props.facetItem.value);\r\n if (props.onChange) props.onChange();\r\n }\r\n\r\n return (\r\n <PseudoLink className={valueClass}\r\n onClick={handleFacetClick}>\r\n { props.facetItem.value }\r\n {\r\n (!props.hideCount && props.facetItem.count) ? \r\n <>&nbsp;<span className={countThemeCss}>{props.facetItem.count}</span></>\r\n : null\r\n }\r\n </PseudoLink>\r\n )\r\n}","import React, { ReactNode } from \"react\";\r\nimport { StandardFacet } from \"../components/controls/facets/standard-facet\";\r\n\r\n\r\n/** Takes in unordered facet field/option array and order reference array and returns ordered facet field/option array */\r\nexport function setOrderBasedOnReference(unordered: string[], reference: string[]): string[] {\r\n let unorderedArr = [...unordered];\r\n let referenceArr = [...reference];\r\n\r\n const wildcards = referenceArr.filter(x => x === \"*\").length;\r\n if (wildcards > 1) {\r\n throw new Error('Only one wildcard (*) allowed in a reference order');\r\n }\r\n\r\n // Sorting is done by first removing any elements from reference array that don't exist in original array\r\n // Remaining reference elements are removed from original unordered array\r\n referenceArr = referenceArr.filter(x => unorderedArr.includes(x) || x === \"*\");\r\n unorderedArr = unorderedArr.filter(x => !referenceArr.includes(x));\r\n\r\n // Remaining unordered elements (unorderedArr) are either inserted into wildcard (*) position\r\n // or simply added to end of ordered reference array and returned\r\n const wildcardIndex = referenceArr.indexOf(\"*\");\r\n if (wildcardIndex > -1) {\r\n referenceArr.splice(wildcardIndex, 1, ...unorderedArr);\r\n return referenceArr;\r\n } \r\n else {\r\n return referenceArr.concat(unorderedArr);\r\n }\r\n}\r\n\r\n\r\n/** Takes in facet field array and collection of child components that should override default component */\r\n/** Returns map with key set to facet field string and value set to facet component that should be rendered for field */\r\nexport function populateFacetGroupMap(facetFields: string[], facetOverrides: React.ReactNode): Map<string, React.ReactNode> {\r\n let DefaultComponent: React.ReactElement;\r\n const facetMap = new Map<string, React.ReactNode>(facetFields.map(field => [field, null]));\r\n\r\n if (facetOverrides) {\r\n React.Children.forEach(facetOverrides, override => {\r\n\r\n // Make sure any overrides are valid React elements and have a \"field\" prop\r\n if (!React.isValidElement(override)) return;\r\n const { field } = override.props;\r\n const { type, props } = override;\r\n if (!field) {\r\n throw new Error(\r\n `Could not find \"field\" prop for facet group override ${type || 'unknown'}.`\r\n );\r\n }\r\n\r\n // If default (*) override set, make sure it is the first default override\r\n // Set default component to instance of override type with any pre-set props (will add field prop later)\r\n if (override.props.field === \"*\") {\r\n if (DefaultComponent) {\r\n throw new Error('Only one override component with wildcard (*) field allowed in a facet group');\r\n } else {\r\n DefaultComponent = React.createElement(type, {...props});\r\n }\r\n }\r\n // Otherwise, set instance of specific override with field prop in map\r\n else {\r\n facetMap.set(field, \r\n React.createElement(type, {field: field, ...props})\r\n );\r\n } \r\n });\r\n }\r\n\r\n // Check map for any facet fields that still have null component value\r\n // Set component instance to either the default component override, if it was set, or standand facet\r\n facetMap.forEach((value, key, map) => {\r\n if(value === null) {\r\n const fallback = DefaultComponent ? \r\n React.cloneElement(DefaultComponent, {field: key}) : \r\n React.createElement(StandardFacet, {field: key});\r\n map.set(key, fallback);\r\n }\r\n })\r\n \r\n return facetMap;\r\n}\r\n\r\n","import React from \"react\"\r\nimport { ExternalFacet } from \"../../../../utils/cludo-search-context\"\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../../../types/types\";\r\n\r\nexport function FacetHeader(props: ThemeBaseProps & {\r\n facet: ExternalFacet | null,\r\n label: string,\r\n hideClear?: boolean,\r\n clearLabel?: string,\r\n onClear?: (e?: React.SyntheticEvent) => void\r\n}) {\r\n \r\n // Set theme css\r\n const headerThemeCss = generateThemeCss('cludo-font-size-lg cludo-m-0 cludo-mr-3 cludo-line-height-2', props.disableTheme);\r\n const clearThemeCss = generateThemeCss('cludo-theme-btn-gray', props.disableTheme);\r\n\r\n return ( \r\n props.facet ?\r\n <div className={(props.className ? props.className + ' ' : '') + 'cludo-display-flex cludo-align-items-center cludo-mb-2'}>\r\n <h3 className={headerThemeCss}>{ props.label }</h3>\r\n {!props.hideClear && props.facet.hasSelection ?\r\n // TODO: future task will add translation/override support for 'clear'\r\n <button className={clearThemeCss} onClick={props.onClear} >{ props.clearLabel || 'Clear' }</button> : null\r\n }\r\n </div> :\r\n null\r\n )\r\n}","import React from \"react\"\r\nimport { FacetItem } from \"../../../../utils/cludo-search-context\";\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../../../types/types\";\r\n\r\nexport function FacetSearch(props: ThemeBaseProps & {\r\n facetItems: FacetItem[],\r\n onChange: (filteredList: FacetItem[]) => void,\r\n placeholder?: string,\r\n hideSelected?: boolean\r\n}) {\r\n const unfilteredList = props.facetItems;\r\n const placeholderOption = props.placeholder || 'Search options'\r\n const hideSelectedOption = props.hideSelected || false\r\n\r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-searchbar', props.disableTheme, props.className);\r\n\r\n function filterBySearch(event: React.ChangeEvent<HTMLInputElement>) {\r\n const query = event.currentTarget?.value;\r\n const filteredList = unfilteredList?.filter((item) => {\r\n return (\r\n item.value.toLowerCase().includes(query.toLowerCase()) ||\r\n (item.isSelected && !hideSelectedOption)\r\n )\r\n });\r\n props.onChange(filteredList);\r\n };\r\n\r\n return (\r\n <input placeholder={placeholderOption} className={themeCss} onChange={filterBySearch} />\r\n )\r\n}","import React, { useEffect, useState } from \"react\";\r\nimport { FacetItem } from \"../../../../utils/cludo-search-context\";\r\nimport { FacetItemProps } from \"../base-facet\";\r\nimport { LoadMore } from \"../../../results/cludo-load-more\";\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../../../types/types\";\r\n\r\nexport function FacetItemsList(props: ThemeBaseProps & {\r\n facetItems: FacetItem[],\r\n itemComponent: React.ComponentType<FacetItemProps>,\r\n limit?: number,\r\n hideShowMore?: boolean,\r\n hideCount?: boolean\r\n}) {\r\n\r\n const facetLimitOption = props.limit || Infinity;\r\n const facetHideShowMoreOption = props.hideShowMore || false;\r\n const facetHideCountOption = props.hideCount || false;\r\n \r\n const [visibleFacets, setVisibleFacets] = useState(facetLimitOption);\r\n\r\n const loadMoreThemeCss = generateThemeCss('cludo-theme-btn-accent-secondary cludo-font-weight-bold', props.disableTheme);\r\n \r\n function shouldBeHidden(item: FacetItem, i: number) {\r\n return (\r\n !item.isSelected &&\r\n (i > (visibleFacets - 1))\r\n )\r\n }\r\n\r\n useEffect(() => {\r\n setVisibleFacets(facetLimitOption);\r\n }, [props.limit]);\r\n\r\n return (\r\n <>\r\n <ul className={(props.className ? props.className + ' ': '') + 'cludo-list-style-none cludo-p-0 cludo-mt-0 cludo-mb-3'}>\r\n {props.facetItems.map((facetItem, i) => {\r\n return (\r\n <li className={ shouldBeHidden(facetItem, i) ? 'cludo-display-none' : '' }\r\n key={`facet-value-${facetItem.value}`}>\r\n <props.itemComponent\r\n key={`facet-value-${facetItem.value}`}\r\n facetItem={facetItem}\r\n hideCount={facetHideCountOption}\r\n disableTheme={props.disableTheme}\r\n />\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {\r\n !facetHideShowMoreOption && (visibleFacets < props.facetItems.length) ?\r\n <LoadMore className={loadMoreThemeCss} onClick={() => setVisibleFacets(Infinity)} /> :\r\n null\r\n }\r\n </>\r\n )\r\n}","import React, { useMemo, useState } from \"react\";\r\nimport { useFacet } from \"../../../hooks/use-facet\";\r\nimport { ExternalFacet, FacetItem } from \"../../../utils/cludo-search-context\";\r\nimport { setOrderBasedOnReference } from \"../../../utils/facet-utils\";\r\nimport { FacetHeader } from \"./elements/facet-header\";\r\nimport { FacetSearch } from \"./elements/facet-search\";\r\nimport { FacetItemsList } from \"./elements/facet-items-list\";\r\nimport { ThemeBaseProps } from \"../../types/types\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\n\r\nexport type FacetProps = ThemeBaseProps & {\r\n field: string;\r\n facet?: ExternalFacet;\r\n label?: string;\r\n searchPlaceholder?: string;\r\n sortBy?: \"count\" | \"alphabetical\";\r\n order?: string [];\r\n exclude?: string [];\r\n hideCount?: boolean;\r\n hideClear?: boolean;\r\n hideSearchBar?: boolean;\r\n limit?: number;\r\n hideShowMore?: boolean;\r\n onChange?: () => {}; \r\n}\r\n\r\nexport type FacetItemProps = ThemeBaseProps & { \r\n facetItem: FacetItem,\r\n hideCount?: boolean,\r\n onChange?: Function\r\n}\r\n\r\nexport function BaseFacet(props: FacetProps & {itemComponent: React.ComponentType<FacetItemProps>}) {\r\n const [facetState, facetDispatchers ] = useFacet(props.field);\r\n\r\n // Set options from props or use defaults\r\n const facetSortByOption = props.sortBy || \"count\";\r\n const facetOrderOption = props.order || [];\r\n const facetExcludeOption = props.exclude || [];\r\n \r\n // Set theme css\r\n const containerThemeCss = generateThemeCss('cludo-box-shadow-card cludo-border-radius-card cludo-p-4 cludo-mb-5 cludo-font-family-default', props.disableTheme, props.className);\r\n\r\n // Consuming component can pass in facet data directly\r\n // or just pass in field prop and facet data will be retrieved from facet hook\r\n const facet = props.facet || facetState.facet;\r\n const facetItems = facet?.values || [];\r\n const [facetItemsSavedCopy, setFacetItemsSavedCopy] = useState<FacetItem[]>([]);\r\n const [facetItemsToRender, setFacetItemsToRender] = useState<FacetItem[]>([]);\r\n\r\n const handleClearFacet = () => {\r\n facetDispatchers.clearFacet();\r\n }\r\n\r\n useMemo(() => {\r\n if (facetItems?.length) {\r\n let facetItemValues = facetItems.map(x => x.value);\r\n // Set sort\r\n if (facetSortByOption) {\r\n switch(facetSortByOption) {\r\n case 'count':\r\n facetItemValues = facetItems.sort((a, b) => (b.count || -1) - (a.count || -1)).map(facet => facet.value)\r\n break;\r\n case 'alphabetical':\r\n facetItemValues = facetItems.sort((a, b) => a.value.localeCompare(b.value)).map(facet => facet.value)\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n // Set exclusions\r\n if (facetExcludeOption.length) {\r\n facetItemValues = facetItemValues.filter(x => !facetExcludeOption.includes(x));\r\n }\r\n // Set custom order\r\n if (facetOrderOption.length) {\r\n facetItemValues = setOrderBasedOnReference(facetItemValues, facetOrderOption);\r\n }\r\n // Take filtered/sorted/etc array of facet items values (strings) and push corresponding\r\n // facet items into an array of facet items that should be rendered\r\n const facetItemsMap = new Map<string, FacetItem>(facetItems?.map(option => [option.value, option]));\r\n const filteredFacetItemsList = [] as FacetItem[];\r\n facetItemValues.forEach(item => {\r\n const mappedItem = facetItemsMap.get(item);\r\n if (mappedItem) filteredFacetItemsList.push(mappedItem);\r\n })\r\n setFacetItemsSavedCopy(filteredFacetItemsList);\r\n setFacetItemsToRender(filteredFacetItemsList);\r\n }\r\n }, [facetState]);\r\n\r\n\r\n return (\r\n facetItems.length ?\r\n <div className={containerThemeCss}>\r\n <FacetHeader\r\n facet={facet}\r\n label={props.label ? props.label : facet?.key || ''}\r\n hideClear={props.hideClear}\r\n onClear={handleClearFacet}\r\n disableTheme={props.disableTheme} />\r\n {\r\n !props.hideSearchBar ?\r\n <FacetSearch\r\n facetItems={facetItemsSavedCopy}\r\n placeholder={props.searchPlaceholder}\r\n onChange={(filteredList) => {setFacetItemsToRender(filteredList)}}\r\n disableTheme={props.disableTheme} />\r\n : null\r\n }\r\n <FacetItemsList\r\n facetItems={facetItemsToRender}\r\n itemComponent={props.itemComponent}\r\n limit={props.limit}\r\n hideShowMore={props.hideShowMore}\r\n hideCount={props.hideCount}\r\n disableTheme={props.disableTheme} />\r\n\r\n </div> : null\r\n )\r\n}","import React from \"react\";\r\nimport { StandardFacetItem } from \"./items/standard-facet-item\";\r\nimport { BaseFacet, FacetProps } from \"./base-facet\";\r\n\r\nexport function StandardFacet(props: FacetProps) { \r\n\r\n return (\r\n <BaseFacet itemComponent={StandardFacetItem} {...props} />\r\n )\r\n}","import { useState } from \"react\";\r\nimport { ExternalFacet } from \"../utils/cludo-search-context\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { useEventSubscriptions } from \"./use-event-subscription\";\r\nimport { FacetMapRequest, RangeFacetMap } from \"../types/core-script-types\";\r\n\r\nexport interface FacetGroupState {\r\n facets: ExternalFacet[];\r\n selectedFacets: FacetMapRequest;\r\n}\r\n\r\nexport interface FacetGroupDispatchers {\r\n clearAllFacets: () => void;\r\n deselectFacet: (field: string, value: string) => void;\r\n}\r\n\r\n/** Expose data and dispatchers for a facet group component (collection of all Cludo search facets) \r\n * @returns cludoState (list of all available facets) and cludoDispatchers (the \"Clear all facets\" event)\r\n*/\r\nexport function useFacetGroup() : [FacetGroupState, FacetGroupDispatchers] {\r\n const { context, eventController } = useCludoContext();\r\n\r\n // Derive state from CludoSearchContext\r\n const deriveState : () => FacetGroupState = () => {\r\n return {\r\n facets: context?.facets || [],\r\n selectedFacets: context?.selectedFacets\r\n }\r\n }\r\n\r\n // Derive dispatchers from EventController\r\n // FUTURE: Investigate getting rid of bind here\r\n const deriveDispatchers : () => FacetGroupDispatchers = () => {\r\n return {\r\n clearAllFacets: eventController?.clearAllFacets?.bind(eventController) || (() => {}),\r\n deselectFacet: eventController?.deselectFacet?.bind(eventController) || (() => {})\r\n }\r\n }\r\n\r\n // When eventController changes, derive state and dispatchers again\r\n useEventSubscriptions(() => {\r\n setCludoState(deriveState());\r\n setCludoDispatchers(deriveDispatchers());\r\n });\r\n\r\n const [cludoState, setCludoState] = useState(deriveState());\r\n const [cludoDispatchers, setCludoDispatchers] = useState(deriveDispatchers());\r\n\r\n return [ cludoState, cludoDispatchers ];\r\n}","import React from \"react\";\r\nimport { CludoSortPicker } from \"./sort-picker/cludo-sort-picker\";\r\nimport { ControlsCompositionOptions } from \"../../utils/models/instantiator-types\";\r\nimport { StandardFacet } from \"./facets/standard-facet\";\r\nimport { useSortBy } from \"../../hooks/use-sort-by\";\r\nimport { useFacetGroup } from \"../../hooks/use-facet-group\";\r\n\r\nexport const CludoSearchControls = composeControls({});\r\n\r\nexport function composeControls(options: ControlsCompositionOptions): () => JSX.Element {\r\n const SortPickerComponent = options.sortPicker || CludoSortPicker;\r\n const FacetComponent = options.facet || StandardFacet;\r\n\r\n return () => {\r\n const [ sortByState ] = useSortBy();\r\n const [ facetsState ] = useFacetGroup();\r\n const shouldShowSortPicker: boolean = sortByState.sortItems.length > 0;\r\n const facets = facetsState.facets;\r\n\r\n return (\r\n <>\r\n {\r\n shouldShowSortPicker\r\n ? <SortPickerComponent />\r\n : <></>\r\n }\r\n\r\n {/* Render facet components */}\r\n {\r\n facets.map((facet) => {\r\n return <FacetComponent key={facet.key} field={facet.key} />\r\n })\r\n }\r\n </>\r\n \r\n );\r\n }\r\n}\r\n","import { CludoSearchResults } from '../components/results/cludo-search-results';\r\nimport { CludoSearchAutocomplete } from '../components/sayt/cludo-search-autocomplete';\r\nimport { CludoInstanceController } from './cludo-instance-controller';\r\nimport { ExternalCludoSearchOptions, PublicSettingsRequestOptions } from './models/instantiator-types';\r\nimport { CludoSearchControls } from '../components/controls/cludo-search-controls';\r\nimport { PublicSettings } from '@cludosearch/cludo-api-client/dist/interfaces/api/public-settings.interface';\r\nimport { SupportedLanguage } from '../types/translation-types';\r\nimport { CludoSearchOptions, PublicSettingsLocal } from '../types/core-script-types';\r\n\r\nconst defaultLanguage: SupportedLanguage = 'da';\r\nconst coreScriptUrl = 'https://customer.cludo.com/scripts/bundles/search-script.min.js';\r\n\r\nexport async function getPublicSettings(options: PublicSettingsRequestOptions): Promise<PublicSettings> {\r\n try {\r\n let publicSettingsDataStr: string = '';\r\n publicSettingsDataStr = await window.Cludo.getPublicSettingsByOptions({\r\n customerId: options.customerId,\r\n engineId: options.engineId,\r\n experienceId: options.experienceId,\r\n apiUrl: undefined,\r\n authKey: undefined,\r\n searchSiteKey: undefined,\r\n isIntranet: options.isIntranet\r\n } as PublicSettingsRequestOptions);\r\n\r\n // Parse public settings from the response (instantSuggestionsConfiguration is double encoded for some reason)\r\n const publicSettings: PublicSettingsLocal = JSON.parse(publicSettingsDataStr);\r\n publicSettings.instantSuggestionsConfiguration = JSON.parse(publicSettings.instantSuggestionsConfiguration as any);\r\n\r\n return publicSettings;\r\n\r\n } catch {\r\n throw('Unable to resolve public settings via web service');\r\n }\r\n}\r\n\r\n// FUTURE: This may be replaced by a CoreJS package in the future\r\nexport async function injectCoreScript(): Promise<void> {\r\n return new Promise(function(resolve, reject) {\r\n if (document.querySelector(`script[src=\"${coreScriptUrl}\"]`)){\r\n resolve();\r\n } else {\r\n let script = document.createElement('script');\r\n script.onload = () => resolve();\r\n script.onerror = () => reject();\r\n script.src = coreScriptUrl;\r\n document.body.appendChild(script);\r\n }\r\n });\r\n}\r\n\r\nexport async function initCludo(options: ExternalCludoSearchOptions): Promise<CludoInstanceController> {\r\n const publicSettingsOptions: PublicSettingsRequestOptions = {\r\n customerId: options.customerId,\r\n engineId: options.engineId,\r\n experienceId: options.experienceId,\r\n isIntranet: options.secureSearch?.enable\r\n };\r\n\r\n // Get core script (headless only)\r\n if (options.headless) {\r\n await injectCoreScript();\r\n }\r\n\r\n // Get public settings\r\n const publicSettings = await getPublicSettings(publicSettingsOptions);\r\n\r\n // Init and return instance controller\r\n const controller = initCludoWithPublicSettings(options, publicSettings);\r\n return controller;\r\n}\r\n\r\nexport function initCludoWithPublicSettings(options: ExternalCludoSearchOptions, publicSettings: PublicSettings): CludoInstanceController {\r\n let cludoSettings: CludoSearchOptions = {\r\n customerId: options.customerId,\r\n engineId: options.engineId,\r\n language: options.language,\r\n searchUrl: options.searchUrl,\r\n paramsPrefix: options.instanceId,\r\n clientTemplates: true, // always true\r\n publicSettings: publicSettings,\r\n searchInputs: options.searchInputSelectors,\r\n headlessSearch: options.headless,\r\n searchResultsWrapper: options.searchResultsWrapperSelector,\r\n intranetSearch: options.secureSearch?.enable,\r\n searchApiUrl: options.secureSearch?.proxyApiUrl,\r\n disableAutocomplete: options.autocomplete?.disable,\r\n facets: options.facets?.keys,\r\n initFacets: options.facets?.defaultValues,\r\n filters: options.filters,\r\n perPage: options.theme?.resultsPerPage,\r\n hideResultsCount: options.theme?.hideResultsCount,\r\n hideSearchFilters: options.theme?.hideSearchFilters,\r\n hideSearchDidYouMean: options.theme?.hideSearchDidYouMean,\r\n type: options.theme?.type,\r\n sortOrder: options.sort?.defaultOrder,\r\n sortOptions: options.sort?.options,\r\n logPageVisits: !options.tracking?.skipLoggingPageVisits,\r\n richAutocomplete: options.autocomplete?.useSearchAsYouType,\r\n autocompleteForceUseTemplate: options.autocomplete?.renderTemplateWhenNoResults,\r\n autocompleteMinimumQueryLength: options.autocomplete?.minimumQueryLength,\r\n applyMultiLevelFacets: options.facets?.applyMultiLevel,\r\n rangeFacets: options.facets?.rangeValues,\r\n pierceShadowDom: options.behavior?.pierceShadowDom,\r\n enableRelatedSearches: options.behavior?.enableRelatedSearches,\r\n customNoResultsMessage: options.overrideStrings?.noResultsMessage,\r\n enableVoiceSearch: options.voiceSearch?.enable,\r\n disableVoiceSearchActiveAnimation: options.voiceSearch?.disableActiveAnimation,\r\n useFixedQueryInResultsCount: options.theme?.showFixedQueryInResultsCount,\r\n allowSearchWithoutSearchword: options.behavior?.allowSearchWithoutSearchword,\r\n jumpToTopOnFacetClick: options.behavior?.jumpToTopOnFacetClick,\r\n endlessScroll: options.behavior?.endlessScroll,\r\n enableExtendedTracking: !options.tracking?.disableExtendedTracking,\r\n customCallbackAfterSearch: options.callbacks?.afterSearch,\r\n customCallbackBeforeSearch: options.callbacks?.beforeSearch,\r\n customCallbackBeforeRedirect: options.callbacks?.beforeRedirect,\r\n customCallbackAfterAutocomplete: options.callbacks?.afterAutocomplete,\r\n canUserBeTracked: options.tracking?.canUserBeTracked,\r\n ovarlayResultsWrapperOpenClass: options.theme?.overlayResultsWrapperOpenClass,\r\n theme: {\r\n searchBoxPosition: options.theme?.searchBoxPosition,\r\n themeColor: options.theme?.themeColor,\r\n elementFocusColor: options.theme?.elementFocusColor,\r\n themeBannerColor: options.theme?.themeBannerColor,\r\n textColor: options.theme?.textColor,\r\n borderRadius: options.theme?.borderRadius,\r\n borderRadiusInput: options.theme?.borderRadius\r\n },\r\n showInstantSuggestions: options.autocomplete?.showInstantSuggestions,\r\n suggestedSearchesHeader: options.overrideStrings?.suggestedSearchesHeader,\r\n recentSearchesHeader: options.overrideStrings?.recentSearchesHeader,\r\n googleAnalyticsTrackingId: options.tracking?.googleAnalyticsId,\r\n focusOnResultsAfterSearch: options.behavior?.focusOnResultsAfterSearch,\r\n translateSearchTemplates: true, // FUTURE -- resolve; theoretically, this shouldn't be necessary\r\n changeWindowLocation: options.behavior?.updateUrlOnSearch !== undefined ? options.behavior?.updateUrlOnSearch : true,\r\n };\r\n\r\n // custom handling for properties that aren't a simple copy or inverse\r\n if (options.theme?.loadingImagePath) {\r\n cludoSettings.loading =\r\n `<img src=\"${options.theme.loadingImagePath}\" class=\"loading\" tabindex=\"-1\" alt=\"loading search results\" />`;\r\n }\r\n\r\n const cludoInstance = new window.Cludo(cludoSettings);\r\n\r\n // Get a reference to the current translation object to use for overrides\r\n let translationRef = cludoInstance.translateProvider\r\n .translations[options.language || options.filters?.Language[0] || defaultLanguage];\r\n\r\n\r\n // Copy the custom strings into the translateProvider object\r\n if (translationRef) {\r\n translationRef = Object.assign(translationRef, options.overrideStrings);\r\n } else {\r\n console.warn('Cludo: Translations not found for language ' + options.language);\r\n }\r\n\r\n // Apply any categorize by field settings\r\n if (options.categorizeResultsByField) {\r\n cludoInstance.params.topHitsFields = [{\r\n // Set required field\r\n field: options.categorizeResultsByField.field,\r\n // Conditionally set max results and categories\r\n ...(options.categorizeResultsByField.maxResultsPerCategory &&\r\n {size: options.categorizeResultsByField.maxResultsPerCategory}),\r\n ...(options.categorizeResultsByField.maxCategories &&\r\n {MaxFieldValues: options.categorizeResultsByField.maxCategories})\r\n }];\r\n }\r\n\r\n const controller: CludoInstanceController = new CludoInstanceController(cludoInstance, options.cssTheme);\r\n\r\n // FUTURE -- remove if / once supported in corejs\r\n if (cludoInstance.setClientTemplateComponentsController) {\r\n cludoInstance.setClientTemplateComponentsController(controller.components);\r\n }\r\n\r\n cludoInstance.configureFeaturesFromPublicSettings(publicSettings);\r\n cludoInstance.init();\r\n\r\n // render any custom components, or their defaults if not defined\r\n if (options.headless !== true) {\r\n controller.components.registerSearchResultsComponent(\r\n options.components?.results || CludoSearchResults,\r\n cludoSettings.searchResultsWrapper ? cludoSettings.searchResultsWrapper : '.search-results .search-results-container'\r\n );\r\n\r\n if (!cludoSettings.hideSearchFilters) {\r\n controller.components.registerControlsComponent(options.components?.controls || CludoSearchControls,\r\n options.controlsWrapperSelector ? options.controlsWrapperSelector : '.search-filters');\r\n }\r\n\r\n if (options.autocomplete?.disable !== true) {\r\n // register autocomplete for each configured search input or fall back to default input selector\r\n if (options.searchInputSelectors?.length) {\r\n options.searchInputSelectors.forEach(selector => {\r\n controller.components.registerAutocompleteComponent(\r\n options.components?.autocomplete || CludoSearchAutocomplete,\r\n selector + ' #search_autocomplete');\r\n })\r\n } else {\r\n controller.components.registerAutocompleteComponent(\r\n options.components?.autocomplete || CludoSearchAutocomplete,\r\n '#cludo-search-input #search_autocomplete');\r\n }\r\n }\r\n }\r\n\r\n return controller;\r\n}\r\n\r\n\r\n// DROPPED PROPERTIES\r\n // The below properties are supported in the Cludo constructor but have been dropped from this\r\n // implementation for the sake of clarity and simplicity\r\n\r\n // siteId: number -- dropping siteId as it seems to be a legacy property; only a couple uses found in the customers repo\r\n // clientTemplates: any -- dropping as we should be able to default this to true\r\n // searchApiUrlPublic?: string -- dropping as it doesn't appear to be used\r\n // statisticsApiUrl?: dropping as it's used extremely rarely\r\n // searchSiteKey?: string; // dropping, custom value doesn't appear to be used and has default\r\n // customerTemplate?: string; // dropping, not used with the client template approach\r\n // loading?: string; // dropping, should be overridden as a component instead\r\n // paramsPrefix?: string // dropping, appears to be unused and has a default ('cludo')\r\n // showSearchPage?: boolean; // dropping, appeard to be unused and has a default (true)\r\n // bannerIsInSearchTemplate?: boolean; // dropping for now, not compatible with client-side templates (needs to default to true)\r\n // xhrRequestHeader?: string; // dropping, not used and has a default ('application/json')\r\n // hideSearchFiltersIfNoResult?: boolean; // drop, for now at least. I believe the decision \r\n // on whether to show the filters when there are no\r\n // results should be delegated to the React components\r\n // resetFiltersBeforeSearch?: boolean; // dropping as it's used extremely rarely\r\n // resetSortBeforeSearch?: boolean; // dropping as it's used extremely rarely\r\n // voiceGrammar?: string[]; // drop for now, as it's not currently supported\r\n // template?: CludoSearchTemplate; // dropping as it can be recreated with other properties\r\n // updateInputOnBlur?: boolean; // dropping as it's used rarely and has a default (true) in corejs\r\n // useStandardSearchTemplate?: boolean; // dropping as it's not currently supported for client side templating\r\n // translateSearchTemplates?: boolean; dropping as it's not currently supported for client-side templating\r\n // suggestedSearchesHeader?: boolean; // duplicative with the translateProvider key suggested_searches_title\r\n // recentSearchesHeader?: string; // duplicative with the translateProvider key recent_searches_title","import React from \"react\";\r\nimport { SelectorTypeProps } from \"../../../types/control-types\";\r\nimport { generateThemeCss } from \"../../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../../types/types\";\r\n\r\nexport function DropdownInput(props: SelectorTypeProps & ThemeBaseProps) {\r\n\r\n const labelThemeCss = generateThemeCss('cludo-font-family-default cludo-font-size-md cludo-font-weight-bold cludo-mr-2', props.disableTheme, props.className)\r\n const selectThemeCss = generateThemeCss('cludo-p-1 cludo-border-radius-button cludo-height-sm', props.disableTheme, props.className);\r\n\r\n return (\r\n <div>\r\n { props.label ?\r\n <label htmlFor={props.id} className={labelThemeCss}>\r\n {props.label}\r\n </label> : null\r\n }\r\n <select \r\n id={props.id}\r\n className={selectThemeCss}\r\n value={props.currentValue}\r\n defaultValue={props.default}\r\n onChange={(event) => props.onChange(event.target.value)}>\r\n {\r\n props.options.map((option, i) =>\r\n <option key={i} value={option.value}>\r\n {option.label}\r\n </option> \r\n )\r\n }\r\n </select>\r\n </div>\r\n )\r\n}","import React from \"react\";\r\nimport { usePagination } from \"../../../hooks/use-pagination\";\r\nimport { DropdownInput } from \"../../controls/inputs/dropdown-input\";\r\nimport { ThemeBaseProps } from \"../../types/types\";\r\n\r\ninterface ResultsPerPageProps extends ThemeBaseProps {\r\n options?: number[];\r\n label?: string;\r\n // FUTURE: Support more selector types like button list\r\n // selectorType?: SelectorType;\r\n}\r\n\r\nexport function ResultsPerPage(props: ResultsPerPageProps) {\r\n const [paginationState, paginationDispatchers] = usePagination();\r\n const options = props.options || [10, 20, 50];\r\n const optionsMap = options.map(option => { return {label: option.toString(), value: option} });\r\n const label = props.label || 'Results per page: ';\r\n const currentPerPage = paginationState.itemsPerPage;\r\n \r\n // FUTURE: Support more selector types like button list\r\n const SelectorComponent = DropdownInput;\r\n\r\n return (\r\n paginationState.showResultsPerPage ?\r\n <>\r\n <SelectorComponent\r\n options={optionsMap} \r\n id=\"perpage\"\r\n label={label}\r\n disableTheme={props.disableTheme}\r\n className={props.className}\r\n currentValue={currentPerPage} \r\n onChange={(value) => paginationDispatchers.setPerPage(Number(value))} />\r\n </> : null\r\n )\r\n}","import React from \"react\";\r\nimport { SaytResult, SaytResultProps } from \"./sayt-result\";\r\nimport { AutocompleteItemType } from \"../../types/types\";\r\n\r\nexport function SaytCategorizedResult(props: SaytResultProps) {\r\n return (\r\n <SaytResult {...props} resultType={AutocompleteItemType.CategorizedResult} />\r\n )\r\n}","import React, {Fragment, useMemo, useRef} from \"react\";\r\nimport {useFacetGroup} from \"../../../../hooks/use-facet-group\";\r\nimport { populateFacetGroupMap, setOrderBasedOnReference } from \"../../../../utils/facet-utils\";\r\n\r\n\r\nexport function FacetGroup(props : {\r\n order? : string[],\r\n exclude? : string[],\r\n children? : React.ReactNode\r\n}) {\r\n const [facetsState] = useFacetGroup();\r\n const facetOrder = props.order || [];\r\n const facetExclude = props.exclude || [];\r\n const facetOverrides = (props.children as React.ReactElement)?.type === Fragment\r\n ? (props.children as React.ReactElement).props.children\r\n : props.children;\r\n\r\n let facetFields = facetsState.facets.map(x => x.key);\r\n const facetFieldsRef = useRef<string[]>([]);\r\n const facetMap = useRef(new Map<string, React.ReactNode>());\r\n\r\n useMemo(() => {\r\n if (facetFields.length) {\r\n facetFieldsRef.current = facetFields;\r\n // Set exclusions\r\n if (facetExclude.length) {\r\n facetFieldsRef.current = facetFields.filter(x => !facetExclude.includes(x));\r\n }\r\n // Set custom order\r\n if (facetOrder.length) {\r\n facetFieldsRef.current = setOrderBasedOnReference(facetFields, facetOrder);\r\n }\r\n // Populate facet map\r\n facetMap.current = populateFacetGroupMap(facetFields, facetOverrides);\r\n }\r\n }, [facetsState]);\r\n\r\n return (\r\n <>\r\n { facetFieldsRef.current.map((field) => {\r\n return <Fragment key={field}>\r\n {facetMap.current.get(field)}\r\n </Fragment>\r\n })\r\n }\r\n </>\r\n )\r\n}\r\n","import React from \"react\";\r\nimport { FacetItemProps } from \"../base-facet\";\r\nimport { useFacet } from \"../../../../hooks/use-facet\";\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\n\r\n\r\nexport function CheckboxFacetItem(props: FacetItemProps) {\r\n const [facetState, facetDispatchers] = useFacet(props.facetItem.facetName)\r\n \r\n const optionThemeCss = generateThemeCss('cludo-theme-facet-option', props.disableTheme);\r\n const activeThemeCss = generateThemeCss('cludo-theme-facet-option cludo-font-weight-bold', props.disableTheme) + ' cludo-active';\r\n const countThemeCss = generateThemeCss('cludo-theme-facet-count', props.disableTheme);\r\n const inputThemeCss = generateThemeCss('cludo-m-0 cludo-mr-2', props.disableTheme);\r\n\r\n const handleFacetChange = (event: React.ChangeEvent<HTMLInputElement>, facetValue: string) => {\r\n const target = event.target;\r\n const value: boolean = target.checked;\r\n\r\n if (value) {\r\n facetDispatchers.selectFacet(facetValue, true);\r\n } else {\r\n facetDispatchers.deselectFacet(facetValue);\r\n }\r\n if (props.onChange) props.onChange();\r\n }\r\n\r\n return (\r\n <label className={ (props.className ? props.className + ' ': '') + (props.facetItem.isSelected ? activeThemeCss : optionThemeCss )}>\r\n <input\r\n name={ props.facetItem.facetName }\r\n type=\"checkbox\"\r\n checked={ props.facetItem.isSelected }\r\n className={inputThemeCss} \r\n onChange={(event) => handleFacetChange(event, props.facetItem.value)} />\r\n { props.facetItem.value }\r\n {\r\n (!props.hideCount && props.facetItem.count) ? \r\n <>&nbsp;<span className={countThemeCss}>{props.facetItem.count}</span></>\r\n : null\r\n }\r\n </label>\r\n )\r\n}","import React from \"react\";\r\nimport { BaseFacet, FacetProps } from \"./base-facet\";\r\nimport { CheckboxFacetItem } from \"./items/checkbox-facet-item\";\r\n\r\nexport function CheckboxFacet(props: FacetProps) { \r\n\r\n return (\r\n <BaseFacet itemComponent={CheckboxFacetItem} {...props} />\r\n )\r\n}","import React from \"react\";\r\nimport { FacetItemProps } from \"../base-facet\";\r\nimport { useFacet } from \"../../../../hooks/use-facet\";\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\n\r\nexport function RadioFacetItem(props: FacetItemProps) {\r\n const [facetState, facetDispatchers] = useFacet(props.facetItem.facetName);\r\n \r\n // Set theme css\r\n const optionThemeCss = generateThemeCss('cludo-theme-facet-option', props.disableTheme, props.className);\r\n const activeThemeCss = generateThemeCss('cludo-theme-facet-option cludo-font-weight-bold', props.disableTheme, props.className) + ' cludo-active';\r\n const countThemeCss = generateThemeCss('cludo-theme-facet-count', props.disableTheme, props.className);\r\n const inputThemeCss = generateThemeCss('cludo-m-0 cludo-mr-2', props.disableTheme, props.className);\r\n\r\n const handleFacetChange = (event: React.ChangeEvent<HTMLInputElement>, facetValue: string) => {\r\n const target = event.target;\r\n const value: boolean = target.checked;\r\n\r\n if (value) {\r\n facetDispatchers.selectFacet(facetValue);\r\n }\r\n if (props.onChange) props.onChange();\r\n }\r\n\r\n return (\r\n <label className={ props.facetItem.isSelected ? activeThemeCss : optionThemeCss }>\r\n <input\r\n name={ props.facetItem.facetName }\r\n type=\"radio\"\r\n checked={ props.facetItem.isSelected }\r\n className={inputThemeCss} \r\n onChange={(event) => handleFacetChange(event, props.facetItem.value)} />\r\n { props.facetItem.value }\r\n {\r\n (!props.hideCount && props.facetItem.count) ? \r\n <>&nbsp;<span className={countThemeCss}>{props.facetItem.count}</span></>\r\n : null\r\n }\r\n </label>\r\n )\r\n}","import React from \"react\";\r\nimport { BaseFacet, FacetProps } from \"./base-facet\";\r\nimport { RadioFacetItem } from \"./items/radio-facet-item\";\r\n\r\nexport function RadioFacet(props: FacetProps) { \r\n\r\n return (\r\n <BaseFacet itemComponent={RadioFacetItem} {...props} />\r\n )\r\n}","import React from \"react\";\r\n\r\nconst DEFAULT_HEIGHT = '200';\r\nconst DEFAULT_WIDTH = '200';\r\nconst DEFAULT_COLOR = '#000';\r\n\r\nexport interface IconProps {\r\n height?: string;\r\n width?: string;\r\n color?: string;\r\n}\r\n\r\nexport interface IconChildProps {\r\n color?: string;\r\n}\r\n\r\ninterface BaseIconProps extends IconProps {\r\n children: React.ReactElement<IconChildProps>;\r\n}\r\n\r\nexport const BaseIcon = (props: BaseIconProps) => {\r\n const width = props.width || DEFAULT_WIDTH;\r\n const height = props.height || DEFAULT_HEIGHT;\r\n const color = props.color || DEFAULT_COLOR;\r\n\r\n return (\r\n <svg width={width} height={height} viewBox=\"0 0 200 200\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n { React.cloneElement(props.children, { color: color }, null) }\r\n </svg>\r\n );\r\n};\r\n\r\n\r\n","import React from \"react\";\r\nimport { BaseIcon, IconProps } from \"./base-icon\";\r\n\r\nexport function CloseIcon(props: IconProps) {\r\n return (\r\n <BaseIcon {...props} >\r\n <path \r\n d=\"M4.62154 23.33C-0.245279 28.1934 -0.245271 36.0785 4.62155 40.9419L59.6556 95.9373L4.5986 150.956C-0.268218 155.819 -0.268218 163.704 4.5986 168.567L23.3455 187.301C28.2123 192.165 36.103 192.165 40.9698 187.301L96.0267 132.283L150.927 187.145C155.794 192.008 163.685 192.008 168.551 187.145L187.298 168.411C192.165 163.548 192.165 155.663 187.298 150.799L132.398 95.9373L187.275 41.0983C192.142 36.2349 192.142 28.3498 187.275 23.4864L168.529 4.75271C163.662 -0.11069 155.771 -0.110682 150.904 4.75272L96.0267 59.5916L40.9927 4.59628C36.1259 -0.267119 28.2352 -0.267119 23.3684 4.59628L4.62154 23.33Z\"\r\n fill={props.color}/>\r\n </BaseIcon>\r\n )\r\n}","import React from \"react\";\r\nimport { useFacetGroup } from \"../../../../hooks/use-facet-group\";\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../../../types/types\";\r\nimport { CloseIcon } from \"../../../icons/close-icon\";\r\n\r\ninterface CurrentFacetsProps extends ThemeBaseProps {\r\n exclude?: string[];\r\n labelsMap?: {[key: string]: string};\r\n}\r\n\r\n// FUTURE: share these values in variables that SCSS and JS can access\r\nconst ICON_DIMENSION = \"10\";\r\nconst ICON_FILL_COLOR = \"#344054\";\r\n\r\nexport function CurrentFacets(props: CurrentFacetsProps) {\r\n const [facetGroupState, facetGroupDispatchers] = useFacetGroup();\r\n const selected = facetGroupState.selectedFacets;\r\n \r\n // Set theme css\r\n const containerThemeCss = generateThemeCss('cludo-theme-current-facets', props.disableTheme); \r\n const labelThemeCss = generateThemeCss('cludo-font-weight-bold', props.disableTheme); \r\n const valueThemeCss = generateThemeCss('cludo-ml-2 cludo-display-inline-block', props.disableTheme); \r\n const buttonThemeCss = generateThemeCss('cludo-theme-current-facets-btn cludo-height-xs', props.disableTheme); \r\n\r\n return(\r\n <div className={(props.className ? props.className + ' ' : '') + 'cludo-display-flex cludo-align-items-start cludo-flex-wrap'}>\r\n { Object.keys(selected).map((key, i) => {\r\n if (props.exclude?.includes(key)) {\r\n return null;\r\n } else {\r\n return (\r\n <div className={containerThemeCss} key={i}>\r\n <label className={labelThemeCss}>\r\n { props.labelsMap ? props.labelsMap[key] || key : key }:&nbsp;\r\n </label>\r\n <div>\r\n {\r\n selected[key].map(value => \r\n <span className={valueThemeCss}>\r\n { value }&nbsp;\r\n <button className={buttonThemeCss} onClick={ () => facetGroupDispatchers.deselectFacet(key, value) }>\r\n <CloseIcon height={ICON_DIMENSION} width={ICON_DIMENSION} color={ICON_FILL_COLOR} />\r\n </button>\r\n </span> \r\n )\r\n }\r\n </div>\r\n </div>\r\n )\r\n }\r\n })}\r\n </div>\r\n )\r\n}","import React from \"react\";\r\nimport { useFacetGroup } from \"../../../../hooks/use-facet-group\";\r\nimport { ThemeBaseProps } from \"../../../types/types\";\r\nimport { generateThemeCss } from \"../../../../utils/theme-provider\";\r\n\r\ninterface ClearAllFacetsProps extends ThemeBaseProps {\r\n label?: string;\r\n}\r\n\r\nexport function ClearAllFacets(props: ClearAllFacetsProps) {\r\n const [facetGroupState, facetGroupDispatchers] = useFacetGroup();\r\n \r\n // Set theme css\r\n const themeCss = generateThemeCss('cludo-theme-btn-accent-secondary cludo-font-weight-bold cludo-mb-2', props.disableTheme, props.className);\r\n\r\n return ( \r\n <>\r\n { Object.keys(facetGroupState.selectedFacets).length > 0 &&\r\n <button className={themeCss} onClick={ facetGroupDispatchers.clearAllFacets }>\r\n { props.label || 'Clear all' }\r\n </button>\r\n }\r\n </>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { ResultContext } from \"../results/items/custom-result\";\r\nimport { MISSING_FIELD, getFieldValue, logMissingResultError } from \"../../utils/result-utils\";\r\nimport { BaseResultProps } from \"../types/types\";\r\n\r\ninterface ResultImageProps extends BaseResultProps {\r\n altText?: string;\r\n imageField?: string;\r\n}\r\n\r\nexport function ResultImage(props: ResultImageProps) {\r\n const resultContext = useContext(ResultContext);\r\n const result = props.result || resultContext;\r\n if (!result) {\r\n logMissingResultError('ResultImage');\r\n return null;\r\n }\r\n\r\n const imageField = props.imageField || 'Image';\r\n const imageSrc = getFieldValue(result, imageField);\r\n const imageAltText = props.altText || getFieldValue(result, 'Title');\r\n\r\n return (\r\n imageSrc !== MISSING_FIELD ?\r\n <img src={imageSrc} alt={imageAltText} /> :\r\n null\r\n )\r\n}","import React, { useContext, useMemo, useRef } from \"react\";\r\nimport { ResultContext } from \"../results/items/custom-result\";\r\nimport { MISSING_FIELD, getFieldValue, getFieldValues, logMissingResultError } from \"../../utils/result-utils\";\r\nimport { BaseResultProps } from \"../types/types\";\r\n\r\ninterface ResultBreadcrumbsProps extends BaseResultProps {\r\n textField: string | string[];\r\n textFieldDelimiter?: string;\r\n linkField?: string | string[];\r\n linkFieldDelimiter?: string;\r\n breadcrumbDelimiter?: string | React.ReactNode;\r\n template?: (text: string) => React.ReactNode\r\n}\r\n\r\nexport function ResultBreadcrumbs(props: ResultBreadcrumbsProps) {\r\n const resultContext = useContext(ResultContext);\r\n const result = props.result || resultContext;\r\n if (!result) {\r\n logMissingResultError('ResultBreadcrumbs');\r\n return null;\r\n }\r\n\r\n const templateFn = props.template || ((text: string) => <span>{ text }</span>);\r\n const breadcrumbDelimiter = props.breadcrumbDelimiter || ' > ';\r\n const textArray = useRef<(string|undefined)[]>([]);\r\n const linkArray = useRef<(string|undefined)[]>([]);\r\n\r\n /**\r\n * populateBreadcrumbArr function populates an array of breadcrumb data one of two ways:\r\n * - If array of fields entered through props, loop through array to get field values to add to our array\r\n * - If single field entered, get value from this field and attempt to split it by an optionally added delimiter before adding to our array\r\n */\r\n function populateBreadcrumbArr(field: string | string[], arr: React.MutableRefObject<(string|undefined)[]>, delim?: string) {\r\n // If array of fields entered, loop through and add values to array\r\n if (Array.isArray(field)) {\r\n field.forEach(field => {\r\n const text = getFieldValue(result, field);\r\n arr.current.push(text && (text !== MISSING_FIELD) ? text: undefined);\r\n })\r\n // Otherwise get single field value as an array and split by delimiter if it exists\r\n } else {\r\n const text = getFieldValues(result, field);\r\n if (text[0] !== MISSING_FIELD) {\r\n const textSubarr = (delim ? text[0].split(delim) : text);\r\n arr.current.push(...textSubarr);\r\n } else {\r\n arr.current.push(undefined);\r\n }\r\n }\r\n }\r\n\r\n useMemo(() => {\r\n populateBreadcrumbArr(props.textField, textArray, props.textFieldDelimiter);\r\n if (props.linkField) {\r\n populateBreadcrumbArr(props.linkField, linkArray, props.linkFieldDelimiter);\r\n }\r\n }, [])\r\n\r\n return (\r\n <div>\r\n { textArray.current.map((text, i) => {\r\n \r\n if (text !== undefined) {\r\n // If link array populated, wrap breadcrumbs with links\r\n if (linkArray.current[i] !== undefined) {\r\n return <React.Fragment key={i}>\r\n <a key={i} href={linkArray.current[i]}>\r\n { templateFn(text) }\r\n </a>\r\n { i !== textArray.current.length - 1 ?\r\n <>\r\n { breadcrumbDelimiter }\r\n </> : null\r\n }\r\n </React.Fragment>\r\n // Otherwise, render read-only breadcrumbs\r\n } else {\r\n return <React.Fragment key={i}>\r\n <>\r\n { templateFn(text) }\r\n </>\r\n { i !== textArray.current.length - 1 ?\r\n <>\r\n { breadcrumbDelimiter }\r\n </> : null\r\n }\r\n </React.Fragment>\r\n }\r\n } else {\r\n return null;\r\n }\r\n }) }\r\n </div>\r\n )\r\n}","import { useEffect, useState } from \"react\";\r\n\r\nexport function useTypingEffect(value: string): { text: string; isAnimating: boolean } {\r\n\tconst [text, setText] = useState(\"\");\r\n\tconst [isAnimating, setIsAnimating] = useState(true);\r\n\r\n\tuseEffect(() => {\r\n\t\tlet i = 0;\r\n\t\tlet intervalId: ReturnType<typeof setInterval>;\r\n\r\n intervalId = setInterval(() => {\r\n setIsAnimating(true);\r\n setText((prev) => {\r\n let curr = prev;\r\n for (let j = 0; j < 12; j++) {\r\n if (i === value.length) {\r\n clearInterval(intervalId);\r\n\r\n setTimeout(() => {\r\n setIsAnimating(false);\r\n }, 0);\r\n\r\n return curr;\r\n }\r\n curr = curr + value[i++];\r\n }\r\n return curr;\r\n });\r\n }, 30);\r\n\r\n\t\treturn () => {\r\n\t\t\tsetText(\"\");\r\n\t\t\tclearInterval(intervalId);\r\n\t\t};\r\n\t}, [value]);\r\n\r\n\treturn { text, isAnimating };\r\n}\r\n","import React from \"react\";\r\nimport { GenerativeResponseState } from \"../../../../hooks/use-generative-response\";\r\nimport { useTypingEffect } from \"../../../../hooks/use-typing-effect\";\r\n\r\nexport function GenerativeResponseModuleContent({ response, readMoreUrl }: { response: string; readMoreUrl: string; }) {\r\n\tconst { text, isAnimating } = useTypingEffect(response);\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<p>{text}</p>\r\n\t\t\t{!isAnimating ? (\r\n\t\t\t\t<span>\r\n\t\t\t\t\t<strong>Read more: </strong>{\" \"}\r\n\t\t\t\t\t<a href={readMoreUrl} target=\"_blank\">\r\n\t\t\t\t\t\t{readMoreUrl}\r\n\t\t\t\t\t</a>\r\n\t\t\t\t</span>\r\n\t\t\t) : null}\r\n\t\t</>\r\n\t);\r\n}\r\n","import React from \"react\";\r\nimport { useTypingEffect } from \"../../../../hooks/use-typing-effect\";\r\n\r\nexport function GenerativeResponseModuleErrorMessage() {\r\n const errorMessage = \"Sorry, I don't understand the input. Please enter a valid question or context.\";\r\n\tconst { text, isAnimating } = useTypingEffect(errorMessage);\r\n\r\n\treturn <p>{text}</p>;\r\n}\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/sass-loader/dist/cjs.js!./generative-response-loader.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/sass-loader/dist/cjs.js!./generative-response-loader.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import React from \"react\";\r\nimport './generative-response-loader.scss';\r\n\r\nexport function GenerativeResponseLoader(props: { isLoading?: boolean }) {\r\n\r\n const isLoading = props.isLoading ?? true;\r\n\r\n return (\r\n isLoading &&\r\n <div className=\"typing\">\r\n <div className=\"typing__dot\"></div>\r\n <div className=\"typing__dot\"></div>\r\n <div className=\"typing__dot\"></div>\r\n </div> || <></>\r\n )\r\n}","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/sass-loader/dist/cjs.js!./generative-response-icon.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/sass-loader/dist/cjs.js!./generative-response-icon.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import React from \"react\";\r\nimport './generative-response-icon.scss';\r\n\r\nexport function GenerativeResponseIcon() {\r\n return (\r\n <div className=\"cludo-generative-ai__icon-container\">\r\n <i className=\"cludo-generative-ai__icon chat_gpt\"></i>\r\n </div>\r\n )\r\n}","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/sass-loader/dist/cjs.js!./generative-response-module.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!../../../../../node_modules/sass-loader/dist/cjs.js!./generative-response-module.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import React, { useContext, useEffect, useState } from \"react\";\r\nimport { CludoContext, EventControllerContext } from \"../../../../context\";\r\nimport { useGenerativeResponse } from \"../../../../hooks/use-generative-response\";\r\nimport { GenerativeResponseModuleContent } from \"./generative-response-module-content\";\r\nimport { GenerativeResponseModuleErrorMessage } from \"./generative-response-module-error-message\";\r\nimport { GenerativeResponseLoader } from \"./generative-response-loader\";\r\nimport { GenerativeResponseIcon } from \"./generative-response-icon\";\r\nimport \"./generative-response-module.scss\";\r\n\r\nexport function GenerativeResponseModule() {\r\n\tconst context = useContext(CludoContext);\r\n\tconst eventController = useContext(EventControllerContext);\r\n\tconst [shouldShowModule, setshouldShowModule] = useState(false);\r\n\tconst [generativeResponseState, generativeResponseDispatchers] = useGenerativeResponse();\r\n\r\n\tuseEffect(() => {\r\n getGenerativeResponse();\r\n\t\teventController.subscribe(\"aftersearch\", () => {\r\n getGenerativeResponse()\r\n });\r\n\t}, []);\r\n\r\n function getGenerativeResponse() {\r\n\t\tif (context.storedSearchResponseData.cludoSearchResponse.GenerativeAnswerAvailable === true && context.query.length) {\r\n setshouldShowModule(true);\r\n\t\t\tgenerativeResponseDispatchers.getResponse(context.query);\r\n\t\t} else {\r\n setshouldShowModule(false);\r\n }\r\n }\r\n\r\n\treturn (\r\n !context.isLoadingResults && shouldShowModule &&\r\n\t\t<div id=\"cludo-generative-ai\" className=\"cludo-generative-ai\">\r\n\t\t\t<div className=\"cludo-generative-ai__answer-container\">\r\n\t\t\t\t<GenerativeResponseIcon />\r\n\t\t\t\t<div className=\"cludo-generative-ai__answer\">\r\n\t\t\t\t\t{generativeResponseState.isLoading ? (\r\n\t\t\t\t\t\t<GenerativeResponseLoader />\r\n\t\t\t\t\t) : generativeResponseState && generativeResponseState.response.length ? (\r\n\t\t\t\t\t\t<GenerativeResponseModuleContent response={generativeResponseState.response} readMoreUrl={generativeResponseState.readMoreUrl} />\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<GenerativeResponseModuleErrorMessage />\r\n\t\t\t\t\t)}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div> || <></>\r\n\t);\r\n}\r\n","import { useState } from \"react\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\nimport { ChatRequestBody, ChatResponse } from \"../types/conversation-types\";\r\nimport { getBaseUrlForCustomer } from \"../utils/http-utils\";\r\n\r\nexport interface GenerativeResponseState {\r\n isLoading: boolean;\r\n response: string;\r\n readMoreUrl: string;\r\n}\r\nexport interface GenerativeResponseDispatcheters {\r\n getResponse: (query: string) => void;\r\n}\r\n\r\n\r\n/** Expose state and dispatchers necessary to request and receive generative responses\r\n * @returns cludoState (generative response data) and cludoDispatchers (generative response methods)\r\n */\r\nexport function useGenerativeResponse(): [GenerativeResponseState, GenerativeResponseDispatcheters] {\r\n const { context, eventController } = useCludoContext();\r\n const requestBaseUrl = getBaseUrlForCustomer(context.customerId, 4);\r\n const requestAuthString = `${context.customerId}:${context.engineId}:SearchKey`;\r\n const qaServiceUrl = `${requestBaseUrl}/${context.customerId}/${context.engineId}/search/answer`;\r\n \r\n const [conversationIdState, setConversationIdState] = useState(self.crypto.randomUUID());\r\n const [generativeResponseState, setGenerativeResponseState] = useState<GenerativeResponseState>({\r\n isLoading: false,\r\n response: '',\r\n readMoreUrl: ''\r\n });\r\n\r\n const generativeResponseDispatchers: GenerativeResponseDispatcheters = {\r\n getResponse: async (query: string): Promise<void> => { \r\n setGenerativeResponseState({\r\n ...generativeResponseState,\r\n isLoading: true\r\n });\r\n const requestBody: ChatRequestBody = {\r\n question: query,\r\n sourceFields: [\"Title\", \"Description\"],\r\n sessionId: context.sessionId,\r\n conversationId: conversationIdState\r\n }\r\n try {\r\n const qaResponse = await fetch(qaServiceUrl, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"SiteKey \" + window.btoa(requestAuthString),\r\n },\r\n body: JSON.stringify(requestBody),\r\n });\r\n const answer: ChatResponse = await qaResponse.json();\r\n setGenerativeResponseState({\r\n response: answer.value.answer,\r\n readMoreUrl: answer.value.url,\r\n isLoading: false\r\n });\r\n } catch (e) {\r\n // We are probably here because we cancelled the in-progress request, but log just in case\r\n console.log(e);\r\n }\r\n }\r\n }\r\n\r\n return [generativeResponseState, generativeResponseDispatchers];\r\n}","/** Determine the API url based on the customer ID -- IDs greater than 10000000 refer to US customers */\r\nexport function getBaseUrlForCustomer(customerId: number, version = 3): string {\r\n return (customerId >= 10000000) ? `https://api-us1.cludo.com/api/v${version}` : `https://api-eu1.cludo.com/api/v${version}`;\r\n}","import React, { ReactNode, useEffect, useState } from \"react\";\r\nimport { ExternalCludoSearchOptions } from \"../../utils/models/instantiator-types\";\r\nimport { initCludo, initCludoWithPublicSettings } from \"../../utils/instantiator\";\r\nimport { CludoContext, EventControllerContext } from \"../../context\";\r\nimport { CludoSearchContext } from \"../../utils/cludo-search-context\";\r\nimport { CludoInstanceController } from \"../../utils/cludo-instance-controller\";\r\nimport { EventController } from \"../../utils/event-controller\";\r\nimport { CludoSearch } from \"../../types/core-script-types\";\r\nimport { ThemeProvider } from \"../../utils/theme-provider\";\r\nimport { PublicSettings } from \"@cludosearch/cludo-api-client/dist/interfaces/api/public-settings.interface\";\r\n\r\ninterface CludoWrapperProps {\r\n config: ExternalCludoSearchOptions,\r\n publicSettings?: PublicSettings,\r\n onInit?: (controller: CludoInstanceController) => void,\r\n children?: ReactNode\r\n}\r\n\r\n/** This component wraps React components with a Cludo Search Context, and should be used to wrap input elements and search containers */\r\nexport function CludoWrapper(props: CludoWrapperProps) {\r\n const [searchContext, setSearchContext] = useState({} as CludoSearchContext);\r\n const [eventContext, setEventContext] = useState({} as EventController);\r\n const [hasInitialized, setHasInitialized] = useState(false);\r\n\r\n // Once we get the instance controller, save the context to state so we can provide it \r\n useEffect(() => {\r\n if(props.publicSettings) {\r\n // if the publicSettings property is set, we can skip the initCludo call and just use the public settings\r\n // to create the search context via initCludoFromPublicSettings (which resolves synchronously)\r\n const controller = initCludoWithPublicSettings(props.config, props.publicSettings);\r\n\r\n if (props.onInit) {\r\n props.onInit(controller);\r\n }\r\n setSearchContext(controller.instance);\r\n setEventContext(controller.components.events);\r\n setHasInitialized(true);\r\n } else {\r\n // Set headless to true by default (overwritten by passed config)\r\n const config: ExternalCludoSearchOptions = {\r\n headless: true,\r\n ...props.config\r\n }\r\n\r\n // If the public settings are not provided, we need to use the config to create the search context\r\n // via initCludo (which resolves asynchronously via a Promise)\r\n initCludo(config).then( (controller: CludoInstanceController) => {\r\n if (props.onInit) {\r\n props.onInit(controller);\r\n }\r\n setSearchContext(controller.instance);\r\n setEventContext(controller.components.events);\r\n setHasInitialized(true);\r\n });\r\n }\r\n\r\n return () => {\r\n // Remove the instance from the global array of instances\r\n const windowObject = window as any;\r\n if (windowObject?.CludoSearchInstances?.length) {\r\n windowObject.CludoSearchInstances = windowObject.CludoSearchInstances.filter((instance: CludoSearch) => instance.engineId !== props.config.engineId);\r\n }\r\n }\r\n }, []);\r\n\r\n return(\r\n !hasInitialized ? null :\r\n <CludoContext.Provider value={searchContext}>\r\n <EventControllerContext.Provider value={eventContext}>\r\n <ThemeProvider theme={props.config.cssTheme}>\r\n {/* FUTURE -- consider deferred rendering of the children until the public settings have been retrieved */}\r\n { props.children }\r\n </ThemeProvider>\r\n </EventControllerContext.Provider>\r\n </CludoContext.Provider>\r\n )\r\n\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../context\";\r\n\r\nexport function CludoAutocompleteContainer() {\r\n const context = useContext(CludoContext);\r\n const autocompleteHintText = context.translateProvider?.translate('template_autocomplete_hint');\r\n\r\n return (\r\n <>\r\n {/* Container */}\r\n <div className=\"search_autocomplete\" id=\"search_autocomplete\" tabIndex={0}></div>\r\n\r\n {/* Hint element */}\r\n <span id=\"autocomplete_hint\" aria-hidden=\"false\" aria-atomic=\"true\" role=\"status\" aria-live=\"polite\">\r\n { autocompleteHintText }\r\n </span>\r\n </>\r\n )\r\n}","import React from \"react\";\r\n\r\n/** We mount the Search Results Component here */\r\nexport function CludoResultsContainer(props: {id?: string}) {\r\n const resultsWrapperId = props.id ? props.id : \"cludo-search-results\";\r\n return (\r\n <div id={resultsWrapperId}></div>\r\n )\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../context\";\r\n\r\nexport function CludoSearchInput() {\r\n const context = useContext(CludoContext);\r\n const placeholder = context.translateProvider?.translate('search_input_label');\r\n const ariaLabel = context.translateProvider?.translate('search_input_label');\r\n\r\n const autocompleteEnabled = context.isAutocompleteEnabled;\r\n\r\n if (autocompleteEnabled) {\r\n return (\r\n <input \r\n type=\"search\" \r\n className=\"cludo-search-input\" \r\n aria-label={ariaLabel} \r\n placeholder={placeholder}\r\n aria-describedby=\"autocomplete_hint\"\r\n aria-autocomplete=\"list\"\r\n aria-controls=\"search_autocomplete\"\r\n />\r\n );\r\n } else {\r\n return (\r\n <input \r\n type=\"search\" \r\n className=\"cludo-search-input\" \r\n aria-label={ariaLabel} \r\n placeholder={placeholder}\r\n />\r\n );\r\n }\r\n\r\n}","import React, { useContext } from \"react\";\r\nimport { CludoContext } from \"../../context\";\r\nimport { CludoSearchInput } from \"./cludo-search-input\";\r\nimport { CludoAutocompleteContainer } from \"./cludo-autocomplete-container\";\r\n\r\nexport function CludoSearchForm(props: {uniqueFormId?: string}) {\r\n const context = useContext(CludoContext);\r\n const ariaLabel = context.translateProvider?.translate('search_input_label');\r\n const autocompleteEnabled = context.isAutocompleteEnabled;\r\n \r\n const formId = props.uniqueFormId ? props.uniqueFormId : 'cludo-search-input';\r\n\r\n return(\r\n <form id={formId} role=\"search\">\r\n <CludoSearchInput />\r\n <button type=\"submit\" \r\n className=\"cludo-search-button\"\r\n aria-label={ariaLabel} />\r\n { autocompleteEnabled ? <CludoAutocompleteContainer /> : <></> }\r\n </form>\r\n )\r\n}","import { useEffect, useState } from \"react\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\n\r\nexport interface SearchInputState {\r\n query: string;\r\n}\r\nexport interface SearchInputDispatchers {\r\n search: (updatedQuery: string) => void;\r\n setQuery: (updatedQuery: string) => void;\r\n}\r\n\r\n/** Expose state and dispatchers necessary to create a functional search input\r\n * @returns cludoState (current query) and cludoDispatchers (search event)\r\n */\r\nexport function useSearchInput(): [SearchInputState, SearchInputDispatchers] {\r\n const { context, eventController } = useCludoContext();\r\n\r\n const [searchInputState, setSearchInputState] = useState({\r\n query: context.query || ''\r\n });\r\n\r\n // Derive dispatchers from CludoSearchContext\r\n const searchInputDispatchers: SearchInputDispatchers = {\r\n search: (updatedQuery: string) => {\r\n eventController.search(updatedQuery);\r\n },\r\n setQuery: (updatedQuery: string) => {\r\n setSearchInputState({query: updatedQuery})\r\n }\r\n };\r\n\r\n // Update search input state whenever the context's query changes\r\n useEffect(() => {\r\n setSearchInputState({query: context.query || ''})\r\n }, [context.query]);\r\n\r\n return [searchInputState, searchInputDispatchers];\r\n}","import React from \"react\";\r\nimport { BaseIcon, IconProps } from \"./base-icon\";\r\n\r\nexport function SearchIcon(props: IconProps) {\r\n return (\r\n <BaseIcon {...props} >\r\n <path \r\n fillRule=\"evenodd\"\r\n clipRule=\"evenodd\"\r\n d=\"M112.092 140.376C101.162 146.595 88.5179 150.147 75.0446 150.147C33.5986 150.147 0 116.535 0 75.0733C0 33.6115 33.5986 0 75.0446 0C116.491 0 150.089 33.6115 150.089 75.0733C150.089 88.5145 146.558 101.131 140.374 112.044L186.485 158.173C191.17 162.86 191.17 170.46 186.485 175.147L175.151 186.485C170.466 191.172 162.869 191.172 158.184 186.485L112.092 140.376ZM120.071 75.0733C120.071 99.9504 99.9122 120.117 75.0446 120.117C50.177 120.117 30.0179 99.9504 30.0179 75.0733C30.0179 50.1962 50.177 30.0293 75.0446 30.0293C99.9122 30.0293 120.071 50.1962 120.071 75.0733Z\"\r\n fill={props.color}/>\r\n </BaseIcon>\r\n )\r\n}","import React from \"react\";\r\nimport { useSearchInput } from \"../../hooks/use-search-input\";\r\nimport { generateThemeCss } from \"../../utils/theme-provider\";\r\nimport { ThemeBaseProps } from \"../types/types\";\r\nimport { SearchIcon } from \"../icons/search-icon\";\r\n\r\nexport interface SearchInputProps extends ThemeBaseProps {\r\n placeholder?: string;\r\n className?: string;\r\n formId?: string;\r\n submitIcon?: React.ReactNode;\r\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n onSubmit?: (event: React.FormEvent<HTMLFormElement>) => void;\r\n onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\r\n onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => void;\r\n\r\n ariaLabel?: string;\r\n}\r\n\r\n/** Search input component that can perform search requests */\r\nexport function SearchInput(props: SearchInputProps) {\r\n const [ cludoState, cludoDispatchers ] = useSearchInput(); \r\n const placeholder = props.placeholder || 'Enter a search term';\r\n\r\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n cludoDispatchers.search(cludoState.query);\r\n if (props.onSubmit) {\r\n props.onSubmit(event);\r\n }\r\n }\r\n\r\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n cludoDispatchers.setQuery(event.target.value);\r\n if (props.onChange) {\r\n props.onChange(event);\r\n }\r\n }\r\n \r\n // Set theme css\r\n const formCss = generateThemeCss('cludo-display-flex cludo-box-shadow-card cludo-border-radius-card cludo-p-4 cludo-mb-3 cludo-align-items-center', props.disableTheme, props.className);\r\n const inputCss = generateThemeCss('cludo-font-size-md cludo-py-1 cludo-px-2 cludo-font-family-default cludo-border-radius-button cludo-border-1-neutral cludo-height-sm cludo-flex-grow-1 cludo-bg-color-gray-light', props.disableTheme);\r\n const buttonCss = generateThemeCss('cludo-theme-icon-btn-secondary cludo-ml-1', props.disableTheme);\r\n\r\n const submitButtonContent: React.ReactNode = props.submitIcon ? props.submitIcon : <SearchIcon width=\"100%\" height=\"100%\" color=\"#fff\" />; \r\n\r\n return (\r\n <form id={props.formId} onSubmit={handleSubmit} className={formCss}>\r\n <input \r\n type=\"search\" \r\n className={inputCss}\r\n placeholder={placeholder}\r\n onChange={handleChange}\r\n onBlur={props.onBlur}\r\n onKeyDown={props.onKeyDown}\r\n aria-label={props.ariaLabel}\r\n value={cludoState.query}\r\n />\r\n <button className={buttonCss} type=\"submit\">{submitButtonContent}</button>\r\n </form>\r\n );\r\n}","import { useState, useEffect } from \"react\";\r\nimport { SearchResultsState, useSearchResults } from \"./use-search-results\";\r\nimport { EndlessScrollOptions } from \"../utils/models/instantiator-types\";\r\nimport { useCludoContext } from \"./use-cludo-context\";\r\n\r\nexport interface EndlessScrollState {\r\n showLoadMore: boolean;\r\n isLoading: boolean;\r\n};\r\n\r\nexport function useEndlessScroll(options: EndlessScrollOptions): EndlessScrollState {\r\n const { context } = useCludoContext();\r\n const [searchResultsState, searchResultsDispatchers] = useSearchResults();\r\n\r\n // Needed so that the results add to themselves, instead of replacing them\r\n context.endlessScroll = options;\r\n\r\n // This use effect handles the endless scroll\r\n useEffect(() => {\r\n const handleScroll = () => {\r\n if (searchResultsState.isLoading) { return; }\r\n if (scrolledElement instanceof Element) {\r\n handleElementScroll(scrolledElement);\r\n } else {\r\n handleWindowScroll();\r\n }\r\n }\r\n \r\n const handleElementScroll = (element: Element) => {\r\n if (element.scrollTop + element.clientHeight >= element.scrollHeight - options.bottomOffset) {\r\n if (\r\n (searchResultsState.currentPage < options.stopAfterPage) &&\r\n (searchResultsState.resultCount > options.resultsPerPage) &&\r\n (searchResultsState.currentPage < Math.ceil(searchResultsState.resultCount / options.resultsPerPage))\r\n ){\r\n // Load more results\r\n searchResultsDispatchers.loadMore();\r\n }\r\n }\r\n }\r\n \r\n const handleWindowScroll = () => {\r\n if (window.scrollY + window.innerHeight >= document.body.scrollHeight - options.bottomOffset) {\r\n if (\r\n (searchResultsState.currentPage < options.stopAfterPage) &&\r\n (searchResultsState.resultCount > options.resultsPerPage) &&\r\n (searchResultsState.currentPage < Math.ceil(searchResultsState.resultCount / options.resultsPerPage))\r\n ){\r\n // Load more results\r\n searchResultsDispatchers.loadMore();\r\n }\r\n }\r\n }\r\n\r\n const scrolledElement = (options.scrolledElementSelector ? document.querySelector(options.scrolledElementSelector) : window) || window;\r\n scrolledElement.addEventListener('scroll', handleScroll);\r\n return () => {\r\n scrolledElement.removeEventListener('scroll', handleScroll);\r\n }\r\n }, [options]);\r\n\r\n\r\n // Derive state when search results change\r\n const deriveState = (state: SearchResultsState) => {\r\n return {\r\n showLoadMore: (state.currentPage >= options.stopAfterPage) && (state.resultCount > options.resultsPerPage) && (state.currentPage < Math.ceil(state.resultCount / options.resultsPerPage)),\r\n isLoading: state.isLoading\r\n }\r\n }\r\n\r\n // Update state based on search results\r\n useEffect(() => {\r\n setEndlessScrollState(deriveState(searchResultsState));\r\n }, [searchResultsState]);\r\n\r\n // State\r\n const [endlessScrollState, setEndlessScrollState] = useState({showLoadMore: false, isLoading: false});\r\n\r\n return endlessScrollState;\r\n}"],"names":["root","factory","exports","module","define","amd","this","CludoFeature","___CSS_LOADER_EXPORT___","push","id","cssWithMappingToString","list","toString","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","stylesInDOM","getIndexByIdentifier","identifier","result","modulesToDom","options","idCountMap","identifiers","base","count","indexByIdentifier","obj","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","window","HTMLIFrameElement","contentDocument","head","e","getTarget","Error","appendChild","element","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","apply","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","nc","locals","require","CludoContext","EventControllerContext","MISSING_FIELD","getUrl","Fields","Value","hasField","fieldName","FieldNames","indexOf","getFieldValue","maxWords","wordDelim","words","split","slice","getFieldValues","Values","getHighlightsOrValues","delim","getHighlightsOrValuesArray","Highlights","values","returnValues","wordCount","trimArrayToMaxWords","getFormattedHTML","val","__html","logMissingResultError","component","console","error","isAutocompleteItem","hasAttribute","getTopHitTotalCount","hit","facets","Field","hitValue","facetMatch","facetValueMatch","Items","find","Key","Count","AllCount","LinkContext","ResultLink","props","context","useContext","eventController","resultContext","ResultContext","useState","fragmentUrlPart","setFragmentUrlPart","model","eleClass","className","titleField","url","urlWithFragments","anchorElem","useRef","LinkContextInstance","onFragmentHover","fragment","urlFragmentPart","isFeatureEnabled","WebContentHighlighter","innerText","replace","getLinkFragmentUrlPart","onFragmentSelect","current","click","useEffect","autofocus","focus","ref","href","ResultIndex","currentPage","openNewTab","onKeyUp","searchResultKeyUpEvent","nativeEvent","onKeyUpHandler","onClick","searchResultTrackClickEventHandler","onClickHandler","Provider","children","ThemeContext","ThemeProvider","theme","generateThemeCss","themeCss","disableTheme","classNameProp","CustomResult","shouldAutoFocus","focusOnResultsAfterSearch","wrapWithLink","ResultTitle","Heading","headingElement","fileType","title","FragmentHighlight","linkContext","classStr","tabIndex","role","onKeyDown","code","onFocus","onMouseEnter","onMouseLeave","dangerouslySetInnerHTML","FragmentHighlightGroup","field","fragments","descriptionPart","maxFragments","ResultDescription","descriptionField","makeHighlightsClickable","maxWordCount","description","showRawText","highlightDelimiter","ResultUrl","showRelativeUrl","urlObj","URL","substring","origin","DEFAULT_BADGE_FIELD","ResultBadge","text","displayText","defaultOrder","StandardResult","propOrder","renderOrder","order","filter","el","hideTitle","hideDescription","hideUrl","hideBadge","widgetMap","Map","descriptionMaxWordCount","badgeField","useCludoContext","useEventSubscriptions","callback","events","subscriptions","keys","forEach","eventType","subscribe","subscribeToAllEvents","unsubscribe","subscriptionId","usePagination","searchResponse","storedSearchResponseData","cludoSearchResponse","deriveState","resultsPerPage","itemsPerPage","maxPages","Math","ceil","ResultCount","nextPageLabel","translateProvider","translate","prevPageLabel","showPagination","isEndlessScrollEnabled","showResultsPerPage","deriveDispatchers","goToPage","bind","setPerPage","setCludoState","setCludoDispatchers","cludoState","cludoDispatchers","Pagination","paginationState","paginationDispatchers","previousButtonIcon","nextButtonIcon","firstButtonIcon","lastButtonIcon","startPage","prevPageTranslation","nextPageTranslation","activeBtnCss","inactiveBtnCss","hideFirst","hidePrevious","currentPageNum","pageNumberButtons","pageTranslation","renderPageNumberButtons","hideNext","hideLast","Banner","banner","Id","Name","bannerLinks","currentTarget","querySelectorAll","paramsPrefix","link","anchor","bannerId","String","bannerTitle","addBannerAttributesToAnchor","decodeURIComponent","addEventListener","preventDefault","linkToSearchClickEvent","onBannerClick","useBanners","banners","Banners","BannerGroup","useSearchResults","resultsSummary","resultCount","resultCountMessage","ResultCountMessage","fixedQuery","FixedQuery","Facets","didYouMean","Suggestions","suggestions","results","TypedDocuments","categorizedResults","TopHits","paginationOptions","endlessScrollOptions","isEnabled","endlessScroll","relatedSearches","RelatedSearchDocuments","isLoading","isLoadingResults","loadMore","endlessScrollLoadMore","searchResultKeyUp","handleDidYouMeanSelect","DidYouMean","resultsState","suggestedQuery","didYouMeanInnerHTML","event","suggestion","HTMLElement","closest","onDidYouMeanClick","query","Query","yourSearchMsg","totalMsg","resultMsg","ResultsSummary","CludoLoader","loadingAltText","src","alt","ResultsList","cssString","templateFn","template","columns","resultSpacing","cssUnit","columnsBreakpoint","LoadMore","loadMoreStr","label","type","LoadMoreResults","searchResultsState","searchResultsDispatchers","showLoadMore","stopAfterPage","AutocompleteItemType","CludoSearchResults","composeResults","ResultComponent","ListComponent","LoaderComponent","loader","PaginationComponent","pagination","HighlightedText","chunkedText","displayType","SaytResult","suggestionCSS","isSelected","resultChildren","chunkedTitle","itemType","resultType","Result","resultIndex","selectResult","SaytSuggestion","Suggestion","suggestionIndex","selectSuggestion","SaytRecentSearch","RecentSearch","recentSearchIndex","recentSearch","useAutocomplete","selectedIndex","keydownListener","tempSelectedSuggestion","tempSelectedResult","tempSelectedRecentSearch","storedAutocompleteResponse","instantSuggestions","recentSearches","categorizedResultGroups","resultGroup","resultValue","Hits","getAutocompleteResultsFromTopHits","listItems","tempIndex","numSuggestions","search","getAttribute","parseInt","categorizedResult","selectRecentSearch","newState","deriveAutocompleteState","selectedSuggestion","selectedResult","selectedRecentSearch","setAutocompleteState","eventControllerIsDefined","keyboardNextSubscription","keyboardPrevSubscription","keyboardEnterSubscription","autocompleteCompleteSubscription","clearSelectedIndices","suggestionsTitle","resultsTitle","recentSearchesTitle","autocompleteState","initiateAutocompleteRequest","autocompleteSelectionNext","emitEvent","autocompleteSelectionPrev","autocompleteSelect","clear","clearAutocomplete","autocompleteHandleInputKeyDown","autocompleteDispatchers","autocompleteHandleInputBlur","relatedTarget","autocompleteHandleInputChange","CludoSearchAutocomplete","cludoSearch","_cludoSearch","params","customerId","engineId","page","perPage","sort","clientTemplateSortOptions","websiteSettings","configurations","isFacetSelected","isFilterSelected","filters","getSelectedMapItem","arrayToCheck","selected","facetMap","entries","facetMapItem","facetKey","facetObj","hasSelection","facetValue","facetName","allCount","missingCount","MissingCount","enabledFeatures","featureKey","includes","richAutocomplete","fragmentText","linkFragment","customEngineSettings","parse","featureConfigKey","instantSuggestionsConfiguration","storedError","chunkString","input","needle","needleIndex","toLowerCase","mapTypedDocumentToResult","mapTypedDocumentToSuggestion","mapStringToSuggestion","str","mapTopHitsToCategorizedResults","mapHitValuesToResults","coreAutocompleteData","cludoAutocompleteResponse","totalResults","totalSuggestions","totalRecentSearches","topHits","isTrackedSession","canUserBeTracked","queryId","getSessionId","querySessionId","deviceType","getTraitsFromStorage","TemplateType","searchContext","keyedSubscriptions","_curSubscriptionIndex","setDateRangeFacet","from","to","setRangeFacetMap","setNumberRangeFacet","clearDateRangeFacet","clearRangeFacetMap","clearNumberRangeFacet","_searchContext","fnc","sub","executeCallbacksForType","payload","subscribersForType","clearResults","clearStoredSearchResponseData","selectFacet","multi","facet","deselectFacet","clearFacet","clearFacetByName","clearAllFacets","clearAllFacetsAndSearch","setFilter","setFilters","clearAllFilters","toggleFacetValue","facetField","didYouMeanText","setDidYouMean","pageNumber","clearSortOrder","clearSortParams","addToSortOrder","dir","setSortOrder","autocompleteByQuery","autocompleteSetSelectedSuggestion","autocompleteSetSelectedResult","autocompleteSetSelectedRecentSearch","clearRecentSearches","autocompleteRestoreClient","endlessScrollLoadMoreClickEvent","trackQuery","queryLog","trackClick","clickLog","trackChatClick","getConversations","conversationService","getConversationsFromStorage","storeConversations","conversations","sendQuestion","requestBody","controller","sendChatFeedbackData","feedbackData","sendFeedbackData","getTrendingPages","daysBack","limit","timezone","getPopularPages","cssTheme","managedComponents","EventController","_cssTheme","registerSearchResultsComponent","addManagedComponent","registerControlsComponent","registerAutocompleteComponent","registerComponent","observedEventTypes","renderImmediately","managedComponent","elem","elemSelector","renderComponent","processEvent","callbackFnc","RenderedComponent","instance","CludoSearchContext","components","ComponentsController","addWidget","widgetType","widgetComponent","Results","Controls","Autocomplete","setOverrideString","language","languageSpecificTranslationSet","translations","setOverrideStrings","overrides","setLanguage","useSortBy","sortOrder","sortItems","CludoSortPicker","sortByState","sortByDispatchers","relTranslation","relevanceLabel","sortObject","sortActive","relActive","sortItem","isActive","direction","PseudoLink","useFacet","StandardFacetItem","facetItem","facetDispatchers","optionThemeCss","activeThemeCss","countThemeCss","valueClass","onChange","hideCount","setOrderBasedOnReference","unordered","reference","unorderedArr","referenceArr","x","wildcardIndex","FacetHeader","headerThemeCss","clearThemeCss","hideClear","onClear","clearLabel","FacetSearch","unfilteredList","facetItems","placeholderOption","placeholder","hideSelectedOption","hideSelected","filteredList","FacetItemsList","facetLimitOption","Infinity","facetHideShowMoreOption","hideShowMore","facetHideCountOption","visibleFacets","setVisibleFacets","loadMoreThemeCss","shouldBeHidden","itemComponent","BaseFacet","facetState","facetSortByOption","sortBy","facetOrderOption","facetExcludeOption","exclude","containerThemeCss","facetItemsSavedCopy","setFacetItemsSavedCopy","facetItemsToRender","setFacetItemsToRender","useMemo","facetItemValues","b","localeCompare","option","mappedItem","hideSearchBar","searchPlaceholder","StandardFacet","useFacetGroup","selectedFacets","CludoSearchControls","composeControls","SortPickerComponent","sortPicker","FacetComponent","facetsState","shouldShowSortPicker","defaultLanguage","coreScriptUrl","getPublicSettings","publicSettingsDataStr","Cludo","getPublicSettingsByOptions","experienceId","apiUrl","authKey","searchSiteKey","isIntranet","publicSettings","injectCoreScript","Promise","resolve","reject","script","onload","onerror","body","initCludo","publicSettingsOptions","secureSearch","enable","headless","initCludoWithPublicSettings","cludoSettings","searchUrl","instanceId","clientTemplates","searchInputs","searchInputSelectors","headlessSearch","searchResultsWrapper","searchResultsWrapperSelector","intranetSearch","searchApiUrl","proxyApiUrl","disableAutocomplete","autocomplete","disable","initFacets","defaultValues","hideResultsCount","hideSearchFilters","hideSearchDidYouMean","sortOptions","logPageVisits","tracking","skipLoggingPageVisits","useSearchAsYouType","autocompleteForceUseTemplate","renderTemplateWhenNoResults","autocompleteMinimumQueryLength","minimumQueryLength","applyMultiLevelFacets","applyMultiLevel","rangeFacets","rangeValues","pierceShadowDom","behavior","enableRelatedSearches","customNoResultsMessage","overrideStrings","noResultsMessage","enableVoiceSearch","voiceSearch","disableVoiceSearchActiveAnimation","disableActiveAnimation","useFixedQueryInResultsCount","showFixedQueryInResultsCount","allowSearchWithoutSearchword","jumpToTopOnFacetClick","enableExtendedTracking","disableExtendedTracking","customCallbackAfterSearch","callbacks","afterSearch","customCallbackBeforeSearch","beforeSearch","customCallbackBeforeRedirect","beforeRedirect","customCallbackAfterAutocomplete","afterAutocomplete","ovarlayResultsWrapperOpenClass","overlayResultsWrapperOpenClass","searchBoxPosition","themeColor","elementFocusColor","themeBannerColor","textColor","borderRadius","borderRadiusInput","showInstantSuggestions","suggestedSearchesHeader","recentSearchesHeader","googleAnalyticsTrackingId","googleAnalyticsId","translateSearchTemplates","changeWindowLocation","updateUrlOnSearch","loadingImagePath","loading","cludoInstance","translationRef","Language","assign","warn","categorizeResultsByField","topHitsFields","maxResultsPerCategory","size","maxCategories","MaxFieldValues","CludoInstanceController","setClientTemplateComponentsController","configureFeaturesFromPublicSettings","init","controls","controlsWrapperSelector","selector","DropdownInput","labelThemeCss","selectThemeCss","htmlFor","currentValue","defaultValue","default","ResultsPerPage","optionsMap","currentPerPage","SelectorComponent","Number","SaytCategorizedResult","CategorizedResult","FacetGroup","facetOrder","facetExclude","facetOverrides","Fragment","facetFields","facetFieldsRef","DefaultComponent","override","set","fallback","populateFacetGroupMap","CheckboxFacetItem","inputThemeCss","name","checked","handleFacetChange","CheckboxFacet","RadioFacetItem","RadioFacet","BaseIcon","width","height","color","viewBox","fill","xmlns","CloseIcon","ICON_DIMENSION","ICON_FILL_COLOR","CurrentFacets","facetGroupState","facetGroupDispatchers","valueThemeCss","buttonThemeCss","labelsMap","ClearAllFacets","ResultImage","imageSrc","imageField","imageAltText","altText","ResultBreadcrumbs","breadcrumbDelimiter","textArray","linkArray","populateBreadcrumbArr","arr","Array","isArray","textSubarr","textField","textFieldDelimiter","linkField","linkFieldDelimiter","useTypingEffect","setText","isAnimating","setIsAnimating","intervalId","setInterval","prev","curr","j","clearInterval","setTimeout","GenerativeResponseModuleContent","response","readMoreUrl","GenerativeResponseModuleErrorMessage","GenerativeResponseLoader","GenerativeResponseIcon","GenerativeResponseModule","shouldShowModule","setshouldShowModule","version","requestBaseUrl","requestAuthString","qaServiceUrl","self","crypto","randomUUID","conversationIdState","generativeResponseState","setGenerativeResponseState","generativeResponseDispatchers","getResponse","question","sourceFields","sessionId","conversationId","fetch","method","headers","Authorization","json","answer","log","useGenerativeResponse","getGenerativeResponse","GenerativeAnswerAvailable","CludoWrapper","setSearchContext","eventContext","setEventContext","hasInitialized","setHasInitialized","config","onInit","then","windowObject","CludoSearchInstances","CludoAutocompleteContainer","autocompleteHintText","CludoResultsContainer","resultsWrapperId","CludoSearchInput","ariaLabel","isAutocompleteEnabled","CludoSearchForm","autocompleteEnabled","formId","uniqueFormId","useSearchInput","searchInputState","setSearchInputState","searchInputDispatchers","updatedQuery","setQuery","SearchIcon","fillRule","clipRule","SearchInput","formCss","inputCss","buttonCss","submitButtonContent","submitIcon","onSubmit","onBlur","useEndlessScroll","handleScroll","scrolledElement","Element","handleElementScroll","handleWindowScroll","scrollTop","clientHeight","scrollHeight","bottomOffset","scrollY","innerHeight","scrolledElementSelector","removeEventListener","state","setEndlessScrollState","endlessScrollState"],"sourceRoot":""}