@envive-ai/react-toolkit 0.1.5 → 0.1.7
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/Accordion/index.cjs +84 -0
- package/dist/Accordion/index.d.cts +13 -0
- package/dist/Accordion/index.d.ts +13 -0
- package/dist/Accordion/index.js +77 -0
- package/dist/AppliedFiltersScrollbar/index.cjs +49 -0
- package/dist/AppliedFiltersScrollbar/index.d.cts +22 -0
- package/dist/AppliedFiltersScrollbar/index.d.ts +22 -0
- package/dist/AppliedFiltersScrollbar/index.js +44 -0
- package/dist/ButtonBase/index.cjs +2 -1
- package/dist/ButtonBase/index.d.cts +3 -3
- package/dist/ButtonBase/index.d.ts +1 -1
- package/dist/ButtonBase/index.js +2 -1
- package/dist/{ButtonBase-CpmFsiUf.js → ButtonBase-BIAu5fIG.js} +1 -1
- package/dist/ButtonBase-BRfuPPzN.js +1 -0
- package/dist/ButtonBase-BleAVeo-.cjs +0 -0
- package/dist/{ButtonBase-Dlh3bpR3.cjs → ButtonBase-DcyxOe2v.cjs} +2 -2
- package/dist/DynamicFiltersScrollbar/index.cjs +37 -0
- package/dist/DynamicFiltersScrollbar/index.d.cts +28 -0
- package/dist/DynamicFiltersScrollbar/index.d.ts +28 -0
- package/dist/DynamicFiltersScrollbar/index.js +32 -0
- package/dist/FilterScrollbar/index.cjs +1 -1
- package/dist/FilterScrollbar/index.d.cts +4 -4
- package/dist/FilterScrollbar/index.d.ts +4 -4
- package/dist/FilterScrollbar/index.js +1 -1
- package/dist/Headline/index.cjs +1 -1
- package/dist/Headline/index.d.cts +2 -2
- package/dist/Headline/index.js +1 -1
- package/dist/ImageWithFallback/index.cjs +1 -1
- package/dist/ImageWithFallback/index.d.ts +2 -2
- package/dist/ImageWithFallback/index.js +1 -1
- package/dist/{ImageWithFallback-By6QdlCR.cjs → ImageWithFallback-1LqhQK1q.cjs} +2 -2
- package/dist/{ImageWithFallback-DtUrq_bk.js → ImageWithFallback-Ckwsmd8P.js} +1 -1
- package/dist/ProductCard/index.cjs +7 -8
- package/dist/ProductCard/index.d.cts +2 -108
- package/dist/ProductCard/index.d.ts +2 -108
- package/dist/ProductCard/index.js +4 -5
- package/dist/{ProductCard-CvTRvhm7.cjs → ProductCard-DZZKutY-.cjs} +64 -5
- package/dist/{ProductCard-aJbQz6Q7.js → ProductCard-SF8-lXlT.js} +46 -6
- package/dist/ProductGrid/index.cjs +5 -5
- package/dist/ProductGrid/index.d.cts +6 -6
- package/dist/ProductGrid/index.d.ts +6 -6
- package/dist/ProductGrid/index.js +5 -5
- package/dist/{ProductGrid-CSIH2_G9.cjs → ProductGrid-BSSmPr7K.cjs} +48 -46
- package/dist/{ProductGrid-NOCayW9O.js → ProductGrid-DTUhH219.js} +48 -46
- package/dist/{SearchInputAutocomplete → SearchAutocomplete}/index.cjs +1 -1
- package/dist/{SearchInputAutocomplete → SearchAutocomplete}/index.d.cts +1 -1
- package/dist/{SearchInputAutocomplete → SearchAutocomplete}/index.d.ts +1 -1
- package/dist/SearchAutocomplete/index.js +3 -0
- package/dist/{SearchAutocomplete-DCu9-Yfk.js → SearchAutocomplete-BPjlo6qq.js} +4 -4
- package/dist/{SearchAutocomplete-CQxxe5Op.cjs → SearchAutocomplete-BzaEXmRQ.cjs} +8 -8
- package/dist/SearchFilter/index.cjs +5 -5
- package/dist/SearchFilter/index.d.cts +1 -34
- package/dist/SearchFilter/index.d.ts +1 -34
- package/dist/SearchFilter/index.js +2 -2
- package/dist/{SearchFilterHeader-qkRVfAB5.cjs → SearchFilter-B15tybnV.cjs} +1 -1
- package/dist/{SearchFilterHeader-BDEcDc_4.js → SearchFilter-D427M2UE.js} +1 -1
- package/dist/SearchInput/index.cjs +3 -3
- package/dist/SearchInput/index.d.cts +4 -4
- package/dist/SearchInput/index.d.ts +5 -5
- package/dist/SearchInput/index.js +3 -3
- package/dist/{SearchInput-DxGvYGZO.js → SearchInput-C0wB4hSV.js} +6 -6
- package/dist/{SearchInput-Cdpwswyv.cjs → SearchInput-D6UW79wT.cjs} +10 -10
- package/dist/SearchInputForm/index.cjs +6 -5
- package/dist/SearchInputForm/index.d.cts +1 -31
- package/dist/SearchInputForm/index.d.ts +1 -31
- package/dist/SearchInputForm/index.js +6 -5
- package/dist/SearchResultsContent/index.cjs +64 -0
- package/dist/SearchResultsContent/index.d.cts +67 -0
- package/dist/SearchResultsContent/index.d.ts +67 -0
- package/dist/SearchResultsContent/index.js +60 -0
- package/dist/SearchResultsFilterSidebar/index.cjs +10 -6
- package/dist/SearchResultsFilterSidebar/index.d.cts +3 -44
- package/dist/SearchResultsFilterSidebar/index.d.ts +3 -44
- package/dist/SearchResultsFilterSidebar/index.js +7 -4
- package/dist/SearchResultsStates/index.cjs +15 -125
- package/dist/SearchResultsStates/index.d.cts +14 -7
- package/dist/SearchResultsStates/index.d.ts +14 -7
- package/dist/SearchResultsStates/index.js +12 -117
- package/dist/SearchResultsStates-CNp6YCqF.js +112 -0
- package/dist/SearchResultsStates-Du7HXBi8.cjs +135 -0
- package/dist/SparkleAnimation/index.cjs +1 -1
- package/dist/SparkleAnimation/index.d.cts +2 -2
- package/dist/SparkleAnimation/index.d.ts +2 -2
- package/dist/SparkleAnimation/index.js +1 -1
- package/dist/{SparkleAnimation-DfMCtvAQ.js → SparkleAnimation-B0u6JtO3.js} +2 -2
- package/dist/{SparkleAnimation-j-mAMEZZ.cjs → SparkleAnimation-D1QpGZIg.cjs} +4 -4
- package/dist/Spinner/index.cjs +1 -1
- package/dist/Spinner/index.d.cts +2 -2
- package/dist/Spinner/index.js +1 -1
- package/dist/SuggestionButton/index.cjs +3 -3
- package/dist/SuggestionButton/index.d.cts +3 -3
- package/dist/SuggestionButton/index.d.ts +3 -3
- package/dist/SuggestionButton/index.js +2 -2
- package/dist/Text/index.cjs +2 -10
- package/dist/Text/index.d.cts +2 -2
- package/dist/Text/index.d.ts +3 -3
- package/dist/Text/index.js +1 -9
- package/dist/Text-DkwDPbHy.js +10 -0
- package/dist/Text-Ji61nRRE.cjs +16 -0
- package/dist/TextInput/index.cjs +1 -1
- package/dist/TextInput/index.d.ts +1 -1
- package/dist/TextInput/index.js +1 -1
- package/dist/{TextInput-CObd_Wcw.cjs → TextInput-C6fF9cSB.cjs} +2 -2
- package/dist/{TextInput-ChPhL54o.js → TextInput-CRMqBW3X.js} +1 -1
- package/dist/index-14eDYe9f.d.ts +58 -0
- package/dist/{types-Dvgr3ZeV.d.cts → index-B3iEVxkL.d.cts} +108 -23
- package/dist/index-B8bifyF-.d.ts +36 -0
- package/dist/index-BFdFh46m.d.cts +58 -0
- package/dist/{types-B7hf-Lif.d.ts → index-ByucvlTy.d.ts} +108 -23
- package/dist/index-C2iKBk7w.d.cts +36 -0
- package/dist/index-DLbdcczl.d.ts +78 -0
- package/dist/index-DlvTcfAg.d.cts +78 -0
- package/dist/{searchFilterSidebarVariants-C_UTEIpZ.js → searchFilterSidebarVariants-CZT1frB-.js} +1 -1
- package/dist/{searchFilterSidebarVariants-DcQLi_TT.cjs → searchFilterSidebarVariants-xyhy0PmQ.cjs} +1 -1
- package/package.json +22 -5
- package/src/components/Accordion/Accordion.tsx +90 -0
- package/src/components/Accordion/index.ts +1 -0
- package/src/components/AppliedFiltersScrollbar/AppliedFiltersScrollbar.tsx +70 -0
- package/src/components/AppliedFiltersScrollbar/index.ts +1 -0
- package/src/components/DynamicFiltersScrollbar/DynamicFiltersScrollbar.tsx +52 -0
- package/src/components/DynamicFiltersScrollbar/index.ts +1 -0
- package/src/components/ProductCard/ProductCard.tsx +34 -17
- package/src/components/ProductCard/types.ts +1 -1
- package/src/components/ProductGrid/ProductGrid.tsx +33 -33
- package/src/components/{SearchInputAutocomplete → SearchAutocomplete}/SearchAutocomplete.tsx +1 -1
- package/src/components/SearchInput/SearchInput.tsx +6 -6
- package/src/components/SearchInput/searchInputVariants.ts +5 -5
- package/src/components/SearchInputForm/SearchInputForm.tsx +6 -4
- package/src/components/SearchResultsContent/SearchResultsContent.tsx +87 -0
- package/src/components/SearchResultsContent/index.ts +2 -0
- package/src/components/SearchResultsContent/utils.ts +28 -0
- package/src/components/SearchResultsFilterSidebar/SearchResultsFilter.tsx +5 -6
- package/src/components/SearchResultsFilterSidebar/types.ts +14 -1
- package/src/components/SearchResultsStates/NoSearchResultsFound.tsx +2 -2
- package/src/components/SearchResultsStates/SearchResultsGrid.tsx +14 -12
- package/src/components/SearchResultsStates/SearchResultsLoadingGrid.tsx +4 -5
- package/dist/ProductCardSkeleton-B6YetUCT.js +0 -43
- package/dist/ProductCardSkeleton-BzBK36m-.cjs +0 -63
- package/dist/SearchInputAutocomplete/index.js +0 -3
- package/dist/types-5luH4G-3.d.cts +0 -5
- package/dist/types-BCAU5OQD.d.cts +0 -46
- package/dist/types-BIPqyTOJ.d.ts +0 -5
- package/dist/types-BwPquD10.d.ts +0 -46
- package/dist/types-CosVh8Hj.d.cts +0 -4
- package/dist/types-nR3jHgIO.d.ts +0 -4
- package/src/types/external.ts +0 -24
- /package/dist/{DynamicFiltersScrollbar-D8Lms7Ox.cjs → DynamicFiltersScrollbar-BTopFhyl.cjs} +0 -0
- /package/dist/{DynamicFiltersScrollbar-t_JASmYC.js → DynamicFiltersScrollbar-BmPTqym5.js} +0 -0
- /package/dist/{Headline-COAnonc2.js → Headline-XpaAeTSR.js} +0 -0
- /package/dist/{Headline-CdddUGwy.cjs → Headline-iP_MckEO.cjs} +0 -0
- /package/dist/{Spinner-D9kkaM9d.js → Spinner-BgGihEfJ.js} +0 -0
- /package/dist/{Spinner-DX35Epv3.cjs → Spinner-DzdIkS6t.cjs} +0 -0
- /package/dist/{colorsConfig-CKiMYHO_.js → colorsConfig-BQlaCfxi.js} +0 -0
- /package/dist/{colorsConfig-DulwYRIk.cjs → colorsConfig-DCvy_dV4.cjs} +0 -0
- /package/dist/{textVariantClasses-sT9E8Uty.d.ts → textVariantClasses-C8OCWZAw.d.ts} +0 -0
- /package/dist/{types-B19i3fxM.d.ts → types-Bm-qQyO3.d.ts} +0 -0
- /package/dist/{types-BQYpWDJ4.d.cts → types-C0UWKVvw.d.ts} +0 -0
- /package/dist/{types-C-Jrlw5Z.d.cts → types-CZHc-1wI.d.cts} +0 -0
- /package/dist/{types-DpfHwTzY.d.ts → types-D2xCS4y9.d.cts} +0 -0
- /package/src/components/{SearchInputAutocomplete → SearchAutocomplete}/index.ts +0 -0
package/src/components/{SearchInputAutocomplete → SearchAutocomplete}/SearchAutocomplete.tsx
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { motion } from 'framer-motion';
|
|
3
3
|
import classNames from 'classnames';
|
|
4
|
-
import OutlinedStar from '@envive-ai/react-icons/
|
|
4
|
+
import OutlinedStar from '@envive-ai/react-icons/OutlinedStar';
|
|
5
5
|
|
|
6
6
|
interface GlobalSearchAutocompleteProps {
|
|
7
7
|
id: string;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import React, { useRef, useImperativeHandle } from 'react';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import MagnifyingGlassStarVariant from '@envive-ai/react-icons/
|
|
4
|
-
import
|
|
5
|
-
import { TextInput } from '
|
|
3
|
+
import MagnifyingGlassStarVariant from '@envive-ai/react-icons/MagnifyingGlassStarVariant';
|
|
4
|
+
import { SearchInputVariant } from '../SearchInputForm';
|
|
5
|
+
import { TextInput } from '../TextInput';
|
|
6
6
|
import { searchInputVariantClasses } from './searchInputVariants';
|
|
7
|
-
import
|
|
7
|
+
import { IconClose } from '@envive-ai/react-icons/src/index.js';
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
interface SearchInputProps {
|
|
10
10
|
searchInputVariant?: SearchInputVariant;
|
|
11
11
|
value: string;
|
|
12
12
|
placeholder?: string;
|
|
@@ -126,7 +126,7 @@ export const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
|
|
|
126
126
|
aria-label="Clear search input"
|
|
127
127
|
type="button"
|
|
128
128
|
>
|
|
129
|
-
<
|
|
129
|
+
<IconClose className={closeButtonIconClassName} />
|
|
130
130
|
</button>
|
|
131
131
|
)}
|
|
132
132
|
</div>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import { colorVar, ColorNames } from 'src/models/colorsConfig';
|
|
2
|
+
import { SearchInputVariant } from '../SearchInputForm';
|
|
3
|
+
import { TextStyleVariantMap } from '../Text/textVariantClasses';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
type SearchInputVariantClasses = {
|
|
6
6
|
searchInputIconColor: string;
|
|
7
7
|
searchInputBorderColor: string;
|
|
8
8
|
searchInputCloseIconClasses: string;
|
|
@@ -10,7 +10,7 @@ interface SearchInputVariantClasses {
|
|
|
10
10
|
autocompleteIconColor: string;
|
|
11
11
|
searchInputClasses: string;
|
|
12
12
|
placeholderVariant: keyof typeof TextStyleVariantMap;
|
|
13
|
-
}
|
|
13
|
+
};
|
|
14
14
|
|
|
15
15
|
export const searchInputVariantClasses: Record<SearchInputVariant, SearchInputVariantClasses> = {
|
|
16
16
|
standard: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { SearchAutocomplete } from '../SearchInputAutocomplete/SearchAutocomplete';
|
|
3
|
-
import { searchInputVariantClasses } from '../SearchInput/searchInputVariants';
|
|
1
|
+
import { SearchAutocomplete } from '../SearchAutocomplete';
|
|
4
2
|
import { SearchInput } from '../SearchInput/SearchInput';
|
|
3
|
+
import { searchInputVariantClasses } from '../SearchInput/searchInputVariants';
|
|
4
|
+
import { SearchInputVariant } from './types';
|
|
5
5
|
|
|
6
6
|
interface SearchInputFormProps {
|
|
7
7
|
searchInputVariant: SearchInputVariant;
|
|
@@ -15,6 +15,7 @@ interface SearchInputFormProps {
|
|
|
15
15
|
onAutocompleteSelect: (suggestion: string) => void;
|
|
16
16
|
onSearchInputChange: (value: string) => void;
|
|
17
17
|
onSearchSubmit: () => void;
|
|
18
|
+
searchInputDataTestId?: string;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
export const SearchInputForm = ({
|
|
@@ -29,6 +30,7 @@ export const SearchInputForm = ({
|
|
|
29
30
|
onAutocompleteSelect,
|
|
30
31
|
onSearchInputChange,
|
|
31
32
|
onSearchSubmit,
|
|
33
|
+
searchInputDataTestId,
|
|
32
34
|
}: SearchInputFormProps) => {
|
|
33
35
|
const { searchInputIconColor } = searchInputVariantClasses[searchInputVariant];
|
|
34
36
|
|
|
@@ -47,7 +49,7 @@ export const SearchInputForm = ({
|
|
|
47
49
|
suggestions={autocompleteResults}
|
|
48
50
|
ariaActivedescendant={focusedOptionId}
|
|
49
51
|
searchInputVariant={searchInputVariant}
|
|
50
|
-
|
|
52
|
+
dataTestId={searchInputDataTestId}
|
|
51
53
|
onKeyDown={onKeyDown}
|
|
52
54
|
onChange={onSearchInputChange}
|
|
53
55
|
/>
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { SelectedFilterOption } from 'src/atoms/search/types';
|
|
2
|
+
import {
|
|
3
|
+
ProductCardConfig,
|
|
4
|
+
ProductGridVariant,
|
|
5
|
+
SearchResponseProductAttributes,
|
|
6
|
+
} from '../ProductCard';
|
|
7
|
+
import { SearchFilterSidebarVariant } from '../SearchResultsFilterSidebar';
|
|
8
|
+
import {
|
|
9
|
+
NoSearchResultsFound,
|
|
10
|
+
SearchResultsGrid,
|
|
11
|
+
SearchResultsLoadingGrid,
|
|
12
|
+
} from '../SearchResultsStates';
|
|
13
|
+
import { SearchResultsState } from './utils';
|
|
14
|
+
|
|
15
|
+
interface SearchResultsContentProps {
|
|
16
|
+
searchResultsState: SearchResultsState;
|
|
17
|
+
productList: SearchResponseProductAttributes['attributes'][];
|
|
18
|
+
productCardConfig: ProductCardConfig;
|
|
19
|
+
merchantShortName: string;
|
|
20
|
+
searchFilterSidebarVariant: SearchFilterSidebarVariant;
|
|
21
|
+
productGridVariant: ProductGridVariant;
|
|
22
|
+
productGridClasses: string;
|
|
23
|
+
containerXPaddingClasses: string;
|
|
24
|
+
selectedFilterOptions: SelectedFilterOption[];
|
|
25
|
+
availableDynamicFilters: { name: string; displayName: string }[];
|
|
26
|
+
searchResponseId: string;
|
|
27
|
+
onRemoveFilter: (filter: SelectedFilterOption) => void;
|
|
28
|
+
onToggleDynamicFilter: ({
|
|
29
|
+
filter,
|
|
30
|
+
dynamicFilterDisplayName,
|
|
31
|
+
}: {
|
|
32
|
+
filter: string;
|
|
33
|
+
dynamicFilterDisplayName: string;
|
|
34
|
+
}) => void;
|
|
35
|
+
noResultsFoundText?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const SearchResultsContent = ({
|
|
39
|
+
searchResultsState,
|
|
40
|
+
productList,
|
|
41
|
+
productCardConfig,
|
|
42
|
+
merchantShortName,
|
|
43
|
+
searchFilterSidebarVariant,
|
|
44
|
+
productGridVariant,
|
|
45
|
+
productGridClasses,
|
|
46
|
+
containerXPaddingClasses,
|
|
47
|
+
selectedFilterOptions,
|
|
48
|
+
availableDynamicFilters,
|
|
49
|
+
searchResponseId,
|
|
50
|
+
onRemoveFilter,
|
|
51
|
+
onToggleDynamicFilter,
|
|
52
|
+
noResultsFoundText,
|
|
53
|
+
}: SearchResultsContentProps) => {
|
|
54
|
+
return (
|
|
55
|
+
<div>
|
|
56
|
+
{searchResultsState === SearchResultsState.NoResults && (
|
|
57
|
+
<NoSearchResultsFound
|
|
58
|
+
containerPaddingClasses={containerXPaddingClasses}
|
|
59
|
+
includeBottomMargin
|
|
60
|
+
noResultsFoundText={noResultsFoundText}
|
|
61
|
+
/>
|
|
62
|
+
)}
|
|
63
|
+
{searchResultsState === SearchResultsState.Results && (
|
|
64
|
+
<SearchResultsGrid
|
|
65
|
+
searchFilterSidebarVariant={searchFilterSidebarVariant}
|
|
66
|
+
productCardConfig={productCardConfig}
|
|
67
|
+
merchantShortName={merchantShortName}
|
|
68
|
+
productList={productList}
|
|
69
|
+
productGridVariant={productGridVariant}
|
|
70
|
+
productGridClasses={productGridClasses}
|
|
71
|
+
containerXPaddingClasses={containerXPaddingClasses}
|
|
72
|
+
selectedFilterOptions={selectedFilterOptions}
|
|
73
|
+
availableDynamicFilters={availableDynamicFilters}
|
|
74
|
+
searchResponseId={searchResponseId}
|
|
75
|
+
onRemoveFilter={onRemoveFilter}
|
|
76
|
+
onToggleDynamicFilter={onToggleDynamicFilter}
|
|
77
|
+
/>
|
|
78
|
+
)}
|
|
79
|
+
{searchResultsState === SearchResultsState.Loading && (
|
|
80
|
+
<SearchResultsLoadingGrid
|
|
81
|
+
productGridVariant={productGridVariant}
|
|
82
|
+
productGridClasses={productGridClasses}
|
|
83
|
+
/>
|
|
84
|
+
)}
|
|
85
|
+
</div>
|
|
86
|
+
);
|
|
87
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SearchResponseProduct } from '@spiffy-ai/commerce-api-client';
|
|
2
|
+
|
|
3
|
+
export interface SearchResult {
|
|
4
|
+
products: SearchResponseProduct[]; // Flattened from all responses
|
|
5
|
+
filters: string[]; // Combined from all responses
|
|
6
|
+
generatedQuery?: string;
|
|
7
|
+
totalProductCount: number;
|
|
8
|
+
searchResponseId: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const enum SearchResultsState {
|
|
12
|
+
Loading,
|
|
13
|
+
Results,
|
|
14
|
+
NoResults,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const getSearchResultsState = (
|
|
18
|
+
isLoadingSearch: boolean,
|
|
19
|
+
searchData: SearchResult | null,
|
|
20
|
+
): SearchResultsState => {
|
|
21
|
+
if (isLoadingSearch) {
|
|
22
|
+
return SearchResultsState.Loading;
|
|
23
|
+
}
|
|
24
|
+
if (searchData) {
|
|
25
|
+
return SearchResultsState.Results;
|
|
26
|
+
}
|
|
27
|
+
return SearchResultsState.NoResults;
|
|
28
|
+
};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
|
|
3
|
-
import { SearchFilter } from '../SearchFilter/SearchFilter';
|
|
4
|
-
import { SearchFilterHeader } from '../SearchFilter/SearchFilterHeader';
|
|
5
|
-
import type { SearchFilter as SearchFilterType, SelectFilterItem } from '../SearchFilter/types';
|
|
6
|
-
import type { SearchFilterSidebarVariant } from './types';
|
|
7
3
|
import { searchFilterSidebarVariantClasses } from './searchFilterSidebarVariants';
|
|
8
|
-
import
|
|
4
|
+
import SettingsVariant from '@envive-ai/react-icons/SettingsVariant';
|
|
5
|
+
import { ButtonBase } from '../ButtonBase';
|
|
6
|
+
import { SelectFilterItem, SearchFilter, SearchFilterHeader } from '../SearchFilter';
|
|
7
|
+
import { SearchFilterSidebarVariant, type SearchFilter as SearchFilterType } from './types';
|
|
9
8
|
|
|
10
9
|
export type SearchResultsFilterProps = {
|
|
11
10
|
productCount: number;
|
|
@@ -70,7 +69,7 @@ export const SearchResultsFilter = ({
|
|
|
70
69
|
/>
|
|
71
70
|
<ButtonBase
|
|
72
71
|
onClick={openFilter}
|
|
73
|
-
|
|
72
|
+
icon={SettingsVariant}
|
|
74
73
|
iconClass="spiffy-tw-w-[28px] spiffy-tw-h-[28px] spiffy-tw-object-center"
|
|
75
74
|
text={filterButtonText}
|
|
76
75
|
textClass="spiffy-tw-uppercase spiffy-tw-text-[--spiffy-colors-text-primary] spiffy-tw-hidden md:spiffy-tw-block"
|
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
export type SearchFilterSidebarVariant = 'darkButton' | 'lightButton';
|
|
2
|
-
export type CloseIconVariant = 'light' | 'tertiary' | 'dark';
|
|
2
|
+
export type CloseIconVariant = 'light' | 'tertiary' | 'dark';
|
|
3
|
+
|
|
4
|
+
export type SearchFilter = {
|
|
5
|
+
id: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
items: SearchFilterItem[];
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type SearchFilterItem = {
|
|
11
|
+
id: string;
|
|
12
|
+
displayName: string;
|
|
13
|
+
value: string;
|
|
14
|
+
isSelected: boolean;
|
|
15
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import Sparkles from '@envive-ai/react-icons/
|
|
3
|
-
import { Text } from 'src/components/Text
|
|
2
|
+
import Sparkles from '@envive-ai/react-icons/Sparkles';
|
|
3
|
+
import { Text } from 'src/components/Text';
|
|
4
4
|
|
|
5
5
|
interface NoSearchResultsFoundProps {
|
|
6
6
|
containerPaddingClasses: string;
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { motion } from 'framer-motion';
|
|
2
|
-
import type { SelectedFilterOption } from 'src/atoms/search/types';
|
|
3
|
-
import classNames from 'classnames';
|
|
4
|
-
import type { SearchResponseProduct } from 'src/types/external';
|
|
5
|
-
import { ProductGrid } from 'src/components/ProductGrid/ProductGrid';
|
|
6
1
|
import { AppliedFiltersScrollbar } from '../FilterScrollbar/AppliedFiltersScrollbar';
|
|
7
2
|
import { DynamicFiltersScrollbar } from '../FilterScrollbar/DynamicFiltersScrollbar';
|
|
3
|
+
import { motion } from 'framer-motion';
|
|
4
|
+
|
|
8
5
|
import { searchFilterSidebarVariantClasses } from '../SearchResultsFilterSidebar/searchFilterSidebarVariants';
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
6
|
+
import classNames from 'classnames';
|
|
7
|
+
import { SearchResponseProduct } from '@spiffy-ai/commerce-api-client';
|
|
8
|
+
import { SelectedFilterOption } from 'src/atoms/search/types';
|
|
9
|
+
import { ProductCardConfig, ProductGridVariant } from '../ProductCard';
|
|
10
|
+
import { ProductGrid } from '../ProductGrid';
|
|
11
|
+
import { SearchFilterSidebarVariant } from '../SearchResultsFilterSidebar';
|
|
11
12
|
|
|
12
13
|
interface SearchResultsGridProps {
|
|
13
14
|
productList: SearchResponseProduct[];
|
|
15
|
+
productCardConfig: ProductCardConfig;
|
|
16
|
+
merchantShortName: string;
|
|
14
17
|
availableDynamicFilters: { name: string; displayName: string }[];
|
|
15
18
|
searchFilterSidebarVariant: SearchFilterSidebarVariant;
|
|
16
19
|
productGridVariant: ProductGridVariant;
|
|
@@ -30,6 +33,8 @@ interface SearchResultsGridProps {
|
|
|
30
33
|
|
|
31
34
|
export const SearchResultsGrid = ({
|
|
32
35
|
productList,
|
|
36
|
+
productCardConfig,
|
|
37
|
+
merchantShortName,
|
|
33
38
|
availableDynamicFilters,
|
|
34
39
|
searchFilterSidebarVariant,
|
|
35
40
|
productGridVariant,
|
|
@@ -93,12 +98,9 @@ export const SearchResultsGrid = ({
|
|
|
93
98
|
productList={productList}
|
|
94
99
|
productGridVariant={productGridVariant}
|
|
95
100
|
productGridClasses={productGridClasses}
|
|
101
|
+
productCardConfig={productCardConfig}
|
|
102
|
+
merchantShortName={merchantShortName}
|
|
96
103
|
searchResponseId={searchResponseId}
|
|
97
|
-
merchantShortName={''}
|
|
98
|
-
handleClick={function (clickedUrl: string): void {
|
|
99
|
-
console.log(clickedUrl);
|
|
100
|
-
throw new Error('Function not implemented.');
|
|
101
|
-
}}
|
|
102
104
|
/>
|
|
103
105
|
</motion.div>
|
|
104
106
|
);
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Text } from 'src/components/Text/Text';
|
|
2
|
-
import { SparkleAnimation } from 'src/components/SparkleAnimation/SparkleAnimation';
|
|
3
1
|
import { motion } from 'framer-motion';
|
|
4
|
-
import { ProductGridVariant } from '
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { ProductGridVariant, ProductCardSkeleton } from '../ProductCard';
|
|
3
|
+
import { productGridVariantClasses } from '../ProductGrid';
|
|
4
|
+
import { SparkleAnimation } from '../SparkleAnimation';
|
|
5
|
+
import { Text } from '@envive-ai/react-toolkit/Text';
|
|
7
6
|
|
|
8
7
|
export const SearchResultsLoadingGrid = ({
|
|
9
8
|
productGridVariant,
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { productCardLayoutVariantClasses } from "./ProductCard-aJbQz6Q7.js";
|
|
2
|
-
import classNames from "classnames";
|
|
3
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
-
|
|
5
|
-
//#region src/components/ProductCard/types.ts
|
|
6
|
-
let ProductCardSkeletonOverrides = /* @__PURE__ */ function(ProductCardSkeletonOverrides$1) {
|
|
7
|
-
ProductCardSkeletonOverrides$1["PRODUCT_CARD_SKELETON_CONTAINER"] = "spiffy-product-card-skeleton-container";
|
|
8
|
-
ProductCardSkeletonOverrides$1["PRODUCT_CARD_SKELETON"] = "spiffy-product-card-skeleton";
|
|
9
|
-
return ProductCardSkeletonOverrides$1;
|
|
10
|
-
}({});
|
|
11
|
-
let AnimatedProductCardOverrides = /* @__PURE__ */ function(AnimatedProductCardOverrides$1) {
|
|
12
|
-
AnimatedProductCardOverrides$1["PRODUCT_CARD_ANIMATED_CONTAINER"] = "spiffy-product-card-animated-container";
|
|
13
|
-
AnimatedProductCardOverrides$1["PRODUCT_CARD_ANIMATED_IMAGE_CONTAINER"] = "spiffy-product-card-animated";
|
|
14
|
-
return AnimatedProductCardOverrides$1;
|
|
15
|
-
}({});
|
|
16
|
-
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region src/components/ProductCard/ProductCardSkeleton.tsx
|
|
19
|
-
const ProductCardSkeleton = ({ layoutVariant, aspectRatio, growWithContainer = false }) => {
|
|
20
|
-
const layoutClasses = productCardLayoutVariantClasses[layoutVariant || "normal"];
|
|
21
|
-
const containerClasses = classNames(ProductCardSkeletonOverrides.PRODUCT_CARD_SKELETON_CONTAINER, "spiffy-tw-flex", "spiffy-tw-flex-col", "spiffy-tw-gap-inherit", "spiffy-tw-bg-transparent", !growWithContainer ? layoutClasses.container : "");
|
|
22
|
-
const verticalContainerClasses = classNames("spiffy-tw-flex", "spiffy-tw-flex-col", "spiffy-tw-overflow-hidden", "spiffy-tw-gap-inherit", !growWithContainer ? layoutClasses.verticalContainer : "");
|
|
23
|
-
const imageClipContainerClasses = classNames("spiffy-tw-w-full", aspectRatio === "3:4" ? "spiffy-tw-aspect-[3/4]" : "", aspectRatio === "square" ? "spiffy-tw-aspect-square" : "", "spiffy-tw-overflow-hidden");
|
|
24
|
-
const imageSkeletonClasses = classNames("spiffy-tw-bg-[#F4F4F6]", "spiffy-tw-animate-pulse", "spiffy-tw-opacity-70", "spiffy-tw-w-full", "spiffy-tw-h-full");
|
|
25
|
-
const contentContainerClasses = classNames("spiffy-tw-flex", "spiffy-tw-flex-col", "spiffy-tw-gap-2", "spiffy-tw-w-full", "spiffy-tw-p-2");
|
|
26
|
-
const textSkeletonClasses = classNames(ProductCardSkeletonOverrides.PRODUCT_CARD_SKELETON, "spiffy-tw-h-[15px]", "spiffy-tw-block", "spiffy-tw-rounded-sm", "spiffy-tw-animate-pulse", "spiffy-tw-opacity-70", "spiffy-tw-bg-[#F4F4F6]");
|
|
27
|
-
return /* @__PURE__ */ jsx("div", {
|
|
28
|
-
className: containerClasses,
|
|
29
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
30
|
-
className: verticalContainerClasses,
|
|
31
|
-
children: [/* @__PURE__ */ jsx("div", {
|
|
32
|
-
className: imageClipContainerClasses,
|
|
33
|
-
children: /* @__PURE__ */ jsx("div", { className: imageSkeletonClasses })
|
|
34
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
35
|
-
className: contentContainerClasses,
|
|
36
|
-
children: [/* @__PURE__ */ jsx("div", { className: classNames(textSkeletonClasses, "spiffy-tw-w-full") }), /* @__PURE__ */ jsx("div", { className: classNames(textSkeletonClasses, "spiffy-tw-w-[60%]") })]
|
|
37
|
-
})]
|
|
38
|
-
})
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
//#endregion
|
|
43
|
-
export { AnimatedProductCardOverrides, ProductCardSkeleton, ProductCardSkeletonOverrides };
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_ProductCard = require('./ProductCard-CvTRvhm7.cjs');
|
|
3
|
-
let classnames = require("classnames");
|
|
4
|
-
classnames = require_chunk.__toESM(classnames);
|
|
5
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
|
-
react_jsx_runtime = require_chunk.__toESM(react_jsx_runtime);
|
|
7
|
-
|
|
8
|
-
//#region src/components/ProductCard/types.ts
|
|
9
|
-
let ProductCardSkeletonOverrides = /* @__PURE__ */ function(ProductCardSkeletonOverrides$1) {
|
|
10
|
-
ProductCardSkeletonOverrides$1["PRODUCT_CARD_SKELETON_CONTAINER"] = "spiffy-product-card-skeleton-container";
|
|
11
|
-
ProductCardSkeletonOverrides$1["PRODUCT_CARD_SKELETON"] = "spiffy-product-card-skeleton";
|
|
12
|
-
return ProductCardSkeletonOverrides$1;
|
|
13
|
-
}({});
|
|
14
|
-
let AnimatedProductCardOverrides = /* @__PURE__ */ function(AnimatedProductCardOverrides$1) {
|
|
15
|
-
AnimatedProductCardOverrides$1["PRODUCT_CARD_ANIMATED_CONTAINER"] = "spiffy-product-card-animated-container";
|
|
16
|
-
AnimatedProductCardOverrides$1["PRODUCT_CARD_ANIMATED_IMAGE_CONTAINER"] = "spiffy-product-card-animated";
|
|
17
|
-
return AnimatedProductCardOverrides$1;
|
|
18
|
-
}({});
|
|
19
|
-
|
|
20
|
-
//#endregion
|
|
21
|
-
//#region src/components/ProductCard/ProductCardSkeleton.tsx
|
|
22
|
-
const ProductCardSkeleton = ({ layoutVariant, aspectRatio, growWithContainer = false }) => {
|
|
23
|
-
const layoutClasses = require_ProductCard.productCardLayoutVariantClasses[layoutVariant || "normal"];
|
|
24
|
-
const containerClasses = (0, classnames.default)(ProductCardSkeletonOverrides.PRODUCT_CARD_SKELETON_CONTAINER, "spiffy-tw-flex", "spiffy-tw-flex-col", "spiffy-tw-gap-inherit", "spiffy-tw-bg-transparent", !growWithContainer ? layoutClasses.container : "");
|
|
25
|
-
const verticalContainerClasses = (0, classnames.default)("spiffy-tw-flex", "spiffy-tw-flex-col", "spiffy-tw-overflow-hidden", "spiffy-tw-gap-inherit", !growWithContainer ? layoutClasses.verticalContainer : "");
|
|
26
|
-
const imageClipContainerClasses = (0, classnames.default)("spiffy-tw-w-full", aspectRatio === "3:4" ? "spiffy-tw-aspect-[3/4]" : "", aspectRatio === "square" ? "spiffy-tw-aspect-square" : "", "spiffy-tw-overflow-hidden");
|
|
27
|
-
const imageSkeletonClasses = (0, classnames.default)("spiffy-tw-bg-[#F4F4F6]", "spiffy-tw-animate-pulse", "spiffy-tw-opacity-70", "spiffy-tw-w-full", "spiffy-tw-h-full");
|
|
28
|
-
const contentContainerClasses = (0, classnames.default)("spiffy-tw-flex", "spiffy-tw-flex-col", "spiffy-tw-gap-2", "spiffy-tw-w-full", "spiffy-tw-p-2");
|
|
29
|
-
const textSkeletonClasses = (0, classnames.default)(ProductCardSkeletonOverrides.PRODUCT_CARD_SKELETON, "spiffy-tw-h-[15px]", "spiffy-tw-block", "spiffy-tw-rounded-sm", "spiffy-tw-animate-pulse", "spiffy-tw-opacity-70", "spiffy-tw-bg-[#F4F4F6]");
|
|
30
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
31
|
-
className: containerClasses,
|
|
32
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
33
|
-
className: verticalContainerClasses,
|
|
34
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
35
|
-
className: imageClipContainerClasses,
|
|
36
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: imageSkeletonClasses })
|
|
37
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
38
|
-
className: contentContainerClasses,
|
|
39
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: (0, classnames.default)(textSkeletonClasses, "spiffy-tw-w-full") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: (0, classnames.default)(textSkeletonClasses, "spiffy-tw-w-[60%]") })]
|
|
40
|
-
})]
|
|
41
|
-
})
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
//#endregion
|
|
46
|
-
Object.defineProperty(exports, 'AnimatedProductCardOverrides', {
|
|
47
|
-
enumerable: true,
|
|
48
|
-
get: function () {
|
|
49
|
-
return AnimatedProductCardOverrides;
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
Object.defineProperty(exports, 'ProductCardSkeleton', {
|
|
53
|
-
enumerable: true,
|
|
54
|
-
get: function () {
|
|
55
|
-
return ProductCardSkeleton;
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
Object.defineProperty(exports, 'ProductCardSkeletonOverrides', {
|
|
59
|
-
enumerable: true,
|
|
60
|
-
get: function () {
|
|
61
|
-
return ProductCardSkeletonOverrides;
|
|
62
|
-
}
|
|
63
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
//#region src/components/SearchFilter/types.d.ts
|
|
4
|
-
type SearchFilterItem = {
|
|
5
|
-
id: string;
|
|
6
|
-
displayName: string;
|
|
7
|
-
value: string;
|
|
8
|
-
isSelected: boolean;
|
|
9
|
-
};
|
|
10
|
-
type SearchFilter = {
|
|
11
|
-
id: string;
|
|
12
|
-
displayName: string;
|
|
13
|
-
items: SearchFilterItem[];
|
|
14
|
-
};
|
|
15
|
-
type SelectFilterItem = (filterItem: SearchFilterItem) => void;
|
|
16
|
-
interface SearchFilterItemProps {
|
|
17
|
-
filterItem: SearchFilterItem;
|
|
18
|
-
onSelectFilterItem: SelectFilterItem;
|
|
19
|
-
radioButtonFillColor: string;
|
|
20
|
-
radioButtonHoverColor: string;
|
|
21
|
-
radioButtonUncheckedBorderColor: string;
|
|
22
|
-
}
|
|
23
|
-
interface SearchFilterHeaderProps {
|
|
24
|
-
closeModal: () => void;
|
|
25
|
-
productCount: number;
|
|
26
|
-
headerClassName: string;
|
|
27
|
-
filterCloseIconVariant: 'dark' | 'light' | 'tertiary';
|
|
28
|
-
}
|
|
29
|
-
interface SearchFilterProps {
|
|
30
|
-
isOpen: boolean;
|
|
31
|
-
setIsOpen: (isOpen: boolean) => void;
|
|
32
|
-
filters: SearchFilter[];
|
|
33
|
-
productCount: number;
|
|
34
|
-
selectFilterItem: SelectFilterItem;
|
|
35
|
-
clearAllFilters: () => void;
|
|
36
|
-
applyFiltersUnchangedClasses: string;
|
|
37
|
-
applyFiltersChangedClasses: string;
|
|
38
|
-
filterButtonText: string;
|
|
39
|
-
radioButtonFillColor: string;
|
|
40
|
-
radioButtonHoverColor: string;
|
|
41
|
-
radioButtonUncheckedBorderColor: string;
|
|
42
|
-
filterCloseIconVariant: 'dark' | 'light' | 'tertiary';
|
|
43
|
-
headerContent: ReactNode;
|
|
44
|
-
}
|
|
45
|
-
//#endregion
|
|
46
|
-
export { SearchFilter, SearchFilterHeaderProps, SearchFilterItemProps, SearchFilterProps, SelectFilterItem };
|
package/dist/types-BIPqyTOJ.d.ts
DELETED
package/dist/types-BwPquD10.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
//#region src/components/SearchFilter/types.d.ts
|
|
4
|
-
type SearchFilterItem = {
|
|
5
|
-
id: string;
|
|
6
|
-
displayName: string;
|
|
7
|
-
value: string;
|
|
8
|
-
isSelected: boolean;
|
|
9
|
-
};
|
|
10
|
-
type SearchFilter = {
|
|
11
|
-
id: string;
|
|
12
|
-
displayName: string;
|
|
13
|
-
items: SearchFilterItem[];
|
|
14
|
-
};
|
|
15
|
-
type SelectFilterItem = (filterItem: SearchFilterItem) => void;
|
|
16
|
-
interface SearchFilterItemProps {
|
|
17
|
-
filterItem: SearchFilterItem;
|
|
18
|
-
onSelectFilterItem: SelectFilterItem;
|
|
19
|
-
radioButtonFillColor: string;
|
|
20
|
-
radioButtonHoverColor: string;
|
|
21
|
-
radioButtonUncheckedBorderColor: string;
|
|
22
|
-
}
|
|
23
|
-
interface SearchFilterHeaderProps {
|
|
24
|
-
closeModal: () => void;
|
|
25
|
-
productCount: number;
|
|
26
|
-
headerClassName: string;
|
|
27
|
-
filterCloseIconVariant: 'dark' | 'light' | 'tertiary';
|
|
28
|
-
}
|
|
29
|
-
interface SearchFilterProps {
|
|
30
|
-
isOpen: boolean;
|
|
31
|
-
setIsOpen: (isOpen: boolean) => void;
|
|
32
|
-
filters: SearchFilter[];
|
|
33
|
-
productCount: number;
|
|
34
|
-
selectFilterItem: SelectFilterItem;
|
|
35
|
-
clearAllFilters: () => void;
|
|
36
|
-
applyFiltersUnchangedClasses: string;
|
|
37
|
-
applyFiltersChangedClasses: string;
|
|
38
|
-
filterButtonText: string;
|
|
39
|
-
radioButtonFillColor: string;
|
|
40
|
-
radioButtonHoverColor: string;
|
|
41
|
-
radioButtonUncheckedBorderColor: string;
|
|
42
|
-
filterCloseIconVariant: 'dark' | 'light' | 'tertiary';
|
|
43
|
-
headerContent: ReactNode;
|
|
44
|
-
}
|
|
45
|
-
//#endregion
|
|
46
|
-
export { SearchFilter, SearchFilterHeaderProps, SearchFilterItemProps, SearchFilterProps, SelectFilterItem };
|
package/dist/types-nR3jHgIO.d.ts
DELETED
package/src/types/external.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// Local type definitions for external dependencies that may not be available
|
|
2
|
-
|
|
3
|
-
export enum ResponseCategory {
|
|
4
|
-
Product = 'product',
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface SearchResponseProduct {
|
|
8
|
-
id: string;
|
|
9
|
-
title: string;
|
|
10
|
-
description?: string;
|
|
11
|
-
price?: number;
|
|
12
|
-
currency?: string;
|
|
13
|
-
imageUrl?: string;
|
|
14
|
-
brand?: string;
|
|
15
|
-
category?: string;
|
|
16
|
-
availability?: string;
|
|
17
|
-
url?: string;
|
|
18
|
-
responseId?: string;
|
|
19
|
-
originalPrice?: number;
|
|
20
|
-
salePrice?: number;
|
|
21
|
-
averageRating?: number;
|
|
22
|
-
numberReviews?: number;
|
|
23
|
-
[key: string]: unknown;
|
|
24
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|