@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,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* withAnalytics – HOC that wraps any React component to inject analytics tracking
|
|
3
|
+
*/
|
|
4
|
+
import React, { useRef, useEffect, useCallback } from 'react';
|
|
5
|
+
import { log } from '@seekora-ai/ui-sdk-core';
|
|
6
|
+
export function withAnalytics(Component, config = {}) {
|
|
7
|
+
const { trackClick = true, trackImpression = false, clickEventName = 'product.click', getProductFromProps = () => null, getPositionFromProps = () => 0, } = config;
|
|
8
|
+
const displayName = Component.displayName || Component.name || 'Component';
|
|
9
|
+
const Wrapped = React.forwardRef((props, ref) => {
|
|
10
|
+
const { seekoraClient, seekoraContext, ...rest } = props;
|
|
11
|
+
const containerRef = useRef(null);
|
|
12
|
+
const impressionTrackedRef = useRef(false);
|
|
13
|
+
const product = getProductFromProps(rest);
|
|
14
|
+
const position = getPositionFromProps(rest);
|
|
15
|
+
const sendEvent = useCallback(async (eventName, metadata) => {
|
|
16
|
+
if (!seekoraClient)
|
|
17
|
+
return;
|
|
18
|
+
try {
|
|
19
|
+
await seekoraClient.trackEvent?.({
|
|
20
|
+
event_name: eventName,
|
|
21
|
+
metadata: {
|
|
22
|
+
product_id: product?.id || product?.objectID,
|
|
23
|
+
product_title: product?.title || product?.name,
|
|
24
|
+
product_price: product?.price,
|
|
25
|
+
position,
|
|
26
|
+
timestamp: Date.now(),
|
|
27
|
+
source: 'with_analytics_hoc',
|
|
28
|
+
...metadata,
|
|
29
|
+
},
|
|
30
|
+
}, seekoraContext);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
log.warn(`withAnalytics: Failed to track ${eventName}`, { error });
|
|
34
|
+
}
|
|
35
|
+
}, [seekoraClient, seekoraContext, product, position]);
|
|
36
|
+
const handleClick = useCallback(() => {
|
|
37
|
+
if (!trackClick || !product)
|
|
38
|
+
return;
|
|
39
|
+
sendEvent(clickEventName, {});
|
|
40
|
+
if (seekoraClient?.trackClick && product) {
|
|
41
|
+
Promise.resolve(seekoraClient.trackClick(product.id || product.objectID || '', position + 1, seekoraContext)).catch(() => { });
|
|
42
|
+
}
|
|
43
|
+
}, [trackClick, product, sendEvent, seekoraClient, seekoraContext, position]);
|
|
44
|
+
// Impression tracking
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (!trackImpression || !seekoraClient || !containerRef.current || impressionTrackedRef.current)
|
|
47
|
+
return;
|
|
48
|
+
if (typeof IntersectionObserver === 'undefined')
|
|
49
|
+
return;
|
|
50
|
+
const observer = new IntersectionObserver((entries) => {
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
if (entry.isIntersecting && !impressionTrackedRef.current) {
|
|
53
|
+
impressionTrackedRef.current = true;
|
|
54
|
+
sendEvent('product.impression', {});
|
|
55
|
+
observer.disconnect();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}, { threshold: 0.5 });
|
|
59
|
+
observer.observe(containerRef.current);
|
|
60
|
+
return () => observer.disconnect();
|
|
61
|
+
}, [trackImpression, seekoraClient, sendEvent]);
|
|
62
|
+
return (React.createElement("div", { ref: (node) => {
|
|
63
|
+
containerRef.current = node;
|
|
64
|
+
if (typeof ref === 'function')
|
|
65
|
+
ref(node);
|
|
66
|
+
else if (ref)
|
|
67
|
+
ref.current = node;
|
|
68
|
+
}, onClick: handleClick, style: { display: 'contents' } },
|
|
69
|
+
React.createElement(Component, { ...rest })));
|
|
70
|
+
});
|
|
71
|
+
Wrapped.displayName = `withAnalytics(${displayName})`;
|
|
72
|
+
return Wrapped;
|
|
73
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProductGallery – product detail image gallery (primitive)
|
|
3
|
+
*
|
|
4
|
+
* Uses ImageDisplay with configurable variant (carousel, thumbStrip, etc.).
|
|
5
|
+
* For use on individual product page.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { type ImageDisplayVariant } from '../primitives/ImageDisplay';
|
|
9
|
+
import type { ImageZoomMode } from '../primitives/ImageZoom';
|
|
10
|
+
export interface ProductGalleryProps {
|
|
11
|
+
images: string[];
|
|
12
|
+
variant?: ImageDisplayVariant;
|
|
13
|
+
alt?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
carouselAutoplay?: boolean;
|
|
17
|
+
carouselIntervalMs?: number;
|
|
18
|
+
/** Enable zoom functionality on product images */
|
|
19
|
+
enableZoom?: boolean;
|
|
20
|
+
/** Zoom mode: 'hover' (Amazon-style), 'lens', 'click' (lightbox), 'both' */
|
|
21
|
+
zoomMode?: ImageZoomMode;
|
|
22
|
+
/** Zoom magnification level (2 = 200%, 3 = 300%) */
|
|
23
|
+
zoomLevel?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function ProductGallery({ images, variant, alt, className, style, carouselAutoplay, carouselIntervalMs, enableZoom, zoomMode, zoomLevel, }: ProductGalleryProps): React.JSX.Element;
|
|
26
|
+
//# sourceMappingURL=ProductGallery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductGallery.d.ts","sourceRoot":"","sources":["../../../src/components/product-page/ProductGallery.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,OAAsB,EACtB,GAAe,EACf,SAAS,EACT,KAAK,EACL,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,SAAS,GACV,EAAE,mBAAmB,qBAerB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProductGallery – product detail image gallery (primitive)
|
|
3
|
+
*
|
|
4
|
+
* Uses ImageDisplay with configurable variant (carousel, thumbStrip, etc.).
|
|
5
|
+
* For use on individual product page.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { clsx } from 'clsx';
|
|
9
|
+
import { ImageDisplay } from '../primitives/ImageDisplay';
|
|
10
|
+
export function ProductGallery({ images, variant = 'thumbStrip', alt = 'Product', className, style, carouselAutoplay, carouselIntervalMs, enableZoom, zoomMode, zoomLevel, }) {
|
|
11
|
+
return (React.createElement("div", { className: clsx('seekora-product-gallery', className), style: style },
|
|
12
|
+
React.createElement(ImageDisplay, { images: images, variant: variant, alt: alt, carouselAutoplay: carouselAutoplay, carouselIntervalMs: carouselIntervalMs, enableZoom: enableZoom, zoomMode: zoomMode, zoomLevel: zoomLevel })));
|
|
13
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProductInfo – product detail block (primitive)
|
|
3
|
+
*
|
|
4
|
+
* Title, description, price, optional variant selector and CTA. Minimal layout;
|
|
5
|
+
* override with className/style. For use on individual product page.
|
|
6
|
+
*
|
|
7
|
+
* When options/variants/selections/onSelectionChange are provided and
|
|
8
|
+
* renderVariantSelector is NOT provided, renders the built-in VariantSelector.
|
|
9
|
+
* renderVariantSelector still takes priority as an override.
|
|
10
|
+
*/
|
|
11
|
+
import React from 'react';
|
|
12
|
+
import type { ProductBadge, ProductOption, ProductVariant } from '@seekora-ai/ui-sdk-types';
|
|
13
|
+
export interface ProductInfoProps {
|
|
14
|
+
title: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
price?: number | string;
|
|
17
|
+
currency?: string;
|
|
18
|
+
/** Compare/original price for strikethrough display */
|
|
19
|
+
comparePrice?: number | string;
|
|
20
|
+
/** Product brand */
|
|
21
|
+
brand?: string;
|
|
22
|
+
/** Whether product is available */
|
|
23
|
+
available?: boolean;
|
|
24
|
+
/** Badges to display */
|
|
25
|
+
badges?: ProductBadge[];
|
|
26
|
+
/** Product option axes (Color, Size, etc.) */
|
|
27
|
+
options?: ProductOption[];
|
|
28
|
+
/** Product variants */
|
|
29
|
+
variants?: ProductVariant[];
|
|
30
|
+
/** Currently selected variant */
|
|
31
|
+
selectedVariant?: ProductVariant | null;
|
|
32
|
+
/** Current option selections */
|
|
33
|
+
selections?: Record<string, string>;
|
|
34
|
+
/** Called when an option value is selected */
|
|
35
|
+
onSelectionChange?: (optionName: string, value: string) => void;
|
|
36
|
+
/** Optional variant selector override (takes priority over built-in) */
|
|
37
|
+
renderVariantSelector?: () => React.ReactNode;
|
|
38
|
+
/** Optional CTA (e.g. Add to cart) */
|
|
39
|
+
renderCTA?: () => React.ReactNode;
|
|
40
|
+
className?: string;
|
|
41
|
+
style?: React.CSSProperties;
|
|
42
|
+
}
|
|
43
|
+
export declare function ProductInfo({ title, description, price, currency, comparePrice, brand, available, badges, options, variants, selectedVariant: _selectedVariant, selections, onSelectionChange, renderVariantSelector, renderCTA, className, style, }: ProductInfoProps): React.JSX.Element;
|
|
44
|
+
//# sourceMappingURL=ProductInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductInfo.d.ts","sourceRoot":"","sources":["../../../src/components/product-page/ProductInfo.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE5F,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,iCAAiC;IACjC,eAAe,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACxC,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAC9C,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAc,EACd,YAAY,EACZ,KAAK,EACL,SAAS,EACT,MAAM,EACN,OAAO,EACP,QAAQ,EACR,eAAe,EAAE,gBAAgB,EACjC,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,KAAK,GACN,EAAE,gBAAgB,qBA2DlB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProductInfo – product detail block (primitive)
|
|
3
|
+
*
|
|
4
|
+
* Title, description, price, optional variant selector and CTA. Minimal layout;
|
|
5
|
+
* override with className/style. For use on individual product page.
|
|
6
|
+
*
|
|
7
|
+
* When options/variants/selections/onSelectionChange are provided and
|
|
8
|
+
* renderVariantSelector is NOT provided, renders the built-in VariantSelector.
|
|
9
|
+
* renderVariantSelector still takes priority as an override.
|
|
10
|
+
*/
|
|
11
|
+
import React from 'react';
|
|
12
|
+
import { clsx } from 'clsx';
|
|
13
|
+
import { PriceDisplay } from '../primitives/PriceDisplay';
|
|
14
|
+
import { BadgeList } from '../primitives/BadgeList';
|
|
15
|
+
import { VariantSelector } from '../primitives/VariantSelector';
|
|
16
|
+
export function ProductInfo({ title, description, price, currency = '$', comparePrice, brand, available, badges, options, variants, selectedVariant: _selectedVariant, selections, onSelectionChange, renderVariantSelector, renderCTA, className, style, }) {
|
|
17
|
+
const priceNum = price != null ? (typeof price === 'number' ? price : parseFloat(String(price))) : null;
|
|
18
|
+
const comparePriceNum = comparePrice != null ? (typeof comparePrice === 'number' ? comparePrice : parseFloat(String(comparePrice))) : null;
|
|
19
|
+
const showBuiltInVariantSelector = !renderVariantSelector && options && options.length > 0 && variants && selections && onSelectionChange;
|
|
20
|
+
return (React.createElement("div", { className: clsx('seekora-product-info', className), style: { display: 'flex', flexDirection: 'column', gap: 12, ...style } },
|
|
21
|
+
badges && badges.length > 0 && (React.createElement(BadgeList, { badges: badges, position: "inline" })),
|
|
22
|
+
brand && (React.createElement("span", { className: "seekora-product-info-brand", style: { fontSize: '0.8125rem', color: 'var(--seekora-text-secondary)', textTransform: 'uppercase', letterSpacing: '0.02em' } }, brand)),
|
|
23
|
+
React.createElement("h1", { className: "seekora-product-info-title", style: { fontSize: '1.25rem', fontWeight: 600, margin: 0 } }, title),
|
|
24
|
+
(priceNum != null && !Number.isNaN(priceNum)) && (React.createElement("div", { className: "seekora-product-info-price" },
|
|
25
|
+
React.createElement(PriceDisplay, { price: priceNum, comparePrice: comparePriceNum ?? undefined, currency: currency, style: { fontSize: '1.125rem' } }))),
|
|
26
|
+
available != null && (React.createElement("span", { className: "seekora-product-info-availability", style: {
|
|
27
|
+
fontSize: '0.875rem',
|
|
28
|
+
color: available ? 'var(--seekora-success, #22c55e)' : 'var(--seekora-error, #ef4444)',
|
|
29
|
+
} }, available ? 'In Stock' : 'Out of Stock')),
|
|
30
|
+
description ? (React.createElement("p", { className: "seekora-product-info-description", style: { fontSize: '0.875rem', color: 'var(--seekora-text-secondary)', margin: 0, lineHeight: 1.5 } }, description)) : null,
|
|
31
|
+
renderVariantSelector ? renderVariantSelector() : null,
|
|
32
|
+
showBuiltInVariantSelector && (React.createElement(VariantSelector, { options: options, variants: variants, selections: selections, onSelectionChange: onSelectionChange, showAvailability: true })),
|
|
33
|
+
renderCTA?.()));
|
|
34
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProductRecommendations – related / frequently bought (primitive)
|
|
3
|
+
*
|
|
4
|
+
* Renders a section of recommended items (generic ItemGrid or product list).
|
|
5
|
+
* Pass items and onItemClick; or wrap SectionSearchProvider with preset query for "related".
|
|
6
|
+
* For use on individual product page.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import type { GenericItem } from '../suggestions-primitives/ItemCard';
|
|
10
|
+
export interface ProductRecommendationsProps {
|
|
11
|
+
title?: string;
|
|
12
|
+
items: GenericItem[] | unknown[];
|
|
13
|
+
onItemClick?: (item: unknown, index: number) => void;
|
|
14
|
+
maxItems?: number;
|
|
15
|
+
columns?: number;
|
|
16
|
+
className?: string;
|
|
17
|
+
style?: React.CSSProperties;
|
|
18
|
+
renderItem?: (item: unknown, index: number) => React.ReactNode;
|
|
19
|
+
}
|
|
20
|
+
export declare function ProductRecommendations({ title, items, onItemClick, maxItems, columns, className, style, renderItem, }: ProductRecommendationsProps): React.JSX.Element | null;
|
|
21
|
+
//# sourceMappingURL=ProductRecommendations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductRecommendations.d.ts","sourceRoot":"","sources":["../../../src/components/product-page/ProductRecommendations.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CAChE;AAED,wBAAgB,sBAAsB,CAAC,EACrC,KAA2B,EAC3B,KAAK,EACL,WAAW,EACX,QAAY,EACZ,OAAW,EACX,SAAS,EACT,KAAK,EACL,UAAU,GACX,EAAE,2BAA2B,4BAiB7B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProductRecommendations – related / frequently bought (primitive)
|
|
3
|
+
*
|
|
4
|
+
* Renders a section of recommended items (generic ItemGrid or product list).
|
|
5
|
+
* Pass items and onItemClick; or wrap SectionSearchProvider with preset query for "related".
|
|
6
|
+
* For use on individual product page.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { clsx } from 'clsx';
|
|
10
|
+
import { ItemGrid } from '../suggestions-primitives/ItemGrid';
|
|
11
|
+
export function ProductRecommendations({ title = 'You may also like', items, onItemClick, maxItems = 6, columns = 3, className, style, renderItem, }) {
|
|
12
|
+
if (!items?.length)
|
|
13
|
+
return null;
|
|
14
|
+
return (React.createElement("div", { className: clsx('seekora-product-recommendations', className), style: style },
|
|
15
|
+
React.createElement("h2", { className: "seekora-product-recommendations-title", style: { fontSize: '1rem', fontWeight: 600, marginBottom: 12 } }, title),
|
|
16
|
+
React.createElement(ItemGrid, { items: items, maxItems: maxItems, columns: columns, onItemClick: onItemClick, renderItem: renderItem })));
|
|
17
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ProductGallery, type ProductGalleryProps } from './ProductGallery';
|
|
2
|
+
export { ProductInfo, type ProductInfoProps } from './ProductInfo';
|
|
3
|
+
export { ProductRecommendations, type ProductRecommendationsProps } from './ProductRecommendations';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/product-page/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,KAAK,2BAA2B,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionError – error state for section (primitive)
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export interface SectionErrorProps {
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
render?: (error: Error) => React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function SectionError({ className, style, render }: SectionErrorProps): React.JSX.Element | null;
|
|
11
|
+
//# sourceMappingURL=SectionError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionError.d.ts","sourceRoot":"","sources":["../../../src/components/section-primitives/SectionError.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,SAAS,CAAC;CAC5C;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,iBAAiB,4BAS3E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionError – error state for section (primitive)
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { useSectionSearchContext } from './SectionSearchContext';
|
|
6
|
+
export function SectionError({ className, style, render }) {
|
|
7
|
+
const { error } = useSectionSearchContext();
|
|
8
|
+
if (!error)
|
|
9
|
+
return null;
|
|
10
|
+
if (render)
|
|
11
|
+
return React.createElement(React.Fragment, null, render(error));
|
|
12
|
+
return (React.createElement("div", { className: className, style: { padding: 16, color: 'var(--seekora-error,#dc2626)', fontSize: '0.875rem', ...style } }, error.message));
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionItemGrid – generic grid of items from SectionSearchProvider (primitive)
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export interface SectionItemGridProps {
|
|
6
|
+
columns?: number;
|
|
7
|
+
maxItems?: number;
|
|
8
|
+
className?: string;
|
|
9
|
+
style?: React.CSSProperties;
|
|
10
|
+
getItemId?: (item: unknown) => string;
|
|
11
|
+
getItemTitle?: (item: unknown) => string;
|
|
12
|
+
getItemImage?: (item: unknown) => string | undefined;
|
|
13
|
+
getItemDescription?: (item: unknown) => string | undefined;
|
|
14
|
+
getItemUrl?: (item: unknown) => string | undefined;
|
|
15
|
+
renderItem?: (item: unknown, index: number) => React.ReactNode;
|
|
16
|
+
}
|
|
17
|
+
export declare function SectionItemGrid({ columns, maxItems, className, style, getItemId, getItemTitle, getItemImage, getItemDescription, getItemUrl, renderItem, }: SectionItemGridProps): React.JSX.Element;
|
|
18
|
+
//# sourceMappingURL=SectionItemGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionItemGrid.d.ts","sourceRoot":"","sources":["../../../src/components/section-primitives/SectionItemGrid.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CAChE;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAW,EACX,QAAa,EACb,SAAS,EACT,KAAK,EACL,SAA8E,EAC9E,YAAyE,EACzE,YAAmE,EACnE,kBAAqF,EACrF,UAA6D,EAC7D,UAAU,GACX,EAAE,oBAAoB,qBAsBtB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionItemGrid – generic grid of items from SectionSearchProvider (primitive)
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { useSectionSearchContext } from './SectionSearchContext';
|
|
6
|
+
import { ItemGrid } from '../suggestions-primitives/ItemGrid';
|
|
7
|
+
import { SectionError } from './SectionError';
|
|
8
|
+
export function SectionItemGrid({ columns = 4, maxItems = 12, className, style, getItemId = (i) => i.id ?? String(i?.objectID ?? ''), getItemTitle = (i) => i.title ?? i?.title ?? '', getItemImage = (i) => i.image ?? i?.image, getItemDescription = (i) => i.description ?? i?.description, getItemUrl = (i) => i.url ?? i?.url, renderItem, }) {
|
|
9
|
+
const { items, loading, error, trackClick } = useSectionSearchContext();
|
|
10
|
+
if (error)
|
|
11
|
+
return React.createElement(SectionError, { className: className, style: style });
|
|
12
|
+
// When loading with previous items, show them (no loading screen)
|
|
13
|
+
return (React.createElement(ItemGrid, { items: items, maxItems: maxItems, columns: columns, className: className, style: style, getItemId: getItemId, getItemTitle: getItemTitle, getItemImage: getItemImage, getItemDescription: getItemDescription, getItemUrl: getItemUrl, renderItem: renderItem, onItemClick: (item, index) => trackClick(item, index) }));
|
|
14
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionLoading – loading state for section (primitive)
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export interface SectionLoadingProps {
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
text?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function SectionLoading({ className, style, text }: SectionLoadingProps): React.JSX.Element | null;
|
|
11
|
+
//# sourceMappingURL=SectionLoading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionLoading.d.ts","sourceRoot":"","sources":["../../../src/components/section-primitives/SectionLoading.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE,mBAAmB,4BAQ5F"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionLoading – loading state for section (primitive)
|
|
3
|
+
*/
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { useSectionSearchContext } from './SectionSearchContext';
|
|
6
|
+
export function SectionLoading({ className, style, text = 'Loading...' }) {
|
|
7
|
+
const { loading } = useSectionSearchContext();
|
|
8
|
+
if (!loading)
|
|
9
|
+
return null;
|
|
10
|
+
return (React.createElement("div", { className: className, style: { padding: 16, color: 'var(--seekora-text-secondary)', fontSize: '0.875rem', ...style } }, text));
|
|
11
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionSearchContext – preset query/filter section state
|
|
3
|
+
*
|
|
4
|
+
* For menus, sidebar, front-page blocks. Independent of main search state.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export interface SectionSearchContextValue {
|
|
8
|
+
items: unknown[];
|
|
9
|
+
loading: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
totalCount: number;
|
|
12
|
+
sectionId?: string;
|
|
13
|
+
trackClick: (item: unknown, position: number) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare const SectionSearchContext: React.Context<SectionSearchContextValue | null>;
|
|
16
|
+
export declare function useSectionSearchContext(): SectionSearchContextValue;
|
|
17
|
+
//# sourceMappingURL=SectionSearchContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionSearchContext.d.ts","sourceRoot":"","sources":["../../../src/components/section-primitives/SectionSearchContext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAoC,MAAM,OAAO,CAAC;AAGzD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,eAAO,MAAM,oBAAoB,iDAAwD,CAAC;AAE1F,wBAAgB,uBAAuB,IAAI,yBAAyB,CAQnE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionSearchContext – preset query/filter section state
|
|
3
|
+
*
|
|
4
|
+
* For menus, sidebar, front-page blocks. Independent of main search state.
|
|
5
|
+
*/
|
|
6
|
+
import { createContext, useContext } from 'react';
|
|
7
|
+
import { log } from '@seekora-ai/ui-sdk-core';
|
|
8
|
+
export const SectionSearchContext = createContext(null);
|
|
9
|
+
export function useSectionSearchContext() {
|
|
10
|
+
const context = useContext(SectionSearchContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
const error = new Error('useSectionSearchContext must be used within a SectionSearchProvider');
|
|
13
|
+
log.error('SectionSearchContext: not available', { error: error.message });
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
return context;
|
|
17
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionSearchProvider – preset query + filter section
|
|
3
|
+
*
|
|
4
|
+
* Runs client.search(query, { refinements, hitsPerPage, sortBy }) on mount and when
|
|
5
|
+
* query/filters change. Does not use global SearchStateManager. Use for menus,
|
|
6
|
+
* sidebar, front-page blocks (e.g. "New arrivals", "On sale").
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
export interface RefinementInput {
|
|
10
|
+
field: string;
|
|
11
|
+
value: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SectionSearchProviderProps {
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
query: string;
|
|
16
|
+
refinements?: RefinementInput[];
|
|
17
|
+
maxItems?: number;
|
|
18
|
+
sortBy?: string;
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
sectionId?: string;
|
|
21
|
+
/** Additional search options merged into the request (e.g. { widget_mode: false }). */
|
|
22
|
+
searchOptions?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export declare function SectionSearchProvider({ children, query, refinements, maxItems, sortBy, enabled, sectionId, searchOptions, }: SectionSearchProviderProps): React.JSX.Element;
|
|
25
|
+
//# sourceMappingURL=SectionSearchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionSearchProvider.d.ts","sourceRoot":"","sources":["../../../src/components/section-primitives/SectionSearchProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AAIzE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAsBD,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,KAAK,EACL,WAAgB,EAChB,QAAa,EACb,MAAM,EACN,OAAc,EACd,SAAS,EACT,aAAa,GACd,EAAE,0BAA0B,qBAiF5B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SectionSearchProvider – preset query + filter section
|
|
3
|
+
*
|
|
4
|
+
* Runs client.search(query, { refinements, hitsPerPage, sortBy }) on mount and when
|
|
5
|
+
* query/filters change. Does not use global SearchStateManager. Use for menus,
|
|
6
|
+
* sidebar, front-page blocks (e.g. "New arrivals", "On sale").
|
|
7
|
+
*/
|
|
8
|
+
import React, { useState, useEffect, useCallback, useMemo } from 'react';
|
|
9
|
+
import { useSearchContext } from '../SearchProvider';
|
|
10
|
+
import { SectionSearchContext } from './SectionSearchContext';
|
|
11
|
+
function extractItems(response) {
|
|
12
|
+
if (!response)
|
|
13
|
+
return [];
|
|
14
|
+
if (Array.isArray(response.results))
|
|
15
|
+
return response.results;
|
|
16
|
+
if (Array.isArray(response.hits))
|
|
17
|
+
return response.hits;
|
|
18
|
+
const data = response.data;
|
|
19
|
+
if (data && Array.isArray(data.results))
|
|
20
|
+
return data.results;
|
|
21
|
+
if (data && Array.isArray(data.data))
|
|
22
|
+
return data.data;
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
function extractTotal(response) {
|
|
26
|
+
if (!response)
|
|
27
|
+
return 0;
|
|
28
|
+
const n = response.totalResults ?? response.total ?? response.total_results;
|
|
29
|
+
if (typeof n === 'number')
|
|
30
|
+
return n;
|
|
31
|
+
const data = response.data;
|
|
32
|
+
if (data?.total_results != null)
|
|
33
|
+
return Number(data.total_results);
|
|
34
|
+
if (data?.data?.total_results != null)
|
|
35
|
+
return Number(data.data.total_results);
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
export function SectionSearchProvider({ children, query, refinements = [], maxItems = 12, sortBy, enabled = true, sectionId, searchOptions, }) {
|
|
39
|
+
const { client } = useSearchContext();
|
|
40
|
+
const [items, setItems] = useState([]);
|
|
41
|
+
const [loading, setLoading] = useState(true);
|
|
42
|
+
const [error, setError] = useState(null);
|
|
43
|
+
const [totalCount, setTotalCount] = useState(0);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!enabled || !client?.search) {
|
|
46
|
+
setItems([]);
|
|
47
|
+
setLoading(false);
|
|
48
|
+
setError(null);
|
|
49
|
+
setTotalCount(0);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
let cancelled = false;
|
|
53
|
+
setLoading(true);
|
|
54
|
+
setError(null);
|
|
55
|
+
const options = {
|
|
56
|
+
...searchOptions,
|
|
57
|
+
per_page: maxItems,
|
|
58
|
+
page: 1,
|
|
59
|
+
};
|
|
60
|
+
if (sortBy)
|
|
61
|
+
options.sort_by = sortBy;
|
|
62
|
+
if (refinements.length > 0) {
|
|
63
|
+
options.filter_by = refinements.map((r) => `${r.field}:${r.value}`).join(',');
|
|
64
|
+
}
|
|
65
|
+
client
|
|
66
|
+
.search(query, options)
|
|
67
|
+
.then((response) => {
|
|
68
|
+
if (cancelled)
|
|
69
|
+
return;
|
|
70
|
+
setItems(extractItems(response));
|
|
71
|
+
setTotalCount(extractTotal(response));
|
|
72
|
+
setLoading(false);
|
|
73
|
+
})
|
|
74
|
+
.catch((err) => {
|
|
75
|
+
if (cancelled)
|
|
76
|
+
return;
|
|
77
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
78
|
+
setItems([]);
|
|
79
|
+
setLoading(false);
|
|
80
|
+
});
|
|
81
|
+
return () => {
|
|
82
|
+
cancelled = true;
|
|
83
|
+
};
|
|
84
|
+
}, [client, enabled, query, maxItems, sortBy, refinements, searchOptions]);
|
|
85
|
+
const trackClick = useCallback((item, position) => {
|
|
86
|
+
if (!client?.trackEvent)
|
|
87
|
+
return;
|
|
88
|
+
const id = item?.id ?? item?.objectID;
|
|
89
|
+
client.trackEvent({
|
|
90
|
+
event_name: 'section_result_click',
|
|
91
|
+
clicked_item_id: id,
|
|
92
|
+
position,
|
|
93
|
+
section: sectionId,
|
|
94
|
+
metadata: { section_id: sectionId },
|
|
95
|
+
}, undefined);
|
|
96
|
+
}, [client, sectionId]);
|
|
97
|
+
const value = useMemo(() => ({
|
|
98
|
+
items,
|
|
99
|
+
loading,
|
|
100
|
+
error,
|
|
101
|
+
totalCount,
|
|
102
|
+
sectionId,
|
|
103
|
+
trackClick,
|
|
104
|
+
}), [items, loading, error, totalCount, sectionId, trackClick]);
|
|
105
|
+
return React.createElement(SectionSearchContext.Provider, { value: value }, children);
|
|
106
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { SectionSearchProvider, type RefinementInput, type SectionSearchProviderProps } from './SectionSearchProvider';
|
|
2
|
+
export { SectionSearchContext, useSectionSearchContext, type SectionSearchContextValue } from './SectionSearchContext';
|
|
3
|
+
export { SectionItemGrid, type SectionItemGridProps } from './SectionItemGrid';
|
|
4
|
+
export { SectionError, type SectionErrorProps } from './SectionError';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/section-primitives/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,KAAK,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACvH,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACvH,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AmazonDropdown - Amazon-style Search Suggestions
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Department/category scoping in search
|
|
6
|
+
* - Suggestions with category context
|
|
7
|
+
* - Product grid with images
|
|
8
|
+
* - "in Department" suffix for scoped searches
|
|
9
|
+
* - Clean, functional design
|
|
10
|
+
*/
|
|
11
|
+
import React from 'react';
|
|
12
|
+
import type { BaseDropdownProps, DropdownRef } from './types';
|
|
13
|
+
export interface AmazonDropdownProps extends BaseDropdownProps {
|
|
14
|
+
/** Show department scoping in suggestions */
|
|
15
|
+
showDepartments?: boolean;
|
|
16
|
+
/** Current department filter */
|
|
17
|
+
currentDepartment?: string;
|
|
18
|
+
/** Available departments */
|
|
19
|
+
departments?: Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
}>;
|
|
23
|
+
/** Show Prime badge */
|
|
24
|
+
showPrime?: boolean;
|
|
25
|
+
/** Prime icon URL */
|
|
26
|
+
primeIconUrl?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const AmazonDropdown: React.ForwardRefExoticComponent<AmazonDropdownProps & React.RefAttributes<DropdownRef>>;
|
|
29
|
+
export default AmazonDropdown;
|
|
30
|
+
//# sourceMappingURL=AmazonDropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AmazonDropdown.d.ts","sourceRoot":"","sources":["../../../src/components/suggestions/AmazonDropdown.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAkU9D,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gCAAgC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,uBAAuB;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,yFAsc1B,CAAC;AAEF,eAAe,cAAc,CAAC"}
|