@seekora-ai/ui-sdk-react 0.0.0-stage-20260517092419

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 (357) hide show
  1. package/dist/components/Breadcrumb.d.ts +43 -0
  2. package/dist/components/Breadcrumb.d.ts.map +1 -0
  3. package/dist/components/Breadcrumb.js +119 -0
  4. package/dist/components/ClearRefinements.d.ts +42 -0
  5. package/dist/components/ClearRefinements.d.ts.map +1 -0
  6. package/dist/components/ClearRefinements.js +81 -0
  7. package/dist/components/CurrentRefinements.d.ts +63 -0
  8. package/dist/components/CurrentRefinements.d.ts.map +1 -0
  9. package/dist/components/CurrentRefinements.js +302 -0
  10. package/dist/components/FacetDropdown.d.ts +94 -0
  11. package/dist/components/FacetDropdown.d.ts.map +1 -0
  12. package/dist/components/FacetDropdown.js +396 -0
  13. package/dist/components/Facets.d.ts +118 -0
  14. package/dist/components/Facets.d.ts.map +1 -0
  15. package/dist/components/Facets.js +785 -0
  16. package/dist/components/FederatedDropdown.d.ts +98 -0
  17. package/dist/components/FederatedDropdown.d.ts.map +1 -0
  18. package/dist/components/FederatedDropdown.js +526 -0
  19. package/dist/components/HierarchicalMenu.d.ts +55 -0
  20. package/dist/components/HierarchicalMenu.d.ts.map +1 -0
  21. package/dist/components/HierarchicalMenu.js +276 -0
  22. package/dist/components/Highlight.d.ts +51 -0
  23. package/dist/components/Highlight.d.ts.map +1 -0
  24. package/dist/components/Highlight.js +155 -0
  25. package/dist/components/HitsPerPage.d.ts +41 -0
  26. package/dist/components/HitsPerPage.d.ts.map +1 -0
  27. package/dist/components/HitsPerPage.js +82 -0
  28. package/dist/components/InfiniteHits.d.ts +51 -0
  29. package/dist/components/InfiniteHits.d.ts.map +1 -0
  30. package/dist/components/InfiniteHits.js +173 -0
  31. package/dist/components/MobileFilters.d.ts +71 -0
  32. package/dist/components/MobileFilters.d.ts.map +1 -0
  33. package/dist/components/MobileFilters.js +242 -0
  34. package/dist/components/Pagination.d.ts +90 -0
  35. package/dist/components/Pagination.d.ts.map +1 -0
  36. package/dist/components/Pagination.js +298 -0
  37. package/dist/components/QuerySuggestions.d.ts +36 -0
  38. package/dist/components/QuerySuggestions.d.ts.map +1 -0
  39. package/dist/components/QuerySuggestions.js +71 -0
  40. package/dist/components/QuerySuggestionsDropdown.d.ts +82 -0
  41. package/dist/components/QuerySuggestionsDropdown.d.ts.map +1 -0
  42. package/dist/components/QuerySuggestionsDropdown.js +394 -0
  43. package/dist/components/RangeInput.d.ts +58 -0
  44. package/dist/components/RangeInput.d.ts.map +1 -0
  45. package/dist/components/RangeInput.js +203 -0
  46. package/dist/components/RangeSlider.d.ts +51 -0
  47. package/dist/components/RangeSlider.d.ts.map +1 -0
  48. package/dist/components/RangeSlider.js +262 -0
  49. package/dist/components/Recommendations.d.ts +89 -0
  50. package/dist/components/Recommendations.d.ts.map +1 -0
  51. package/dist/components/Recommendations.js +256 -0
  52. package/dist/components/RichQuerySuggestions.d.ts +88 -0
  53. package/dist/components/RichQuerySuggestions.d.ts.map +1 -0
  54. package/dist/components/RichQuerySuggestions.js +498 -0
  55. package/dist/components/SearchBar.d.ts +57 -0
  56. package/dist/components/SearchBar.d.ts.map +1 -0
  57. package/dist/components/SearchBar.js +361 -0
  58. package/dist/components/SearchBarWithSuggestions.d.ts +105 -0
  59. package/dist/components/SearchBarWithSuggestions.d.ts.map +1 -0
  60. package/dist/components/SearchBarWithSuggestions.js +275 -0
  61. package/dist/components/SearchLayout.d.ts +35 -0
  62. package/dist/components/SearchLayout.d.ts.map +1 -0
  63. package/dist/components/SearchLayout.js +61 -0
  64. package/dist/components/SearchProvider.d.ts +35 -0
  65. package/dist/components/SearchProvider.d.ts.map +1 -0
  66. package/dist/components/SearchProvider.js +53 -0
  67. package/dist/components/SearchResults.d.ts +57 -0
  68. package/dist/components/SearchResults.d.ts.map +1 -0
  69. package/dist/components/SearchResults.js +456 -0
  70. package/dist/components/SortBy.d.ts +84 -0
  71. package/dist/components/SortBy.d.ts.map +1 -0
  72. package/dist/components/SortBy.js +183 -0
  73. package/dist/components/Stats.d.ts +51 -0
  74. package/dist/components/Stats.d.ts.map +1 -0
  75. package/dist/components/Stats.js +201 -0
  76. package/dist/components/primitives/ActionButtons.d.ts +27 -0
  77. package/dist/components/primitives/ActionButtons.d.ts.map +1 -0
  78. package/dist/components/primitives/ActionButtons.js +102 -0
  79. package/dist/components/primitives/AnalyticsProvider.d.ts +22 -0
  80. package/dist/components/primitives/AnalyticsProvider.d.ts.map +1 -0
  81. package/dist/components/primitives/AnalyticsProvider.js +87 -0
  82. package/dist/components/primitives/BadgeList.d.ts +14 -0
  83. package/dist/components/primitives/BadgeList.d.ts.map +1 -0
  84. package/dist/components/primitives/BadgeList.js +65 -0
  85. package/dist/components/primitives/CustomSelect.d.ts +40 -0
  86. package/dist/components/primitives/CustomSelect.d.ts.map +1 -0
  87. package/dist/components/primitives/CustomSelect.js +196 -0
  88. package/dist/components/primitives/ImageDisplay.d.ts +28 -0
  89. package/dist/components/primitives/ImageDisplay.d.ts.map +1 -0
  90. package/dist/components/primitives/ImageDisplay.js +127 -0
  91. package/dist/components/primitives/ImageZoom.d.ts +33 -0
  92. package/dist/components/primitives/ImageZoom.d.ts.map +1 -0
  93. package/dist/components/primitives/ImageZoom.js +433 -0
  94. package/dist/components/primitives/PriceDisplay.d.ts +21 -0
  95. package/dist/components/primitives/PriceDisplay.d.ts.map +1 -0
  96. package/dist/components/primitives/PriceDisplay.js +44 -0
  97. package/dist/components/primitives/RatingDisplay.d.ts +43 -0
  98. package/dist/components/primitives/RatingDisplay.d.ts.map +1 -0
  99. package/dist/components/primitives/RatingDisplay.js +114 -0
  100. package/dist/components/primitives/VariantSelector.d.ts +30 -0
  101. package/dist/components/primitives/VariantSelector.d.ts.map +1 -0
  102. package/dist/components/primitives/VariantSelector.js +155 -0
  103. package/dist/components/primitives/VariantSwatches.d.ts +28 -0
  104. package/dist/components/primitives/VariantSwatches.d.ts.map +1 -0
  105. package/dist/components/primitives/VariantSwatches.js +188 -0
  106. package/dist/components/primitives/index.d.ts +12 -0
  107. package/dist/components/primitives/index.d.ts.map +1 -0
  108. package/dist/components/primitives/index.js +11 -0
  109. package/dist/components/primitives/withAnalytics.d.ts +24 -0
  110. package/dist/components/primitives/withAnalytics.d.ts.map +1 -0
  111. package/dist/components/primitives/withAnalytics.js +73 -0
  112. package/dist/components/product-page/ProductGallery.d.ts +26 -0
  113. package/dist/components/product-page/ProductGallery.d.ts.map +1 -0
  114. package/dist/components/product-page/ProductGallery.js +13 -0
  115. package/dist/components/product-page/ProductInfo.d.ts +44 -0
  116. package/dist/components/product-page/ProductInfo.d.ts.map +1 -0
  117. package/dist/components/product-page/ProductInfo.js +34 -0
  118. package/dist/components/product-page/ProductRecommendations.d.ts +21 -0
  119. package/dist/components/product-page/ProductRecommendations.d.ts.map +1 -0
  120. package/dist/components/product-page/ProductRecommendations.js +17 -0
  121. package/dist/components/product-page/index.d.ts +4 -0
  122. package/dist/components/product-page/index.d.ts.map +1 -0
  123. package/dist/components/product-page/index.js +3 -0
  124. package/dist/components/section-primitives/SectionError.d.ts +11 -0
  125. package/dist/components/section-primitives/SectionError.d.ts.map +1 -0
  126. package/dist/components/section-primitives/SectionError.js +13 -0
  127. package/dist/components/section-primitives/SectionItemGrid.d.ts +18 -0
  128. package/dist/components/section-primitives/SectionItemGrid.d.ts.map +1 -0
  129. package/dist/components/section-primitives/SectionItemGrid.js +14 -0
  130. package/dist/components/section-primitives/SectionLoading.d.ts +11 -0
  131. package/dist/components/section-primitives/SectionLoading.d.ts.map +1 -0
  132. package/dist/components/section-primitives/SectionLoading.js +11 -0
  133. package/dist/components/section-primitives/SectionSearchContext.d.ts +17 -0
  134. package/dist/components/section-primitives/SectionSearchContext.d.ts.map +1 -0
  135. package/dist/components/section-primitives/SectionSearchContext.js +17 -0
  136. package/dist/components/section-primitives/SectionSearchProvider.d.ts +25 -0
  137. package/dist/components/section-primitives/SectionSearchProvider.d.ts.map +1 -0
  138. package/dist/components/section-primitives/SectionSearchProvider.js +106 -0
  139. package/dist/components/section-primitives/index.d.ts +5 -0
  140. package/dist/components/section-primitives/index.d.ts.map +1 -0
  141. package/dist/components/section-primitives/index.js +4 -0
  142. package/dist/components/suggestions/AmazonDropdown.d.ts +30 -0
  143. package/dist/components/suggestions/AmazonDropdown.d.ts.map +1 -0
  144. package/dist/components/suggestions/AmazonDropdown.js +509 -0
  145. package/dist/components/suggestions/GoogleDropdown.d.ts +31 -0
  146. package/dist/components/suggestions/GoogleDropdown.d.ts.map +1 -0
  147. package/dist/components/suggestions/GoogleDropdown.js +349 -0
  148. package/dist/components/suggestions/MinimalDropdown.d.ts +24 -0
  149. package/dist/components/suggestions/MinimalDropdown.d.ts.map +1 -0
  150. package/dist/components/suggestions/MinimalDropdown.js +312 -0
  151. package/dist/components/suggestions/MobileSheetDropdown.d.ts +31 -0
  152. package/dist/components/suggestions/MobileSheetDropdown.d.ts.map +1 -0
  153. package/dist/components/suggestions/MobileSheetDropdown.js +483 -0
  154. package/dist/components/suggestions/PinterestDropdown.d.ts +29 -0
  155. package/dist/components/suggestions/PinterestDropdown.d.ts.map +1 -0
  156. package/dist/components/suggestions/PinterestDropdown.js +446 -0
  157. package/dist/components/suggestions/ShopifyDropdown.d.ts +27 -0
  158. package/dist/components/suggestions/ShopifyDropdown.d.ts.map +1 -0
  159. package/dist/components/suggestions/ShopifyDropdown.js +448 -0
  160. package/dist/components/suggestions/SpotlightDropdown.d.ts +33 -0
  161. package/dist/components/suggestions/SpotlightDropdown.d.ts.map +1 -0
  162. package/dist/components/suggestions/SpotlightDropdown.js +544 -0
  163. package/dist/components/suggestions/SuggestionSearchBar.d.ts +127 -0
  164. package/dist/components/suggestions/SuggestionSearchBar.d.ts.map +1 -0
  165. package/dist/components/suggestions/SuggestionSearchBar.js +644 -0
  166. package/dist/components/suggestions/index.d.ts +37 -0
  167. package/dist/components/suggestions/index.d.ts.map +1 -0
  168. package/dist/components/suggestions/index.js +59 -0
  169. package/dist/components/suggestions/styles/index.d.ts +11 -0
  170. package/dist/components/suggestions/styles/index.d.ts.map +1 -0
  171. package/dist/components/suggestions/styles/index.js +289 -0
  172. package/dist/components/suggestions/styles/responsive.d.ts +107 -0
  173. package/dist/components/suggestions/styles/responsive.d.ts.map +1 -0
  174. package/dist/components/suggestions/styles/responsive.js +237 -0
  175. package/dist/components/suggestions/types.d.ts +511 -0
  176. package/dist/components/suggestions/types.d.ts.map +1 -0
  177. package/dist/components/suggestions/types.js +6 -0
  178. package/dist/components/suggestions/utils.d.ts +259 -0
  179. package/dist/components/suggestions/utils.d.ts.map +1 -0
  180. package/dist/components/suggestions/utils.js +668 -0
  181. package/dist/components/suggestions-primitives/CategoriesTabs.d.ts +13 -0
  182. package/dist/components/suggestions-primitives/CategoriesTabs.d.ts.map +1 -0
  183. package/dist/components/suggestions-primitives/CategoriesTabs.js +35 -0
  184. package/dist/components/suggestions-primitives/DropdownPanel.d.ts +24 -0
  185. package/dist/components/suggestions-primitives/DropdownPanel.d.ts.map +1 -0
  186. package/dist/components/suggestions-primitives/DropdownPanel.js +67 -0
  187. package/dist/components/suggestions-primitives/ItemCard.d.ts +48 -0
  188. package/dist/components/suggestions-primitives/ItemCard.d.ts.map +1 -0
  189. package/dist/components/suggestions-primitives/ItemCard.js +103 -0
  190. package/dist/components/suggestions-primitives/ItemGrid.d.ts +28 -0
  191. package/dist/components/suggestions-primitives/ItemGrid.d.ts.map +1 -0
  192. package/dist/components/suggestions-primitives/ItemGrid.js +55 -0
  193. package/dist/components/suggestions-primitives/ProductCard.d.ts +45 -0
  194. package/dist/components/suggestions-primitives/ProductCard.d.ts.map +1 -0
  195. package/dist/components/suggestions-primitives/ProductCard.js +177 -0
  196. package/dist/components/suggestions-primitives/ProductCardLayouts.d.ts +44 -0
  197. package/dist/components/suggestions-primitives/ProductCardLayouts.d.ts.map +1 -0
  198. package/dist/components/suggestions-primitives/ProductCardLayouts.js +137 -0
  199. package/dist/components/suggestions-primitives/ProductGrid.d.ts +22 -0
  200. package/dist/components/suggestions-primitives/ProductGrid.d.ts.map +1 -0
  201. package/dist/components/suggestions-primitives/ProductGrid.js +41 -0
  202. package/dist/components/suggestions-primitives/RecentSearchesList.d.ts +17 -0
  203. package/dist/components/suggestions-primitives/RecentSearchesList.d.ts.map +1 -0
  204. package/dist/components/suggestions-primitives/RecentSearchesList.js +46 -0
  205. package/dist/components/suggestions-primitives/SearchInput.d.ts +23 -0
  206. package/dist/components/suggestions-primitives/SearchInput.d.ts.map +1 -0
  207. package/dist/components/suggestions-primitives/SearchInput.js +114 -0
  208. package/dist/components/suggestions-primitives/SuggestionItem.d.ts +31 -0
  209. package/dist/components/suggestions-primitives/SuggestionItem.d.ts.map +1 -0
  210. package/dist/components/suggestions-primitives/SuggestionItem.js +47 -0
  211. package/dist/components/suggestions-primitives/SuggestionList.d.ts +26 -0
  212. package/dist/components/suggestions-primitives/SuggestionList.d.ts.map +1 -0
  213. package/dist/components/suggestions-primitives/SuggestionList.js +35 -0
  214. package/dist/components/suggestions-primitives/SuggestionsContext.d.ts +44 -0
  215. package/dist/components/suggestions-primitives/SuggestionsContext.d.ts.map +1 -0
  216. package/dist/components/suggestions-primitives/SuggestionsContext.js +18 -0
  217. package/dist/components/suggestions-primitives/SuggestionsDropdownComposition.d.ts +24 -0
  218. package/dist/components/suggestions-primitives/SuggestionsDropdownComposition.d.ts.map +1 -0
  219. package/dist/components/suggestions-primitives/SuggestionsDropdownComposition.js +30 -0
  220. package/dist/components/suggestions-primitives/SuggestionsError.d.ts +11 -0
  221. package/dist/components/suggestions-primitives/SuggestionsError.d.ts.map +1 -0
  222. package/dist/components/suggestions-primitives/SuggestionsError.js +19 -0
  223. package/dist/components/suggestions-primitives/SuggestionsLoading.d.ts +11 -0
  224. package/dist/components/suggestions-primitives/SuggestionsLoading.d.ts.map +1 -0
  225. package/dist/components/suggestions-primitives/SuggestionsLoading.js +17 -0
  226. package/dist/components/suggestions-primitives/SuggestionsProvider.d.ts +38 -0
  227. package/dist/components/suggestions-primitives/SuggestionsProvider.d.ts.map +1 -0
  228. package/dist/components/suggestions-primitives/SuggestionsProvider.js +259 -0
  229. package/dist/components/suggestions-primitives/TrendingList.d.ts +17 -0
  230. package/dist/components/suggestions-primitives/TrendingList.d.ts.map +1 -0
  231. package/dist/components/suggestions-primitives/TrendingList.js +48 -0
  232. package/dist/components/suggestions-primitives/highlightMarkup.d.ts +31 -0
  233. package/dist/components/suggestions-primitives/highlightMarkup.d.ts.map +1 -0
  234. package/dist/components/suggestions-primitives/highlightMarkup.js +70 -0
  235. package/dist/components/suggestions-primitives/index.d.ts +39 -0
  236. package/dist/components/suggestions-primitives/index.d.ts.map +1 -0
  237. package/dist/components/suggestions-primitives/index.js +24 -0
  238. package/dist/docsearch/components/DocSearch.d.ts +4 -0
  239. package/dist/docsearch/components/DocSearch.d.ts.map +1 -0
  240. package/dist/docsearch/components/DocSearch.js +93 -0
  241. package/dist/docsearch/components/DocSearchButton.d.ts +4 -0
  242. package/dist/docsearch/components/DocSearchButton.d.ts.map +1 -0
  243. package/dist/docsearch/components/DocSearchButton.js +12 -0
  244. package/dist/docsearch/components/Footer.d.ts +8 -0
  245. package/dist/docsearch/components/Footer.d.ts.map +1 -0
  246. package/dist/docsearch/components/Footer.js +40 -0
  247. package/dist/docsearch/components/Highlight.d.ts +9 -0
  248. package/dist/docsearch/components/Highlight.d.ts.map +1 -0
  249. package/dist/docsearch/components/Highlight.js +48 -0
  250. package/dist/docsearch/components/Hit.d.ts +15 -0
  251. package/dist/docsearch/components/Hit.d.ts.map +1 -0
  252. package/dist/docsearch/components/Hit.js +96 -0
  253. package/dist/docsearch/components/Modal.d.ts +10 -0
  254. package/dist/docsearch/components/Modal.d.ts.map +1 -0
  255. package/dist/docsearch/components/Modal.js +57 -0
  256. package/dist/docsearch/components/Results.d.ts +23 -0
  257. package/dist/docsearch/components/Results.d.ts.map +1 -0
  258. package/dist/docsearch/components/Results.js +141 -0
  259. package/dist/docsearch/components/SearchBox.d.ts +11 -0
  260. package/dist/docsearch/components/SearchBox.d.ts.map +1 -0
  261. package/dist/docsearch/components/SearchBox.js +16 -0
  262. package/dist/docsearch/hooks/useDocSearch.d.ts +33 -0
  263. package/dist/docsearch/hooks/useDocSearch.d.ts.map +1 -0
  264. package/dist/docsearch/hooks/useDocSearch.js +224 -0
  265. package/dist/docsearch/hooks/useKeyboard.d.ts +17 -0
  266. package/dist/docsearch/hooks/useKeyboard.d.ts.map +1 -0
  267. package/dist/docsearch/hooks/useKeyboard.js +71 -0
  268. package/dist/docsearch/hooks/useSeekoraSearch.d.ts +27 -0
  269. package/dist/docsearch/hooks/useSeekoraSearch.d.ts.map +1 -0
  270. package/dist/docsearch/hooks/useSeekoraSearch.js +213 -0
  271. package/dist/docsearch/index.d.ts +13 -0
  272. package/dist/docsearch/index.d.ts.map +1 -0
  273. package/dist/docsearch/index.js +11 -0
  274. package/dist/docsearch/types.d.ts +175 -0
  275. package/dist/docsearch/types.d.ts.map +1 -0
  276. package/dist/docsearch/types.js +4 -0
  277. package/dist/docsearch.css +234 -0
  278. package/dist/hooks/useAnalytics.d.ts +24 -0
  279. package/dist/hooks/useAnalytics.d.ts.map +1 -0
  280. package/dist/hooks/useAnalytics.js +67 -0
  281. package/dist/hooks/useClickTracking.d.ts +36 -0
  282. package/dist/hooks/useClickTracking.d.ts.map +1 -0
  283. package/dist/hooks/useClickTracking.js +89 -0
  284. package/dist/hooks/useExperiment.d.ts +25 -0
  285. package/dist/hooks/useExperiment.d.ts.map +1 -0
  286. package/dist/hooks/useExperiment.js +123 -0
  287. package/dist/hooks/useFilters.d.ts +27 -0
  288. package/dist/hooks/useFilters.d.ts.map +1 -0
  289. package/dist/hooks/useFilters.js +86 -0
  290. package/dist/hooks/useKeyboardNavigation.d.ts +51 -0
  291. package/dist/hooks/useKeyboardNavigation.d.ts.map +1 -0
  292. package/dist/hooks/useKeyboardNavigation.js +113 -0
  293. package/dist/hooks/useNaturalLanguageFilters.d.ts +48 -0
  294. package/dist/hooks/useNaturalLanguageFilters.d.ts.map +1 -0
  295. package/dist/hooks/useNaturalLanguageFilters.js +221 -0
  296. package/dist/hooks/useProductAnalytics.d.ts +49 -0
  297. package/dist/hooks/useProductAnalytics.d.ts.map +1 -0
  298. package/dist/hooks/useProductAnalytics.js +116 -0
  299. package/dist/hooks/useQuerySuggestions.d.ts +21 -0
  300. package/dist/hooks/useQuerySuggestions.d.ts.map +1 -0
  301. package/dist/hooks/useQuerySuggestions.js +84 -0
  302. package/dist/hooks/useQuerySuggestionsEnhanced.d.ts +120 -0
  303. package/dist/hooks/useQuerySuggestionsEnhanced.d.ts.map +1 -0
  304. package/dist/hooks/useQuerySuggestionsEnhanced.js +444 -0
  305. package/dist/hooks/useSearchState.d.ts +35 -0
  306. package/dist/hooks/useSearchState.d.ts.map +1 -0
  307. package/dist/hooks/useSearchState.js +68 -0
  308. package/dist/hooks/useSeekoraSearch.d.ts +20 -0
  309. package/dist/hooks/useSeekoraSearch.d.ts.map +1 -0
  310. package/dist/hooks/useSeekoraSearch.js +63 -0
  311. package/dist/hooks/useSmartSuggestions.d.ts +55 -0
  312. package/dist/hooks/useSmartSuggestions.d.ts.map +1 -0
  313. package/dist/hooks/useSmartSuggestions.js +236 -0
  314. package/dist/hooks/useSuggestionsAnalytics.d.ts +93 -0
  315. package/dist/hooks/useSuggestionsAnalytics.d.ts.map +1 -0
  316. package/dist/hooks/useSuggestionsAnalytics.js +239 -0
  317. package/dist/hooks/useVariantSelection.d.ts +28 -0
  318. package/dist/hooks/useVariantSelection.d.ts.map +1 -0
  319. package/dist/hooks/useVariantSelection.js +44 -0
  320. package/dist/index.d.ts +105 -0
  321. package/dist/index.d.ts.map +1 -0
  322. package/dist/index.js +110 -0
  323. package/dist/index.umd.js +1 -0
  324. package/dist/src/index.d.ts +4469 -0
  325. package/dist/src/index.esm.js +18952 -0
  326. package/dist/src/index.esm.js.map +1 -0
  327. package/dist/src/index.js +19086 -0
  328. package/dist/src/index.js.map +1 -0
  329. package/dist/themes/createTheme.d.ts +8 -0
  330. package/dist/themes/createTheme.d.ts.map +1 -0
  331. package/dist/themes/createTheme.js +10 -0
  332. package/dist/themes/dark.d.ts +6 -0
  333. package/dist/themes/dark.d.ts.map +1 -0
  334. package/dist/themes/dark.js +34 -0
  335. package/dist/themes/default.d.ts +6 -0
  336. package/dist/themes/default.d.ts.map +1 -0
  337. package/dist/themes/default.js +71 -0
  338. package/dist/themes/mergeThemes.d.ts +7 -0
  339. package/dist/themes/mergeThemes.d.ts.map +1 -0
  340. package/dist/themes/mergeThemes.js +6 -0
  341. package/dist/themes/minimal.d.ts +6 -0
  342. package/dist/themes/minimal.d.ts.map +1 -0
  343. package/dist/themes/minimal.js +34 -0
  344. package/dist/themes/suggestions.d.ts +216 -0
  345. package/dist/themes/suggestions.d.ts.map +1 -0
  346. package/dist/themes/suggestions.js +546 -0
  347. package/dist/themes/types.d.ts +7 -0
  348. package/dist/themes/types.d.ts.map +1 -0
  349. package/dist/themes/types.js +6 -0
  350. package/dist/types/index.d.ts +33 -0
  351. package/dist/types/index.d.ts.map +1 -0
  352. package/dist/types/index.js +4 -0
  353. package/dist/utils/responsive.d.ts +130 -0
  354. package/dist/utils/responsive.d.ts.map +1 -0
  355. package/dist/utils/responsive.js +225 -0
  356. package/package.json +68 -0
  357. package/src/docsearch/docsearch.css +234 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * FacetDropdown Component
