@seekora-ai/ui-sdk-react 0.1.1

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 (169) hide show
  1. package/dist/components/Breadcrumb.d.ts +43 -0
  2. package/dist/components/Breadcrumb.d.ts.map +1 -0
  3. package/dist/components/Breadcrumb.js +119 -0
  4. package/dist/components/ClearRefinements.d.ts +42 -0
  5. package/dist/components/ClearRefinements.d.ts.map +1 -0
  6. package/dist/components/ClearRefinements.js +80 -0
  7. package/dist/components/CurrentRefinements.d.ts +41 -0
  8. package/dist/components/CurrentRefinements.d.ts.map +1 -0
  9. package/dist/components/CurrentRefinements.js +83 -0
  10. package/dist/components/Facets.d.ts +53 -0
  11. package/dist/components/Facets.d.ts.map +1 -0
  12. package/dist/components/Facets.js +195 -0
  13. package/dist/components/FederatedDropdown.d.ts +92 -0
  14. package/dist/components/FederatedDropdown.d.ts.map +1 -0
  15. package/dist/components/FederatedDropdown.js +510 -0
  16. package/dist/components/HierarchicalMenu.d.ts +55 -0
  17. package/dist/components/HierarchicalMenu.d.ts.map +1 -0
  18. package/dist/components/HierarchicalMenu.js +168 -0
  19. package/dist/components/Highlight.d.ts +51 -0
  20. package/dist/components/Highlight.d.ts.map +1 -0
  21. package/dist/components/Highlight.js +155 -0
  22. package/dist/components/HitsPerPage.d.ts +41 -0
  23. package/dist/components/HitsPerPage.d.ts.map +1 -0
  24. package/dist/components/HitsPerPage.js +72 -0
  25. package/dist/components/InfiniteHits.d.ts +56 -0
  26. package/dist/components/InfiniteHits.d.ts.map +1 -0
  27. package/dist/components/InfiniteHits.js +181 -0
  28. package/dist/components/MobileFilters.d.ts +71 -0
  29. package/dist/components/MobileFilters.d.ts.map +1 -0
  30. package/dist/components/MobileFilters.js +242 -0
  31. package/dist/components/Pagination.d.ts +44 -0
  32. package/dist/components/Pagination.d.ts.map +1 -0
  33. package/dist/components/Pagination.js +142 -0
  34. package/dist/components/QuerySuggestions.d.ts +38 -0
  35. package/dist/components/QuerySuggestions.d.ts.map +1 -0
  36. package/dist/components/QuerySuggestions.js +86 -0
  37. package/dist/components/QuerySuggestionsDropdown.d.ts +86 -0
  38. package/dist/components/QuerySuggestionsDropdown.d.ts.map +1 -0
  39. package/dist/components/QuerySuggestionsDropdown.js +395 -0
  40. package/dist/components/RangeInput.d.ts +58 -0
  41. package/dist/components/RangeInput.d.ts.map +1 -0
  42. package/dist/components/RangeInput.js +203 -0
  43. package/dist/components/RangeSlider.d.ts +51 -0
  44. package/dist/components/RangeSlider.d.ts.map +1 -0
  45. package/dist/components/RangeSlider.js +193 -0
  46. package/dist/components/Recommendations.d.ts +90 -0
  47. package/dist/components/Recommendations.d.ts.map +1 -0
  48. package/dist/components/Recommendations.js +270 -0
  49. package/dist/components/RichQuerySuggestions.d.ts +77 -0
  50. package/dist/components/RichQuerySuggestions.d.ts.map +1 -0
  51. package/dist/components/RichQuerySuggestions.js +492 -0
  52. package/dist/components/SearchBar.d.ts +40 -0
  53. package/dist/components/SearchBar.d.ts.map +1 -0
  54. package/dist/components/SearchBar.js +217 -0
  55. package/dist/components/SearchBarWithSuggestions.d.ts +99 -0
  56. package/dist/components/SearchBarWithSuggestions.d.ts.map +1 -0
  57. package/dist/components/SearchBarWithSuggestions.js +275 -0
  58. package/dist/components/SearchLayout.d.ts +35 -0
  59. package/dist/components/SearchLayout.d.ts.map +1 -0
  60. package/dist/components/SearchLayout.js +56 -0
  61. package/dist/components/SearchProvider.d.ts +28 -0
  62. package/dist/components/SearchProvider.d.ts.map +1 -0
  63. package/dist/components/SearchProvider.js +43 -0
  64. package/dist/components/SearchResults.d.ts +51 -0
  65. package/dist/components/SearchResults.d.ts.map +1 -0
  66. package/dist/components/SearchResults.js +485 -0
  67. package/dist/components/SortBy.d.ts +44 -0
  68. package/dist/components/SortBy.d.ts.map +1 -0
  69. package/dist/components/SortBy.js +61 -0
  70. package/dist/components/Stats.d.ts +37 -0
  71. package/dist/components/Stats.d.ts.map +1 -0
  72. package/dist/components/Stats.js +52 -0
  73. package/dist/components/suggestions/AmazonDropdown.d.ts +30 -0
  74. package/dist/components/suggestions/AmazonDropdown.d.ts.map +1 -0
  75. package/dist/components/suggestions/AmazonDropdown.js +529 -0
  76. package/dist/components/suggestions/GoogleDropdown.d.ts +31 -0
  77. package/dist/components/suggestions/GoogleDropdown.d.ts.map +1 -0
  78. package/dist/components/suggestions/GoogleDropdown.js +370 -0
  79. package/dist/components/suggestions/MinimalDropdown.d.ts +24 -0
  80. package/dist/components/suggestions/MinimalDropdown.d.ts.map +1 -0
  81. package/dist/components/suggestions/MinimalDropdown.js +314 -0
  82. package/dist/components/suggestions/MobileSheetDropdown.d.ts +31 -0
  83. package/dist/components/suggestions/MobileSheetDropdown.d.ts.map +1 -0
  84. package/dist/components/suggestions/MobileSheetDropdown.js +485 -0
  85. package/dist/components/suggestions/PinterestDropdown.d.ts +29 -0
  86. package/dist/components/suggestions/PinterestDropdown.d.ts.map +1 -0
  87. package/dist/components/suggestions/PinterestDropdown.js +450 -0
  88. package/dist/components/suggestions/ShopifyDropdown.d.ts +27 -0
  89. package/dist/components/suggestions/ShopifyDropdown.d.ts.map +1 -0
  90. package/dist/components/suggestions/ShopifyDropdown.js +451 -0
  91. package/dist/components/suggestions/SpotlightDropdown.d.ts +33 -0
  92. package/dist/components/suggestions/SpotlightDropdown.d.ts.map +1 -0
  93. package/dist/components/suggestions/SpotlightDropdown.js +547 -0
  94. package/dist/components/suggestions/SuggestionSearchBar.d.ts +123 -0
  95. package/dist/components/suggestions/SuggestionSearchBar.d.ts.map +1 -0
  96. package/dist/components/suggestions/SuggestionSearchBar.js +652 -0
  97. package/dist/components/suggestions/index.d.ts +37 -0
  98. package/dist/components/suggestions/index.d.ts.map +1 -0
  99. package/dist/components/suggestions/index.js +59 -0
  100. package/dist/components/suggestions/styles/index.d.ts +11 -0
  101. package/dist/components/suggestions/styles/index.d.ts.map +1 -0
  102. package/dist/components/suggestions/styles/index.js +289 -0
  103. package/dist/components/suggestions/styles/responsive.d.ts +107 -0
  104. package/dist/components/suggestions/styles/responsive.d.ts.map +1 -0
  105. package/dist/components/suggestions/styles/responsive.js +237 -0
  106. package/dist/components/suggestions/types.d.ts +489 -0
  107. package/dist/components/suggestions/types.d.ts.map +1 -0
  108. package/dist/components/suggestions/types.js +6 -0
  109. package/dist/components/suggestions/utils.d.ts +213 -0
  110. package/dist/components/suggestions/utils.d.ts.map +1 -0
  111. package/dist/components/suggestions/utils.js +514 -0
  112. package/dist/hooks/useAnalytics.d.ts +20 -0
  113. package/dist/hooks/useAnalytics.d.ts.map +1 -0
  114. package/dist/hooks/useAnalytics.js +62 -0
  115. package/dist/hooks/useNaturalLanguageFilters.d.ts +48 -0
  116. package/dist/hooks/useNaturalLanguageFilters.d.ts.map +1 -0
  117. package/dist/hooks/useNaturalLanguageFilters.js +221 -0
  118. package/dist/hooks/useQuerySuggestions.d.ts +21 -0
  119. package/dist/hooks/useQuerySuggestions.d.ts.map +1 -0
  120. package/dist/hooks/useQuerySuggestions.js +68 -0
  121. package/dist/hooks/useQuerySuggestionsEnhanced.d.ts +114 -0
  122. package/dist/hooks/useQuerySuggestionsEnhanced.d.ts.map +1 -0
  123. package/dist/hooks/useQuerySuggestionsEnhanced.js +376 -0
  124. package/dist/hooks/useSearchState.d.ts +35 -0
  125. package/dist/hooks/useSearchState.d.ts.map +1 -0
  126. package/dist/hooks/useSearchState.js +68 -0
  127. package/dist/hooks/useSeekoraSearch.d.ts +20 -0
  128. package/dist/hooks/useSeekoraSearch.d.ts.map +1 -0
  129. package/dist/hooks/useSeekoraSearch.js +63 -0
  130. package/dist/hooks/useSmartSuggestions.d.ts +55 -0
  131. package/dist/hooks/useSmartSuggestions.d.ts.map +1 -0
  132. package/dist/hooks/useSmartSuggestions.js +236 -0
  133. package/dist/hooks/useSuggestionsAnalytics.d.ts +91 -0
  134. package/dist/hooks/useSuggestionsAnalytics.d.ts.map +1 -0
  135. package/dist/hooks/useSuggestionsAnalytics.js +226 -0
  136. package/dist/index.d.ts +80 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +86 -0
  139. package/dist/index.umd.js +1 -0
  140. package/dist/src/index.d.ts +2849 -0
  141. package/dist/src/index.esm.js +11679 -0
  142. package/dist/src/index.esm.js.map +1 -0
  143. package/dist/src/index.js +11761 -0
  144. package/dist/src/index.js.map +1 -0
  145. package/dist/themes/createTheme.d.ts +8 -0
  146. package/dist/themes/createTheme.d.ts.map +1 -0
  147. package/dist/themes/createTheme.js +10 -0
  148. package/dist/themes/dark.d.ts +6 -0
  149. package/dist/themes/dark.d.ts.map +1 -0
  150. package/dist/themes/dark.js +34 -0
  151. package/dist/themes/default.d.ts +6 -0
  152. package/dist/themes/default.d.ts.map +1 -0
  153. package/dist/themes/default.js +71 -0
  154. package/dist/themes/mergeThemes.d.ts +7 -0
  155. package/dist/themes/mergeThemes.d.ts.map +1 -0
  156. package/dist/themes/mergeThemes.js +6 -0
  157. package/dist/themes/minimal.d.ts +6 -0
  158. package/dist/themes/minimal.d.ts.map +1 -0
  159. package/dist/themes/minimal.js +34 -0
  160. package/dist/themes/suggestions.d.ts +216 -0
  161. package/dist/themes/suggestions.d.ts.map +1 -0
  162. package/dist/themes/suggestions.js +546 -0
  163. package/dist/themes/types.d.ts +7 -0
  164. package/dist/themes/types.d.ts.map +1 -0
  165. package/dist/themes/types.js +6 -0
  166. package/dist/types/index.d.ts +33 -0
  167. package/dist/types/index.d.ts.map +1 -0
  168. package/dist/types/index.js +4 -0
  169. package/package.json +65 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Breadcrumb Component
