@envive-ai/react-toolkit 0.1.12 → 0.1.13
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 +3 -3
- package/dist/Accordion/index.d.cts +2 -2
- package/dist/Accordion/index.d.ts +2 -2
- package/dist/Accordion/index.js +3 -3
- package/dist/{Accordion-DBZpiQe7.cjs → Accordion-D9gO9_y3.cjs} +1 -1
- package/dist/{Accordion-Cp3Hx2zm.js → Accordion-ZEdp99Ph.js} +1 -1
- package/dist/AppliedFiltersScrollbar/index.cjs +25 -27
- package/dist/AppliedFiltersScrollbar/index.d.cts +2 -2
- package/dist/AppliedFiltersScrollbar/index.d.ts +2 -2
- package/dist/AppliedFiltersScrollbar/index.js +25 -27
- package/dist/ButtonBase/index.cjs +3 -3
- package/dist/ButtonBase/index.d.cts +2 -3
- package/dist/ButtonBase/index.d.ts +2 -3
- package/dist/ButtonBase/index.js +3 -3
- package/dist/{ButtonBase-BAf-nlCm.js → ButtonBase-DgRupM53.js} +3 -3
- package/dist/{ButtonBase-Do88ndKa.cjs → ButtonBase-DrIwVGTR.cjs} +3 -3
- package/dist/DynamicFiltersScrollbar/index.cjs +23 -25
- package/dist/DynamicFiltersScrollbar/index.d.cts +2 -2
- package/dist/DynamicFiltersScrollbar/index.d.ts +2 -2
- package/dist/DynamicFiltersScrollbar/index.js +23 -25
- package/dist/DynamicFiltersScrollbar-B1j53y2q.cjs +81 -0
- package/dist/DynamicFiltersScrollbar-D7WYp6x9.js +66 -0
- package/dist/FilterScrollbar/index.cjs +3 -3
- package/dist/FilterScrollbar/index.d.cts +3 -3
- package/dist/FilterScrollbar/index.d.ts +3 -3
- package/dist/FilterScrollbar/index.js +3 -3
- package/dist/Headline/index.cjs +2 -2
- package/dist/Headline/index.d.cts +2 -2
- package/dist/Headline/index.d.ts +2 -2
- package/dist/Headline/index.js +2 -2
- package/dist/{Headline-DNEWF8ly.js → Headline-COv0Jbn8.js} +1 -1
- package/dist/{Headline-DTT4RSv2.cjs → Headline-Cp79THVF.cjs} +1 -1
- package/dist/ImageWithFallback/index.d.cts +2 -2
- package/dist/ImageWithFallback/index.d.ts +2 -2
- package/dist/ModalSheet/index.d.cts +2 -2
- package/dist/ModalSheet/index.d.ts +2 -2
- package/dist/ProductCard/index.cjs +4 -4
- package/dist/ProductCard/index.d.cts +1 -1
- package/dist/ProductCard/index.d.ts +1 -1
- package/dist/ProductCard/index.js +4 -4
- package/dist/{ProductCard-C3MjnfZJ.js → ProductCard-CNwmHggx.js} +32 -32
- package/dist/{ProductCard-FDyIMnZs.cjs → ProductCard-EmdDy2af.cjs} +32 -32
- package/dist/ProductGrid/index.cjs +5 -5
- package/dist/ProductGrid/index.d.cts +4 -8
- package/dist/ProductGrid/index.d.ts +4 -8
- package/dist/ProductGrid/index.js +5 -5
- package/dist/{ProductGrid-TlntVJ6h.cjs → ProductGrid-CMoomZLc.cjs} +3 -7
- package/dist/{ProductGrid-C9OKsyB2.js → ProductGrid-nmWSp0qX.js} +3 -7
- package/dist/RadioButton/index.cjs +3 -3
- package/dist/RadioButton/index.d.cts +5 -3
- package/dist/RadioButton/index.d.ts +5 -3
- package/dist/RadioButton/index.js +3 -3
- package/dist/{RadioButton-DZ6QXkrN.cjs → RadioButton-BdKJRzLM.cjs} +17 -10
- package/dist/{RadioButton-Bf68dZl7.js → RadioButton-S5dALI2f.js} +18 -11
- package/dist/RadioButtonGroup/index.cjs +4 -4
- package/dist/RadioButtonGroup/index.d.cts +2 -2
- package/dist/RadioButtonGroup/index.d.ts +2 -2
- package/dist/RadioButtonGroup/index.js +4 -4
- package/dist/{RadioButtonGroup-8k7hkJYB.js → RadioButtonGroup-BipNsoHL.js} +2 -1
- package/dist/{RadioButtonGroup-Dc_n5amh.cjs → RadioButtonGroup-TAJMA1j_.cjs} +2 -1
- package/dist/SearchAutocomplete/index.cjs +56 -2
- package/dist/SearchAutocomplete/index.js +49 -1
- package/dist/SearchFilter/index.cjs +8 -8
- package/dist/SearchFilter/index.d.cts +4 -4
- package/dist/SearchFilter/index.d.ts +4 -4
- package/dist/SearchFilter/index.js +8 -8
- package/dist/{SearchFilter-CTVBi5s3.cjs → SearchFilter-BcLc0TMq.cjs} +26 -16
- package/dist/{SearchFilter-DvqBIXa1.js → SearchFilter-w-0s2YVu.js} +26 -16
- package/dist/SearchInput/index.cjs +96 -6
- package/dist/SearchInput/index.d.cts +1 -1
- package/dist/SearchInput/index.d.ts +2 -2
- package/dist/SearchInput/index.js +88 -4
- package/dist/SearchInputForm/index.cjs +0 -39
- package/dist/SearchInputForm/index.d.cts +2 -2
- package/dist/SearchInputForm/index.d.ts +2 -2
- package/dist/SearchInputForm/index.js +1 -37
- package/dist/SearchResultsContent/index.cjs +34 -37
- package/dist/SearchResultsContent/index.d.cts +4 -6
- package/dist/SearchResultsContent/index.d.ts +4 -6
- package/dist/SearchResultsContent/index.js +34 -37
- package/dist/SearchResultsFilterSidebar/index.cjs +10 -10
- package/dist/SearchResultsFilterSidebar/index.d.cts +1 -1
- package/dist/SearchResultsFilterSidebar/index.d.ts +1 -1
- package/dist/SearchResultsFilterSidebar/index.js +10 -10
- package/dist/SearchResultsStates/index.cjs +10 -10
- package/dist/SearchResultsStates/index.d.cts +6 -8
- package/dist/SearchResultsStates/index.d.ts +6 -8
- package/dist/SearchResultsStates/index.js +10 -10
- package/dist/{SearchResultsStates-iKz64Pd4.js → SearchResultsStates-DlZz14yy.js} +8 -10
- package/dist/{SearchResultsStates-CH4agenX.cjs → SearchResultsStates-DwcPrsdd.cjs} +8 -10
- 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-qi5WCJ9B.cjs → SparkleAnimation-CvGlWUqv.cjs} +0 -1
- package/dist/{SparkleAnimation-BLfNojLv.js → SparkleAnimation-paLhSu5E.js} +0 -1
- package/dist/Spinner/index.d.cts +2 -2
- package/dist/SuggestionButton/index.cjs +3 -3
- package/dist/SuggestionButton/index.d.cts +2 -2
- package/dist/SuggestionButton/index.d.ts +2 -2
- package/dist/SuggestionButton/index.js +3 -3
- package/dist/Text/index.cjs +2 -2
- package/dist/Text/index.d.cts +2 -2
- package/dist/Text/index.d.ts +3 -3
- package/dist/Text/index.js +2 -2
- package/dist/{Text-Bod4OMPk.js → Text-BLzNhX4H.js} +1 -1
- package/dist/{Text-MQjxqgZZ.cjs → Text-DllCE9_D.cjs} +1 -1
- package/dist/TextInput/index.cjs +2 -2
- package/dist/TextInput/index.d.ts +1 -1
- package/dist/TextInput/index.js +2 -2
- package/dist/{TextInput-DoM41M53.js → TextInput-DmsOxxPN.js} +1 -1
- package/dist/{TextInput-B3dTeD3q.cjs → TextInput-HMW0hxLI.cjs} +1 -1
- package/dist/ToggleButton/index.cjs +3 -3
- package/dist/ToggleButton/index.d.cts +2 -2
- package/dist/ToggleButton/index.d.ts +2 -2
- package/dist/ToggleButton/index.js +3 -3
- package/dist/{ToggleButton-CK_vkMvt.cjs → ToggleButton-DblAj4Cd.cjs} +1 -1
- package/dist/{ToggleButton-GIVd2-Z4.js → ToggleButton-r7Y7Kzzo.js} +1 -1
- package/dist/index-BKvXn5sj.d.ts +4 -0
- package/dist/{index-B8l3muO3.d.ts → index-Br1B7Jta.d.cts} +2 -3
- package/dist/{index-CFH3KUVw.d.cts → index-DADHwW6M.d.ts} +5 -9
- package/dist/{index-Vck3pox6.d.ts → index-DDp-fLgm.d.cts} +5 -9
- package/dist/{index-BMt66uqr.d.cts → index-Dh8rcWev.d.ts} +2 -3
- package/dist/index-W1wCDiw_.d.cts +4 -0
- package/dist/{searchFilterSidebarVariants-CI782ylo.js → searchFilterSidebarVariants-J0FJ8pck.js} +1 -1
- package/dist/{searchFilterSidebarVariants-DFfOTqjc.cjs → searchFilterSidebarVariants-kkTjYEIF.cjs} +1 -1
- package/dist/{textVariantClasses-Dgz7Zaql.cjs → textVariantClasses-CBre7vXv.cjs} +5 -7
- package/dist/{textVariantClasses-D77TGEy1.js → textVariantClasses-CRrTb43V.js} +5 -7
- package/package.json +2 -6
- package/src/components/AppliedFiltersScrollbar/AppliedFiltersScrollbar.tsx +25 -27
- package/src/components/ButtonBase/ButtonBase.tsx +1 -2
- package/src/components/DynamicFiltersScrollbar/DynamicFiltersScrollbar.tsx +26 -28
- package/src/components/FilterScrollbar/AppliedFiltersScrollbar.tsx +25 -27
- package/src/components/FilterScrollbar/DynamicFiltersScrollbar.tsx +26 -28
- package/src/components/ModalSheet/ModalSheet.tsx +1 -1
- package/src/components/ModalSheet/common/closeIcon.tsx +2 -2
- package/src/components/ModalSheet/mobile/mobileHeader.tsx +1 -1
- package/src/components/ProductCard/ProductCard.tsx +5 -28
- package/src/components/ProductGrid/ProductGrid.tsx +3 -11
- package/src/components/RadioButton/RadioButton.tsx +15 -6
- package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +1 -0
- package/src/components/SearchFilter/SearchFilter.tsx +2 -2
- package/src/components/SearchFilter/SearchFilterFooter.tsx +1 -1
- package/src/components/SearchFilter/SearchFilterHeader.tsx +6 -1
- package/src/components/SearchFilter/SearchFilterItem.tsx +17 -3
- package/src/components/SearchFilter/useHasFilterStateChanged.tsx +1 -0
- package/src/components/SearchFilter/utils.ts +4 -6
- package/src/components/SearchInput/SearchInput.tsx +2 -2
- package/src/components/SearchInputForm/index.ts +0 -1
- package/src/components/SearchResultsContent/SearchResultsContent.tsx +33 -38
- package/src/components/SearchResultsFilterSidebar/SearchResultsFilter.tsx +2 -3
- package/src/components/SearchResultsFilterSidebar/searchFilterSidebarVariants.ts +1 -1
- package/src/components/SearchResultsStates/SearchResultsGrid.tsx +4 -8
- package/src/components/SearchResultsStates/SearchResultsLoadingGrid.tsx +3 -3
- package/src/components/SparkleAnimation/SparkleAnimation.tsx +0 -1
- package/src/components/Spinner/Spinner.tsx +29 -14
- package/src/components/SuggestionButton/SuggestionButton.tsx +1 -1
- package/src/components/SuggestionButton/types.ts +1 -1
- package/src/components/Text/textVariantClasses.ts +12 -10
- package/src/components/TextInput/TextInput.tsx +1 -0
- package/src/util/camelCasedPropertiesDeep.ts +22 -22
- package/src/util/internal.ts +4 -2
- package/src/util/splitWords.ts +35 -31
- package/dist/DynamicFiltersScrollbar-C4kdNSJ9.js +0 -70
- package/dist/DynamicFiltersScrollbar-CVw1PINp.cjs +0 -85
- package/dist/SearchAutocomplete-BlpII8Xs.js +0 -51
- package/dist/SearchAutocomplete-DIEhLT4C.cjs +0 -62
- package/dist/SearchInput-CVaCPWCE.js +0 -89
- package/dist/SearchInput-vJMWoLzS.cjs +0 -106
- package/dist/Styles/index.cjs +0 -274
- package/dist/Styles/index.d.cts +0 -258
- package/dist/Styles/index.d.ts +0 -258
- package/dist/Styles/index.js +0 -274
- package/dist/index-H_9LhS_1.d.cts +0 -36
- package/dist/index-h-QwQNnu.d.ts +0 -36
- package/src/components/Styles/EnviveTailwindPreset.ts +0 -285
- package/src/components/Styles/index.ts +0 -2
- package/tailwind-preset.js +0 -3
- /package/dist/{colorsConfig-D-MZuBvt.cjs → colorsConfig-B3-SMUSx.cjs} +0 -0
- /package/dist/{colorsConfig-DEfiLHH0.js → colorsConfig-DZ-GSPWy.js} +0 -0
- /package/dist/{textVariantClasses-kyZtL8F5.d.ts → textVariantClasses-C8OCWZAw.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime22 from "react/jsx-runtime";
|
|
2
2
|
import { SearchFilterDatum, SelectFilterItem } from "@envive-ai/react-hooks/types";
|
|
3
3
|
|
|
4
4
|
//#region src/components/SearchResultsFilterSidebar/types.d.ts
|
|
@@ -28,7 +28,6 @@ type SearchResultsFilterProps = {
|
|
|
28
28
|
setIsOpen: (isOpen: boolean) => void;
|
|
29
29
|
searchFilters: SearchFilterDatum[];
|
|
30
30
|
searchFilterSidebarVariant: SearchFilterSidebarVariant;
|
|
31
|
-
searchText: string;
|
|
32
31
|
onSelectFilterItem: SelectFilterItem;
|
|
33
32
|
onClearAllFilters: () => void;
|
|
34
33
|
filterButtonText: string;
|
|
@@ -42,6 +41,6 @@ declare const SearchResultsFilter: ({
|
|
|
42
41
|
onSelectFilterItem,
|
|
43
42
|
onClearAllFilters,
|
|
44
43
|
filterButtonText
|
|
45
|
-
}: SearchResultsFilterProps) =>
|
|
44
|
+
}: SearchResultsFilterProps) => react_jsx_runtime22.JSX.Element;
|
|
46
45
|
//#endregion
|
|
47
46
|
export { CloseIconVariant$1 as CloseIconVariant, SearchFilterSidebarVariant, SearchResultsFilter, SearchResultsFilterProps, searchFilterSidebarVariantClasses };
|
package/dist/{searchFilterSidebarVariants-DFfOTqjc.cjs → searchFilterSidebarVariants-kkTjYEIF.cjs}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_colorsConfig = require('./colorsConfig-
|
|
1
|
+
const require_colorsConfig = require('./colorsConfig-B3-SMUSx.cjs');
|
|
2
2
|
|
|
3
3
|
//#region src/components/SearchResultsFilterSidebar/searchFilterSidebarVariants.ts
|
|
4
4
|
const searchFilterSidebarVariantClasses = {
|
|
@@ -90,13 +90,11 @@ const TextStyleVariantMap = {
|
|
|
90
90
|
...TextVariantMap,
|
|
91
91
|
...HeadlineVariantMap
|
|
92
92
|
};
|
|
93
|
-
const getVariantPlaceholderClassNames = (classes) => {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}, {});
|
|
99
|
-
};
|
|
93
|
+
const getVariantPlaceholderClassNames = (classes) => Object.keys(classes).reduce((acc, key) => {
|
|
94
|
+
if (key.includes("spiffy-tw")) acc[`placeholder:${key}`] = classes[key];
|
|
95
|
+
else acc[`${key}-placeholder`] = classes[key];
|
|
96
|
+
return acc;
|
|
97
|
+
}, {});
|
|
100
98
|
|
|
101
99
|
//#endregion
|
|
102
100
|
Object.defineProperty(exports, 'HeadlineVariantMap', {
|
|
@@ -89,13 +89,11 @@ const TextStyleVariantMap = {
|
|
|
89
89
|
...TextVariantMap,
|
|
90
90
|
...HeadlineVariantMap
|
|
91
91
|
};
|
|
92
|
-
const getVariantPlaceholderClassNames = (classes) => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}, {});
|
|
98
|
-
};
|
|
92
|
+
const getVariantPlaceholderClassNames = (classes) => Object.keys(classes).reduce((acc, key) => {
|
|
93
|
+
if (key.includes("spiffy-tw")) acc[`placeholder:${key}`] = classes[key];
|
|
94
|
+
else acc[`${key}-placeholder`] = classes[key];
|
|
95
|
+
return acc;
|
|
96
|
+
}, {});
|
|
99
97
|
|
|
100
98
|
//#endregion
|
|
101
99
|
export { HeadlineVariantMap, TextStyleVariantMap, TextVariantMap, getVariantPlaceholderClassNames };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@envive-ai/react-toolkit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "React component library for Envive services.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"postcss": "^8.5.6",
|
|
46
46
|
"tailwindcss": "^3.4.17",
|
|
47
47
|
"tsdown": "^0.14.2",
|
|
48
|
-
"typescript": "
|
|
48
|
+
"typescript": "^5.4.3"
|
|
49
49
|
},
|
|
50
50
|
"exports": {
|
|
51
51
|
"./Accordion": {
|
|
@@ -132,10 +132,6 @@
|
|
|
132
132
|
"import": "./dist/Spinner/index.js",
|
|
133
133
|
"require": "./dist/Spinner/index.cjs"
|
|
134
134
|
},
|
|
135
|
-
"./Styles": {
|
|
136
|
-
"import": "./dist/Styles/index.js",
|
|
137
|
-
"require": "./dist/Styles/index.cjs"
|
|
138
|
-
},
|
|
139
135
|
"./SuggestionButton": {
|
|
140
136
|
"import": "./dist/SuggestionButton/index.js",
|
|
141
137
|
"require": "./dist/SuggestionButton/index.cjs"
|
|
@@ -38,33 +38,31 @@ export const AppliedFiltersScrollbar = ({
|
|
|
38
38
|
|
|
39
39
|
return (
|
|
40
40
|
<ScrollContainer className={filterBarClassNames} hideScrollbars>
|
|
41
|
-
{selectedFilterOptions.map((filter) =>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
>
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
);
|
|
67
|
-
})}
|
|
41
|
+
{selectedFilterOptions.map((filter) => (
|
|
42
|
+
<button
|
|
43
|
+
key={filter.id}
|
|
44
|
+
className={buttonClasses}
|
|
45
|
+
type="button"
|
|
46
|
+
onClick={() => onRemoveFilter(filter)}
|
|
47
|
+
aria-label={`Remove filter: ${filter.displayName}`}
|
|
48
|
+
>
|
|
49
|
+
<div className="spiffy-tw-flex spiffy-tw-items-center spiffy-tw-gap-[8px]">
|
|
50
|
+
<Text variant="body3">{filter.displayName}</Text>
|
|
51
|
+
<svg
|
|
52
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
53
|
+
width="10"
|
|
54
|
+
height="10"
|
|
55
|
+
viewBox="0 0 10 10"
|
|
56
|
+
fill="none"
|
|
57
|
+
>
|
|
58
|
+
<path
|
|
59
|
+
d="M4.59766 4.29297L8.48535 0.405273L9.19238 1.1123L5.30469 5L9.19238 8.8877L8.48535 9.59473L4.59766 5.70703L0.707031 9.59766L0 8.89062L3.89062 5L0 1.10938L0.707031 0.402344L4.59766 4.29297Z"
|
|
60
|
+
fill={iconColor}
|
|
61
|
+
/>
|
|
62
|
+
</svg>
|
|
63
|
+
</div>
|
|
64
|
+
</button>
|
|
65
|
+
))}
|
|
68
66
|
</ScrollContainer>
|
|
69
67
|
);
|
|
70
68
|
};
|
|
@@ -4,7 +4,6 @@ import { ButtonBaseOverrides, ButtonBaseProps } from './types';
|
|
|
4
4
|
import { Text } from '../Text/Text';
|
|
5
5
|
|
|
6
6
|
export const ButtonBase = ({
|
|
7
|
-
type = 'button',
|
|
8
7
|
isDisabled = false,
|
|
9
8
|
dataAttributes,
|
|
10
9
|
buttonClass,
|
|
@@ -53,7 +52,7 @@ export const ButtonBase = ({
|
|
|
53
52
|
|
|
54
53
|
return (
|
|
55
54
|
<button
|
|
56
|
-
type=
|
|
55
|
+
type="button"
|
|
57
56
|
ref={buttonRef}
|
|
58
57
|
className={buttonClassName}
|
|
59
58
|
disabled={isDisabled}
|
|
@@ -22,31 +22,29 @@ export const DynamicFiltersScrollbar = ({
|
|
|
22
22
|
filterDefaultClasses,
|
|
23
23
|
filterHoverClasses,
|
|
24
24
|
onToggleDynamicFilter,
|
|
25
|
-
}: DynamicFiltersScrollbarProps) =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
);
|
|
52
|
-
};
|
|
25
|
+
}: DynamicFiltersScrollbarProps) => (
|
|
26
|
+
<ScrollContainer className={filterBarClassNames} hideScrollbars>
|
|
27
|
+
{availableDynamicFilters.map(({ name, displayName }) => {
|
|
28
|
+
const buttonClasses = classNames(
|
|
29
|
+
'spiffy-tw-px-[12px] spiffy-tw-py-2 spiffy-tw-rounded-full spiffy-tw-border spiffy-tw-whitespace-nowrap ',
|
|
30
|
+
filterHoverClasses,
|
|
31
|
+
filterDefaultClasses,
|
|
32
|
+
);
|
|
33
|
+
return (
|
|
34
|
+
<button
|
|
35
|
+
key={name}
|
|
36
|
+
type="button"
|
|
37
|
+
className={buttonClasses}
|
|
38
|
+
onClick={() => {
|
|
39
|
+
onToggleDynamicFilter({
|
|
40
|
+
filter: name,
|
|
41
|
+
dynamicFilterDisplayName: displayName,
|
|
42
|
+
});
|
|
43
|
+
}}
|
|
44
|
+
>
|
|
45
|
+
<Text variant="body3">{displayName}</Text>
|
|
46
|
+
</button>
|
|
47
|
+
);
|
|
48
|
+
})}
|
|
49
|
+
</ScrollContainer>
|
|
50
|
+
);
|
|
@@ -38,33 +38,31 @@ export const AppliedFiltersScrollbar = ({
|
|
|
38
38
|
|
|
39
39
|
return (
|
|
40
40
|
<ScrollContainer className={filterBarClassNames} hideScrollbars>
|
|
41
|
-
{selectedFilterOptions.map((filter) =>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
>
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
);
|
|
67
|
-
})}
|
|
41
|
+
{selectedFilterOptions.map((filter) => (
|
|
42
|
+
<button
|
|
43
|
+
key={filter.id}
|
|
44
|
+
className={buttonClasses}
|
|
45
|
+
type="button"
|
|
46
|
+
onClick={() => onRemoveFilter(filter)}
|
|
47
|
+
aria-label={`Remove filter: ${filter.displayName}`}
|
|
48
|
+
>
|
|
49
|
+
<div className="spiffy-tw-flex spiffy-tw-items-center spiffy-tw-gap-[8px]">
|
|
50
|
+
<Text variant="body3">{filter.displayName}</Text>
|
|
51
|
+
<svg
|
|
52
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
53
|
+
width="10"
|
|
54
|
+
height="10"
|
|
55
|
+
viewBox="0 0 10 10"
|
|
56
|
+
fill="none"
|
|
57
|
+
>
|
|
58
|
+
<path
|
|
59
|
+
d="M4.59766 4.29297L8.48535 0.405273L9.19238 1.1123L5.30469 5L9.19238 8.8877L8.48535 9.59473L4.59766 5.70703L0.707031 9.59766L0 8.89062L3.89062 5L0 1.10938L0.707031 0.402344L4.59766 4.29297Z"
|
|
60
|
+
fill={iconColor}
|
|
61
|
+
/>
|
|
62
|
+
</svg>
|
|
63
|
+
</div>
|
|
64
|
+
</button>
|
|
65
|
+
))}
|
|
68
66
|
</ScrollContainer>
|
|
69
67
|
);
|
|
70
68
|
};
|
|
@@ -22,31 +22,29 @@ export const DynamicFiltersScrollbar = ({
|
|
|
22
22
|
filterDefaultClasses,
|
|
23
23
|
filterHoverClasses,
|
|
24
24
|
onToggleDynamicFilter,
|
|
25
|
-
}: DynamicFiltersScrollbarProps) =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
);
|
|
52
|
-
};
|
|
25
|
+
}: DynamicFiltersScrollbarProps) => (
|
|
26
|
+
<ScrollContainer className={filterBarClassNames} hideScrollbars>
|
|
27
|
+
{availableDynamicFilters.map(({ name, displayName }) => {
|
|
28
|
+
const buttonClasses = classNames(
|
|
29
|
+
'spiffy-tw-px-[12px] spiffy-tw-py-2 spiffy-tw-rounded-full spiffy-tw-border spiffy-tw-whitespace-nowrap ',
|
|
30
|
+
filterHoverClasses,
|
|
31
|
+
filterDefaultClasses,
|
|
32
|
+
);
|
|
33
|
+
return (
|
|
34
|
+
<button
|
|
35
|
+
key={name}
|
|
36
|
+
type="button"
|
|
37
|
+
className={buttonClasses}
|
|
38
|
+
onClick={() => {
|
|
39
|
+
onToggleDynamicFilter({
|
|
40
|
+
filter: name,
|
|
41
|
+
dynamicFilterDisplayName: displayName,
|
|
42
|
+
});
|
|
43
|
+
}}
|
|
44
|
+
>
|
|
45
|
+
<Text variant="body3">{displayName}</Text>
|
|
46
|
+
</button>
|
|
47
|
+
);
|
|
48
|
+
})}
|
|
49
|
+
</ScrollContainer>
|
|
50
|
+
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { useIsSmallScreen } from '@envive-ai/react-hooks/hooks/IsSmallScreen';
|
|
1
2
|
import { ModalSheetMobile } from './mobile';
|
|
2
3
|
import { ModalSheetDesktop } from './desktop';
|
|
3
4
|
import { ModalSheetProps } from './types';
|
|
4
|
-
import { useIsSmallScreen } from '@envive-ai/react-hooks/hooks/IsSmallScreen';
|
|
5
5
|
|
|
6
6
|
const ANIMATION_DURATION = 0.3;
|
|
7
7
|
|
|
@@ -33,8 +33,8 @@ export const ModalSheetCloseIcon = ({
|
|
|
33
33
|
|
|
34
34
|
const closeIconContextValue = useMemo(() => ({ size: iconSize }), [iconSize]);
|
|
35
35
|
return (
|
|
36
|
-
<
|
|
36
|
+
<button type="button" className={closeIconClassNames} onClick={closeModal}>
|
|
37
37
|
<IconContext.Provider value={closeIconContextValue}>{closeIcon}</IconContext.Provider>
|
|
38
|
-
</
|
|
38
|
+
</button>
|
|
39
39
|
);
|
|
40
40
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
2
|
import { motion, useMotionValue } from 'framer-motion';
|
|
3
|
-
import { ModalSheetHeaderProps } from '../types';
|
|
4
3
|
import { AnimatedChevron } from 'src/components/AnimatedChevron/AnimatedChevron';
|
|
4
|
+
import { ModalSheetHeaderProps } from '../types';
|
|
5
5
|
|
|
6
6
|
const modalSheetVariants = {
|
|
7
7
|
primary: {
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
2
|
import { MdStar } from 'react-icons/md';
|
|
3
|
+
import Logger from 'src/logging/logger';
|
|
4
|
+
import { Text } from 'src/components/Text/Text';
|
|
5
|
+
import { formatPrice } from 'src/util/formatPrice';
|
|
6
|
+
import { TestProps } from '@envive-ai/react-hooks/types';
|
|
7
|
+
import { useImageResolver } from '@envive-ai/react-hooks/hooks/ImageResolver';
|
|
3
8
|
import {
|
|
4
9
|
variantClassMap,
|
|
5
10
|
variantHoverClassMap,
|
|
6
11
|
productCardLayoutVariantClasses,
|
|
7
12
|
variantTitleColorMap,
|
|
8
13
|
} from './productCardVariants';
|
|
9
|
-
import Logger from 'src/logging/logger';
|
|
10
14
|
import { Headline } from '../Headline';
|
|
11
15
|
import { ImageWithFallback } from '../ImageWithFallback';
|
|
12
16
|
import { Spinner } from '../Spinner';
|
|
@@ -16,10 +20,6 @@ import {
|
|
|
16
20
|
ProductCardHoverVariant,
|
|
17
21
|
ProductCardLayoutVariant,
|
|
18
22
|
} from './types';
|
|
19
|
-
import { Text } from 'src/components/Text/Text';
|
|
20
|
-
import { formatPrice } from 'src/util/formatPrice';
|
|
21
|
-
import { TestProps } from '@envive-ai/react-hooks/types';
|
|
22
|
-
import { useImageResolver } from '@envive-ai/react-hooks/hooks/ImageResolver';
|
|
23
23
|
|
|
24
24
|
const formatReviews = (stars: number) =>
|
|
25
25
|
String(
|
|
@@ -95,29 +95,11 @@ export const PriceSection = ({ originalPrice, salePrice, pricePrefix }: PriceSec
|
|
|
95
95
|
);
|
|
96
96
|
};
|
|
97
97
|
|
|
98
|
-
// export const formatPrice = (price?: number, currency: string = '$'): string => {
|
|
99
|
-
// if (price == null) {
|
|
100
|
-
// return '';
|
|
101
|
-
// }
|
|
102
|
-
|
|
103
|
-
// const options: Intl.NumberFormatOptions = {};
|
|
104
|
-
|
|
105
|
-
// if (!Number.isInteger(price)) {
|
|
106
|
-
// options.minimumFractionDigits = 2;
|
|
107
|
-
// options.maximumFractionDigits = 2;
|
|
108
|
-
// }
|
|
109
|
-
|
|
110
|
-
// return `${currency}${price.toLocaleString('en-US', options)}`;
|
|
111
|
-
// };
|
|
112
|
-
|
|
113
98
|
interface ProductCardProps extends TestProps {
|
|
114
99
|
productCardConfig?: ProductCardConfig;
|
|
115
100
|
merchantShortName: string;
|
|
116
101
|
title: string;
|
|
117
102
|
url: string;
|
|
118
|
-
searchResponseId?: string;
|
|
119
|
-
productResponseId?: string;
|
|
120
|
-
cardDisplayLocation: string;
|
|
121
103
|
imageUrl?: string;
|
|
122
104
|
originalPrice?: number;
|
|
123
105
|
averageRating?: number;
|
|
@@ -128,7 +110,6 @@ interface ProductCardProps extends TestProps {
|
|
|
128
110
|
layoutVariant?: ProductCardLayoutVariant;
|
|
129
111
|
zoomOnHover?: boolean;
|
|
130
112
|
aspectRatio?: '3:4' | 'square' | 'none';
|
|
131
|
-
clickPosition?: number | null;
|
|
132
113
|
growWithContainer?: boolean;
|
|
133
114
|
handleClick?: (clickedUrl: string) => void;
|
|
134
115
|
}
|
|
@@ -139,8 +120,6 @@ export const ProductCard = ({
|
|
|
139
120
|
imageUrl,
|
|
140
121
|
title,
|
|
141
122
|
url,
|
|
142
|
-
// searchResponseId,
|
|
143
|
-
// productResponseId,
|
|
144
123
|
originalPrice,
|
|
145
124
|
averageRating,
|
|
146
125
|
numberReviews,
|
|
@@ -149,10 +128,8 @@ export const ProductCard = ({
|
|
|
149
128
|
hoverVariant,
|
|
150
129
|
dataTestId,
|
|
151
130
|
layoutVariant = 'normal',
|
|
152
|
-
// cardDisplayLocation,
|
|
153
131
|
zoomOnHover = false,
|
|
154
132
|
aspectRatio = 'none',
|
|
155
|
-
// clickPosition = null,
|
|
156
133
|
growWithContainer = false,
|
|
157
134
|
handleClick,
|
|
158
135
|
}: ProductCardProps) => {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ProductGridVariant, ProductCardConfig, ProductCard } from '../ProductCard';
|
|
2
|
-
import { productGridVariantClasses } from './productGridVariants';
|
|
3
1
|
import classNames from 'classnames';
|
|
4
2
|
import { SearchResponseProduct } from '@spiffy-ai/commerce-api-client';
|
|
5
3
|
import { CamelCasedPropertiesDeep } from 'src/util/camelCasedPropertiesDeep';
|
|
4
|
+
import { productGridVariantClasses } from './productGridVariants';
|
|
5
|
+
import { ProductGridVariant, ProductCardConfig, ProductCard } from '../ProductCard';
|
|
6
6
|
|
|
7
7
|
interface ProductGridProps {
|
|
8
8
|
productList: SearchResponseProduct[];
|
|
@@ -10,9 +10,7 @@ interface ProductGridProps {
|
|
|
10
10
|
productGridClasses: string;
|
|
11
11
|
productCardConfig?: ProductCardConfig;
|
|
12
12
|
merchantShortName: string;
|
|
13
|
-
searchResponseId: string;
|
|
14
13
|
cardsGrowWithContainer?: boolean;
|
|
15
|
-
cardDisplayLocation: string;
|
|
16
14
|
}
|
|
17
15
|
|
|
18
16
|
export const ProductGrid = ({
|
|
@@ -21,9 +19,7 @@ export const ProductGrid = ({
|
|
|
21
19
|
productGridClasses,
|
|
22
20
|
productCardConfig,
|
|
23
21
|
merchantShortName,
|
|
24
|
-
searchResponseId,
|
|
25
22
|
cardsGrowWithContainer = true,
|
|
26
|
-
cardDisplayLocation,
|
|
27
23
|
}: ProductGridProps) => {
|
|
28
24
|
const {
|
|
29
25
|
productCardVariant,
|
|
@@ -40,7 +36,7 @@ export const ProductGrid = ({
|
|
|
40
36
|
|
|
41
37
|
return (
|
|
42
38
|
<div className={productGridClasses}>
|
|
43
|
-
{productList.map((product: SearchResponseProduct
|
|
39
|
+
{productList.map((product: SearchResponseProduct) => {
|
|
44
40
|
const camelCasedProduct: CamelCasedPropertiesDeep<SearchResponseProduct> = product;
|
|
45
41
|
return (
|
|
46
42
|
<div key={camelCasedProduct.id} className={cardContainerClasses}>
|
|
@@ -49,21 +45,17 @@ export const ProductGrid = ({
|
|
|
49
45
|
merchantShortName={merchantShortName}
|
|
50
46
|
key={camelCasedProduct.id}
|
|
51
47
|
imageUrl={camelCasedProduct.imageUrl}
|
|
52
|
-
searchResponseId={searchResponseId}
|
|
53
|
-
productResponseId={camelCasedProduct.responseId}
|
|
54
48
|
title={camelCasedProduct.title}
|
|
55
49
|
url={camelCasedProduct.url}
|
|
56
50
|
originalPrice={camelCasedProduct.originalPrice}
|
|
57
51
|
salePrice={camelCasedProduct.salePrice}
|
|
58
52
|
averageRating={camelCasedProduct.averageRating}
|
|
59
53
|
numberReviews={camelCasedProduct.numberReviews}
|
|
60
|
-
cardDisplayLocation={cardDisplayLocation}
|
|
61
54
|
layoutVariant={productCardLayoutVariant}
|
|
62
55
|
variant={productCardVariant}
|
|
63
56
|
hoverVariant={productCardHoverVariant}
|
|
64
57
|
zoomOnHover={zoomOnHover}
|
|
65
58
|
aspectRatio={productCardImageAspectRatio}
|
|
66
|
-
clickPosition={index}
|
|
67
59
|
growWithContainer={cardsGrowWithContainer}
|
|
68
60
|
/>
|
|
69
61
|
</div>
|
|
@@ -14,6 +14,7 @@ interface RadioButtonProps extends TestProps {
|
|
|
14
14
|
uncheckedBorderColor?: string;
|
|
15
15
|
checked?: boolean;
|
|
16
16
|
onChange: (value: string) => void;
|
|
17
|
+
id;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export const RadioButton = ({
|
|
@@ -27,6 +28,7 @@ export const RadioButton = ({
|
|
|
27
28
|
uncheckedBorderColor,
|
|
28
29
|
checked = false,
|
|
29
30
|
onChange,
|
|
31
|
+
id,
|
|
30
32
|
}: RadioButtonProps) => {
|
|
31
33
|
const [isHovered, setIsHovered] = useState(false);
|
|
32
34
|
|
|
@@ -54,14 +56,21 @@ export const RadioButton = ({
|
|
|
54
56
|
};
|
|
55
57
|
|
|
56
58
|
return (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
<>
|
|
60
|
+
<label
|
|
61
|
+
className={containerClassName}
|
|
62
|
+
onMouseEnter={() => !isDisabled && setIsHovered(true)}
|
|
63
|
+
onMouseLeave={() => setIsHovered(false)}
|
|
64
|
+
aria-label={label}
|
|
65
|
+
htmlFor={id}
|
|
66
|
+
>
|
|
67
|
+
{label}
|
|
68
|
+
</label>
|
|
69
|
+
|
|
62
70
|
<div className="spiffy-tw-relative">
|
|
63
71
|
<input
|
|
64
72
|
type="radio"
|
|
73
|
+
id={id}
|
|
65
74
|
name={name}
|
|
66
75
|
value={value}
|
|
67
76
|
checked={checked}
|
|
@@ -83,6 +92,6 @@ export const RadioButton = ({
|
|
|
83
92
|
</svg>
|
|
84
93
|
</div>
|
|
85
94
|
<Text variant="body3">{label}</Text>
|
|
86
|
-
|
|
95
|
+
</>
|
|
87
96
|
);
|
|
88
97
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import classNames from 'classnames';
|
|
2
|
-
import { SearchFilterProps } from './types';
|
|
3
2
|
import { useCallback } from 'react';
|
|
3
|
+
import { FilterItemProps, FilterProps } from '@envive-ai/react-hooks/types';
|
|
4
|
+
import { SearchFilterProps } from './types';
|
|
4
5
|
import { SearchFilterHeader } from './SearchFilterHeader';
|
|
5
6
|
import { useHasFilterStateChanged } from './useHasFilterStateChanged';
|
|
6
7
|
import { getSelectedFilterItemsCount, getTotalSelectedFilterItemsCount } from './utils';
|
|
7
8
|
import { ModalSheet } from '../ModalSheet';
|
|
8
|
-
import { FilterItemProps, FilterProps } from '@envive-ai/react-hooks/types';
|
|
9
9
|
import { ToggleButton } from '../ToggleButton';
|
|
10
10
|
import { Accordion } from '../Accordion';
|
|
11
11
|
import { RadioButtonGroup } from '../RadioButtonGroup';
|
|
@@ -23,7 +23,12 @@ export const SearchFilterHeader = ({
|
|
|
23
23
|
<Text variant="body2" className="spiffy-tw-font-medium">
|
|
24
24
|
Filters ({productCount})
|
|
25
25
|
</Text>
|
|
26
|
-
<button
|
|
26
|
+
<button
|
|
27
|
+
onClick={closeModal}
|
|
28
|
+
className="spiffy-tw-p-2"
|
|
29
|
+
type="button"
|
|
30
|
+
aria-label="Open Filter Menu"
|
|
31
|
+
>
|
|
27
32
|
<svg
|
|
28
33
|
xmlns="http://www.w3.org/2000/svg"
|
|
29
34
|
width="14"
|