3
+ *
4
+ * A dropdown component that displays facet values from a specific field
5
+ * and allows users to filter search results by selecting values.
6
+ *
7
+ * Can be used standalone (fetches its own data) or integrated with SearchProvider.
8
+ *
9
+ * @cssVariables
10
+ * Customize the dropdown appearance using CSS variables:
11
+ *
12
+ * Button:
13
+ * - `--facet-dropdown-button-bg`: Button background color
14
+ * - `--facet-dropdown-text`: Button text color
15
+ * - `--facet-dropdown-border`: Button and panel border color
16
+ * - `--facet-dropdown-font-size`: Button font size (default: 0.875rem)
17
+ * - `--facet-dropdown-font-weight`: Button font weight (default: 500)
18
+ *
19
+ * Dropdown Panel:
20
+ * - `--facet-dropdown-bg`: Panel background color
21
+ * - `--facet-dropdown-shadow`: Panel box shadow
22
+ *
23
+ * Options:
24
+ * - `--facet-dropdown-option-text`: Option text color
25
+ * - `--facet-dropdown-option-font-size`: Option font size (default: 0.875rem)
26
+ * - `--facet-dropdown-option-font-weight-active`: Active option font weight (default: 500)
27
+ * - `--facet-dropdown-option-active-bg`: Active option background color
28
+ *
29
+ * Count Badge:
30
+ * - `--facet-dropdown-count-text`: Count text color
31
+ * - `--facet-dropdown-count-font-size`: Count font size (default: 0.75rem)
32
+ *
33
+ * Scrollbar:
34
+ * - `--facet-dropdown-scrollbar-thumb`: Scrollbar thumb color
35
+ * - `--facet-dropdown-scrollbar-thumb-hover`: Scrollbar thumb hover color
36
+ *
37
+ * @example
38
+ * ```tsx
39
+ * <FacetDropdown
40
+ * field="category"
41
+ * placeholder="All Categories"
42
+ * applyFilter={true}
43
+ * showCounts={true}
44
+ * />
45
+ * ```
46
+ */
47
+ import React from 'react';
48
+ import type { SeekoraClient } from '@seekora-ai/search-sdk';
49
+ export interface FacetDropdownOption {
50
+ value: string;
51
+ count: number;
52
+ label?: string;
53
+ }
54
+ export interface FacetDropdownTheme {
55
+ button?: string;
56
+ buttonOpen?: string;
57
+ panel?: string;
58
+ option?: string;
59
+ optionActive?: string;
60
+ optionHover?: string;
61
+ caretIcon?: string;
62
+ }
63
+ export interface FacetDropdownProps {
64
+ /** The facet field to display (e.g., "category", "brand", "product_type") */
65
+ field: string;
66
+ /** Placeholder text when no value is selected */
67
+ placeholder?: string;
68
+ /** Custom className for the button */
69
+ className?: string;
70
+ /** Custom theme overrides */
71
+ theme?: FacetDropdownTheme;
72
+ /** Called when a value is selected */
73
+ onChange?: (value: string) => void;
74
+ /** Current selected value (controlled mode) */
75
+ value?: string;
76
+ /** Maximum number of options to show before scrolling */
77
+ maxOptions?: number;
78
+ /** Whether to show facet counts */
79
+ showCounts?: boolean;
80
+ /** Custom options (if you want to provide static options instead of fetching) */
81
+ options?: FacetDropdownOption[];
82
+ /** Standalone mode: provide your own search client */
83
+ client?: SeekoraClient;
84
+ /** Apply filter immediately on selection (default: true) */
85
+ applyFilter?: boolean;
86
+ /** Navigate to search page on selection (default: false) */
87
+ navigateOnSelect?: boolean;
88
+ /** Base URL for navigation (e.g., "/search") */
89
+ searchPageUrl?: string;
90
+ /** Use dedicated Filters API instead of search API for fetching facet values */
91
+ useFiltersApi?: boolean;
92
+ }
93
+ export declare const FacetDropdown: React.FC<FacetDropdownProps>;
94
+ //# sourceMappingURL=FacetDropdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FacetDropdown.d.ts","sourceRoot":"","sources":["../../src/components/FacetDropdown.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAe5D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iFAAiF;IACjF,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAChC,sDAAsD;IACtD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAMD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAmctD,CAAC"}
@@ -0,0 +1,396 @@
1
+ /**
2
+ * FacetDropdown Component
3
+ *
4
+ * A dropdown component that displays facet values from a specific field
5
+ * and allows users to filter search results by selecting values.
6
+ *
7
+ * Can be used standalone (fetches its own data) or integrated with SearchProvider.
8
+ *
9
+ * @cssVariables
10
+ * Customize the dropdown appearance using CSS variables:
11
+ *
12
+ * Button:
13
+ * - `--facet-dropdown-button-bg`: Button background color
14
+ * - `--facet-dropdown-text`: Button text color
15
+ * - `--facet-dropdown-border`: Button and panel border color
16
+ * - `--facet-dropdown-font-size`: Button font size (default: 0.875rem)
17
+ * - `--facet-dropdown-font-weight`: Button font weight (default: 500)
18
+ *
19
+ * Dropdown Panel:
20
+ * - `--facet-dropdown-bg`: Panel background color
21
+ * - `--facet-dropdown-shadow`: Panel box shadow
22
+ *
23
+ * Options:
24
+ * - `--facet-dropdown-option-text`: Option text color
25
+ * - `--facet-dropdown-option-font-size`: Option font size (default: 0.875rem)
26
+ * - `--facet-dropdown-option-font-weight-active`: Active option font weight (default: 500)
27
+ * - `--facet-dropdown-option-active-bg`: Active option background color
28
+ *
29
+ * Count Badge:
30
+ * - `--facet-dropdown-count-text`: Count text color
31
+ * - `--facet-dropdown-count-font-size`: Count font size (default: 0.75rem)
32
+ *
33
+ * Scrollbar:
34
+ * - `--facet-dropdown-scrollbar-thumb`: Scrollbar thumb color
35
+ * - `--facet-dropdown-scrollbar-thumb-hover`: Scrollbar thumb hover color
36
+ *
37
+ * @example
38
+ * ```tsx
39
+ * <FacetDropdown
40
+ * field="category"
41
+ * placeholder="All Categories"
42
+ * applyFilter={true}
43
+ * showCounts={true}
44
+ * />
45
+ * ```
46
+ */
47
+ import React, { useState, useEffect, useRef, useCallback } from 'react';
48
+ import { createPortal } from 'react-dom';
49
+ import { useSearchContext } from './SearchProvider';
50
+ import { useSearchState } from '../hooks/useSearchState';
51
+ import { log } from '@seekora-ai/ui-sdk-core';
52
+ // Z-index scale for consistent layering
53
+ // SearchOverlay uses z-100, so dropdown must be higher
54
+ const Z_INDEX = {
55
+ dropdown: 150, // Higher than SearchOverlay (100)
56
+ modal: 200,
57
+ overlay: 300,
58
+ tooltip: 50,
59
+ };
60
+ // ---------------------------------------------------------------------------
61
+ // Component
62
+ // ---------------------------------------------------------------------------
63
+ export const FacetDropdown = ({ field, placeholder = 'All Categories', className, theme: customTheme = {}, onChange, value: controlledValue, maxOptions = 10, showCounts = true, options: providedOptions, client: providedClient, applyFilter = true, navigateOnSelect = false, searchPageUrl = '/search', useFiltersApi = false, }) => {
64
+ const { client: contextClient, theme, stateManager } = useSearchContext();
65
+ const { addRefinement, removeRefinement, refinements, search } = useSearchState();
66
+ const client = providedClient || contextClient;
67
+ const [open, setOpen] = useState(false);
68
+ const [facetOptions, setFacetOptions] = useState(providedOptions || []);
69
+ const [internalValue, setInternalValue] = useState(controlledValue || '');
70
+ const [dropdownPosition, setDropdownPosition] = useState(null);
71
+ const dropdownRef = useRef(null);
72
+ const buttonRef = useRef(null);
73
+ // Determine the current value (controlled or uncontrolled)
74
+ const currentValue = controlledValue !== undefined ? controlledValue : internalValue;
75
+ // ---------------------------------------------------------------------------
76
+ // Fetch facet values
77
+ // ---------------------------------------------------------------------------
78
+ const fetchFacetValues = useCallback(async () => {
79
+ if (providedOptions || !client)
80
+ return;
81
+ try {
82
+ log.verbose('FacetDropdown: Fetching facet values', { field, useFiltersApi });
83
+ if (useFiltersApi) {
84
+ // Use dedicated Filters API via state manager
85
+ const response = await stateManager.fetchFilters({
86
+ facetBy: field,
87
+ maxFacetValues: 100,
88
+ });
89
+ const targetFilter = (response?.filters || []).find((f) => f.field === field);
90
+ if (targetFilter && targetFilter.values) {
91
+ const options = targetFilter.values.map((v) => ({
92
+ value: v.value || '',
93
+ count: v.count || 0,
94
+ label: v.value || '',
95
+ }));
96
+ setFacetOptions(options);
97
+ log.verbose('FacetDropdown: Facet options loaded via Filters API', { field, count: options.length });
98
+ }
99
+ else {
100
+ log.verbose('FacetDropdown: No filter data found', { field });
101
+ setFacetOptions([]);
102
+ }
103
+ }
104
+ else {
105
+ // Fallback: use search API with per_page=0
106
+ const response = await client.search('*', {
107
+ facet_by: field,
108
+ max_facet_values: 100,
109
+ per_page: 0,
110
+ });
111
+ log.verbose('FacetDropdown: Search response', { response });
112
+ const facetsData = response?.data?.facets || response?.facets;
113
+ const facets = Array.isArray(facetsData) ? facetsData : [];
114
+ const targetFacet = facets.find((f) => f.field_name === field || f.field === field);
115
+ if (targetFacet && targetFacet.counts) {
116
+ const options = targetFacet.counts.map((count) => ({
117
+ value: count.value,
118
+ count: count.count,
119
+ label: count.value,
120
+ }));
121
+ setFacetOptions(options);
122
+ log.verbose('FacetDropdown: Facet options loaded', { field, count: options.length });
123
+ }
124
+ else {
125
+ log.verbose('FacetDropdown: No facet data found', { field, facets });
126
+ setFacetOptions([]);
127
+ }
128
+ }
129
+ }
130
+ catch (error) {
131
+ const err = error instanceof Error ? error : new Error(String(error));
132
+ log.error('FacetDropdown: Error fetching facet values', {
133
+ field,
134
+ error: err.message,
135
+ });
136
+ setFacetOptions([]);
137
+ }
138
+ }, [field, client, providedOptions, useFiltersApi]);
139
+ useEffect(() => {
140
+ if (!providedOptions && client) {
141
+ fetchFacetValues();
142
+ }
143
+ }, [fetchFacetValues, providedOptions, client]);
144
+ // ---------------------------------------------------------------------------
145
+ // Calculate dropdown position when opened
146
+ // ---------------------------------------------------------------------------
147
+ useEffect(() => {
148
+ if (!open || !buttonRef.current)
149
+ return;
150
+ const updatePosition = () => {
151
+ if (!buttonRef.current)
152
+ return;
153
+ const rect = buttonRef.current.getBoundingClientRect();
154
+ setDropdownPosition({
155
+ top: rect.bottom + window.scrollY + 4,
156
+ left: rect.left + window.scrollX,
157
+ width: rect.width,
158
+ });
159
+ };
160
+ updatePosition();
161
+ window.addEventListener('scroll', updatePosition, true);
162
+ window.addEventListener('resize', updatePosition);
163
+ return () => {
164
+ window.removeEventListener('scroll', updatePosition, true);
165
+ window.removeEventListener('resize', updatePosition);
166
+ };
167
+ }, [open]);
168
+ // ---------------------------------------------------------------------------
169
+ // Click outside handler
170
+ // ---------------------------------------------------------------------------
171
+ useEffect(() => {
172
+ if (!open)
173
+ return;
174
+ const handleClickOutside = (e) => {
175
+ if (dropdownRef.current &&
176
+ !dropdownRef.current.contains(e.target) &&
177
+ buttonRef.current &&
178
+ !buttonRef.current.contains(e.target)) {
179
+ setOpen(false);
180
+ }
181
+ };
182
+ const handleEscape = (e) => {
183
+ if (e.key === 'Escape') {
184
+ setOpen(false);
185
+ }
186
+ };
187
+ document.addEventListener('mousedown', handleClickOutside);
188
+ document.addEventListener('keydown', handleEscape);
189
+ return () => {
190
+ document.removeEventListener('mousedown', handleClickOutside);
191
+ document.removeEventListener('keydown', handleEscape);
192
+ };
193
+ }, [open]);
194
+ // ---------------------------------------------------------------------------
195
+ // Selection handler
196
+ // ---------------------------------------------------------------------------
197
+ const handleSelect = useCallback((value) => {
198
+ log.verbose('FacetDropdown: Value selected', { field, value });
199
+ // Update internal state
200
+ setInternalValue(value);
201
+ setOpen(false);
202
+ // Call onChange callback
203
+ if (onChange) {
204
+ onChange(value);
205
+ }
206
+ // Apply filter if enabled and we have search state
207
+ if (applyFilter && addRefinement && removeRefinement) {
208
+ // Remove any existing refinement for this field
209
+ const existingRefinement = refinements.find(r => r.field === field);
210
+ if (existingRefinement) {
211
+ removeRefinement(field, existingRefinement.value, false);
212
+ }
213
+ // Add new refinement if value is not empty
214
+ if (value) {
215
+ addRefinement(field, value, true); // true = trigger search
216
+ }
217
+ else if (search) {
218
+ // If clearing the filter, trigger search manually
219
+ search();
220
+ }
221
+ }
222
+ // Navigate to search page if enabled
223
+ if (navigateOnSelect && value && typeof window !== 'undefined') {
224
+ const url = new URL(window.location.origin + searchPageUrl);
225
+ url.searchParams.set(field, value);
226
+ window.location.href = url.toString();
227
+ }
228
+ }, [field, onChange, applyFilter, addRefinement, removeRefinement, refinements, search, navigateOnSelect, searchPageUrl]);
229
+ // ---------------------------------------------------------------------------
230
+ // Render
231
+ // ---------------------------------------------------------------------------
232
+ const displayLabel = currentValue || placeholder;
233
+ const hasOptions = facetOptions.length > 0;
234
+ const buttonClass = [
235
+ 'facet-dropdown-button',
236
+ customTheme.button,
237
+ className,
238
+ open && customTheme.buttonOpen,
239
+ ]
240
+ .filter(Boolean)
241
+ .join(' ');
242
+ // Render dropdown panel via portal
243
+ const renderDropdown = () => {
244
+ if (!open || !hasOptions || !dropdownPosition || typeof document === 'undefined') {
245
+ return null;
246
+ }
247
+ const dropdown = (React.createElement("div", { ref: dropdownRef, className: customTheme.panel || 'facet-dropdown-panel', role: "listbox", "aria-label": `${field} options`, style: {
248
+ position: 'absolute',
249
+ top: `${dropdownPosition.top}px`,
250
+ left: `${dropdownPosition.left}px`,
251
+ minWidth: `${dropdownPosition.width}px`,
252
+ width: 'max-content',
253
+ maxWidth: 'min(24rem, 90vw)',
254
+ maxHeight: `calc(100vh - 100px)`,
255
+ overflowY: 'auto',
256
+ overflowX: 'hidden',
257
+ backgroundColor: 'var(--facet-dropdown-bg, var(--background))',
258
+ border: '1px solid var(--facet-dropdown-border, var(--border-color))',
259
+ borderRadius: theme?.borderRadius && typeof theme.borderRadius !== 'string'
260
+ ? theme.borderRadius.medium
261
+ : '0.5rem',
262
+ boxShadow: 'var(--facet-dropdown-shadow, var(--shadow-lg))',
263
+ zIndex: Z_INDEX.dropdown,
264
+ padding: '0.25rem',
265
+ } },
266
+ React.createElement("button", { type: "button", role: "option", "aria-selected": !currentValue, onClick: (e) => {
267
+ e.preventDefault();
268
+ e.stopPropagation();
269
+ handleSelect('');
270
+ }, className: [
271
+ customTheme.option,
272
+ !currentValue && customTheme.optionActive,
273
+ ]
274
+ .filter(Boolean)
275
+ .join(' '), style: {
276
+ width: '100%',
277
+ textAlign: 'left',
278
+ padding: '0.5rem 0.75rem',
279
+ fontSize: 'var(--facet-dropdown-option-font-size, 0.875rem)',
280
+ fontWeight: !currentValue ? 'var(--facet-dropdown-option-font-weight-active, 500)' : 'normal',
281
+ color: 'var(--facet-dropdown-option-text, var(--text-color, currentColor))',
282
+ backgroundColor: !currentValue ? 'var(--facet-dropdown-option-active-bg, var(--hover-color))' : 'transparent',
283
+ border: 'none',
284
+ borderRadius: theme?.borderRadius && typeof theme.borderRadius !== 'string'
285
+ ? theme.borderRadius.small
286
+ : '0.25rem',
287
+ cursor: 'pointer',
288
+ transition: 'background-color 0.15s ease',
289
+ display: 'flex',
290
+ alignItems: 'center',
291
+ justifyContent: 'space-between',
292
+ } },
293
+ React.createElement("span", null, placeholder)),
294
+ facetOptions.map((option) => {
295
+ const isActive = currentValue === option.value;
296
+ return (React.createElement("button", { key: option.value, type: "button", role: "option", "aria-selected": isActive, onClick: (e) => {
297
+ e.preventDefault();
298
+ e.stopPropagation();
299
+ handleSelect(option.value);
300
+ }, className: [
301
+ customTheme.option,
302
+ isActive && customTheme.optionActive,
303
+ ]
304
+ .filter(Boolean)
305
+ .join(' '), style: {
306
+ width: '100%',
307
+ textAlign: 'left',
308
+ padding: '0.5rem 0.75rem',
309
+ fontSize: 'var(--facet-dropdown-option-font-size, 0.875rem)',
310
+ fontWeight: isActive ? 'var(--facet-dropdown-option-font-weight-active, 500)' : 'normal',
311
+ color: 'var(--facet-dropdown-option-text, var(--text-color, currentColor))',
312
+ backgroundColor: isActive ? 'var(--facet-dropdown-option-active-bg, var(--hover-color))' : 'transparent',
313
+ border: 'none',
314
+ borderRadius: theme?.borderRadius && typeof theme.borderRadius !== 'string'
315
+ ? theme.borderRadius.small
316
+ : '0.25rem',
317
+ cursor: 'pointer',
318
+ transition: 'background-color 0.15s ease',
319
+ display: 'flex',
320
+ alignItems: 'center',
321
+ justifyContent: 'space-between',
322
+ } },
323
+ React.createElement("span", { style: { flex: 1, overflow: 'hidden', textOverflow: 'ellipsis' } }, option.label || option.value),
324
+ showCounts && (React.createElement("span", { style: {
325
+ fontSize: 'var(--facet-dropdown-count-font-size, 0.75rem)',
326
+ color: 'var(--facet-dropdown-count-text, var(--text-secondary, currentColor))',
327
+ opacity: 0.7,
328
+ marginLeft: '0.5rem',
329
+ flexShrink: 0,
330
+ } },
331
+ "(",
332
+ option.count,
333
+ ")"))));
334
+ })));
335
+ return createPortal(dropdown, document.body);
336
+ };
337
+ return (React.createElement("div", { className: "facet-dropdown-container", style: { position: 'relative' } },
338
+ React.createElement("style", { dangerouslySetInnerHTML: {
339
+ __html: `
340
+ .facet-dropdown-panel {
341
+ --scrollbar-track: transparent;
342
+ --scrollbar-thumb: var(--facet-dropdown-scrollbar-thumb, var(--border-color));
343
+ --scrollbar-thumb-hover: var(--facet-dropdown-scrollbar-thumb-hover, var(--text-secondary));
344
+ }
345
+ .facet-dropdown-panel::-webkit-scrollbar {
346
+ width: 6px;
347
+ }
348
+ .facet-dropdown-panel::-webkit-scrollbar-track {
349
+ background: var(--scrollbar-track);
350
+ }
351
+ .facet-dropdown-panel::-webkit-scrollbar-thumb {
352
+ background: var(--scrollbar-thumb);
353
+ border-radius: 3px;
354
+ }
355
+ .facet-dropdown-panel::-webkit-scrollbar-thumb:hover {
356
+ background: var(--scrollbar-thumb-hover);
357
+ }
358
+ .facet-dropdown-panel {
359
+ scrollbar-width: thin;
360
+ scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
361
+ }
362
+ `
363
+ } }),
364
+ React.createElement("button", { ref: buttonRef, type: "button", onClick: (e) => {
365
+ e.preventDefault();
366
+ e.stopPropagation();
367
+ setOpen(prev => !prev);
368
+ }, className: buttonClass, "aria-label": `Filter by ${field}`, "aria-expanded": open, "aria-haspopup": "listbox", style: {
369
+ display: 'flex',
370
+ alignItems: 'center',
371
+ gap: '0.375rem',
372
+ padding: '0.625rem 0.75rem',
373
+ fontSize: 'var(--facet-dropdown-font-size, 0.875rem)',
374
+ fontWeight: 'var(--facet-dropdown-font-weight, 500)',
375
+ color: 'var(--facet-dropdown-text, var(--text-color, currentColor))',
376
+ backgroundColor: 'var(--facet-dropdown-button-bg, var(--background, transparent))',
377
+ border: '1px solid var(--facet-dropdown-border, var(--border-color))',
378
+ borderRadius: theme?.borderRadius && typeof theme.borderRadius !== 'string'
379
+ ? theme.borderRadius.medium
380
+ : '0.5rem',
381
+ cursor: 'pointer',
382
+ transition: 'all 0.2s ease',
383
+ outline: 'none',
384
+ whiteSpace: 'nowrap',
385
+ minWidth: '8rem',
386
+ ...(!hasOptions && { opacity: 0.6, cursor: 'not-allowed' }),
387
+ }, disabled: !hasOptions },
388
+ React.createElement("span", { style: { flex: 1, textAlign: 'left', overflow: 'hidden', textOverflow: 'ellipsis' } }, displayLabel),
389
+ React.createElement("svg", { className: customTheme.caretIcon, width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", style: {
390
+ transform: open ? 'rotate(180deg)' : 'rotate(0deg)',
391
+ transition: 'transform 0.2s ease',
392
+ flexShrink: 0,
393
+ }, "aria-hidden": "true" },
394
+ React.createElement("path", { d: "M4 6L8 10L12 6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }))),
395
+ renderDropdown()));
396
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Facets Component
3
+ *
4
+ * Displays facet filters for search results with multiple display variants,
5
+ * client-side search, count badges, and color swatch support.
6
+ */
7
+ import React from 'react';
8
+ import type { SearchResponse } from '@seekora-ai/search-sdk';
9
+ export interface FacetItem {
10
+ value: string;
11
+ count: number;
12
+ selected?: boolean;
13
+ }
14
+ export interface FacetStats {
15
+ min: number;
16
+ max: number;
17
+ avg?: number;
18
+ sum?: number;
19
+ }
20
+ export interface FacetRangeItem {
21
+ label: string;
22
+ from?: number;
23
+ to?: number;
24
+ }
25
+ export interface FacetRangeConfig {
26
+ field: string;
27
+ ranges: FacetRangeItem[];
28
+ }
29
+ export interface Facet {
30
+ field: string;
31
+ label?: string;
32
+ items: FacetItem[];
33
+ stats?: FacetStats;
34
+ }
35
+ export interface FacetsTheme {
36
+ container?: string;
37
+ facet?: string;
38
+ facetHeader?: string;
39
+ facetTitle?: string;
40
+ facetList?: string;
41
+ facetItem?: string;
42
+ facetItemActive?: string;
43
+ facetItemCount?: string;
44
+ facetItemLabel?: string;
45
+ checkbox?: string;
46
+ /** Color swatch circle/square */
47
+ colorSwatch?: string;
48
+ /** Color swatch when selected */
49
+ colorSwatchSelected?: string;
50
+ /** Inner element of color swatch (for checkmark overlay) */
51
+ colorSwatchInner?: string;
52
+ /** Search input within a facet group */
53
+ searchInput?: string;
54
+ /** Collapsible header row */
55
+ collapsibleHeader?: string;
56
+ /** Chevron/expand icon in collapsible header */
57
+ collapsibleIcon?: string;
58
+ /** Count badge pill */
59
+ countBadge?: string;
60
+ /** Range button (pre-configured range option) */
61
+ rangeButton?: string;
62
+ /** Active range button */
63
+ rangeButtonActive?: string;
64
+ /** Count badge on range button */
65
+ rangeButtonCount?: string;
66
+ /** Clear button for range filters */
67
+ rangeClear?: string;
68
+ }
69
+ export type FacetVariant = 'checkbox' | 'color-swatch' | 'collapsible';
70
+ export type FacetSize = 'small' | 'medium' | 'large';
71
+ export interface FacetsProps {
72
+ /** Search results response */
73
+ results?: SearchResponse | null;
74
+ /** Custom facets data */
75
+ facets?: Facet[];
76
+ /** Callback when facet is selected/deselected */
77
+ onFacetChange?: (field: string, value: string, selected: boolean) => void;
78
+ /** Custom render function for facet */
79
+ renderFacet?: (facet: Facet, index: number) => React.ReactNode;
80
+ /** Custom render function for facet item */
81
+ renderFacetItem?: (item: FacetItem, facet: Facet, index: number) => React.ReactNode;
82
+ /** Maximum number of items to show per facet */
83
+ maxItems?: number;
84
+ /** Show "Show more" button */
85
+ showMore?: boolean;
86
+ /** Custom className */
87
+ className?: string;
88
+ /** Custom styles */
89
+ style?: React.CSSProperties;
90
+ /** Custom theme */
91
+ theme?: FacetsTheme;
92
+ /** Display variant: checkbox (default), color-swatch, or collapsible */
93
+ variant?: FacetVariant;
94
+ /** When true, show a search input at the top of each facet group */
95
+ searchable?: boolean;
96
+ /** Show count badges (default: true) */
97
+ showCounts?: boolean;
98
+ /** Maps facet values to CSS colors (used by color-swatch variant) */
99
+ colorMap?: Record<string, string>;
100
+ /** For collapsible variant, whether facets start collapsed (default: false) */
101
+ defaultCollapsed?: boolean;
102
+ /** Size preset: small, medium (default), or large */
103
+ size?: FacetSize;
104
+ /** Pre-configured range button definitions for numeric facets */
105
+ facetRanges?: FacetRangeConfig[];
106
+ /** Use dedicated Filters API instead of extracting facets from search results */
107
+ useFiltersApi?: boolean;
108
+ /** Fields that should use disjunctive (OR) faceting (only with useFiltersApi) */
109
+ disjunctiveFacets?: string[];
110
+ /** Hide facets that have no selectable values (default: true) */
111
+ hideEmptyFacets?: boolean;
112
+ /** Fields that should start collapsed (collapsible variant only). Overrides defaultCollapsed for listed fields. */
113
+ defaultCollapsedFields?: string[];
114
+ /** Callback fired when facet availability changes. Receives true when facets are available, false when empty. */
115
+ onFacetsAvailable?: (available: boolean) => void;
116
+ }
117
+ export declare const Facets: React.FC<FacetsProps>;
118
+ //# sourceMappingURL=Facets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Facets.d.ts","sourceRoot":"","sources":["../../src/components/Facets.tsx"],"names":[],"mappings":"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"}