3
+ *
4
+ * Displays the current hierarchical navigation path
5
+ * Allows users to navigate back to parent categories
6
+ */
7
+ import React from 'react';
8
+ export interface BreadcrumbItem {
9
+ label: string;
10
+ value: string;
11
+ }
12
+ export interface BreadcrumbTheme {
13
+ root?: string;
14
+ list?: string;
15
+ item?: string;
16
+ link?: string;
17
+ separator?: string;
18
+ current?: string;
19
+ }
20
+ export interface BreadcrumbProps {
21
+ /** Attributes for each level of hierarchy */
22
+ attributes: string[];
23
+ /** Separator between items (default: ' > ') */
24
+ separator?: string;
25
+ /** Root label (default: 'Home') */
26
+ rootLabel?: string;
27
+ /** Custom render function for items */
28
+ renderItem?: (item: BreadcrumbItem, index: number, isLast: boolean) => React.ReactNode;
29
+ /** Custom render for separator */
30
+ renderSeparator?: () => React.ReactNode;
31
+ /** Callback when an item is clicked */
32
+ onNavigate?: (item: BreadcrumbItem | null, index: number) => void;
33
+ /** Custom className */
34
+ className?: string;
35
+ /** Custom styles */
36
+ style?: React.CSSProperties;
37
+ /** Custom theme */
38
+ theme?: BreadcrumbTheme;
39
+ /** Custom breadcrumb items (overrides automatic detection) */
40
+ items?: BreadcrumbItem[];
41
+ }
42
+ export declare const Breadcrumb: React.FC<BreadcrumbProps>;
43
+ //# sourceMappingURL=Breadcrumb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumb.d.ts","sourceRoot":"","sources":["../../src/components/Breadcrumb.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA+B,MAAM,OAAO,CAAC;AAKpD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IACvF,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACxC,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA0LhD,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Breadcrumb Component
3
+ *
4
+ * Displays the current hierarchical navigation path
5
+ * Allows users to navigate back to parent categories
6
+ */
7
+ import React, { useMemo, useCallback } from 'react';
8
+ import { useSearchContext } from './SearchProvider';
9
+ import { useSearchState } from '../hooks/useSearchState';
10
+ import { clsx } from 'clsx';
11
+ export const Breadcrumb = ({ attributes, separator = ' > ', rootLabel = 'Home', renderItem, renderSeparator, onNavigate, className, style, theme: customTheme, items: itemsProp, }) => {
12
+ const { theme, stateManager } = useSearchContext();
13
+ const { refinements, removeRefinement, clearRefinements } = useSearchState();
14
+ const breadcrumbTheme = customTheme || {};
15
+ // Build breadcrumb items from refinements
16
+ const items = useMemo(() => {
17
+ if (itemsProp)
18
+ return itemsProp;
19
+ const breadcrumbItems = [];
20
+ // Find hierarchical refinements
21
+ attributes.forEach((attr, level) => {
22
+ const refinement = refinements.find(r => r.field === attr);
23
+ if (refinement) {
24
+ // Parse the hierarchical value
25
+ const parts = refinement.value.split(separator);
26
+ parts.forEach((part, partIndex) => {
27
+ const fullPath = parts.slice(0, partIndex + 1).join(separator);
28
+ // Only add if not already in the list
29
+ if (!breadcrumbItems.some(item => item.value === fullPath)) {
30
+ breadcrumbItems.push({
31
+ label: part,
32
+ value: fullPath,
33
+ });
34
+ }
35
+ });
36
+ }
37
+ });
38
+ return breadcrumbItems;
39
+ }, [attributes, refinements, separator, itemsProp]);
40
+ // Handle click on breadcrumb item
41
+ const handleClick = useCallback((item, index) => {
42
+ if (item === null) {
43
+ // Clicked on root - clear all hierarchical refinements
44
+ attributes.forEach(attr => {
45
+ refinements
46
+ .filter(r => r.field === attr)
47
+ .forEach(r => removeRefinement(r.field, r.value, false));
48
+ });
49
+ stateManager.search();
50
+ }
51
+ else {
52
+ // Navigate to this level - remove refinements below this level
53
+ const currentLevel = items.findIndex(i => i.value === item.value);
54
+ attributes.forEach((attr, attrLevel) => {
55
+ refinements
56
+ .filter(r => r.field === attr)
57
+ .forEach(r => {
58
+ // Remove if this is below the clicked level
59
+ if (attrLevel > currentLevel ||
60
+ (attrLevel === currentLevel && r.value !== item.value)) {
61
+ removeRefinement(r.field, r.value, false);
62
+ }
63
+ });
64
+ });
65
+ stateManager.search();
66
+ }
67
+ if (onNavigate) {
68
+ onNavigate(item, index);
69
+ }
70
+ }, [attributes, refinements, removeRefinement, stateManager, items, onNavigate]);
71
+ // Default separator renderer
72
+ const defaultRenderSeparator = () => (React.createElement("span", { className: breadcrumbTheme.separator, style: {
73
+ margin: `0 ${theme.spacing.small}`,
74
+ color: theme.colors.textSecondary,
75
+ }, "aria-hidden": "true" }, "\u203A"));
76
+ // Don't render if no items
77
+ if (items.length === 0) {
78
+ return null;
79
+ }
80
+ return (React.createElement("nav", { className: clsx(breadcrumbTheme.root, className), style: style, "aria-label": "Breadcrumb" },
81
+ React.createElement("ol", { className: breadcrumbTheme.list, style: {
82
+ display: 'flex',
83
+ flexWrap: 'wrap',
84
+ alignItems: 'center',
85
+ listStyle: 'none',
86
+ margin: 0,
87
+ padding: 0,
88
+ fontSize: theme.typography.fontSize.small,
89
+ } },
90
+ React.createElement("li", { className: breadcrumbTheme.item },
91
+ React.createElement("button", { type: "button", onClick: () => handleClick(null, -1), className: breadcrumbTheme.link, style: {
92
+ padding: 0,
93
+ background: 'none',
94
+ border: 'none',
95
+ cursor: 'pointer',
96
+ color: theme.colors.primary,
97
+ fontFamily: 'inherit',
98
+ fontSize: 'inherit',
99
+ textDecoration: 'none',
100
+ } }, rootLabel)),
101
+ items.map((item, index) => {
102
+ const isLast = index === items.length - 1;
103
+ return (React.createElement(React.Fragment, { key: item.value },
104
+ renderSeparator ? renderSeparator() : defaultRenderSeparator(),
105
+ React.createElement("li", { className: clsx(breadcrumbTheme.item, isLast && breadcrumbTheme.current) }, renderItem ? (renderItem(item, index, isLast)) : isLast ? (React.createElement("span", { style: {
106
+ color: theme.colors.text,
107
+ fontWeight: theme.typography.fontWeight?.medium || 500,
108
+ }, "aria-current": "page" }, item.label)) : (React.createElement("button", { type: "button", onClick: () => handleClick(item, index), className: breadcrumbTheme.link, style: {
109
+ padding: 0,
110
+ background: 'none',
111
+ border: 'none',
112
+ cursor: 'pointer',
113
+ color: theme.colors.primary,
114
+ fontFamily: 'inherit',
115
+ fontSize: 'inherit',
116
+ textDecoration: 'none',
117
+ } }, item.label)))));
118
+ }))));
119
+ };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ClearRefinements Component
3
+ *
4
+ * A standalone button to clear all active refinements/filters
5
+ * Integrates with SearchStateManager for automatic state sync
6
+ */
7
+ import React from 'react';
8
+ export interface ClearRefinementsTheme {
9
+ root?: string;
10
+ button?: string;
11
+ buttonDisabled?: string;
12
+ }
13
+ export interface ClearRefinementsProps {
14
+ /** Button text when there are refinements to clear */
15
+ clearsQuery?: boolean;
16
+ /** Whether clicking should also clear the search query */
17
+ resetLabel?: string;
18
+ /** Button text shown when there are no refinements */
19
+ disabledLabel?: string;
20
+ /** Fields to include (if not specified, all fields are included) */
21
+ includedFields?: string[];
22
+ /** Fields to exclude from clearing */
23
+ excludedFields?: string[];
24
+ /** Callback when refinements are cleared */
25
+ onClear?: () => void;
26
+ /** Custom render function */
27
+ renderButton?: (props: {
28
+ canClear: boolean;
29
+ onClick: () => void;
30
+ disabled: boolean;
31
+ }) => React.ReactNode;
32
+ /** Custom className */
33
+ className?: string;
34
+ /** Custom styles */
35
+ style?: React.CSSProperties;
36
+ /** Custom theme */
37
+ theme?: ClearRefinementsTheme;
38
+ /** Whether to hide when there are no refinements */
39
+ hideWhenEmpty?: boolean;
40
+ }
41
+ export declare const ClearRefinements: React.FC<ClearRefinementsProps>;
42
+ //# sourceMappingURL=ClearRefinements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClearRefinements.d.ts","sourceRoot":"","sources":["../../src/components/ClearRefinements.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAkB,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;KACnB,KAAK,KAAK,CAAC,SAAS,CAAC;IACtB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,oDAAoD;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAyG5D,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ClearRefinements Component
3
+ *
4
+ * A standalone button to clear all active refinements/filters
5
+ * Integrates with SearchStateManager for automatic state sync
6
+ */
7
+ import React, { useMemo } from 'react';
8
+ import { useSearchContext } from './SearchProvider';
9
+ import { useSearchState } from '../hooks/useSearchState';
10
+ import { clsx } from 'clsx';
11
+ export const ClearRefinements = ({ clearsQuery = false, resetLabel = 'Clear all filters', disabledLabel = 'No filters applied', includedFields, excludedFields = [], onClear, renderButton, className, style, theme: customTheme, hideWhenEmpty = false, }) => {
12
+ const { theme } = useSearchContext();
13
+ const { query, refinements, clearRefinements, setQuery, removeRefinement } = useSearchState();
14
+ const clearTheme = customTheme || {};
15
+ // Filter refinements based on included/excluded fields
16
+ const relevantRefinements = useMemo(() => {
17
+ return refinements.filter(r => {
18
+ if (excludedFields.includes(r.field))
19
+ return false;
20
+ if (includedFields && !includedFields.includes(r.field))
21
+ return false;
22
+ return true;
23
+ });
24
+ }, [refinements, includedFields, excludedFields]);
25
+ const canClear = relevantRefinements.length > 0 || (clearsQuery && query.length > 0);
26
+ const handleClick = () => {
27
+ if (!canClear)
28
+ return;
29
+ // Clear relevant refinements
30
+ if (includedFields || excludedFields.length > 0) {
31
+ // Clear only specific refinements
32
+ relevantRefinements.forEach(r => {
33
+ removeRefinement(r.field, r.value, false);
34
+ });
35
+ // Trigger search after all removals
36
+ if (relevantRefinements.length > 0) {
37
+ clearRefinements(false); // This will trigger the search
38
+ }
39
+ }
40
+ else {
41
+ // Clear all refinements
42
+ clearRefinements(!clearsQuery); // Trigger search if not also clearing query
43
+ }
44
+ // Clear query if requested
45
+ if (clearsQuery && query.length > 0) {
46
+ setQuery('', true);
47
+ }
48
+ // Call the callback
49
+ if (onClear) {
50
+ onClear();
51
+ }
52
+ };
53
+ // Hide when empty if requested
54
+ if (hideWhenEmpty && !canClear) {
55
+ return null;
56
+ }
57
+ // Custom render function
58
+ if (renderButton) {
59
+ return (React.createElement("div", { className: clsx(clearTheme.root, className), style: style }, renderButton({
60
+ canClear,
61
+ onClick: handleClick,
62
+ disabled: !canClear,
63
+ })));
64
+ }
65
+ return (React.createElement("div", { className: clsx(clearTheme.root, className), style: style },
66
+ React.createElement("button", { type: "button", onClick: handleClick, disabled: !canClear, className: clsx(clearTheme.button, !canClear && clearTheme.buttonDisabled), style: {
67
+ padding: `${theme.spacing.small} ${theme.spacing.medium}`,
68
+ fontSize: theme.typography.fontSize.medium,
69
+ fontWeight: theme.typography.fontWeight?.medium || 500,
70
+ backgroundColor: canClear ? theme.colors.primary : theme.colors.hover,
71
+ color: canClear ? '#ffffff' : theme.colors.textSecondary,
72
+ border: 'none',
73
+ borderRadius: typeof theme.borderRadius === 'string'
74
+ ? theme.borderRadius
75
+ : theme.borderRadius.medium,
76
+ cursor: canClear ? 'pointer' : 'not-allowed',
77
+ opacity: canClear ? 1 : 0.6,
78
+ transition: theme.transitions?.fast || '150ms ease-in-out',
79
+ }, "aria-label": canClear ? resetLabel : disabledLabel }, canClear ? resetLabel : disabledLabel)));
80
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * CurrentRefinements Component
3
+ *
4
+ * Displays currently active filters/refinements with ability to clear them
5
+ */
6
+ import React from 'react';
7
+ export interface Refinement {
8
+ field: string;
9
+ label?: string;
10
+ value: string;
11
+ displayValue?: string;
12
+ }
13
+ export interface CurrentRefinementsTheme {
14
+ container?: string;
15
+ list?: string;
16
+ item?: string;
17
+ label?: string;
18
+ value?: string;
19
+ clearButton?: string;
20
+ clearAllButton?: string;
21
+ }
22
+ export interface CurrentRefinementsProps {
23
+ /** Current refinements */
24
+ refinements?: Refinement[];
25
+ /** Callback when a refinement is cleared */
26
+ onRefinementClear?: (field: string, value: string) => void;
27
+ /** Callback when all refinements are cleared */
28
+ onClearAll?: () => void;
29
+ /** Custom render function for refinement */
30
+ renderRefinement?: (refinement: Refinement, index: number) => React.ReactNode;
31
+ /** Show "Clear all" button */
32
+ showClearAll?: boolean;
33
+ /** Custom className */
34
+ className?: string;
35
+ /** Custom styles */
36
+ style?: React.CSSProperties;
37
+ /** Custom theme */
38
+ theme?: CurrentRefinementsTheme;
39
+ }
40
+ export declare const CurrentRefinements: React.FC<CurrentRefinementsProps>;
41
+ //# sourceMappingURL=CurrentRefinements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurrentRefinements.d.ts","sourceRoot":"","sources":["../../src/components/CurrentRefinements.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,0BAA0B;IAC1B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC9E,8BAA8B;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,uBAAuB,CAAC;CACjC;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAmIhE,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * CurrentRefinements Component
3
+ *
4
+ * Displays currently active filters/refinements with ability to clear them
5
+ */
6
+ import React from 'react';
7
+ import { useSearchContext } from './SearchProvider';
8
+ import { clsx } from 'clsx';
9
+ export const CurrentRefinements = ({ refinements = [], onRefinementClear, onClearAll, renderRefinement, showClearAll = true, className, style, theme: customTheme, }) => {
10
+ const { theme } = useSearchContext();
11
+ const refinementsTheme = customTheme || {};
12
+ const handleClear = (field, value) => {
13
+ if (onRefinementClear) {
14
+ onRefinementClear(field, value);
15
+ }
16
+ };
17
+ const handleClearAll = () => {
18
+ if (onClearAll) {
19
+ onClearAll();
20
+ }
21
+ };
22
+ const defaultRenderRefinement = (refinement, index) => (React.createElement("div", { key: `${refinement.field}-${refinement.value}-${index}`, className: refinementsTheme.item, style: {
23
+ display: 'inline-flex',
24
+ alignItems: 'center',
25
+ padding: `${theme.spacing.small} ${theme.spacing.medium}`,
26
+ margin: `0 ${theme.spacing.small} ${theme.spacing.small} 0`,
27
+ backgroundColor: theme.colors.hover,
28
+ border: `1px solid ${theme.colors.border}`,
29
+ borderRadius: typeof theme.borderRadius === 'string' ? theme.borderRadius : theme.borderRadius.medium,
30
+ fontSize: theme.typography.fontSize.small,
31
+ } },
32
+ React.createElement("span", { className: refinementsTheme.label, style: {
33
+ marginRight: theme.spacing.small,
34
+ color: theme.colors.text,
35
+ fontWeight: '500',
36
+ } },
37
+ refinement.label || refinement.field,
38
+ ":"),
39
+ React.createElement("span", { className: refinementsTheme.value, style: {
40
+ marginRight: theme.spacing.small,
41
+ color: theme.colors.text,
42
+ } }, refinement.displayValue || refinement.value),
43
+ React.createElement("button", { type: "button", onClick: () => handleClear(refinement.field, refinement.value), className: refinementsTheme.clearButton, style: {
44
+ border: 'none',
45
+ backgroundColor: 'transparent',
46
+ color: theme.colors.text,
47
+ cursor: 'pointer',
48
+ fontSize: theme.typography.fontSize.medium,
49
+ padding: 0,
50
+ marginLeft: theme.spacing.small,
51
+ width: '20px',
52
+ height: '20px',
53
+ display: 'flex',
54
+ alignItems: 'center',
55
+ justifyContent: 'center',
56
+ borderRadius: '50%',
57
+ transition: theme.transitions?.fast || '150ms ease-in-out',
58
+ }, "aria-label": `Clear ${refinement.label || refinement.field}: ${refinement.value}` }, "\u00D7")));
59
+ if (refinements.length === 0) {
60
+ return null;
61
+ }
62
+ return (React.createElement("div", { className: clsx(refinementsTheme.container, className), style: style },
63
+ React.createElement("div", { className: refinementsTheme.list, style: {
64
+ display: 'flex',
65
+ flexWrap: 'wrap',
66
+ alignItems: 'center',
67
+ marginBottom: showClearAll ? theme.spacing.medium : 0,
68
+ } }, refinements.map((refinement, index) => {
69
+ return renderRefinement
70
+ ? renderRefinement(refinement, index)
71
+ : defaultRenderRefinement(refinement, index);
72
+ })),
73
+ showClearAll && refinements.length > 1 && (React.createElement("button", { type: "button", onClick: handleClearAll, className: refinementsTheme.clearAllButton, style: {
74
+ padding: `${theme.spacing.small} ${theme.spacing.medium}`,
75
+ border: `1px solid ${theme.colors.border}`,
76
+ borderRadius: typeof theme.borderRadius === 'string' ? theme.borderRadius : theme.borderRadius.medium,
77
+ backgroundColor: theme.colors.background,
78
+ color: theme.colors.text,
79
+ cursor: 'pointer',
80
+ fontSize: theme.typography.fontSize.small,
81
+ textDecoration: 'underline',
82
+ } }, "Clear all filters"))));
83
+ };
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Facets Component
3
+ *
4
+ * Displays facet filters for search results
5
+ */
6
+ import React from 'react';
7
+ import type { SearchResponse } from '@seekora-ai/search-sdk';
8
+ export interface FacetItem {
9
+ value: string;
10
+ count: number;
11
+ selected?: boolean;
12
+ }
13
+ export interface Facet {
14
+ field: string;
15
+ label?: string;
16
+ items: FacetItem[];
17
+ }
18
+ export interface FacetsTheme {
19
+ container?: string;
20
+ facet?: string;
21
+ facetHeader?: string;
22
+ facetTitle?: string;
23
+ facetList?: string;
24
+ facetItem?: string;
25
+ facetItemActive?: string;
26
+ facetItemCount?: string;
27
+ facetItemLabel?: string;
28
+ checkbox?: string;
29
+ }
30
+ export interface FacetsProps {
31
+ /** Search results response */
32
+ results?: SearchResponse | null;
33
+ /** Custom facets data */
34
+ facets?: Facet[];
35
+ /** Callback when facet is selected/deselected */
36
+ onFacetChange?: (field: string, value: string, selected: boolean) => void;
37
+ /** Custom render function for facet */
38
+ renderFacet?: (facet: Facet, index: number) => React.ReactNode;
39
+ /** Custom render function for facet item */
40
+ renderFacetItem?: (item: FacetItem, facet: Facet, index: number) => React.ReactNode;
41
+ /** Maximum number of items to show per facet */
42
+ maxItems?: number;
43
+ /** Show "Show more" button */
44
+ showMore?: boolean;
45
+ /** Custom className */
46
+ className?: string;
47
+ /** Custom styles */
48
+ style?: React.CSSProperties;
49
+ /** Custom theme */
50
+ theme?: FacetsTheme;
51
+ }
52
+ export declare const Facets: React.FC<FacetsProps>;
53
+ //# sourceMappingURL=Facets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Facets.d.ts","sourceRoot":"","sources":["../../src/components/Facets.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,iDAAiD;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1E,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/D,4CAA4C;IAC5C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IACpF,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAmRxC,CAAC"}