@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.
- package/dist/components/Breadcrumb.d.ts +43 -0
- package/dist/components/Breadcrumb.d.ts.map +1 -0
- package/dist/components/Breadcrumb.js +119 -0
- package/dist/components/ClearRefinements.d.ts +42 -0
- package/dist/components/ClearRefinements.d.ts.map +1 -0
- package/dist/components/ClearRefinements.js +81 -0
- package/dist/components/CurrentRefinements.d.ts +63 -0
- package/dist/components/CurrentRefinements.d.ts.map +1 -0
- package/dist/components/CurrentRefinements.js +302 -0
- package/dist/components/FacetDropdown.d.ts +94 -0
- package/dist/components/FacetDropdown.d.ts.map +1 -0
- package/dist/components/FacetDropdown.js +396 -0
- package/dist/components/Facets.d.ts +118 -0
- package/dist/components/Facets.d.ts.map +1 -0
- package/dist/components/Facets.js +785 -0
- package/dist/components/FederatedDropdown.d.ts +98 -0
- package/dist/components/FederatedDropdown.d.ts.map +1 -0
- package/dist/components/FederatedDropdown.js +526 -0
- package/dist/components/HierarchicalMenu.d.ts +55 -0
- package/dist/components/HierarchicalMenu.d.ts.map +1 -0
- package/dist/components/HierarchicalMenu.js +276 -0
- package/dist/components/Highlight.d.ts +51 -0
- package/dist/components/Highlight.d.ts.map +1 -0
- package/dist/components/Highlight.js +155 -0
- package/dist/components/HitsPerPage.d.ts +41 -0
- package/dist/components/HitsPerPage.d.ts.map +1 -0
- package/dist/components/HitsPerPage.js +82 -0
- package/dist/components/InfiniteHits.d.ts +51 -0
- package/dist/components/InfiniteHits.d.ts.map +1 -0
- package/dist/components/InfiniteHits.js +173 -0
- package/dist/components/MobileFilters.d.ts +71 -0
- package/dist/components/MobileFilters.d.ts.map +1 -0
- package/dist/components/MobileFilters.js +242 -0
- package/dist/components/Pagination.d.ts +90 -0
- package/dist/components/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination.js +298 -0
- package/dist/components/QuerySuggestions.d.ts +36 -0
- package/dist/components/QuerySuggestions.d.ts.map +1 -0
- package/dist/components/QuerySuggestions.js +71 -0
- package/dist/components/QuerySuggestionsDropdown.d.ts +82 -0
- package/dist/components/QuerySuggestionsDropdown.d.ts.map +1 -0
- package/dist/components/QuerySuggestionsDropdown.js +394 -0
- package/dist/components/RangeInput.d.ts +58 -0
- package/dist/components/RangeInput.d.ts.map +1 -0
- package/dist/components/RangeInput.js +203 -0
- package/dist/components/RangeSlider.d.ts +51 -0
- package/dist/components/RangeSlider.d.ts.map +1 -0
- package/dist/components/RangeSlider.js +262 -0
- package/dist/components/Recommendations.d.ts +89 -0
- package/dist/components/Recommendations.d.ts.map +1 -0
- package/dist/components/Recommendations.js +256 -0
- package/dist/components/RichQuerySuggestions.d.ts +88 -0
- package/dist/components/RichQuerySuggestions.d.ts.map +1 -0
- package/dist/components/RichQuerySuggestions.js +498 -0
- package/dist/components/SearchBar.d.ts +57 -0
- package/dist/components/SearchBar.d.ts.map +1 -0
- package/dist/components/SearchBar.js +361 -0
- package/dist/components/SearchBarWithSuggestions.d.ts +105 -0
- package/dist/components/SearchBarWithSuggestions.d.ts.map +1 -0
- package/dist/components/SearchBarWithSuggestions.js +275 -0
- package/dist/components/SearchLayout.d.ts +35 -0
- package/dist/components/SearchLayout.d.ts.map +1 -0
- package/dist/components/SearchLayout.js +61 -0
- package/dist/components/SearchProvider.d.ts +35 -0
- package/dist/components/SearchProvider.d.ts.map +1 -0
- package/dist/components/SearchProvider.js +53 -0
- package/dist/components/SearchResults.d.ts +57 -0
- package/dist/components/SearchResults.d.ts.map +1 -0
- package/dist/components/SearchResults.js +456 -0
- package/dist/components/SortBy.d.ts +84 -0
- package/dist/components/SortBy.d.ts.map +1 -0
- package/dist/components/SortBy.js +183 -0
- package/dist/components/Stats.d.ts +51 -0
- package/dist/components/Stats.d.ts.map +1 -0
- package/dist/components/Stats.js +201 -0
- package/dist/components/primitives/ActionButtons.d.ts +27 -0
- package/dist/components/primitives/ActionButtons.d.ts.map +1 -0
- package/dist/components/primitives/ActionButtons.js +102 -0
- package/dist/components/primitives/AnalyticsProvider.d.ts +22 -0
- package/dist/components/primitives/AnalyticsProvider.d.ts.map +1 -0
- package/dist/components/primitives/AnalyticsProvider.js +87 -0
- package/dist/components/primitives/BadgeList.d.ts +14 -0
- package/dist/components/primitives/BadgeList.d.ts.map +1 -0
- package/dist/components/primitives/BadgeList.js +65 -0
- package/dist/components/primitives/CustomSelect.d.ts +40 -0
- package/dist/components/primitives/CustomSelect.d.ts.map +1 -0
- package/dist/components/primitives/CustomSelect.js +196 -0
- package/dist/components/primitives/ImageDisplay.d.ts +28 -0
- package/dist/components/primitives/ImageDisplay.d.ts.map +1 -0
- package/dist/components/primitives/ImageDisplay.js +127 -0
- package/dist/components/primitives/ImageZoom.d.ts +33 -0
- package/dist/components/primitives/ImageZoom.d.ts.map +1 -0
- package/dist/components/primitives/ImageZoom.js +433 -0
- package/dist/components/primitives/PriceDisplay.d.ts +21 -0
- package/dist/components/primitives/PriceDisplay.d.ts.map +1 -0
- package/dist/components/primitives/PriceDisplay.js +44 -0
- package/dist/components/primitives/RatingDisplay.d.ts +43 -0
- package/dist/components/primitives/RatingDisplay.d.ts.map +1 -0
- package/dist/components/primitives/RatingDisplay.js +114 -0
- package/dist/components/primitives/VariantSelector.d.ts +30 -0
- package/dist/components/primitives/VariantSelector.d.ts.map +1 -0
- package/dist/components/primitives/VariantSelector.js +155 -0
- package/dist/components/primitives/VariantSwatches.d.ts +28 -0
- package/dist/components/primitives/VariantSwatches.d.ts.map +1 -0
- package/dist/components/primitives/VariantSwatches.js +188 -0
- package/dist/components/primitives/index.d.ts +12 -0
- package/dist/components/primitives/index.d.ts.map +1 -0
- package/dist/components/primitives/index.js +11 -0
- package/dist/components/primitives/withAnalytics.d.ts +24 -0
- package/dist/components/primitives/withAnalytics.d.ts.map +1 -0
- package/dist/components/primitives/withAnalytics.js +73 -0
- package/dist/components/product-page/ProductGallery.d.ts +26 -0
- package/dist/components/product-page/ProductGallery.d.ts.map +1 -0
- package/dist/components/product-page/ProductGallery.js +13 -0
- package/dist/components/product-page/ProductInfo.d.ts +44 -0
- package/dist/components/product-page/ProductInfo.d.ts.map +1 -0
- package/dist/components/product-page/ProductInfo.js +34 -0
- package/dist/components/product-page/ProductRecommendations.d.ts +21 -0
- package/dist/components/product-page/ProductRecommendations.d.ts.map +1 -0
- package/dist/components/product-page/ProductRecommendations.js +17 -0
- package/dist/components/product-page/index.d.ts +4 -0
- package/dist/components/product-page/index.d.ts.map +1 -0
- package/dist/components/product-page/index.js +3 -0
- package/dist/components/section-primitives/SectionError.d.ts +11 -0
- package/dist/components/section-primitives/SectionError.d.ts.map +1 -0
- package/dist/components/section-primitives/SectionError.js +13 -0
- package/dist/components/section-primitives/SectionItemGrid.d.ts +18 -0
- package/dist/components/section-primitives/SectionItemGrid.d.ts.map +1 -0
- package/dist/components/section-primitives/SectionItemGrid.js +14 -0
- package/dist/components/section-primitives/SectionLoading.d.ts +11 -0
- package/dist/components/section-primitives/SectionLoading.d.ts.map +1 -0
- package/dist/components/section-primitives/SectionLoading.js +11 -0
- package/dist/components/section-primitives/SectionSearchContext.d.ts +17 -0
- package/dist/components/section-primitives/SectionSearchContext.d.ts.map +1 -0
- package/dist/components/section-primitives/SectionSearchContext.js +17 -0
- package/dist/components/section-primitives/SectionSearchProvider.d.ts +25 -0
- package/dist/components/section-primitives/SectionSearchProvider.d.ts.map +1 -0
- package/dist/components/section-primitives/SectionSearchProvider.js +106 -0
- package/dist/components/section-primitives/index.d.ts +5 -0
- package/dist/components/section-primitives/index.d.ts.map +1 -0
- package/dist/components/section-primitives/index.js +4 -0
- package/dist/components/suggestions/AmazonDropdown.d.ts +30 -0
- package/dist/components/suggestions/AmazonDropdown.d.ts.map +1 -0
- package/dist/components/suggestions/AmazonDropdown.js +509 -0
- package/dist/components/suggestions/GoogleDropdown.d.ts +31 -0
- package/dist/components/suggestions/GoogleDropdown.d.ts.map +1 -0
- package/dist/components/suggestions/GoogleDropdown.js +349 -0
- package/dist/components/suggestions/MinimalDropdown.d.ts +24 -0
- package/dist/components/suggestions/MinimalDropdown.d.ts.map +1 -0
- package/dist/components/suggestions/MinimalDropdown.js +312 -0
- package/dist/components/suggestions/MobileSheetDropdown.d.ts +31 -0
- package/dist/components/suggestions/MobileSheetDropdown.d.ts.map +1 -0
- package/dist/components/suggestions/MobileSheetDropdown.js +483 -0
- package/dist/components/suggestions/PinterestDropdown.d.ts +29 -0
- package/dist/components/suggestions/PinterestDropdown.d.ts.map +1 -0
- package/dist/components/suggestions/PinterestDropdown.js +446 -0
- package/dist/components/suggestions/ShopifyDropdown.d.ts +27 -0
- package/dist/components/suggestions/ShopifyDropdown.d.ts.map +1 -0
- package/dist/components/suggestions/ShopifyDropdown.js +448 -0
- package/dist/components/suggestions/SpotlightDropdown.d.ts +33 -0
- package/dist/components/suggestions/SpotlightDropdown.d.ts.map +1 -0
- package/dist/components/suggestions/SpotlightDropdown.js +544 -0
- package/dist/components/suggestions/SuggestionSearchBar.d.ts +127 -0
- package/dist/components/suggestions/SuggestionSearchBar.d.ts.map +1 -0
- package/dist/components/suggestions/SuggestionSearchBar.js +644 -0
- package/dist/components/suggestions/index.d.ts +37 -0
- package/dist/components/suggestions/index.d.ts.map +1 -0
- package/dist/components/suggestions/index.js +59 -0
- package/dist/components/suggestions/styles/index.d.ts +11 -0
- package/dist/components/suggestions/styles/index.d.ts.map +1 -0
- package/dist/components/suggestions/styles/index.js +289 -0
- package/dist/components/suggestions/styles/responsive.d.ts +107 -0
- package/dist/components/suggestions/styles/responsive.d.ts.map +1 -0
- package/dist/components/suggestions/styles/responsive.js +237 -0
- package/dist/components/suggestions/types.d.ts +511 -0
- package/dist/components/suggestions/types.d.ts.map +1 -0
- package/dist/components/suggestions/types.js +6 -0
- package/dist/components/suggestions/utils.d.ts +259 -0
- package/dist/components/suggestions/utils.d.ts.map +1 -0
- package/dist/components/suggestions/utils.js +668 -0
- package/dist/components/suggestions-primitives/CategoriesTabs.d.ts +13 -0
- package/dist/components/suggestions-primitives/CategoriesTabs.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/CategoriesTabs.js +35 -0
- package/dist/components/suggestions-primitives/DropdownPanel.d.ts +24 -0
- package/dist/components/suggestions-primitives/DropdownPanel.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/DropdownPanel.js +67 -0
- package/dist/components/suggestions-primitives/ItemCard.d.ts +48 -0
- package/dist/components/suggestions-primitives/ItemCard.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/ItemCard.js +103 -0
- package/dist/components/suggestions-primitives/ItemGrid.d.ts +28 -0
- package/dist/components/suggestions-primitives/ItemGrid.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/ItemGrid.js +55 -0
- package/dist/components/suggestions-primitives/ProductCard.d.ts +45 -0
- package/dist/components/suggestions-primitives/ProductCard.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/ProductCard.js +177 -0
- package/dist/components/suggestions-primitives/ProductCardLayouts.d.ts +44 -0
- package/dist/components/suggestions-primitives/ProductCardLayouts.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/ProductCardLayouts.js +137 -0
- package/dist/components/suggestions-primitives/ProductGrid.d.ts +22 -0
- package/dist/components/suggestions-primitives/ProductGrid.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/ProductGrid.js +41 -0
- package/dist/components/suggestions-primitives/RecentSearchesList.d.ts +17 -0
- package/dist/components/suggestions-primitives/RecentSearchesList.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/RecentSearchesList.js +46 -0
- package/dist/components/suggestions-primitives/SearchInput.d.ts +23 -0
- package/dist/components/suggestions-primitives/SearchInput.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SearchInput.js +114 -0
- package/dist/components/suggestions-primitives/SuggestionItem.d.ts +31 -0
- package/dist/components/suggestions-primitives/SuggestionItem.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SuggestionItem.js +47 -0
- package/dist/components/suggestions-primitives/SuggestionList.d.ts +26 -0
- package/dist/components/suggestions-primitives/SuggestionList.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SuggestionList.js +35 -0
- package/dist/components/suggestions-primitives/SuggestionsContext.d.ts +44 -0
- package/dist/components/suggestions-primitives/SuggestionsContext.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SuggestionsContext.js +18 -0
- package/dist/components/suggestions-primitives/SuggestionsDropdownComposition.d.ts +24 -0
- package/dist/components/suggestions-primitives/SuggestionsDropdownComposition.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SuggestionsDropdownComposition.js +30 -0
- package/dist/components/suggestions-primitives/SuggestionsError.d.ts +11 -0
- package/dist/components/suggestions-primitives/SuggestionsError.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SuggestionsError.js +19 -0
- package/dist/components/suggestions-primitives/SuggestionsLoading.d.ts +11 -0
- package/dist/components/suggestions-primitives/SuggestionsLoading.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SuggestionsLoading.js +17 -0
- package/dist/components/suggestions-primitives/SuggestionsProvider.d.ts +38 -0
- package/dist/components/suggestions-primitives/SuggestionsProvider.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/SuggestionsProvider.js +259 -0
- package/dist/components/suggestions-primitives/TrendingList.d.ts +17 -0
- package/dist/components/suggestions-primitives/TrendingList.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/TrendingList.js +48 -0
- package/dist/components/suggestions-primitives/highlightMarkup.d.ts +31 -0
- package/dist/components/suggestions-primitives/highlightMarkup.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/highlightMarkup.js +70 -0
- package/dist/components/suggestions-primitives/index.d.ts +39 -0
- package/dist/components/suggestions-primitives/index.d.ts.map +1 -0
- package/dist/components/suggestions-primitives/index.js +24 -0
- package/dist/docsearch/components/DocSearch.d.ts +4 -0
- package/dist/docsearch/components/DocSearch.d.ts.map +1 -0
- package/dist/docsearch/components/DocSearch.js +93 -0
- package/dist/docsearch/components/DocSearchButton.d.ts +4 -0
- package/dist/docsearch/components/DocSearchButton.d.ts.map +1 -0
- package/dist/docsearch/components/DocSearchButton.js +12 -0
- package/dist/docsearch/components/Footer.d.ts +8 -0
- package/dist/docsearch/components/Footer.d.ts.map +1 -0
- package/dist/docsearch/components/Footer.js +40 -0
- package/dist/docsearch/components/Highlight.d.ts +9 -0
- package/dist/docsearch/components/Highlight.d.ts.map +1 -0
- package/dist/docsearch/components/Highlight.js +48 -0
- package/dist/docsearch/components/Hit.d.ts +15 -0
- package/dist/docsearch/components/Hit.d.ts.map +1 -0
- package/dist/docsearch/components/Hit.js +96 -0
- package/dist/docsearch/components/Modal.d.ts +10 -0
- package/dist/docsearch/components/Modal.d.ts.map +1 -0
- package/dist/docsearch/components/Modal.js +57 -0
- package/dist/docsearch/components/Results.d.ts +23 -0
- package/dist/docsearch/components/Results.d.ts.map +1 -0
- package/dist/docsearch/components/Results.js +141 -0
- package/dist/docsearch/components/SearchBox.d.ts +11 -0
- package/dist/docsearch/components/SearchBox.d.ts.map +1 -0
- package/dist/docsearch/components/SearchBox.js +16 -0
- package/dist/docsearch/hooks/useDocSearch.d.ts +33 -0
- package/dist/docsearch/hooks/useDocSearch.d.ts.map +1 -0
- package/dist/docsearch/hooks/useDocSearch.js +224 -0
- package/dist/docsearch/hooks/useKeyboard.d.ts +17 -0
- package/dist/docsearch/hooks/useKeyboard.d.ts.map +1 -0
- package/dist/docsearch/hooks/useKeyboard.js +71 -0
- package/dist/docsearch/hooks/useSeekoraSearch.d.ts +27 -0
- package/dist/docsearch/hooks/useSeekoraSearch.d.ts.map +1 -0
- package/dist/docsearch/hooks/useSeekoraSearch.js +213 -0
- package/dist/docsearch/index.d.ts +13 -0
- package/dist/docsearch/index.d.ts.map +1 -0
- package/dist/docsearch/index.js +11 -0
- package/dist/docsearch/types.d.ts +175 -0
- package/dist/docsearch/types.d.ts.map +1 -0
- package/dist/docsearch/types.js +4 -0
- package/dist/docsearch.css +234 -0
- package/dist/hooks/useAnalytics.d.ts +24 -0
- package/dist/hooks/useAnalytics.d.ts.map +1 -0
- package/dist/hooks/useAnalytics.js +67 -0
- package/dist/hooks/useClickTracking.d.ts +36 -0
- package/dist/hooks/useClickTracking.d.ts.map +1 -0
- package/dist/hooks/useClickTracking.js +89 -0
- package/dist/hooks/useExperiment.d.ts +25 -0
- package/dist/hooks/useExperiment.d.ts.map +1 -0
- package/dist/hooks/useExperiment.js +123 -0
- package/dist/hooks/useFilters.d.ts +27 -0
- package/dist/hooks/useFilters.d.ts.map +1 -0
- package/dist/hooks/useFilters.js +86 -0
- package/dist/hooks/useKeyboardNavigation.d.ts +51 -0
- package/dist/hooks/useKeyboardNavigation.d.ts.map +1 -0
- package/dist/hooks/useKeyboardNavigation.js +113 -0
- package/dist/hooks/useNaturalLanguageFilters.d.ts +48 -0
- package/dist/hooks/useNaturalLanguageFilters.d.ts.map +1 -0
- package/dist/hooks/useNaturalLanguageFilters.js +221 -0
- package/dist/hooks/useProductAnalytics.d.ts +49 -0
- package/dist/hooks/useProductAnalytics.d.ts.map +1 -0
- package/dist/hooks/useProductAnalytics.js +116 -0
- package/dist/hooks/useQuerySuggestions.d.ts +21 -0
- package/dist/hooks/useQuerySuggestions.d.ts.map +1 -0
- package/dist/hooks/useQuerySuggestions.js +84 -0
- package/dist/hooks/useQuerySuggestionsEnhanced.d.ts +120 -0
- package/dist/hooks/useQuerySuggestionsEnhanced.d.ts.map +1 -0
- package/dist/hooks/useQuerySuggestionsEnhanced.js +444 -0
- package/dist/hooks/useSearchState.d.ts +35 -0
- package/dist/hooks/useSearchState.d.ts.map +1 -0
- package/dist/hooks/useSearchState.js +68 -0
- package/dist/hooks/useSeekoraSearch.d.ts +20 -0
- package/dist/hooks/useSeekoraSearch.d.ts.map +1 -0
- package/dist/hooks/useSeekoraSearch.js +63 -0
- package/dist/hooks/useSmartSuggestions.d.ts +55 -0
- package/dist/hooks/useSmartSuggestions.d.ts.map +1 -0
- package/dist/hooks/useSmartSuggestions.js +236 -0
- package/dist/hooks/useSuggestionsAnalytics.d.ts +93 -0
- package/dist/hooks/useSuggestionsAnalytics.d.ts.map +1 -0
- package/dist/hooks/useSuggestionsAnalytics.js +239 -0
- package/dist/hooks/useVariantSelection.d.ts +28 -0
- package/dist/hooks/useVariantSelection.d.ts.map +1 -0
- package/dist/hooks/useVariantSelection.js +44 -0
- package/dist/index.d.ts +105 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +110 -0
- package/dist/index.umd.js +1 -0
- package/dist/src/index.d.ts +4469 -0
- package/dist/src/index.esm.js +18952 -0
- package/dist/src/index.esm.js.map +1 -0
- package/dist/src/index.js +19086 -0
- package/dist/src/index.js.map +1 -0
- package/dist/themes/createTheme.d.ts +8 -0
- package/dist/themes/createTheme.d.ts.map +1 -0
- package/dist/themes/createTheme.js +10 -0
- package/dist/themes/dark.d.ts +6 -0
- package/dist/themes/dark.d.ts.map +1 -0
- package/dist/themes/dark.js +34 -0
- package/dist/themes/default.d.ts +6 -0
- package/dist/themes/default.d.ts.map +1 -0
- package/dist/themes/default.js +71 -0
- package/dist/themes/mergeThemes.d.ts +7 -0
- package/dist/themes/mergeThemes.d.ts.map +1 -0
- package/dist/themes/mergeThemes.js +6 -0
- package/dist/themes/minimal.d.ts +6 -0
- package/dist/themes/minimal.d.ts.map +1 -0
- package/dist/themes/minimal.js +34 -0
- package/dist/themes/suggestions.d.ts +216 -0
- package/dist/themes/suggestions.d.ts.map +1 -0
- package/dist/themes/suggestions.js +546 -0
- package/dist/themes/types.d.ts +7 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +6 -0
- package/dist/types/index.d.ts +33 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/utils/responsive.d.ts +130 -0
- package/dist/utils/responsive.d.ts.map +1 -0
- package/dist/utils/responsive.js +225 -0
- package/package.json +68 -0
- package/src/docsearch/docsearch.css +234 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breadcrumb Component
|
|
3
|
+
*
|
|
4
|
+
* Displays the current hierarchical navigation path
|
|
5
|
+
* Allows users to navigate back to parent categories
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
export interface BreadcrumbItem {
|
|
9
|
+
label: string;
|
|
10
|
+
value: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BreadcrumbTheme {
|
|
13
|
+
root?: string;
|
|
14
|
+
list?: string;
|
|
15
|
+
item?: string;
|
|
16
|
+
link?: string;
|
|
17
|
+
separator?: string;
|
|
18
|
+
current?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface BreadcrumbProps {
|
|
21
|
+
/** Attributes for each level of hierarchy */
|
|
22
|
+
attributes: string[];
|
|
23
|
+
/** Separator between items (default: ' > ') */
|
|
24
|
+
separator?: string;
|
|
25
|
+
/** Root label (default: 'Home') */
|
|
26
|
+
rootLabel?: string;
|
|
27
|
+
/** Custom render function for items */
|
|
28
|
+
renderItem?: (item: BreadcrumbItem, index: number, isLast: boolean) => React.ReactNode;
|
|
29
|
+
/** Custom render for separator */
|
|
30
|
+
renderSeparator?: () => React.ReactNode;
|
|
31
|
+
/** Callback when an item is clicked */
|
|
32
|
+
onNavigate?: (item: BreadcrumbItem | null, index: number) => void;
|
|
33
|
+
/** Custom className */
|
|
34
|
+
className?: string;
|
|
35
|
+
/** Custom styles */
|
|
36
|
+
style?: React.CSSProperties;
|
|
37
|
+
/** Custom theme */
|
|
38
|
+
theme?: BreadcrumbTheme;
|
|
39
|
+
/** Custom breadcrumb items (overrides automatic detection) */
|
|
40
|
+
items?: BreadcrumbItem[];
|
|
41
|
+
}
|
|
42
|
+
export declare const Breadcrumb: React.FC<BreadcrumbProps>;
|
|
43
|
+
//# sourceMappingURL=Breadcrumb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb.d.ts","sourceRoot":"","sources":["../../src/components/Breadcrumb.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA+B,MAAM,OAAO,CAAC;AAKpD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IACvF,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA0LhD,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breadcrumb Component
|
|
3
|
+
*
|
|
4
|
+
* Displays the current hierarchical navigation path
|
|
5
|
+
* Allows users to navigate back to parent categories
|
|
6
|
+
*/
|
|
7
|
+
import React, { useMemo, useCallback } from 'react';
|
|
8
|
+
import { useSearchContext } from './SearchProvider';
|
|
9
|
+
import { useSearchState } from '../hooks/useSearchState';
|
|
10
|
+
import { clsx } from 'clsx';
|
|
11
|
+
export const Breadcrumb = ({ attributes, separator = ' > ', rootLabel = 'Home', renderItem, renderSeparator, onNavigate, className, style, theme: customTheme, items: itemsProp, }) => {
|
|
12
|
+
const { theme, stateManager } = useSearchContext();
|
|
13
|
+
const { refinements, removeRefinement, clearRefinements } = useSearchState();
|
|
14
|
+
const breadcrumbTheme = customTheme || {};
|
|
15
|
+
// Build breadcrumb items from refinements
|
|
16
|
+
const items = useMemo(() => {
|
|
17
|
+
if (itemsProp)
|
|
18
|
+
return itemsProp;
|
|
19
|
+
const breadcrumbItems = [];
|
|
20
|
+
// Find hierarchical refinements
|
|
21
|
+
attributes.forEach((attr, level) => {
|
|
22
|
+
const refinement = refinements.find(r => r.field === attr);
|
|
23
|
+
if (refinement) {
|
|
24
|
+
// Parse the hierarchical value
|
|
25
|
+
const parts = refinement.value.split(separator);
|
|
26
|
+
parts.forEach((part, partIndex) => {
|
|
27
|
+
const fullPath = parts.slice(0, partIndex + 1).join(separator);
|
|
28
|
+
// Only add if not already in the list
|
|
29
|
+
if (!breadcrumbItems.some(item => item.value === fullPath)) {
|
|
30
|
+
breadcrumbItems.push({
|
|
31
|
+
label: part,
|
|
32
|
+
value: fullPath,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return breadcrumbItems;
|
|
39
|
+
}, [attributes, refinements, separator, itemsProp]);
|
|
40
|
+
// Handle click on breadcrumb item
|
|
41
|
+
const handleClick = useCallback((item, index) => {
|
|
42
|
+
if (item === null) {
|
|
43
|
+
// Clicked on root - clear all hierarchical refinements
|
|
44
|
+
attributes.forEach(attr => {
|
|
45
|
+
refinements
|
|
46
|
+
.filter(r => r.field === attr)
|
|
47
|
+
.forEach(r => removeRefinement(r.field, r.value, false));
|
|
48
|
+
});
|
|
49
|
+
stateManager.search();
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Navigate to this level - remove refinements below this level
|
|
53
|
+
const currentLevel = items.findIndex(i => i.value === item.value);
|
|
54
|
+
attributes.forEach((attr, attrLevel) => {
|
|
55
|
+
refinements
|
|
56
|
+
.filter(r => r.field === attr)
|
|
57
|
+
.forEach(r => {
|
|
58
|
+
// Remove if this is below the clicked level
|
|
59
|
+
if (attrLevel > currentLevel ||
|
|
60
|
+
(attrLevel === currentLevel && r.value !== item.value)) {
|
|
61
|
+
removeRefinement(r.field, r.value, false);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
stateManager.search();
|
|
66
|
+
}
|
|
67
|
+
if (onNavigate) {
|
|
68
|
+
onNavigate(item, index);
|
|
69
|
+
}
|
|
70
|
+
}, [attributes, refinements, removeRefinement, stateManager, items, onNavigate]);
|
|
71
|
+
// Default separator renderer
|
|
72
|
+
const defaultRenderSeparator = () => (React.createElement("span", { className: breadcrumbTheme.separator, style: {
|
|
73
|
+
margin: `0 ${theme.spacing.small}`,
|
|
74
|
+
color: theme.colors.textSecondary,
|
|
75
|
+
}, "aria-hidden": "true" }, "\u203A"));
|
|
76
|
+
// Don't render if no items
|
|
77
|
+
if (items.length === 0) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return (React.createElement("nav", { className: clsx(breadcrumbTheme.root, className), style: style, "aria-label": "Breadcrumb" },
|
|
81
|
+
React.createElement("ol", { className: breadcrumbTheme.list, style: {
|
|
82
|
+
display: 'flex',
|
|
83
|
+
flexWrap: 'wrap',
|
|
84
|
+
alignItems: 'center',
|
|
85
|
+
listStyle: 'none',
|
|
86
|
+
margin: 0,
|
|
87
|
+
padding: 0,
|
|
88
|
+
fontSize: theme.typography.fontSize.small,
|
|
89
|
+
} },
|
|
90
|
+
React.createElement("li", { className: breadcrumbTheme.item },
|
|
91
|
+
React.createElement("button", { type: "button", onClick: () => handleClick(null, -1), className: breadcrumbTheme.link, style: {
|
|
92
|
+
padding: 0,
|
|
93
|
+
background: 'none',
|
|
94
|
+
border: 'none',
|
|
95
|
+
cursor: 'pointer',
|
|
96
|
+
color: theme.colors.primary,
|
|
97
|
+
fontFamily: 'inherit',
|
|
98
|
+
fontSize: 'inherit',
|
|
99
|
+
textDecoration: 'none',
|
|
100
|
+
} }, rootLabel)),
|
|
101
|
+
items.map((item, index) => {
|
|
102
|
+
const isLast = index === items.length - 1;
|
|
103
|
+
return (React.createElement(React.Fragment, { key: item.value },
|
|
104
|
+
renderSeparator ? renderSeparator() : defaultRenderSeparator(),
|
|
105
|
+
React.createElement("li", { className: clsx(breadcrumbTheme.item, isLast && breadcrumbTheme.current) }, renderItem ? (renderItem(item, index, isLast)) : isLast ? (React.createElement("span", { style: {
|
|
106
|
+
color: theme.colors.text,
|
|
107
|
+
fontWeight: theme.typography.fontWeight?.medium || 500,
|
|
108
|
+
}, "aria-current": "page" }, item.label)) : (React.createElement("button", { type: "button", onClick: () => handleClick(item, index), className: breadcrumbTheme.link, style: {
|
|
109
|
+
padding: 0,
|
|
110
|
+
background: 'none',
|
|
111
|
+
border: 'none',
|
|
112
|
+
cursor: 'pointer',
|
|
113
|
+
color: theme.colors.primary,
|
|
114
|
+
fontFamily: 'inherit',
|
|
115
|
+
fontSize: 'inherit',
|
|
116
|
+
textDecoration: 'none',
|
|
117
|
+
} }, item.label)))));
|
|
118
|
+
}))));
|
|
119
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClearRefinements Component
|
|
3
|
+
*
|
|
4
|
+
* A standalone button to clear all active refinements/filters
|
|
5
|
+
* Integrates with SearchStateManager for automatic state sync
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
export interface ClearRefinementsTheme {
|
|
9
|
+
root?: string;
|
|
10
|
+
button?: string;
|
|
11
|
+
buttonDisabled?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ClearRefinementsProps {
|
|
14
|
+
/** Button text when there are refinements to clear */
|
|
15
|
+
clearsQuery?: boolean;
|
|
16
|
+
/** Whether clicking should also clear the search query */
|
|
17
|
+
resetLabel?: string;
|
|
18
|
+
/** Button text shown when there are no refinements */
|
|
19
|
+
disabledLabel?: string;
|
|
20
|
+
/** Fields to include (if not specified, all fields are included) */
|
|
21
|
+
includedFields?: string[];
|
|
22
|
+
/** Fields to exclude from clearing */
|
|
23
|
+
excludedFields?: string[];
|
|
24
|
+
/** Callback when refinements are cleared */
|
|
25
|
+
onClear?: () => void;
|
|
26
|
+
/** Custom render function */
|
|
27
|
+
renderButton?: (props: {
|
|
28
|
+
canClear: boolean;
|
|
29
|
+
onClick: () => void;
|
|
30
|
+
disabled: boolean;
|
|
31
|
+
}) => React.ReactNode;
|
|
32
|
+
/** Custom className */
|
|
33
|
+
className?: string;
|
|
34
|
+
/** Custom styles */
|
|
35
|
+
style?: React.CSSProperties;
|
|
36
|
+
/** Custom theme */
|
|
37
|
+
theme?: ClearRefinementsTheme;
|
|
38
|
+
/** Whether to hide when there are no refinements */
|
|
39
|
+
hideWhenEmpty?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export declare const ClearRefinements: React.FC<ClearRefinementsProps>;
|
|
42
|
+
//# sourceMappingURL=ClearRefinements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClearRefinements.d.ts","sourceRoot":"","sources":["../../src/components/ClearRefinements.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAkB,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;KACnB,KAAK,KAAK,CAAC,SAAS,CAAC;IACtB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,oDAAoD;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA0G5D,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClearRefinements Component
|
|
3
|
+
*
|
|
4
|
+
* A standalone button to clear all active refinements/filters
|
|
5
|
+
* Integrates with SearchStateManager for automatic state sync
|
|
6
|
+
*/
|
|
7
|
+
import React, { useMemo } from 'react';
|
|
8
|
+
import { useSearchContext } from './SearchProvider';
|
|
9
|
+
import { useSearchState } from '../hooks/useSearchState';
|
|
10
|
+
import { clsx } from 'clsx';
|
|
11
|
+
export const ClearRefinements = ({ clearsQuery = false, resetLabel = 'Clear all filters', disabledLabel = 'No filters applied', includedFields, excludedFields = [], onClear, renderButton, className, style, theme: customTheme, hideWhenEmpty = false, }) => {
|
|
12
|
+
const { theme } = useSearchContext();
|
|
13
|
+
const { query, refinements, clearRefinements, setQuery, removeRefinement } = useSearchState();
|
|
14
|
+
const clearTheme = customTheme || {};
|
|
15
|
+
// Filter refinements based on included/excluded fields
|
|
16
|
+
const relevantRefinements = useMemo(() => {
|
|
17
|
+
return refinements.filter(r => {
|
|
18
|
+
if (excludedFields.includes(r.field))
|
|
19
|
+
return false;
|
|
20
|
+
if (includedFields && !includedFields.includes(r.field))
|
|
21
|
+
return false;
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
}, [refinements, includedFields, excludedFields]);
|
|
25
|
+
const canClear = relevantRefinements.length > 0 || (clearsQuery && query.length > 0);
|
|
26
|
+
const handleClick = () => {
|
|
27
|
+
if (!canClear)
|
|
28
|
+
return;
|
|
29
|
+
// Clear relevant refinements
|
|
30
|
+
if (includedFields || excludedFields.length > 0) {
|
|
31
|
+
// Clear only specific refinements
|
|
32
|
+
relevantRefinements.forEach(r => {
|
|
33
|
+
removeRefinement(r.field, r.value, false);
|
|
34
|
+
});
|
|
35
|
+
// Trigger search after all removals
|
|
36
|
+
if (relevantRefinements.length > 0) {
|
|
37
|
+
clearRefinements(false); // This will trigger the search
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Clear all refinements
|
|
42
|
+
clearRefinements(!clearsQuery); // Trigger search if not also clearing query
|
|
43
|
+
}
|
|
44
|
+
// Clear query if requested
|
|
45
|
+
if (clearsQuery && query.length > 0) {
|
|
46
|
+
setQuery('', true);
|
|
47
|
+
}
|
|
48
|
+
// Call the callback
|
|
49
|
+
if (onClear) {
|
|
50
|
+
onClear();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
// Hide when empty if requested
|
|
54
|
+
if (hideWhenEmpty && !canClear) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
// Custom render function
|
|
58
|
+
if (renderButton) {
|
|
59
|
+
return (React.createElement("div", { className: clsx(clearTheme.root, className), style: style }, renderButton({
|
|
60
|
+
canClear,
|
|
61
|
+
onClick: handleClick,
|
|
62
|
+
disabled: !canClear,
|
|
63
|
+
})));
|
|
64
|
+
}
|
|
65
|
+
return (React.createElement("div", { className: clsx(clearTheme.root, className), style: style },
|
|
66
|
+
React.createElement("button", { type: "button", onClick: handleClick, disabled: !canClear, className: clsx(clearTheme.button, !canClear && clearTheme.buttonDisabled), style: {
|
|
67
|
+
padding: `${theme.spacing.small} ${theme.spacing.medium}`,
|
|
68
|
+
fontSize: theme.typography.fontSize.medium,
|
|
69
|
+
fontWeight: theme.typography.fontWeight?.medium || 500,
|
|
70
|
+
backgroundColor: theme.colors.primary,
|
|
71
|
+
color: '#ffffff',
|
|
72
|
+
border: 'none',
|
|
73
|
+
borderRadius: typeof theme.borderRadius === 'string'
|
|
74
|
+
? theme.borderRadius
|
|
75
|
+
: theme.borderRadius.medium,
|
|
76
|
+
cursor: canClear ? 'pointer' : 'default',
|
|
77
|
+
opacity: canClear ? 1 : 0,
|
|
78
|
+
pointerEvents: canClear ? 'auto' : 'none',
|
|
79
|
+
transition: 'none',
|
|
80
|
+
}, "aria-label": resetLabel }, resetLabel)));
|
|
81
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CurrentRefinements Component
|
|
3
|
+
*
|
|
4
|
+
* Displays currently active filters/refinements with ability to clear them.
|
|
5
|
+
* Supports StateManager auto-sync, display variants, layout modes, and animations.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
export interface Refinement {
|
|
9
|
+
field: string;
|
|
10
|
+
label?: string;
|
|
11
|
+
value: string;
|
|
12
|
+
displayValue?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CurrentRefinementsTheme {
|
|
15
|
+
container?: string;
|
|
16
|
+
list?: string;
|
|
17
|
+
item?: string;
|
|
18
|
+
label?: string;
|
|
19
|
+
value?: string;
|
|
20
|
+
clearButton?: string;
|
|
21
|
+
clearAllButton?: string;
|
|
22
|
+
/** Variant-specific class slots */
|
|
23
|
+
chip?: string;
|
|
24
|
+
tag?: string;
|
|
25
|
+
pill?: string;
|
|
26
|
+
badge?: string;
|
|
27
|
+
group?: string;
|
|
28
|
+
groupLabel?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Display variant for refinement items */
|
|
31
|
+
export type RefinementVariant = 'chips' | 'tags' | 'pills' | 'badges' | 'text-list';
|
|
32
|
+
/** Layout variant for the container */
|
|
33
|
+
export type RefinementLayout = 'horizontal' | 'vertical' | 'grouped';
|
|
34
|
+
export interface CurrentRefinementsProps {
|
|
35
|
+
/** Current refinements (if not provided, auto-reads from StateManager) */
|
|
36
|
+
refinements?: Refinement[];
|
|
37
|
+
/** Callback when a refinement is cleared */
|
|
38
|
+
onRefinementClear?: (field: string, value: string) => void;
|
|
39
|
+
/** Callback when all refinements are cleared */
|
|
40
|
+
onClearAll?: () => void;
|
|
41
|
+
/** Custom render function for refinement */
|
|
42
|
+
renderRefinement?: (refinement: Refinement, index: number) => React.ReactNode;
|
|
43
|
+
/** Show "Clear all" button */
|
|
44
|
+
showClearAll?: boolean;
|
|
45
|
+
/** Display variant (default: 'chips') */
|
|
46
|
+
variant?: RefinementVariant;
|
|
47
|
+
/** Layout mode (default: 'horizontal') */
|
|
48
|
+
layout?: RefinementLayout;
|
|
49
|
+
/** Per-field color mapping */
|
|
50
|
+
fieldColors?: Record<string, string>;
|
|
51
|
+
/** Custom close icon renderer */
|
|
52
|
+
renderCloseIcon?: () => React.ReactNode;
|
|
53
|
+
/** Custom className */
|
|
54
|
+
className?: string;
|
|
55
|
+
/** Custom styles */
|
|
56
|
+
style?: React.CSSProperties;
|
|
57
|
+
/** Custom theme */
|
|
58
|
+
theme?: CurrentRefinementsTheme;
|
|
59
|
+
/** Fields to exclude from display (e.g. ['category'] on collection pages) */
|
|
60
|
+
excludeFields?: string[];
|
|
61
|
+
}
|
|
62
|
+
export declare const CurrentRefinements: React.FC<CurrentRefinementsProps>;
|
|
63
|
+
//# sourceMappingURL=CurrentRefinements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurrentRefinements.d.ts","sourceRoot":"","sources":["../../src/components/CurrentRefinements.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA+C,MAAM,OAAO,CAAC;AAWpE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,2CAA2C;AAC3C,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpF,uCAAuC;AACvC,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC9E,8BAA8B;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,0CAA0C;IAC1C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iCAAiC;IACjC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,uBAAuB,CAAC;IAChC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AA0FD,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAiThE,CAAC"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CurrentRefinements Component
|
|
3
|
+
*
|
|
4
|
+
* Displays currently active filters/refinements with ability to clear them.
|
|
5
|
+
* Supports StateManager auto-sync, display variants, layout modes, and animations.
|
|
6
|
+
*/
|
|
7
|
+
import React, { useState, useEffect, useRef, useMemo } from 'react';
|
|
8
|
+
import { useSearchContext } from './SearchProvider';
|
|
9
|
+
import { useSearchState } from '../hooks/useSearchState';
|
|
10
|
+
import { clsx } from 'clsx';
|
|
11
|
+
const TRANSITIONS = {
|
|
12
|
+
fast: '150ms ease-in-out',
|
|
13
|
+
normal: '200ms ease-in-out',
|
|
14
|
+
slow: '300ms ease-in-out',
|
|
15
|
+
};
|
|
16
|
+
/** Get variant-specific styles */
|
|
17
|
+
const getVariantStyles = (variant, themeColors, themeSpacing, themeBorderRadius, fieldColor) => {
|
|
18
|
+
const baseBg = fieldColor || `var(--seekora-refinement-bg, ${themeColors.hover})`;
|
|
19
|
+
const baseColor = `var(--seekora-refinement-color, ${themeColors.text})`;
|
|
20
|
+
const baseBorder = `var(--seekora-refinement-border, ${themeColors.border})`;
|
|
21
|
+
switch (variant) {
|
|
22
|
+
case 'tags':
|
|
23
|
+
return {
|
|
24
|
+
display: 'inline-flex',
|
|
25
|
+
alignItems: 'center',
|
|
26
|
+
padding: `2px ${themeSpacing.medium}`,
|
|
27
|
+
backgroundColor: baseBg,
|
|
28
|
+
border: `1px solid ${baseBorder}`,
|
|
29
|
+
borderRadius: `var(--seekora-refinement-radius, 4px)`,
|
|
30
|
+
fontSize: '12px',
|
|
31
|
+
color: baseColor,
|
|
32
|
+
fontWeight: 500,
|
|
33
|
+
};
|
|
34
|
+
case 'pills':
|
|
35
|
+
return {
|
|
36
|
+
display: 'inline-flex',
|
|
37
|
+
alignItems: 'center',
|
|
38
|
+
padding: `${themeSpacing.small} ${themeSpacing.medium}`,
|
|
39
|
+
backgroundColor: baseBg,
|
|
40
|
+
border: 'none',
|
|
41
|
+
borderRadius: `var(--seekora-refinement-radius, 9999px)`,
|
|
42
|
+
fontSize: '13px',
|
|
43
|
+
color: baseColor,
|
|
44
|
+
};
|
|
45
|
+
case 'badges':
|
|
46
|
+
return {
|
|
47
|
+
display: 'inline-flex',
|
|
48
|
+
alignItems: 'center',
|
|
49
|
+
padding: `3px ${themeSpacing.small}`,
|
|
50
|
+
backgroundColor: themeColors.primary,
|
|
51
|
+
border: 'none',
|
|
52
|
+
borderRadius: `var(--seekora-refinement-radius, 4px)`,
|
|
53
|
+
fontSize: '11px',
|
|
54
|
+
color: '#fff',
|
|
55
|
+
fontWeight: 600,
|
|
56
|
+
textTransform: 'uppercase',
|
|
57
|
+
letterSpacing: '0.5px',
|
|
58
|
+
};
|
|
59
|
+
case 'text-list':
|
|
60
|
+
return {
|
|
61
|
+
display: 'flex',
|
|
62
|
+
alignItems: 'center',
|
|
63
|
+
padding: `${themeSpacing.small} 0`,
|
|
64
|
+
backgroundColor: 'transparent',
|
|
65
|
+
border: 'none',
|
|
66
|
+
borderBottom: `1px solid ${baseBorder}`,
|
|
67
|
+
borderRadius: '0',
|
|
68
|
+
fontSize: '14px',
|
|
69
|
+
color: baseColor,
|
|
70
|
+
};
|
|
71
|
+
case 'chips':
|
|
72
|
+
default:
|
|
73
|
+
return {
|
|
74
|
+
display: 'inline-flex',
|
|
75
|
+
alignItems: 'center',
|
|
76
|
+
padding: `${themeSpacing.small} ${themeSpacing.medium}`,
|
|
77
|
+
backgroundColor: baseBg,
|
|
78
|
+
border: `1px solid ${baseBorder}`,
|
|
79
|
+
borderRadius: `var(--seekora-refinement-radius, ${typeof themeBorderRadius === 'string' ? themeBorderRadius : themeBorderRadius.medium})`,
|
|
80
|
+
fontSize: '13px',
|
|
81
|
+
color: baseColor,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
/** Get variant-specific class name from theme */
|
|
86
|
+
const getVariantClass = (variant, refinementsTheme) => {
|
|
87
|
+
switch (variant) {
|
|
88
|
+
case 'tags': return refinementsTheme.tag;
|
|
89
|
+
case 'pills': return refinementsTheme.pill;
|
|
90
|
+
case 'badges': return refinementsTheme.badge;
|
|
91
|
+
case 'chips': return refinementsTheme.chip;
|
|
92
|
+
default: return refinementsTheme.item;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
export const CurrentRefinements = ({ refinements: refinementsProp, onRefinementClear, onClearAll, renderRefinement, showClearAll = true, variant = 'chips', layout = 'horizontal', fieldColors, renderCloseIcon, className, style, theme: customTheme, excludeFields, }) => {
|
|
96
|
+
const { theme } = useSearchContext();
|
|
97
|
+
const { refinements: stateRefinements, removeRefinement, clearRefinements } = useSearchState();
|
|
98
|
+
const refinementsTheme = customTheme || {};
|
|
99
|
+
// Format a numeric value for display (auto-detect price fields)
|
|
100
|
+
const formatRangeValue = (field, val) => {
|
|
101
|
+
const f = field.toLowerCase();
|
|
102
|
+
if (f.includes('price') || f.includes('cost') || f.includes('amount')) {
|
|
103
|
+
return `$${val.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
|
|
104
|
+
}
|
|
105
|
+
return val.toLocaleString();
|
|
106
|
+
};
|
|
107
|
+
// Create a stable serialized key from stateRefinements to detect actual changes
|
|
108
|
+
// (needed because state manager mutates the array in place)
|
|
109
|
+
const stateRefinementsKey = useMemo(() => stateRefinements.map(r => `${r.field}:${r.value}`).sort().join('|'), [stateRefinements.map(r => `${r.field}:${r.value}`).sort().join('|')]);
|
|
110
|
+
// Use props if provided, otherwise auto-read from StateManager
|
|
111
|
+
// Combines >= / <= range refinements into single formatted pills
|
|
112
|
+
const refinements = useMemo(() => {
|
|
113
|
+
if (refinementsProp !== undefined) {
|
|
114
|
+
return refinementsProp;
|
|
115
|
+
}
|
|
116
|
+
const rangeMap = new Map();
|
|
117
|
+
const nonRange = [];
|
|
118
|
+
stateRefinements.forEach(r => {
|
|
119
|
+
const minMatch = r.value.match(/^>=(\d+(?:\.\d+)?)$/);
|
|
120
|
+
const maxMatch = r.value.match(/^<=(\d+(?:\.\d+)?)$/);
|
|
121
|
+
if (minMatch || maxMatch) {
|
|
122
|
+
if (!rangeMap.has(r.field))
|
|
123
|
+
rangeMap.set(r.field, {});
|
|
124
|
+
const entry = rangeMap.get(r.field);
|
|
125
|
+
if (minMatch)
|
|
126
|
+
entry.minVal = parseFloat(minMatch[1]);
|
|
127
|
+
if (maxMatch)
|
|
128
|
+
entry.maxVal = parseFloat(maxMatch[1]);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
nonRange.push({ field: r.field, value: r.value });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
rangeMap.forEach((range, field) => {
|
|
135
|
+
let displayValue;
|
|
136
|
+
if (range.minVal !== undefined && range.maxVal !== undefined) {
|
|
137
|
+
displayValue = `${formatRangeValue(field, range.minVal)} – ${formatRangeValue(field, range.maxVal)}`;
|
|
138
|
+
}
|
|
139
|
+
else if (range.minVal !== undefined) {
|
|
140
|
+
displayValue = `≥ ${formatRangeValue(field, range.minVal)}`;
|
|
141
|
+
}
|
|
142
|
+
else if (range.maxVal !== undefined) {
|
|
143
|
+
displayValue = `≤ ${formatRangeValue(field, range.maxVal)}`;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
nonRange.push({ field, value: '__range__', displayValue });
|
|
149
|
+
});
|
|
150
|
+
const merged = nonRange;
|
|
151
|
+
if (excludeFields && excludeFields.length > 0) {
|
|
152
|
+
const excluded = new Set(excludeFields);
|
|
153
|
+
return merged.filter(r => !excluded.has(r.field));
|
|
154
|
+
}
|
|
155
|
+
return merged;
|
|
156
|
+
}, [refinementsProp, stateRefinementsKey, excludeFields]);
|
|
157
|
+
// Track items for entry/exit animations
|
|
158
|
+
const [visibleItems, setVisibleItems] = useState(new Set());
|
|
159
|
+
const [exitingItems, setExitingItems] = useState(new Set());
|
|
160
|
+
const prevRefinementsRef = useRef([]);
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
const currentKeys = new Set(refinements.map(r => `${r.field}:${r.value}`));
|
|
163
|
+
const prevKeys = new Set(prevRefinementsRef.current.map(r => `${r.field}:${r.value}`));
|
|
164
|
+
// Detect removed items for exit animation
|
|
165
|
+
const removed = new Set();
|
|
166
|
+
prevKeys.forEach(key => {
|
|
167
|
+
if (!currentKeys.has(key))
|
|
168
|
+
removed.add(key);
|
|
169
|
+
});
|
|
170
|
+
if (removed.size > 0) {
|
|
171
|
+
setExitingItems(removed);
|
|
172
|
+
// Remove after animation completes
|
|
173
|
+
setTimeout(() => setExitingItems(new Set()), 200);
|
|
174
|
+
}
|
|
175
|
+
// Mark new items for entry animation
|
|
176
|
+
setVisibleItems(currentKeys);
|
|
177
|
+
prevRefinementsRef.current = [...refinements];
|
|
178
|
+
}, [refinements]);
|
|
179
|
+
const handleClear = (field, value) => {
|
|
180
|
+
if (refinementsProp === undefined) {
|
|
181
|
+
if (value === '__range__') {
|
|
182
|
+
// Clear all range refinements for this field
|
|
183
|
+
const rangeRefs = stateRefinements.filter(r => r.field === field && (/^>=/.test(r.value) || /^<=/.test(r.value)));
|
|
184
|
+
rangeRefs.forEach((r, i) => removeRefinement(field, r.value, i === rangeRefs.length - 1));
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
removeRefinement(field, value);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (onRefinementClear) {
|
|
191
|
+
onRefinementClear(field, value);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
const handleClearAll = () => {
|
|
195
|
+
// If synced with StateManager, auto-clear all via StateManager
|
|
196
|
+
if (refinementsProp === undefined) {
|
|
197
|
+
clearRefinements();
|
|
198
|
+
}
|
|
199
|
+
if (onClearAll) {
|
|
200
|
+
onClearAll();
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
const defaultCloseIcon = () => (React.createElement("span", { "aria-hidden": "true", style: { lineHeight: 1 } }, "\u00D7"));
|
|
204
|
+
const defaultRenderRefinement = (refinement, index) => {
|
|
205
|
+
const key = `${refinement.field}:${refinement.value}`;
|
|
206
|
+
const fieldColor = fieldColors?.[refinement.field];
|
|
207
|
+
const isEntering = visibleItems.has(key) && !prevRefinementsRef.current.some(r => `${r.field}:${r.value}` === key);
|
|
208
|
+
const variantStyles = getVariantStyles(variant, theme.colors, theme.spacing, theme.borderRadius, fieldColor);
|
|
209
|
+
const variantClass = getVariantClass(variant, refinementsTheme);
|
|
210
|
+
return (React.createElement("div", { key: `${key}-${index}`, className: clsx(refinementsTheme.item, variantClass), role: "listitem", style: {
|
|
211
|
+
...variantStyles,
|
|
212
|
+
margin: layout === 'vertical'
|
|
213
|
+
? `0 0 ${theme.spacing.small} 0`
|
|
214
|
+
: `0 ${theme.spacing.small} ${theme.spacing.small} 0`,
|
|
215
|
+
transition: `all ${TRANSITIONS.normal}`,
|
|
216
|
+
opacity: exitingItems.has(key) ? 0 : 1,
|
|
217
|
+
transform: exitingItems.has(key) ? 'scale(0.8)' : 'scale(1)',
|
|
218
|
+
animation: isEntering ? 'seekoraChipIn 200ms ease-out' : undefined,
|
|
219
|
+
} },
|
|
220
|
+
variant !== 'badges' && (React.createElement("span", { className: refinementsTheme.label, style: {
|
|
221
|
+
marginRight: theme.spacing.small,
|
|
222
|
+
fontWeight: '500',
|
|
223
|
+
opacity: 0.7,
|
|
224
|
+
} },
|
|
225
|
+
refinement.label || refinement.field,
|
|
226
|
+
":")),
|
|
227
|
+
React.createElement("span", { className: refinementsTheme.value }, refinement.displayValue || refinement.value),
|
|
228
|
+
React.createElement("button", { type: "button", onClick: () => handleClear(refinement.field, refinement.value), className: refinementsTheme.clearButton, style: {
|
|
229
|
+
border: 'none',
|
|
230
|
+
backgroundColor: 'transparent',
|
|
231
|
+
color: 'inherit',
|
|
232
|
+
cursor: 'pointer',
|
|
233
|
+
fontSize: '14px',
|
|
234
|
+
padding: '0 0 0 6px',
|
|
235
|
+
display: 'flex',
|
|
236
|
+
alignItems: 'center',
|
|
237
|
+
justifyContent: 'center',
|
|
238
|
+
borderRadius: '50%',
|
|
239
|
+
transition: `opacity ${TRANSITIONS.fast}`,
|
|
240
|
+
opacity: 0.6,
|
|
241
|
+
}, "aria-label": `Clear ${refinement.label || refinement.field}: ${refinement.value}`, onMouseEnter: e => (e.currentTarget.style.opacity = '1'), onMouseLeave: e => (e.currentTarget.style.opacity = '0.6') }, renderCloseIcon ? renderCloseIcon() : defaultCloseIcon())));
|
|
242
|
+
};
|
|
243
|
+
// Group refinements by field for grouped layout
|
|
244
|
+
const groupedRefinements = layout === 'grouped'
|
|
245
|
+
? refinements.reduce((acc, r) => {
|
|
246
|
+
if (!acc[r.field])
|
|
247
|
+
acc[r.field] = [];
|
|
248
|
+
acc[r.field].push(r);
|
|
249
|
+
return acc;
|
|
250
|
+
}, {})
|
|
251
|
+
: null;
|
|
252
|
+
const containerStyles = {
|
|
253
|
+
...style,
|
|
254
|
+
// When a custom list theme is provided, make the container transparent to layout
|
|
255
|
+
// so the list div becomes the direct layout child (enables overflow scroll from parent)
|
|
256
|
+
...(refinementsTheme.list && !style?.display ? { display: 'contents' } : {}),
|
|
257
|
+
};
|
|
258
|
+
const listStyles = {
|
|
259
|
+
display: 'flex',
|
|
260
|
+
flexDirection: layout === 'vertical' ? 'column' : 'row',
|
|
261
|
+
alignItems: layout === 'vertical' ? 'flex-start' : 'center',
|
|
262
|
+
marginBottom: showClearAll && refinements.length > 0 ? theme.spacing.medium : 0,
|
|
263
|
+
// Only apply flex-wrap if no custom list theme is provided (let theme classes control wrapping)
|
|
264
|
+
...(!refinementsTheme.list ? { flexWrap: layout === 'vertical' ? 'nowrap' : 'wrap' } : {}),
|
|
265
|
+
};
|
|
266
|
+
return (React.createElement("div", { className: clsx(refinementsTheme.container, className), style: containerStyles },
|
|
267
|
+
React.createElement("style", null, `
|
|
268
|
+
@keyframes seekoraChipIn {
|
|
269
|
+
from { opacity: 0; transform: scale(0.8); }
|
|
270
|
+
to { opacity: 1; transform: scale(1); }
|
|
271
|
+
}
|
|
272
|
+
`),
|
|
273
|
+
refinements.length > 0 && (React.createElement(React.Fragment, null,
|
|
274
|
+
layout === 'grouped' && groupedRefinements ? (Object.entries(groupedRefinements).map(([field, items]) => (React.createElement("div", { key: field, className: refinementsTheme.group, style: { marginBottom: theme.spacing.medium } },
|
|
275
|
+
React.createElement("div", { className: refinementsTheme.groupLabel, style: {
|
|
276
|
+
fontSize: theme.typography.fontSize.small,
|
|
277
|
+
fontWeight: 600,
|
|
278
|
+
color: theme.colors.text,
|
|
279
|
+
marginBottom: theme.spacing.small,
|
|
280
|
+
textTransform: 'capitalize',
|
|
281
|
+
} }, items[0]?.label || field),
|
|
282
|
+
React.createElement("div", { role: "list", style: listStyles }, items.map((refinement, index) => {
|
|
283
|
+
return renderRefinement
|
|
284
|
+
? renderRefinement(refinement, index)
|
|
285
|
+
: defaultRenderRefinement(refinement, index);
|
|
286
|
+
})))))) : (React.createElement("div", { role: "list", className: refinementsTheme.list, style: listStyles }, refinements.map((refinement, index) => {
|
|
287
|
+
return renderRefinement
|
|
288
|
+
? renderRefinement(refinement, index)
|
|
289
|
+
: defaultRenderRefinement(refinement, index);
|
|
290
|
+
}))),
|
|
291
|
+
showClearAll && refinements.length > 1 && (React.createElement("button", { type: "button", onClick: handleClearAll, className: refinementsTheme.clearAllButton, style: {
|
|
292
|
+
padding: `${theme.spacing.small} ${theme.spacing.medium}`,
|
|
293
|
+
border: `1px solid ${theme.colors.border}`,
|
|
294
|
+
borderRadius: typeof theme.borderRadius === 'string' ? theme.borderRadius : theme.borderRadius.medium,
|
|
295
|
+
backgroundColor: theme.colors.background,
|
|
296
|
+
color: theme.colors.text,
|
|
297
|
+
cursor: 'pointer',
|
|
298
|
+
fontSize: theme.typography.fontSize.small,
|
|
299
|
+
textDecoration: 'underline',
|
|
300
|
+
transition: `background-color ${TRANSITIONS.fast}`,
|
|
301
|
+
} }, "Clear all filters"))))));
|
|
302
|
+
};
|