@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,141 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import { Hit } from './Hit';
3
+ function getTypeLevel(type) {
4
+ if (!type)
5
+ return 1;
6
+ const match = type.match(/^lvl(\d+)$/);
7
+ return match ? parseInt(match[1], 10) : 1;
8
+ }
9
+ function isChildType(type) {
10
+ return getTypeLevel(type) >= 2;
11
+ }
12
+ /** Build a stable grouping key from all hierarchy levels (lvl0 through lvl5). */
13
+ function getHierarchyKey(hit) {
14
+ const h = hit.hierarchy ?? {};
15
+ const parts = [
16
+ h.lvl0 ?? '',
17
+ h.lvl1 ?? '',
18
+ h.lvl2 ?? '',
19
+ h.lvl3 ?? '',
20
+ h.lvl4 ?? '',
21
+ h.lvl5 ?? '',
22
+ ];
23
+ return parts.join('\0');
24
+ }
25
+ /** Build a display breadcrumb from hierarchy, skipping consecutive duplicates (e.g. lvl0 === lvl1). */
26
+ function getHierarchyBreadcrumb(hit) {
27
+ const h = hit.hierarchy ?? {};
28
+ const parts = [h.lvl0, h.lvl1, h.lvl2, h.lvl3, h.lvl4, h.lvl5].filter((v) => typeof v === 'string' && v.length > 0);
29
+ const deduped = [];
30
+ for (const p of parts) {
31
+ if (deduped[deduped.length - 1] !== p)
32
+ deduped.push(p);
33
+ }
34
+ return deduped.join(' › ');
35
+ }
36
+ function groupHitsByHierarchy(hits) {
37
+ const hitToIndex = new Map();
38
+ hits.forEach((h, i) => hitToIndex.set(h, i));
39
+ const groups = new Map();
40
+ for (const hit of hits) {
41
+ const key = getHierarchyKey(hit);
42
+ if (!groups.has(key))
43
+ groups.set(key, []);
44
+ groups.get(key).push(hit);
45
+ }
46
+ const entries = Array.from(groups.entries());
47
+ entries.sort(([, aHits], [, bHits]) => {
48
+ const aMin = Math.min(...aHits.map(h => hitToIndex.get(h) ?? 0));
49
+ const bMin = Math.min(...bHits.map(h => hitToIndex.get(h) ?? 0));
50
+ return aMin - bMin;
51
+ });
52
+ const result = [];
53
+ for (const [, groupHits] of entries) {
54
+ const sortedHits = [...groupHits].sort((a, b) => {
55
+ const aType = a.type;
56
+ const bType = b.type;
57
+ return getTypeLevel(aType) - getTypeLevel(bType);
58
+ });
59
+ const markedHits = sortedHits.map((hit, index) => {
60
+ const suggestion = hit;
61
+ const isChild = isChildType(suggestion.type);
62
+ const nextHit = sortedHits[index + 1];
63
+ const isLastChild = isChild && (!nextHit || !isChildType(nextHit.type));
64
+ return { ...hit, isChild, isLastChild };
65
+ });
66
+ const category = getHierarchyBreadcrumb(groupHits[0]);
67
+ result.push({ category: category || null, hits: markedHits });
68
+ }
69
+ return result;
70
+ }
71
+ function getGlobalIndexMulti(groups, groupIndex, hitIndex) {
72
+ let index = 0;
73
+ for (let i = 0; i < groupIndex; i++)
74
+ index += groups[i].hits.length;
75
+ return index + hitIndex;
76
+ }
77
+ function getHitKey(hit, index) {
78
+ if ('objectID' in hit)
79
+ return hit.objectID;
80
+ return `suggestion-${hit.url}-${index}`;
81
+ }
82
+ export function Results({ hits, groupedHits, selectedIndex, onSelect, onHover, scrollSelectionIntoViewRef, query, isLoading, error, translations = {}, sources: _sources = [], }) {
83
+ void _sources;
84
+ const listRef = useRef(null);
85
+ useEffect(() => {
86
+ if (!listRef.current || hits.length === 0)
87
+ return;
88
+ // Only scroll when selection changed via keyboard (avoids scroll-to-selected on hover)
89
+ if (scrollSelectionIntoViewRef && !scrollSelectionIntoViewRef.current)
90
+ return;
91
+ // listRef's direct children are groups (li.seekora-docsearch-results-group), not hits.
92
+ // Find the actual hit element at flat selectedIndex.
93
+ const groupEls = listRef.current.querySelectorAll('.seekora-docsearch-results-group');
94
+ let idx = 0;
95
+ for (const groupEl of groupEls) {
96
+ const itemList = groupEl.querySelector('.seekora-docsearch-results-group-items');
97
+ if (!itemList)
98
+ continue;
99
+ const items = itemList.children;
100
+ for (let i = 0; i < items.length; i++) {
101
+ if (idx === selectedIndex) {
102
+ items[i].scrollIntoView({ block: 'nearest' });
103
+ if (scrollSelectionIntoViewRef)
104
+ scrollSelectionIntoViewRef.current = false;
105
+ return;
106
+ }
107
+ idx++;
108
+ }
109
+ }
110
+ if (scrollSelectionIntoViewRef)
111
+ scrollSelectionIntoViewRef.current = false;
112
+ }, [selectedIndex, hits.length, scrollSelectionIntoViewRef]);
113
+ if (!query) {
114
+ return (React.createElement("div", { className: "seekora-docsearch-empty" },
115
+ React.createElement("p", { className: "seekora-docsearch-empty-text" }, translations.searchPlaceholder || 'Type to start searching...')));
116
+ }
117
+ if (isLoading && hits.length === 0) {
118
+ return React.createElement("div", { className: "seekora-docsearch-empty" });
119
+ }
120
+ // When loading with previous hits, fall through and show them (no loading screen)
121
+ if (error) {
122
+ return (React.createElement("div", { className: "seekora-docsearch-error" },
123
+ React.createElement("p", { className: "seekora-docsearch-error-text" }, translations.errorText || error)));
124
+ }
125
+ if (hits.length === 0 && query) {
126
+ return (React.createElement("div", { className: "seekora-docsearch-no-results" },
127
+ React.createElement("p", { className: "seekora-docsearch-no-results-text" }, translations.noResultsText || `No results found for "${query}"`)));
128
+ }
129
+ const displayGroups = groupedHits && groupedHits.length > 0
130
+ ? groupedHits.map(g => ({ category: g.source.name, sourceId: g.source.id, openInNewTab: g.source.openInNewTab, hits: g.items }))
131
+ : groupHitsByHierarchy(hits).map(g => ({ category: g.category, sourceId: 'default', openInNewTab: false, hits: g.hits }));
132
+ return (React.createElement("div", { className: "seekora-docsearch-results" },
133
+ React.createElement("ul", { ref: listRef, id: "seekora-docsearch-results", className: "seekora-docsearch-results-list", role: "listbox" }, displayGroups.map((group, groupIndex) => (React.createElement("li", { key: group.sourceId + '-' + groupIndex, className: "seekora-docsearch-results-group" },
134
+ group.category && React.createElement("div", { className: "seekora-docsearch-results-group-header" }, group.category),
135
+ React.createElement("ul", { className: "seekora-docsearch-results-group-items" }, group.hits.map((hit, hitIndex) => {
136
+ const globalIndex = getGlobalIndexMulti(displayGroups, groupIndex, hitIndex);
137
+ const extHit = hit;
138
+ return (React.createElement("li", { key: getHitKey(hit, hitIndex) },
139
+ React.createElement(Hit, { hit: hit, isSelected: globalIndex === selectedIndex, onClick: () => onSelect(hit), onMouseEnter: () => onHover(globalIndex), openInNewTab: group.openInNewTab, isChild: extHit.isChild, isLastChild: extHit.isLastChild, hierarchyType: hit.type })));
140
+ }))))))));
141
+ }
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ interface SearchBoxProps {
3
+ value: string;
4
+ onChange: (value: string) => void;
5
+ onKeyDown?: (event: React.KeyboardEvent) => void;
6
+ placeholder?: string;
7
+ onClear?: () => void;
8
+ }
9
+ export declare function SearchBox({ value, onChange, onKeyDown, placeholder, onClear, }: SearchBoxProps): React.JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=SearchBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchBox.d.ts","sourceRoot":"","sources":["../../../src/docsearch/components/SearchBox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,WAAuC,EACvC,OAAO,GACR,EAAE,cAAc,qBAuChB"}
@@ -0,0 +1,16 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ export function SearchBox({ value, onChange, onKeyDown, placeholder = 'Search documentation...', onClear, }) {
3
+ const inputRef = useRef(null);
4
+ useEffect(() => { if (inputRef.current)
5
+ inputRef.current.focus(); }, []);
6
+ const handleChange = (event) => onChange(event.target.value);
7
+ const handleClear = () => { onChange(''); onClear?.(); inputRef.current?.focus(); };
8
+ return (React.createElement("div", { className: "seekora-docsearch-searchbox" },
9
+ React.createElement("label", { className: "seekora-docsearch-searchbox-icon", htmlFor: "seekora-docsearch-input" },
10
+ React.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" },
11
+ React.createElement("path", { d: "M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z", fill: "currentColor" }))),
12
+ React.createElement("input", { ref: inputRef, id: "seekora-docsearch-input", className: "seekora-docsearch-input", type: "text", value: value, onChange: handleChange, onKeyDown: onKeyDown, placeholder: placeholder, autoComplete: "off", autoCorrect: "off", autoCapitalize: "off", spellCheck: false, "aria-autocomplete": "list", "aria-controls": "seekora-docsearch-results" }),
13
+ value && (React.createElement("button", { type: "button", className: "seekora-docsearch-clear", onClick: handleClear, "aria-label": "Clear search" },
14
+ React.createElement("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true" },
15
+ React.createElement("path", { d: "M4.28 3.22a.75.75 0 00-1.06 1.06L6.94 8l-3.72 3.72a.75.75 0 101.06 1.06L8 9.06l3.72 3.72a.75.75 0 101.06-1.06L9.06 8l3.72-3.72a.75.75 0 00-1.06-1.06L8 6.94 4.28 3.22z", fill: "currentColor" }))))));
16
+ }
@@ -0,0 +1,33 @@
1
+ import type { DocSearchHit, DocSearchSuggestion, SearchSource } from '../types';
2
+ interface UseDocSearchOptions {
3
+ apiEndpoint?: string;
4
+ apiKey?: string;
5
+ sources?: SearchSource[];
6
+ maxResults?: number;
7
+ debounceMs?: number;
8
+ processGroupedResults?: (sourceId: string, items: DocSearchSuggestion[]) => DocSearchSuggestion[];
9
+ }
10
+ export declare function useDocSearch(options: UseDocSearchOptions): {
11
+ sources: SearchSource[];
12
+ setQuery: (query: string) => void;
13
+ search: (q: string) => Promise<void>;
14
+ fetchSuggestions: (query: string) => Promise<void>;
15
+ selectNext: () => void;
16
+ selectPrev: () => void;
17
+ setSelectedIndex: (index: number) => void;
18
+ reset: () => void;
19
+ getSelectedItem: () => DocSearchHit | DocSearchSuggestion | null;
20
+ groupedSuggestions: {
21
+ source: SearchSource;
22
+ items: DocSearchSuggestion[];
23
+ }[];
24
+ query: string;
25
+ results: DocSearchHit[];
26
+ suggestions: DocSearchSuggestion[];
27
+ isLoading: boolean;
28
+ error: string | null;
29
+ selectedIndex: number;
30
+ mode: "suggestions" | "results";
31
+ };
32
+ export {};
33
+ //# sourceMappingURL=useDocSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDocSearch.d.ts","sourceRoot":"","sources":["../../../src/docsearch/hooks/useDocSearch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACb,MAAM,UAAU,CAAC;AA0DlB,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,CAAC;CACnG;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB;;sBAoJ7C,MAAM;gBAHe,MAAM;8BAlCrB,MAAM;;;8BA+CuB,MAAM;;2BASX,YAAY,GAAG,mBAAmB,GAAG,IAAI;wBAvO7D;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,KAAK,EAAE,mBAAmB,EAAE,CAAA;KAAE,EAAE;;;;;;;;EAgQ7E"}
@@ -0,0 +1,224 @@
1
+ import { useCallback, useEffect, useReducer, useRef } from 'react';
2
+ const initialState = {
3
+ query: '',
4
+ results: [],
5
+ suggestions: [],
6
+ groupedSuggestions: [],
7
+ isLoading: false,
8
+ error: null,
9
+ selectedIndex: 0,
10
+ mode: 'suggestions',
11
+ };
12
+ function reducer(state, action) {
13
+ switch (action.type) {
14
+ case 'SET_QUERY':
15
+ return { ...state, query: action.payload, selectedIndex: 0 };
16
+ case 'SET_RESULTS':
17
+ return { ...state, results: action.payload, mode: 'results' };
18
+ case 'SET_SUGGESTIONS':
19
+ return { ...state, suggestions: action.payload, mode: 'suggestions' };
20
+ case 'SET_GROUPED_SUGGESTIONS': {
21
+ const flatSuggestions = action.payload.flatMap(group => group.items.map(item => ({ ...item, _source: group.source.id })));
22
+ return { ...state, groupedSuggestions: action.payload, suggestions: flatSuggestions, mode: 'suggestions' };
23
+ }
24
+ case 'SET_LOADING':
25
+ return { ...state, isLoading: action.payload };
26
+ case 'SET_ERROR':
27
+ return { ...state, error: action.payload };
28
+ case 'SET_SELECTED_INDEX':
29
+ return { ...state, selectedIndex: action.payload };
30
+ case 'SELECT_NEXT': {
31
+ const items = state.mode === 'results' ? state.results : state.suggestions;
32
+ const maxIndex = items.length - 1;
33
+ return { ...state, selectedIndex: state.selectedIndex >= maxIndex ? 0 : state.selectedIndex + 1 };
34
+ }
35
+ case 'SELECT_PREV': {
36
+ const items = state.mode === 'results' ? state.results : state.suggestions;
37
+ const maxIndex = items.length - 1;
38
+ return { ...state, selectedIndex: state.selectedIndex <= 0 ? maxIndex : state.selectedIndex - 1 };
39
+ }
40
+ case 'SET_MODE':
41
+ return { ...state, mode: action.payload, selectedIndex: 0 };
42
+ case 'RESET':
43
+ return initialState;
44
+ default:
45
+ return state;
46
+ }
47
+ }
48
+ export function useDocSearch(options) {
49
+ const { apiEndpoint, apiKey, sources, maxResults = 10, debounceMs = 200, processGroupedResults } = options;
50
+ const searchSources = sources || (apiEndpoint ? [{
51
+ id: 'default',
52
+ name: 'Results',
53
+ endpoint: apiEndpoint,
54
+ apiKey,
55
+ maxResults,
56
+ }] : []);
57
+ const [state, dispatch] = useReducer(reducer, initialState);
58
+ const abortControllersRef = useRef(new Map());
59
+ const debounceTimerRef = useRef(null);
60
+ const defaultTransform = (data, sourceId) => {
61
+ const items = data.data?.suggestions || data.data?.results || data.data?.hits || data.suggestions || data.results || data.hits || [];
62
+ return items.map((item) => {
63
+ const doc = item.document || item;
64
+ // Build hierarchy from nested object or flat dot-notation keys
65
+ const hierarchy = doc.hierarchy || {
66
+ lvl0: doc['hierarchy.lvl0'],
67
+ lvl1: doc['hierarchy.lvl1'],
68
+ lvl2: doc['hierarchy.lvl2'],
69
+ lvl3: doc['hierarchy.lvl3'],
70
+ lvl4: doc['hierarchy.lvl4'],
71
+ lvl5: doc['hierarchy.lvl5'],
72
+ };
73
+ return {
74
+ url: doc.url || doc.route || item.url || '',
75
+ title: (doc.title || '').replace?.(/<\/?mark>/g, '') || '',
76
+ content: (doc.content || doc.description || '').replace?.(/<\/?mark>/g, '')?.substring?.(0, 100) || '',
77
+ description: doc.description || doc.content?.substring?.(0, 100) || '',
78
+ category: doc.category || hierarchy?.lvl0 || '',
79
+ hierarchy,
80
+ route: doc.route,
81
+ parentTitle: doc.parent_title || doc.parentTitle,
82
+ anchor: doc.anchor || item.anchor,
83
+ _source: sourceId,
84
+ };
85
+ });
86
+ };
87
+ const transformPublicSearchResults = useCallback((data, sourceId) => {
88
+ const results = data?.data?.results || [];
89
+ return results.map((item) => {
90
+ const doc = item.document || item;
91
+ return {
92
+ url: doc.url || doc.route || '',
93
+ title: (doc.title || doc.name || '').replace?.(/<\/?mark>/g, '') || '',
94
+ content: (doc.content || doc.description || '').replace?.(/<\/?mark>/g, '')?.substring?.(0, 100) || '',
95
+ description: doc.description || doc.content?.substring?.(0, 100) || '',
96
+ category: doc.category || doc.hierarchy?.lvl0 || '',
97
+ hierarchy: doc.hierarchy,
98
+ route: doc.route,
99
+ parentTitle: doc.parent_title || doc.parentTitle,
100
+ _source: sourceId,
101
+ };
102
+ });
103
+ }, []);
104
+ const fetchFromSource = useCallback(async (source, query, signal) => {
105
+ const minLength = source.minQueryLength ?? 1;
106
+ if (query.length < minLength)
107
+ return [];
108
+ try {
109
+ if (source.storeId) {
110
+ const baseUrl = source.endpoint.replace(/\/$/, '');
111
+ const searchUrl = `${baseUrl}/api/v1/search`;
112
+ const headers = {
113
+ 'Content-Type': 'application/json',
114
+ 'x-storeid': source.storeId,
115
+ ...(source.storeSecret && { 'x-storesecret': source.storeSecret }),
116
+ };
117
+ const response = await fetch(searchUrl, {
118
+ method: 'POST',
119
+ headers,
120
+ body: JSON.stringify({ q: query.trim() || '*', per_page: source.maxResults || 8 }),
121
+ signal,
122
+ });
123
+ if (!response.ok)
124
+ return [];
125
+ const data = await response.json();
126
+ if (source.transformResults) {
127
+ return source.transformResults(data).map((item) => ({ ...item, _source: source.id }));
128
+ }
129
+ return transformPublicSearchResults(data, source.id);
130
+ }
131
+ const url = new URL(source.endpoint);
132
+ url.searchParams.set('query', query);
133
+ url.searchParams.set('limit', String(source.maxResults || 8));
134
+ const headers = { 'Content-Type': 'application/json' };
135
+ if (source.apiKey)
136
+ headers['X-Docs-API-Key'] = source.apiKey;
137
+ const response = await fetch(url.toString(), { method: 'GET', headers, signal });
138
+ if (!response.ok)
139
+ return [];
140
+ const data = await response.json();
141
+ if (source.transformResults) {
142
+ return source.transformResults(data).map((item) => ({ ...item, _source: source.id }));
143
+ }
144
+ return defaultTransform(data, source.id);
145
+ }
146
+ catch (error) {
147
+ if (error instanceof Error && error.name === 'AbortError')
148
+ throw error;
149
+ return [];
150
+ }
151
+ }, [transformPublicSearchResults]);
152
+ const fetchSuggestions = useCallback(async (query) => {
153
+ if (!query.trim()) {
154
+ dispatch({ type: 'SET_GROUPED_SUGGESTIONS', payload: [] });
155
+ return;
156
+ }
157
+ abortControllersRef.current.forEach(c => c.abort());
158
+ abortControllersRef.current.clear();
159
+ dispatch({ type: 'SET_LOADING', payload: true });
160
+ dispatch({ type: 'SET_ERROR', payload: null });
161
+ try {
162
+ const results = await Promise.all(searchSources.map(async (source) => {
163
+ const controller = new AbortController();
164
+ abortControllersRef.current.set(source.id, controller);
165
+ let items = await fetchFromSource(source, query, controller.signal);
166
+ if (processGroupedResults) {
167
+ items = processGroupedResults(source.id, items);
168
+ }
169
+ return { source, items };
170
+ }));
171
+ const groupedResults = results.filter(r => r.items.length > 0);
172
+ dispatch({ type: 'SET_GROUPED_SUGGESTIONS', payload: groupedResults });
173
+ }
174
+ catch (error) {
175
+ if (error instanceof Error && error.name === 'AbortError')
176
+ return;
177
+ dispatch({ type: 'SET_ERROR', payload: error instanceof Error ? error.message : 'Search failed' });
178
+ }
179
+ finally {
180
+ dispatch({ type: 'SET_LOADING', payload: false });
181
+ }
182
+ }, [searchSources, fetchFromSource, processGroupedResults]);
183
+ const search = useCallback((q) => fetchSuggestions(q), [fetchSuggestions]);
184
+ const setQuery = useCallback((query) => {
185
+ dispatch({ type: 'SET_QUERY', payload: query });
186
+ if (debounceTimerRef.current)
187
+ clearTimeout(debounceTimerRef.current);
188
+ debounceTimerRef.current = setTimeout(() => fetchSuggestions(query), debounceMs);
189
+ }, [fetchSuggestions, debounceMs]);
190
+ const selectNext = useCallback(() => dispatch({ type: 'SELECT_NEXT' }), []);
191
+ const selectPrev = useCallback(() => dispatch({ type: 'SELECT_PREV' }), []);
192
+ const setSelectedIndex = useCallback((index) => dispatch({ type: 'SET_SELECTED_INDEX', payload: index }), []);
193
+ const reset = useCallback(() => {
194
+ abortControllersRef.current.forEach(c => c.abort());
195
+ abortControllersRef.current.clear();
196
+ if (debounceTimerRef.current)
197
+ clearTimeout(debounceTimerRef.current);
198
+ dispatch({ type: 'RESET' });
199
+ }, []);
200
+ const getSelectedItem = useCallback(() => {
201
+ const items = state.mode === 'results' ? state.results : state.suggestions;
202
+ return items[state.selectedIndex] || null;
203
+ }, [state.mode, state.results, state.suggestions, state.selectedIndex]);
204
+ useEffect(() => {
205
+ return () => {
206
+ abortControllersRef.current.forEach(c => c.abort());
207
+ abortControllersRef.current.clear();
208
+ if (debounceTimerRef.current)
209
+ clearTimeout(debounceTimerRef.current);
210
+ };
211
+ }, []);
212
+ return {
213
+ ...state,
214
+ sources: searchSources,
215
+ setQuery,
216
+ search,
217
+ fetchSuggestions,
218
+ selectNext,
219
+ selectPrev,
220
+ setSelectedIndex,
221
+ reset,
222
+ getSelectedItem,
223
+ };
224
+ }
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ interface UseKeyboardOptions {
3
+ isOpen: boolean;
4
+ onOpen: () => void;
5
+ onClose: () => void;
6
+ onSelectNext: () => void;
7
+ onSelectPrev: () => void;
8
+ onEnter: () => void;
9
+ disableShortcut?: boolean;
10
+ shortcutKey?: string;
11
+ }
12
+ export declare function useKeyboard(options: UseKeyboardOptions): {
13
+ handleModalKeyDown: (event: KeyboardEvent | React.KeyboardEvent) => void;
14
+ };
15
+ export declare function getShortcutText(key?: string): string;
16
+ export {};
17
+ //# sourceMappingURL=useKeyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboard.d.ts","sourceRoot":"","sources":["../../../src/docsearch/hooks/useKeyboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAEtD,UAAU,kBAAkB;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB;gCAyC3C,aAAa,GAAG,KAAK,CAAC,aAAa;EAyC9C;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAY,GAAG,MAAM,CAMzD"}
@@ -0,0 +1,71 @@
1
+ import { useCallback, useEffect } from 'react';
2
+ export function useKeyboard(options) {
3
+ const { isOpen, onOpen, onClose, onSelectNext, onSelectPrev, onEnter, disableShortcut = false, shortcutKey = 'k', } = options;
4
+ const handleGlobalKeyDown = useCallback((event) => {
5
+ if (!disableShortcut && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === shortcutKey) {
6
+ event.preventDefault();
7
+ if (isOpen) {
8
+ onClose();
9
+ }
10
+ else {
11
+ onOpen();
12
+ }
13
+ return;
14
+ }
15
+ if (!disableShortcut && event.key === '/' && !isOpen) {
16
+ const target = event.target;
17
+ const isInput = target.tagName === 'INPUT' ||
18
+ target.tagName === 'TEXTAREA' ||
19
+ target.isContentEditable;
20
+ if (!isInput) {
21
+ event.preventDefault();
22
+ onOpen();
23
+ }
24
+ }
25
+ }, [isOpen, onOpen, onClose, disableShortcut, shortcutKey]);
26
+ const handleModalKeyDown = useCallback((event) => {
27
+ switch (event.key) {
28
+ case 'Escape':
29
+ event.preventDefault();
30
+ onClose();
31
+ break;
32
+ case 'ArrowDown':
33
+ event.preventDefault();
34
+ onSelectNext();
35
+ break;
36
+ case 'ArrowUp':
37
+ event.preventDefault();
38
+ onSelectPrev();
39
+ break;
40
+ case 'Enter':
41
+ event.preventDefault();
42
+ onEnter();
43
+ break;
44
+ case 'Tab':
45
+ if (event.shiftKey) {
46
+ onSelectPrev();
47
+ }
48
+ else {
49
+ onSelectNext();
50
+ }
51
+ event.preventDefault();
52
+ break;
53
+ }
54
+ }, [onClose, onSelectNext, onSelectPrev, onEnter]);
55
+ useEffect(() => {
56
+ document.addEventListener('keydown', handleGlobalKeyDown);
57
+ return () => {
58
+ document.removeEventListener('keydown', handleGlobalKeyDown);
59
+ };
60
+ }, [handleGlobalKeyDown]);
61
+ return {
62
+ handleModalKeyDown,
63
+ };
64
+ }
65
+ export function getShortcutText(key = 'K') {
66
+ if (typeof navigator === 'undefined') {
67
+ return `⌘${key}`;
68
+ }
69
+ const isMac = navigator.platform.toLowerCase().includes('mac');
70
+ return isMac ? `⌘${key}` : `Ctrl+${key}`;
71
+ }
@@ -0,0 +1,27 @@
1
+ import type { DocSearchSuggestion } from '../types';
2
+ export interface UseSeekoraSearchOptions {
3
+ storeId: string;
4
+ storeSecret?: string;
5
+ apiEndpoint?: string;
6
+ maxResults?: number;
7
+ debounceMs?: number;
8
+ analyticsTags?: string[];
9
+ groupField?: string;
10
+ groupSize?: number;
11
+ }
12
+ export interface UseSeekoraSearchResult {
13
+ query: string;
14
+ suggestions: DocSearchSuggestion[];
15
+ isLoading: boolean;
16
+ error: string | null;
17
+ selectedIndex: number;
18
+ setQuery: (query: string) => void;
19
+ selectNext: () => void;
20
+ selectPrev: () => void;
21
+ setSelectedIndex: (index: number) => void;
22
+ reset: () => void;
23
+ getSelectedItem: () => DocSearchSuggestion | null;
24
+ trackDocClick: (hit: DocSearchSuggestion, position: number) => void | Promise<void>;
25
+ }
26
+ export declare function useSeekoraSearch(options: UseSeekoraSearchOptions): UseSeekoraSearchResult;
27
+ //# sourceMappingURL=useSeekoraSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSeekoraSearch.d.ts","sourceRoot":"","sources":["../../../src/docsearch/hooks/useSeekoraSearch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,eAAe,EAAE,MAAM,mBAAmB,GAAG,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,GAAG,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AA0DD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAiLzF"}