@seekora-ai/ui-sdk-react 0.2.14 → 0.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/components/CurrentRefinements.d.ts.map +1 -1
  2. package/dist/components/CurrentRefinements.js +69 -9
  3. package/dist/components/FacetDropdown.d.ts +94 -0
  4. package/dist/components/FacetDropdown.d.ts.map +1 -0
  5. package/dist/components/FacetDropdown.js +396 -0
  6. package/dist/components/Facets.d.ts +30 -0
  7. package/dist/components/Facets.d.ts.map +1 -1
  8. package/dist/components/Facets.js +215 -7
  9. package/dist/components/FederatedDropdown.d.ts.map +1 -1
  10. package/dist/components/FederatedDropdown.js +45 -31
  11. package/dist/components/InfiniteHits.d.ts +0 -7
  12. package/dist/components/InfiniteHits.d.ts.map +1 -1
  13. package/dist/components/InfiniteHits.js +2 -13
  14. package/dist/components/Pagination.d.ts.map +1 -1
  15. package/dist/components/Pagination.js +27 -9
  16. package/dist/components/QuerySuggestions.d.ts +0 -4
  17. package/dist/components/QuerySuggestions.d.ts.map +1 -1
  18. package/dist/components/QuerySuggestions.js +1 -17
  19. package/dist/components/QuerySuggestionsDropdown.d.ts +0 -4
  20. package/dist/components/QuerySuggestionsDropdown.d.ts.map +1 -1
  21. package/dist/components/QuerySuggestionsDropdown.js +32 -33
  22. package/dist/components/RangeInput.d.ts.map +1 -1
  23. package/dist/components/RangeInput.js +6 -6
  24. package/dist/components/RangeSlider.d.ts.map +1 -1
  25. package/dist/components/RangeSlider.js +54 -32
  26. package/dist/components/Recommendations.d.ts +0 -7
  27. package/dist/components/Recommendations.d.ts.map +1 -1
  28. package/dist/components/Recommendations.js +3 -23
  29. package/dist/components/RichQuerySuggestions.d.ts +0 -4
  30. package/dist/components/RichQuerySuggestions.d.ts.map +1 -1
  31. package/dist/components/RichQuerySuggestions.js +40 -35
  32. package/dist/components/SearchBar.d.ts +0 -4
  33. package/dist/components/SearchBar.d.ts.map +1 -1
  34. package/dist/components/SearchBar.js +17 -11
  35. package/dist/components/SearchBarWithSuggestions.js +4 -4
  36. package/dist/components/SearchLayout.d.ts.map +1 -1
  37. package/dist/components/SearchLayout.js +22 -17
  38. package/dist/components/SearchProvider.d.ts.map +1 -1
  39. package/dist/components/SearchProvider.js +1 -3
  40. package/dist/components/SearchResults.d.ts +0 -6
  41. package/dist/components/SearchResults.d.ts.map +1 -1
  42. package/dist/components/SearchResults.js +38 -39
  43. package/dist/components/primitives/ActionButtons.d.ts.map +1 -1
  44. package/dist/components/primitives/ActionButtons.js +34 -10
  45. package/dist/components/primitives/BadgeList.d.ts.map +1 -1
  46. package/dist/components/primitives/BadgeList.js +33 -13
  47. package/dist/components/primitives/ImageDisplay.d.ts.map +1 -1
  48. package/dist/components/primitives/ImageDisplay.js +32 -19
  49. package/dist/components/primitives/ImageZoom.d.ts.map +1 -1
  50. package/dist/components/primitives/ImageZoom.js +85 -30
  51. package/dist/components/primitives/VariantSelector.js +10 -10
  52. package/dist/components/primitives/VariantSwatches.d.ts.map +1 -1
  53. package/dist/components/primitives/VariantSwatches.js +28 -13
  54. package/dist/components/product-page/ProductGallery.d.ts +8 -1
  55. package/dist/components/product-page/ProductGallery.d.ts.map +1 -1
  56. package/dist/components/product-page/ProductGallery.js +2 -2
  57. package/dist/components/section-primitives/SectionItemGrid.d.ts +1 -3
  58. package/dist/components/section-primitives/SectionItemGrid.d.ts.map +1 -1
  59. package/dist/components/section-primitives/SectionItemGrid.js +1 -4
  60. package/dist/components/section-primitives/SectionSearchProvider.d.ts +3 -1
  61. package/dist/components/section-primitives/SectionSearchProvider.d.ts.map +1 -1
  62. package/dist/components/section-primitives/SectionSearchProvider.js +3 -2
  63. package/dist/components/section-primitives/index.d.ts +0 -1
  64. package/dist/components/section-primitives/index.d.ts.map +1 -1
  65. package/dist/components/section-primitives/index.js +0 -1
  66. package/dist/components/suggestions/AmazonDropdown.d.ts.map +1 -1
  67. package/dist/components/suggestions/AmazonDropdown.js +3 -21
  68. package/dist/components/suggestions/GoogleDropdown.d.ts.map +1 -1
  69. package/dist/components/suggestions/GoogleDropdown.js +3 -20
  70. package/dist/components/suggestions/MinimalDropdown.d.ts.map +1 -1
  71. package/dist/components/suggestions/MinimalDropdown.js +2 -2
  72. package/dist/components/suggestions/MobileSheetDropdown.d.ts.map +1 -1
  73. package/dist/components/suggestions/MobileSheetDropdown.js +78 -78
  74. package/dist/components/suggestions/PinterestDropdown.d.ts.map +1 -1
  75. package/dist/components/suggestions/PinterestDropdown.js +41 -41
  76. package/dist/components/suggestions/ShopifyDropdown.d.ts.map +1 -1
  77. package/dist/components/suggestions/ShopifyDropdown.js +40 -41
  78. package/dist/components/suggestions/SpotlightDropdown.d.ts.map +1 -1
  79. package/dist/components/suggestions/SpotlightDropdown.js +2 -3
  80. package/dist/components/suggestions/SuggestionSearchBar.d.ts.map +1 -1
  81. package/dist/components/suggestions/SuggestionSearchBar.js +2 -15
  82. package/dist/components/suggestions/types.d.ts +0 -6
  83. package/dist/components/suggestions/types.d.ts.map +1 -1
  84. package/dist/components/suggestions-primitives/DropdownPanel.d.ts.map +1 -1
  85. package/dist/components/suggestions-primitives/DropdownPanel.js +15 -2
  86. package/dist/components/suggestions-primitives/ItemCard.d.ts.map +1 -1
  87. package/dist/components/suggestions-primitives/ItemCard.js +48 -11
  88. package/dist/components/suggestions-primitives/ItemGrid.d.ts.map +1 -1
  89. package/dist/components/suggestions-primitives/ItemGrid.js +18 -5
  90. package/dist/components/suggestions-primitives/ProductCard.d.ts.map +1 -1
  91. package/dist/components/suggestions-primitives/ProductCard.js +36 -12
  92. package/dist/components/suggestions-primitives/ProductCardLayouts.d.ts.map +1 -1
  93. package/dist/components/suggestions-primitives/ProductCardLayouts.js +52 -20
  94. package/dist/components/suggestions-primitives/ProductGrid.d.ts.map +1 -1
  95. package/dist/components/suggestions-primitives/ProductGrid.js +8 -3
  96. package/dist/components/suggestions-primitives/RecentSearchesList.d.ts.map +1 -1
  97. package/dist/components/suggestions-primitives/RecentSearchesList.js +12 -5
  98. package/dist/components/suggestions-primitives/SearchInput.d.ts.map +1 -1
  99. package/dist/components/suggestions-primitives/SearchInput.js +29 -10
  100. package/dist/components/suggestions-primitives/SuggestionItem.d.ts.map +1 -1
  101. package/dist/components/suggestions-primitives/SuggestionItem.js +8 -3
  102. package/dist/components/suggestions-primitives/SuggestionList.d.ts +1 -8
  103. package/dist/components/suggestions-primitives/SuggestionList.d.ts.map +1 -1
  104. package/dist/components/suggestions-primitives/SuggestionList.js +1 -7
  105. package/dist/components/suggestions-primitives/TrendingList.d.ts.map +1 -1
  106. package/dist/components/suggestions-primitives/TrendingList.js +14 -7
  107. package/dist/components/suggestions-primitives/index.d.ts +1 -3
  108. package/dist/components/suggestions-primitives/index.d.ts.map +1 -1
  109. package/dist/components/suggestions-primitives/index.js +1 -2
  110. package/dist/docsearch/components/DocSearch.d.ts.map +1 -1
  111. package/dist/docsearch/components/DocSearch.js +1 -1
  112. package/dist/docsearch/components/Results.d.ts +1 -3
  113. package/dist/docsearch/components/Results.d.ts.map +1 -1
  114. package/dist/docsearch/components/Results.js +1 -9
  115. package/dist/docsearch/components/SearchBox.d.ts +1 -2
  116. package/dist/docsearch/components/SearchBox.d.ts.map +1 -1
  117. package/dist/docsearch/components/SearchBox.js +4 -6
  118. package/dist/docsearch/hooks/useSeekoraSearch.d.ts.map +1 -1
  119. package/dist/docsearch/hooks/useSeekoraSearch.js +6 -0
  120. package/dist/docsearch/types.d.ts +0 -1
  121. package/dist/docsearch/types.d.ts.map +1 -1
  122. package/dist/docsearch.css +2 -5
  123. package/dist/hooks/useClickTracking.d.ts.map +1 -1
  124. package/dist/hooks/useClickTracking.js +4 -11
  125. package/dist/hooks/useExperiment.d.ts.map +1 -1
  126. package/dist/hooks/useExperiment.js +10 -33
  127. package/dist/hooks/useFilters.d.ts +27 -0
  128. package/dist/hooks/useFilters.d.ts.map +1 -0
  129. package/dist/hooks/useFilters.js +66 -0
  130. package/dist/index.d.ts +10 -5
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +4 -2
  133. package/dist/index.umd.js +1 -1
  134. package/dist/src/index.d.ts +166 -81
  135. package/dist/src/index.esm.js +2141 -1048
  136. package/dist/src/index.esm.js.map +1 -1
  137. package/dist/src/index.js +2142 -1049
  138. package/dist/src/index.js.map +1 -1
  139. package/dist/utils/responsive.d.ts +130 -0
  140. package/dist/utils/responsive.d.ts.map +1 -0
  141. package/dist/utils/responsive.js +231 -0
  142. package/package.json +7 -7
  143. package/src/docsearch/docsearch.css +2 -5
@@ -21,7 +21,6 @@ export interface RecommendationTheme {
21
21
  content?: string;
22
22
  name?: string;
23
23
  price?: string;
24
- loading?: string;
25
24
  empty?: string;
26
25
  }
27
26
  interface BaseRecommendationProps {
@@ -51,8 +50,6 @@ export interface RelatedProductsProps extends BaseRecommendationProps {
51
50
  items?: RecommendationItem[];
52
51
  /** Loading state */
53
52
  loading?: boolean;
54
- /** Show loading state when fetching and no previous items (default false: show previous results until new render) */
55
- showLoadingState?: boolean;
56
53
  }
57
54
  export declare const RelatedProducts: React.FC<RelatedProductsProps>;
58
55
  export interface TrendingItemsProps extends BaseRecommendationProps {
@@ -60,8 +57,6 @@ export interface TrendingItemsProps extends BaseRecommendationProps {
60
57
  items?: RecommendationItem[];
61
58
  /** Loading state */
62
59
  loading?: boolean;
63
- /** Show loading state when fetching and no previous items (default false: show previous results until new render) */
64
- showLoadingState?: boolean;
65
60
  /** Facet name for trending (if using facet data) */
66
61
  facetName?: string;
67
62
  }
@@ -73,8 +68,6 @@ export interface FrequentlyBoughtTogetherProps extends BaseRecommendationProps {
73
68
  items?: RecommendationItem[];
74
69
  /** Loading state */
75
70
  loading?: boolean;
76
- /** Show loading state when fetching and no previous items (default false: show previous results until new render) */
77
- showLoadingState?: boolean;
78
71
  /** Show "Add all to cart" button */
79
72
  showAddAllButton?: boolean;
80
73
  /** Callback when "Add all" is clicked */
@@ -1 +1 @@
1
- {"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../src/components/Recommendations.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Recommendations.d.ts","sourceRoot":"","sources":["../../src/components/Recommendations.tsx"],"names":[],"mappings":"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"}
@@ -10,16 +10,12 @@
10
10
  import React, { useEffect, useState, useMemo } from 'react';
11
11
  import { useSearchContext } from './SearchProvider';
12
12
  import { clsx } from 'clsx';
13
- export const RelatedProducts = ({ productId, items: itemsProp, loading: loadingProp = false, showLoadingState = false, title = 'Related Products', maxItems = 6, renderItem, onItemClick, className, style, theme: customTheme, layout = 'horizontal', currencySymbol = '$', }) => {
13
+ export const RelatedProducts = ({ productId, items: itemsProp, loading: loadingProp = false, title = 'Related Products', maxItems = 6, renderItem, onItemClick, className, style, theme: customTheme, layout = 'horizontal', currencySymbol = '$', }) => {
14
14
  const { theme } = useSearchContext();
15
15
  const recommendationTheme = customTheme || {};
16
16
  // If items are provided, use them directly
17
17
  const items = itemsProp?.slice(0, maxItems) || [];
18
18
  const loading = loadingProp;
19
- if (loading && items.length === 0 && showLoadingState) {
20
- return (React.createElement("div", { className: clsx(recommendationTheme.root, className), style: style },
21
- React.createElement("div", { className: recommendationTheme.loading, style: getLoadingStyle(theme) }, "Loading related products...")));
22
- }
23
19
  if (loading && items.length === 0)
24
20
  return null;
25
21
  if (items.length === 0) {
@@ -27,15 +23,11 @@ export const RelatedProducts = ({ productId, items: itemsProp, loading: loadingP
27
23
  }
28
24
  return (React.createElement(RecommendationSection, { title: title, items: items, renderItem: renderItem, onItemClick: onItemClick, className: className, style: style, theme: customTheme, layout: layout, currencySymbol: currencySymbol }));
29
25
  };
30
- export const TrendingItems = ({ items: itemsProp, loading: loadingProp = false, showLoadingState = false, title = 'Trending Now', maxItems = 8, renderItem, onItemClick, className, style, theme: customTheme, layout = 'horizontal', currencySymbol = '$', }) => {
26
+ export const TrendingItems = ({ items: itemsProp, loading: loadingProp = false, title = 'Trending Now', maxItems = 8, renderItem, onItemClick, className, style, theme: customTheme, layout = 'horizontal', currencySymbol = '$', }) => {
31
27
  const { theme } = useSearchContext();
32
28
  const recommendationTheme = customTheme || {};
33
29
  const items = itemsProp?.slice(0, maxItems) || [];
34
30
  const loading = loadingProp;
35
- if (loading && items.length === 0 && showLoadingState) {
36
- return (React.createElement("div", { className: clsx(recommendationTheme.root, className), style: style },
37
- React.createElement("div", { className: recommendationTheme.loading, style: getLoadingStyle(theme) }, "Loading trending items...")));
38
- }
39
31
  if (loading && items.length === 0)
40
32
  return null;
41
33
  if (items.length === 0) {
@@ -43,7 +35,7 @@ export const TrendingItems = ({ items: itemsProp, loading: loadingProp = false,
43
35
  }
44
36
  return (React.createElement(RecommendationSection, { title: title, items: items, renderItem: renderItem, onItemClick: onItemClick, className: className, style: style, theme: customTheme, layout: layout, currencySymbol: currencySymbol }));
45
37
  };
46
- export const FrequentlyBoughtTogether = ({ productId, items: itemsProp, loading: loadingProp = false, showLoadingState = false, title = 'Frequently Bought Together', maxItems = 4, renderItem, onItemClick, className, style, theme: customTheme, layout = 'horizontal', currencySymbol = '$', showAddAllButton = true, onAddAll, }) => {
38
+ export const FrequentlyBoughtTogether = ({ productId, items: itemsProp, loading: loadingProp = false, title = 'Frequently Bought Together', maxItems = 4, renderItem, onItemClick, className, style, theme: customTheme, layout = 'horizontal', currencySymbol = '$', showAddAllButton = true, onAddAll, }) => {
47
39
  const { theme } = useSearchContext();
48
40
  const recommendationTheme = customTheme || {};
49
41
  const items = itemsProp?.slice(0, maxItems) || [];
@@ -56,10 +48,6 @@ export const FrequentlyBoughtTogether = ({ productId, items: itemsProp, loading:
56
48
  return sum + price;
57
49
  }, 0);
58
50
  }, [items]);
59
- if (loading && items.length === 0 && showLoadingState) {
60
- return (React.createElement("div", { className: clsx(recommendationTheme.root, className), style: style },
61
- React.createElement("div", { className: recommendationTheme.loading, style: getLoadingStyle(theme) }, "Loading recommendations...")));
62
- }
63
51
  if (loading && items.length === 0)
64
52
  return null;
65
53
  if (items.length === 0) {
@@ -266,11 +254,3 @@ const DefaultRecommendationItem = ({ item, theme: recommendationTheme, currencyS
266
254
  currencySymbol,
267
255
  typeof price === 'number' ? price.toFixed(2) : price)))));
268
256
  };
269
- // Helper function
270
- function getLoadingStyle(theme) {
271
- return {
272
- padding: theme.spacing.large,
273
- textAlign: 'center',
274
- color: theme.colors.textSecondary,
275
- };
276
- }
@@ -57,10 +57,6 @@ export interface RichQuerySuggestionsProps extends QuerySuggestionsEventHandlers
57
57
  header?: React.ReactNode;
58
58
  /** Custom footer content */
59
59
  footer?: React.ReactNode;
60
- /** Show loading overlay when fetching (default false: show previous results until new results render) */
61
- showLoadingOverlay?: boolean;
62
- /** Custom render for loading overlay (only when showLoadingOverlay is true) */
63
- renderLoading?: () => React.ReactNode;
64
60
  /** Dropdown width */
65
61
  width?: string | number;
66
62
  /** Dropdown max height */
@@ -1 +1 @@
1
- {"version":3,"file":"RichQuerySuggestions.d.ts","sourceRoot":"","sources":["../../src/components/RichQuerySuggestions.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAQN,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EAGd,kBAAkB,EAClB,0BAA0B,EAC1B,6BAA6B,EAE7B,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAMlC,MAAM,WAAW,yBAA0B,SAAQ,6BAA6B;IAC9E,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACnC,sCAAsC;IACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,sEAAsE;IACtE,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wCAAwC;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2BAA2B;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2BAA2B;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,yBAAyB;IACzB,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC,wBAAwB;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mCAAmC;IACnC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IACtF,sCAAsC;IACtC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC;IACnE,sCAAsC;IACtC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC9E,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3D,4BAA4B;IAC5B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,yGAAyG;IACzG,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACtC,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACtC,cAAc,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC;KACrE,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,MAAM,CAAC;CAC7B;AAqPD,eAAO,MAAM,oBAAoB,2GAwchC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"RichQuerySuggestions.d.ts","sourceRoot":"","sources":["../../src/components/RichQuerySuggestions.tsx"],"names":[],"mappings":"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"}
@@ -14,6 +14,20 @@ import React, { useState, useRef, useCallback, useMemo, forwardRef, useImperativ
14
14
  import { useSearchContext } from './SearchProvider';
15
15
  import { useQuerySuggestionsEnhanced } from '../hooks/useQuerySuggestionsEnhanced';
16
16
  import { clsx } from 'clsx';
17
+ // ============================================================================
18
+ // Constants
19
+ // ============================================================================
20
+ const TRANSITIONS = {
21
+ fast: '150ms ease-in-out',
22
+ normal: '200ms ease-in-out',
23
+ slow: '300ms ease-in-out',
24
+ };
25
+ const BORDER_RADIUS = {
26
+ sm: 4,
27
+ md: 6,
28
+ lg: 8,
29
+ full: 9999,
30
+ };
17
31
  // Default section order
18
32
  const DEFAULT_SECTIONS = [
19
33
  { id: 'recent', title: 'Recent Searches', maxItems: 5, enabled: true, order: 1 },
@@ -26,16 +40,16 @@ const DEFAULT_SECTIONS = [
26
40
  // ============================================================================
27
41
  const styles = {
28
42
  container: {
29
- backgroundColor: 'var(--seekora-bg-surface, #ffffff)',
30
- border: '1px solid var(--seekora-border-color, #e5e7eb)',
31
- borderRadius: 'var(--seekora-border-radius-lg, 12px)',
43
+ backgroundColor: 'var(--seekora-bg-surface, transparent)',
44
+ border: '1px solid var(--seekora-border-color, rgba(128,128,128,0.2))',
45
+ borderRadius: `var(--seekora-border-radius-lg, ${BORDER_RADIUS.lg * 1.5}px)`,
32
46
  boxShadow: 'var(--seekora-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04))',
33
47
  overflow: 'hidden',
34
48
  },
35
49
  header: {
36
50
  padding: '12px 16px',
37
- borderBottom: '1px solid var(--seekora-border-color, #e5e7eb)',
38
- backgroundColor: 'var(--seekora-bg-secondary, #f9fafb)',
51
+ borderBottom: '1px solid var(--seekora-border-color, rgba(128,128,128,0.2))',
52
+ backgroundColor: 'var(--seekora-bg-secondary, rgba(255, 255, 255, 0.1))',
39
53
  },
40
54
  content: {
41
55
  overflowY: 'auto',
@@ -70,7 +84,7 @@ const styles = {
70
84
  alignItems: 'flex-start',
71
85
  padding: '10px 16px',
72
86
  cursor: 'pointer',
73
- transition: 'background-color 100ms ease',
87
+ transition: `background-color ${TRANSITIONS.fast}`,
74
88
  gap: '12px',
75
89
  },
76
90
  itemActive: {
@@ -89,7 +103,7 @@ const styles = {
89
103
  },
90
104
  itemQuery: {
91
105
  fontSize: '14px',
92
- color: 'var(--seekora-text-primary, #111827)',
106
+ color: 'var(--seekora-text-primary, inherit)',
93
107
  fontWeight: 500,
94
108
  margin: 0,
95
109
  overflow: 'hidden',
@@ -98,7 +112,7 @@ const styles = {
98
112
  },
99
113
  itemMeta: {
100
114
  fontSize: '12px',
101
- color: 'var(--seekora-text-secondary, #6b7280)',
115
+ color: 'var(--seekora-text-secondary, inherit)',
102
116
  marginTop: '2px',
103
117
  },
104
118
  itemCount: {
@@ -119,11 +133,11 @@ const styles = {
119
133
  padding: '3px 8px',
120
134
  fontSize: '11px',
121
135
  fontWeight: 500,
122
- color: 'var(--seekora-text-secondary, #6b7280)',
123
- backgroundColor: 'var(--seekora-bg-tertiary, #f3f4f6)',
124
- borderRadius: '12px',
136
+ color: 'var(--seekora-text-secondary, inherit)',
137
+ backgroundColor: 'var(--seekora-bg-tertiary, rgba(255, 255, 255, 0.1))',
138
+ borderRadius: `${BORDER_RADIUS.lg * 1.5}px`,
125
139
  cursor: 'pointer',
126
- transition: 'all 100ms ease',
140
+ transition: `all ${TRANSITIONS.fast}`,
127
141
  },
128
142
  categoryPillHover: {
129
143
  backgroundColor: 'var(--seekora-primary-light, #dbeafe)',
@@ -145,12 +159,12 @@ const styles = {
145
159
  padding: '6px 12px',
146
160
  fontSize: '13px',
147
161
  fontWeight: 500,
148
- color: 'var(--seekora-text-primary, #374151)',
149
- backgroundColor: 'var(--seekora-bg-secondary, #f3f4f6)',
150
- border: '1px solid var(--seekora-border-color, #e5e7eb)',
151
- borderRadius: '20px',
162
+ color: 'var(--seekora-text-primary, inherit)',
163
+ backgroundColor: 'var(--seekora-bg-secondary, rgba(255, 255, 255, 0.1))',
164
+ border: '1px solid var(--seekora-border-color, rgba(128,128,128,0.2))',
165
+ borderRadius: `${BORDER_RADIUS.full}px`,
152
166
  cursor: 'pointer',
153
- transition: 'all 150ms ease',
167
+ transition: `all ${TRANSITIONS.fast}`,
154
168
  },
155
169
  trendingChipHover: {
156
170
  borderColor: 'var(--seekora-primary, #3b82f6)',
@@ -164,7 +178,7 @@ const styles = {
164
178
  trendingRank: {
165
179
  width: '18px',
166
180
  height: '18px',
167
- borderRadius: '50%',
181
+ borderRadius: `${BORDER_RADIUS.full}px`,
168
182
  backgroundColor: 'var(--seekora-primary, #3b82f6)',
169
183
  color: 'white',
170
184
  fontSize: '10px',
@@ -176,38 +190,30 @@ const styles = {
176
190
  removeButton: {
177
191
  padding: '4px',
178
192
  marginLeft: 'auto',
179
- borderRadius: '4px',
193
+ borderRadius: `${BORDER_RADIUS.sm}px`,
180
194
  border: 'none',
181
195
  background: 'transparent',
182
196
  cursor: 'pointer',
183
197
  color: 'var(--seekora-text-tertiary, #9ca3af)',
184
198
  opacity: 0,
185
- transition: 'opacity 100ms ease',
199
+ transition: `opacity ${TRANSITIONS.fast}`,
186
200
  },
187
201
  divider: {
188
202
  height: '1px',
189
- backgroundColor: 'var(--seekora-border-color, #e5e7eb)',
203
+ backgroundColor: 'var(--seekora-border-color, rgba(128,128,128,0.2))',
190
204
  margin: '4px 16px',
191
205
  },
192
206
  footer: {
193
207
  padding: '12px 16px',
194
- borderTop: '1px solid var(--seekora-border-color, #e5e7eb)',
195
- backgroundColor: 'var(--seekora-bg-secondary, #f9fafb)',
208
+ borderTop: '1px solid var(--seekora-border-color, rgba(128,128,128,0.2))',
209
+ backgroundColor: 'var(--seekora-bg-secondary, rgba(255, 255, 255, 0.1))',
196
210
  fontSize: '12px',
197
- color: 'var(--seekora-text-secondary, #6b7280)',
198
- },
199
- loadingOverlay: {
200
- position: 'absolute',
201
- inset: 0,
202
- display: 'flex',
203
- alignItems: 'center',
204
- justifyContent: 'center',
205
- backgroundColor: 'rgba(255, 255, 255, 0.8)',
211
+ color: 'var(--seekora-text-secondary, inherit)',
206
212
  },
207
213
  emptyState: {
208
214
  padding: '32px 16px',
209
215
  textAlign: 'center',
210
- color: 'var(--seekora-text-secondary, #6b7280)',
216
+ color: 'var(--seekora-text-secondary, inherit)',
211
217
  },
212
218
  highlight: {
213
219
  backgroundColor: 'var(--seekora-highlight-bg, #fef9c3)',
@@ -233,7 +239,7 @@ const CloseIcon = () => (React.createElement("svg", { viewBox: "0 0 20 20", fill
233
239
  // Component
234
240
  // ============================================================================
235
241
  export const RichQuerySuggestions = forwardRef(function RichQuerySuggestions(props, ref) {
236
- const { query, isOpen = true, sections = DEFAULT_SECTIONS, maxSuggestionsPerSection = 8, minQueryLength = 0, debounceMs = 200, includeDropdownRecommendations = true, includeDropdownProductList = true, includeFilteredTabs = true, includeCategories = true, maxCategories = 3, showCounts = true, showCategoryCounts = true, showSectionHeaders = true, classNames = {}, style, renderSuggestion, renderCategory, renderTrendingItem, renderRecentItem, header, footer, width = '100%', maxHeight = '480px', zIndex = 1000, ariaLabel = 'Search suggestions', analyticsTags, onSuggestionSelect, onCategoryClick, onRecentSearchClick, onRecentSearchRemove, onViewAllClick, onOpen, onClose, showLoadingOverlay = false, renderLoading, } = props;
242
+ const { query, isOpen = true, sections = DEFAULT_SECTIONS, maxSuggestionsPerSection = 8, minQueryLength = 0, debounceMs = 200, includeDropdownRecommendations = true, includeDropdownProductList = true, includeFilteredTabs = true, includeCategories = true, maxCategories = 3, showCounts = true, showCategoryCounts = true, showSectionHeaders = true, classNames = {}, style, renderSuggestion, renderCategory, renderTrendingItem, renderRecentItem, header, footer, width = '100%', maxHeight = '480px', zIndex = 1000, ariaLabel = 'Search suggestions', analyticsTags, onSuggestionSelect, onCategoryClick, onRecentSearchClick, onRecentSearchRemove, onViewAllClick, onOpen, onClose, } = props;
237
243
  const { client } = useSearchContext();
238
244
  const containerRef = useRef(null);
239
245
  const [activeIndex, setActiveIndex] = useState(-1);
@@ -452,7 +458,6 @@ export const RichQuerySuggestions = forwardRef(function RichQuerySuggestions(pro
452
458
  } },
453
459
  header && React.createElement("div", { style: styles.header }, header),
454
460
  React.createElement("div", { style: { ...styles.content, maxHeight } },
455
- loading && showLoadingOverlay && (React.createElement("div", { style: styles.loadingOverlay }, renderLoading ? renderLoading() : React.createElement("span", null, "Loading..."))),
456
461
  enabledSections.map((section, index) => {
457
462
  let content = null;
458
463
  switch (section.id) {
@@ -14,7 +14,6 @@ export interface SearchBarTheme {
14
14
  suggestionItem?: string;
15
15
  suggestionItemHover?: string;
16
16
  suggestionItemActive?: string;
17
- loadingIndicator?: string;
18
17
  searchIcon?: string;
19
18
  clearButton?: string;
20
19
  submitButton?: string;
@@ -37,10 +36,7 @@ export interface SearchBarProps {
37
36
  className?: string;
38
37
  style?: React.CSSProperties;
39
38
  theme?: SearchBarTheme;
40
- /** Show loading state when fetching and no previous suggestions (default false: show previous results until new render) */
41
- showLoadingState?: boolean;
42
39
  renderSuggestion?: (suggestion: string, index: number) => React.ReactNode;
43
- renderLoading?: () => React.ReactNode;
44
40
  /** Custom render for the search icon. If not provided, a default magnifying glass SVG is rendered. */
45
41
  renderSearchIcon?: () => React.ReactNode;
46
42
  /** Whether to show a clear button when the query is non-empty (default: true) */
@@ -1 +1 @@
1
- {"version":3,"file":"SearchBar.d.ts","sourceRoot":"","sources":["../../src/components/SearchBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/F,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,2HAA2H;IAC3H,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACtC,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACzC,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAC3C,yEAAyE;IACzE,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAgED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA0b9C,CAAC"}
1
+ {"version":3,"file":"SearchBar.d.ts","sourceRoot":"","sources":["../../src/components/SearchBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAU5D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/F,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACzC,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAC3C,yEAAyE;IACzE,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAgED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAib9C,CAAC"}
@@ -9,6 +9,13 @@ import { useSearchState } from '../hooks/useSearchState';
9
9
  import { useQuerySuggestions } from '../hooks/useQuerySuggestions';
10
10
  import { log } from '@seekora-ai/ui-sdk-core';
11
11
  import { clsx } from 'clsx';
12
+ // Z-index scale for consistent layering
13
+ const Z_INDEX = {
14
+ dropdown: 100,
15
+ modal: 200,
16
+ overlay: 300,
17
+ tooltip: 50,
18
+ };
12
19
  const SIZE_CONFIG = {
13
20
  small: {
14
21
  padding: '0.375rem 0.5rem',
@@ -44,7 +51,7 @@ const DefaultSearchIcon = ({ size = 18 }) => (React.createElement("svg", { width
44
51
  const DefaultClearIcon = ({ size = 14 }) => (React.createElement("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" },
45
52
  React.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
46
53
  React.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })));
47
- export const SearchBar = ({ placeholder = 'Search...', showSuggestions = true, debounceMs = 300, minQueryLength = 2, maxSuggestions = 10, onSearch, onQueryChange, onSuggestionSelect, onSearchStateChange, searchOptions, className, style, theme: customTheme, showLoadingState = false, renderSuggestion, renderLoading, renderSearchIcon, showClearButton = true, renderClearIcon, showSubmitButton = false, renderSubmitButton, size = 'medium', }) => {
54
+ export const SearchBar = ({ placeholder = 'Powered by Seekora', showSuggestions = true, debounceMs = 300, minQueryLength = 2, maxSuggestions = 10, onSearch, onQueryChange, onSuggestionSelect, onSearchStateChange, searchOptions, className, style, theme: customTheme, renderSuggestion, renderSearchIcon, showClearButton = true, renderClearIcon, showSubmitButton = false, renderSubmitButton, size = 'medium', }) => {
48
55
  const { client, theme, enableAnalytics, autoTrackSearch } = useSearchContext();
49
56
  const { query, setQuery, search: triggerSearch, results, loading: searchLoading, error: searchError } = useSearchState();
50
57
  const [isFocused, setIsFocused] = useState(false);
@@ -174,12 +181,11 @@ export const SearchBar = ({ placeholder = 'Search...', showSuggestions = true, d
174
181
  }, 200);
175
182
  }, []);
176
183
  const defaultRenderSuggestion = (suggestion, index) => (React.createElement("div", { key: index }, suggestion));
177
- const defaultRenderLoading = () => (React.createElement("div", { style: { padding: theme.spacing.medium, textAlign: 'center' } }, "Loading suggestions..."));
178
184
  const searchBarTheme = customTheme || {};
179
185
  const isLoading = suggestionsLoading || searchLoading;
180
186
  // Show list when we have suggestions (including previous while loading) or when loading and showLoadingState
181
187
  const hasSuggestions = displayedSuggestions.length > 0;
182
- const showSuggestionsList = isFocused && showSuggestions && query.length >= minQueryLength && (hasSuggestions || (isLoading && showLoadingState));
188
+ const showSuggestionsList = isFocused && showSuggestions && query.length >= minQueryLength && hasSuggestions;
183
189
  // Get processing time from results
184
190
  const res = results;
185
191
  const processingTime = res?.processingTimeMS
@@ -195,9 +201,9 @@ export const SearchBar = ({ placeholder = 'Search...', showSuggestions = true, d
195
201
  const inputPaddingLeft = hasSearchIcon ? sizeConfig.iconPaddingLeft : sizeConfig.padding.split(' ')[1] || sizeConfig.padding;
196
202
  const inputPaddingRight = hasClearBtn ? sizeConfig.iconPaddingRight : sizeConfig.padding.split(' ')[1] || sizeConfig.padding;
197
203
  const borderRadius = typeof theme.borderRadius === 'string' ? theme.borderRadius : theme.borderRadius.medium;
198
- const focusBorderColor = isFocused ? theme.colors.focus : theme.colors.border;
204
+ const focusBorderColor = isFocused ? `var(--seekora-border-focus, ${theme.colors.focus})` : `var(--seekora-border, ${theme.colors.border})`;
199
205
  const focusRingShadow = isFocused
200
- ? `0 0 0 3px ${theme.colors.focus}33`
206
+ ? `0 0 0 3px var(--seekora-border-focus-alpha, ${theme.colors.focus}33)`
201
207
  : undefined;
202
208
  const handleClear = useCallback(() => {
203
209
  setQuery('', false);
@@ -231,7 +237,7 @@ export const SearchBar = ({ placeholder = 'Search...', showSuggestions = true, d
231
237
  justifyContent: 'center',
232
238
  pointerEvents: 'none',
233
239
  color: 'var(--seekora-searchbar-icon-color)',
234
- zIndex: 1,
240
+ zIndex: 2,
235
241
  } }, renderSearchIcon ? renderSearchIcon() : React.createElement(DefaultSearchIcon, { size: sizeConfig.iconSize }))),
236
242
  React.createElement("input", { ref: inputRef, type: "text", value: query, onChange: handleInputChange, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur, placeholder: placeholder, className: clsx(searchBarTheme.input, isFocused && searchBarTheme.inputFocused), style: {
237
243
  width: '100%',
@@ -267,7 +273,7 @@ export const SearchBar = ({ placeholder = 'Search...', showSuggestions = true, d
267
273
  borderRadius: '50%',
268
274
  color: 'var(--seekora-searchbar-icon-color)',
269
275
  transition: theme.transitions?.fast || '150ms ease-in-out',
270
- zIndex: 1,
276
+ zIndex: 2,
271
277
  }, onMouseDown: (e) => {
272
278
  // Prevent input blur so the clear action doesn't race with blur handler
273
279
  e.preventDefault();
@@ -278,8 +284,8 @@ export const SearchBar = ({ placeholder = 'Search...', showSuggestions = true, d
278
284
  fontSize: sizeConfig.fontSize,
279
285
  fontFamily: theme.typography.fontFamily,
280
286
  fontWeight: theme.typography.fontWeight?.medium ?? 500,
281
- backgroundColor: theme.colors.primary,
282
- color: '#ffffff',
287
+ backgroundColor: `var(--seekora-primary, ${theme.colors.primary})`,
288
+ color: 'var(--seekora-primary-text, #ffffff)',
283
289
  border: 'none',
284
290
  borderRadius: 'var(--seekora-searchbar-radius)',
285
291
  cursor: 'pointer',
@@ -307,9 +313,9 @@ export const SearchBar = ({ placeholder = 'Search...', showSuggestions = true, d
307
313
  boxShadow: theme.shadows.medium,
308
314
  maxHeight: '400px',
309
315
  overflowY: 'auto',
310
- zIndex: 1000,
316
+ zIndex: Z_INDEX.dropdown,
317
+ boxSizing: 'border-box',
311
318
  } },
312
- isLoading && displayedSuggestions.length === 0 && showLoadingState && (renderLoading ? renderLoading() : defaultRenderLoading()),
313
319
  displayedSuggestions.length > 0 && (React.createElement(React.Fragment, null, displayedSuggestions.map((suggestion, index) => {
314
320
  const isSelected = index === selectedIndex;
315
321
  const renderFn = renderSuggestion || defaultRenderSuggestion;
@@ -29,8 +29,8 @@ const styles = {
29
29
  transition: 'border-color 150ms ease, box-shadow 150ms ease',
30
30
  },
31
31
  inputWrapperFocused: {
32
- borderColor: 'var(--seekora-primary, #3b82f6)',
33
- boxShadow: '0 0 0 3px var(--seekora-primary-light, rgba(59, 130, 246, 0.1))',
32
+ borderColor: 'var(--seekora-border-focus, var(--seekora-primary, #3b82f6))',
33
+ boxShadow: '0 0 0 3px var(--seekora-border-focus-alpha, var(--seekora-primary-light, rgba(59, 130, 246, 0.1)))',
34
34
  },
35
35
  input: {
36
36
  flex: 1,
@@ -73,7 +73,7 @@ const styles = {
73
73
  margin: '4px',
74
74
  border: 'none',
75
75
  backgroundColor: 'var(--seekora-primary, #3b82f6)',
76
- color: 'white',
76
+ color: 'var(--seekora-primary-text, white)',
77
77
  borderRadius: 'var(--seekora-border-radius, 6px)',
78
78
  fontSize: '14px',
79
79
  fontWeight: 600,
@@ -92,7 +92,7 @@ const ClearIcon = () => (React.createElement("svg", { viewBox: "0 0 20 20", fill
92
92
  // Component
93
93
  // ============================================================================
94
94
  export const SearchBarWithSuggestions = forwardRef(function SearchBarWithSuggestions(props, ref) {
95
- const { variant = 'classic', placeholder = 'Search...', initialQuery = '', value, onQueryChange, onSearch, onSuggestionSelect, onProductClick, showSearchButton = false, searchButtonText = 'Search', showClearButton = true, autoFocus = false, minQueryLength = 1, maxSuggestions = 8, maxProducts = 8, debounceMs = 200, showRecentSearches = true, showTrendingOnEmpty = true, includeDropdownRecommendations = false, filteredTabs, enableAnalytics = true, analyticsTags, includeFacets, includeCategories, dropdownWidth, dropdownMaxHeight, classNames = {}, style, inputStyle, ariaLabel = 'Search', } = props;
95
+ const { variant = 'classic', placeholder = 'Powered by Seekora', initialQuery = '', value, onQueryChange, onSearch, onSuggestionSelect, onProductClick, showSearchButton = false, searchButtonText = 'Search', showClearButton = true, autoFocus = false, minQueryLength = 1, maxSuggestions = 8, maxProducts = 8, debounceMs = 200, showRecentSearches = true, showTrendingOnEmpty = true, includeDropdownRecommendations = false, filteredTabs, enableAnalytics = true, analyticsTags, includeFacets, includeCategories, dropdownWidth, dropdownMaxHeight, classNames = {}, style, inputStyle, ariaLabel = 'Search', } = props;
96
96
  const { client } = useSearchContext();
97
97
  const inputRef = useRef(null);
98
98
  const dropdownRef = useRef(null);
@@ -1 +1 @@
1
- {"version":3,"file":"SearchLayout.d.ts","sourceRoot":"","sources":["../../src/components/SearchLayout.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,qBAAqB;IACrB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,qBAAqB;IACrB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,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,iBAAiB,CAAC;IAC1B,6BAA6B;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkGpD,CAAC"}
1
+ {"version":3,"file":"SearchLayout.d.ts","sourceRoot":"","sources":["../../src/components/SearchLayout.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,qBAAqB;IACrB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,qBAAqB;IACrB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,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,iBAAiB,CAAC;IAC1B,6BAA6B;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAoGpD,CAAC"}
@@ -3,53 +3,58 @@
3
3
  *
4
4
  * Provides a layout structure for search interfaces with sidebar and main content
5
5
  */
6
- import React, { useEffect, useState } from 'react';
6
+ import React from 'react';
7
7
  import { useSearchContext } from './SearchProvider';
8
8
  import { clsx } from 'clsx';
9
+ import { useIsMobile, useResponsivePadding, useResponsiveGap } from '../utils/responsive';
9
10
  export const SearchLayout = ({ sidebar, children, header, footer, sidebarWidth = '300px', className, style, theme: customTheme, showSidebarOnMobile = false, }) => {
10
11
  const { theme } = useSearchContext();
11
12
  const layoutTheme = customTheme || {};
12
- const [isMobile, setIsMobile] = useState(false);
13
- useEffect(() => {
14
- const checkMobile = () => {
15
- setIsMobile(window.innerWidth <= 768);
16
- };
17
- checkMobile();
18
- window.addEventListener('resize', checkMobile);
19
- return () => window.removeEventListener('resize', checkMobile);
20
- }, []);
13
+ const isMobile = useIsMobile();
14
+ const responsivePadding = useResponsivePadding(parseInt(theme.spacing.medium) || 16);
15
+ const responsiveGap = useResponsiveGap(parseInt(theme.spacing.large) || 24);
21
16
  return (React.createElement("div", { className: clsx(layoutTheme.container, className), style: {
22
17
  display: 'flex',
23
18
  flexDirection: 'column',
24
19
  minHeight: '100vh',
20
+ width: '100%',
21
+ maxWidth: '100%',
25
22
  backgroundColor: theme.colors.background,
26
23
  ...style,
27
24
  } },
28
25
  header && (React.createElement("header", { className: layoutTheme.header, style: {
29
- padding: theme.spacing.medium,
26
+ padding: responsivePadding,
30
27
  borderBottom: `1px solid ${theme.colors.border}`,
31
28
  backgroundColor: theme.colors.background,
32
29
  } }, header)),
33
30
  React.createElement("div", { style: {
34
31
  display: 'flex',
35
32
  flex: 1,
36
- gap: theme.spacing.large,
37
- padding: theme.spacing.medium,
33
+ width: '100%',
34
+ maxWidth: '100%',
35
+ flexDirection: isMobile ? 'column' : 'row',
36
+ gap: responsiveGap,
37
+ padding: responsivePadding,
38
38
  backgroundColor: theme.colors.background,
39
39
  color: theme.colors.text,
40
+ overflow: isMobile ? 'visible' : 'hidden',
40
41
  } },
41
42
  sidebar && (!isMobile || showSidebarOnMobile) && (React.createElement("aside", { className: layoutTheme.sidebar, style: {
42
- width: sidebarWidth,
43
- minWidth: sidebarWidth,
43
+ width: isMobile ? '100%' : sidebarWidth,
44
+ minWidth: isMobile ? '100%' : sidebarWidth,
45
+ flexShrink: 0,
44
46
  } }, sidebar)),
45
47
  React.createElement("main", { className: layoutTheme.main, style: {
46
48
  flex: 1,
47
- minWidth: 0, // Prevents flex item from overflowing
49
+ minWidth: 0,
50
+ width: '100%',
51
+ maxWidth: '100%',
48
52
  backgroundColor: theme.colors.background,
49
53
  color: theme.colors.text,
54
+ overflow: 'auto',
50
55
  } }, children)),
51
56
  footer && (React.createElement("footer", { className: layoutTheme.footer, style: {
52
- padding: theme.spacing.medium,
57
+ padding: responsivePadding,
53
58
  borderTop: `1px solid ${theme.colors.border}`,
54
59
  backgroundColor: theme.colors.background,
55
60
  } }, footer))));
@@ -1 +1 @@
1
- {"version":3,"file":"SearchProvider.d.ts","sourceRoot":"","sources":["../../src/components/SearchProvider.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,EAA6B,SAAS,EAAsB,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAO,kBAAkB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI1D,UAAU,kBAAkB;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAID,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAoDxD,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,kBAQnC,CAAC"}
1
+ {"version":3,"file":"SearchProvider.d.ts","sourceRoot":"","sources":["../../src/components/SearchProvider.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,EAA6B,SAAS,EAAsB,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAO,kBAAkB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI1D,UAAU,kBAAkB;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAID,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,QAAQ,EAAE,SAAS,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkDxD,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,kBAQnC,CAAC"}
@@ -30,9 +30,7 @@ export const SearchProvider = ({ client, theme: themeConfig, enableAnalytics = t
30
30
  useEffect(() => {
31
31
  if (abTestId !== undefined || abVariant !== undefined) {
32
32
  stateManager.setAbTest(abTestId, abVariant);
33
- if (typeof client.setAbTest === 'function') {
34
- client.setAbTest(abTestId, abVariant);
35
- }
33
+ client.setAbTest(abTestId, abVariant);
36
34
  }
37
35
  }, [stateManager, client, abTestId, abVariant]);
38
36
  const value = useMemo(() => ({
@@ -18,7 +18,6 @@ export interface SearchResultsTheme {
18
18
  resultImage?: string;
19
19
  resultPrice?: string;
20
20
  emptyState?: string;
21
- loadingState?: string;
22
21
  errorState?: string;
23
22
  pagination?: string;
24
23
  /** Custom min-height class override */
@@ -33,9 +32,6 @@ export interface SearchResultsProps {
33
32
  onResultClick?: (result: ResultItem, index: number) => void;
34
33
  renderResult?: (result: ResultItem, index: number, isActive?: boolean) => React.ReactNode;
35
34
  renderEmpty?: () => React.ReactNode;
36
- /** Show loading state when fetching and no previous results (default false: show previous results until new render) */
37
- showLoadingState?: boolean;
38
- renderLoading?: () => React.ReactNode;
39
35
  renderError?: (error: Error) => React.ReactNode;
40
36
  className?: string;
41
37
  style?: React.CSSProperties;
@@ -56,8 +52,6 @@ export interface SearchResultsProps {
56
52
  minHeight?: string;
57
53
  /** Minimum width to prevent container shrinking (default: '100%') */
58
54
  minWidth?: string;
59
- /** Opacity applied to results while loading new results (default: 0.7, set to 1 to disable) */
60
- loadingOpacity?: number;
61
55
  }
62
56
  export declare const SearchResults: React.FC<SearchResultsProps>;
63
57
  //# sourceMappingURL=SearchResults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchResults.d.ts","sourceRoot":"","sources":["../../src/components/SearchResults.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1F,WAAW,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACpC,uHAAuH;IACvH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,mEAAmE;IACnE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gFAAgF;IAChF,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;IAC1C,+DAA+D;IAC/D,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAoBD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA6mBtD,CAAC"}
1
+ {"version":3,"file":"SearchResults.d.ts","sourceRoot":"","sources":["../../src/components/SearchResults.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1F,WAAW,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACpC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,mEAAmE;IACnE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gFAAgF;IAChF,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;IAC1C,+DAA+D;IAC/D,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoBD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAqlBtD,CAAC"}