@riosst100/pwa-marketplace 1.3.3 → 1.3.5
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/.github/workflows/dependabot.yml +28 -28
- package/package.json +18 -18
- package/src/componentOverrideMapping.js +14 -0
- package/src/components/BecomeSellerLink/becomeSellerLink.js +1 -1
- package/src/components/BecomeSellerLink/becomeSellerLink.module.css +0 -4
- package/src/components/CurrencySwitcher/currencySwitcher.himmer.js +6 -0
- package/src/components/CurrencySwitcher/currencySwitcher.module.css +102 -0
- package/src/components/CurrencySwitcher/index.js +107 -0
- package/src/components/CurrencySwitcher/switcherItem.js +47 -0
- package/src/components/CurrencySwitcher/switcherItem.module.css +20 -0
- package/src/components/FilterOption/FilterOptionModal.module.css +90 -0
- package/src/components/FilterOption/filterOptionModal.js +48 -0
- package/src/components/FilterOptionModal/filterOptionModal.js +66 -0
- package/src/components/Header/becomeSellerLink.module.css +0 -4
- package/src/components/Header/websiteSwitcher.js +0 -1
- package/src/components/Header/websiteSwitcher.module.css +107 -111
- package/src/components/WebsiteSwitcher/websiteSwitcher.js +18 -6
- package/src/components/WebsiteSwitcher/websiteSwitcher.module.css +107 -111
- package/src/overwrites/peregrine/lib/talons/FilterModal/useFilterList.js +62 -0
- package/src/overwrites/peregrine/lib/talons/MegaMenu/useMegaMenuItem.js +66 -0
- package/src/overwrites/peregrine/lib/talons/MegaMenu/useSubMenu.js +20 -0
- package/src/overwrites/peregrine/lib/talons/RootComponents/Category/useCategoryContent.js +0 -2
- package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/index.js +1 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.js +77 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.module.css +39 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.png +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/category.gql.js +17 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/category.js +91 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/category.module.css +76 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/categoryContent.js +12 -14
- package/src/overwrites/venia-ui/lib/RootComponents/Category/categoryContent.shimmer.js +74 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/001.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/002.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/003.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/004.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/005.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/006.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/007.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/008.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/009.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/010.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/011.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/012.jpg +0 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/images/index.js +12 -0
- package/src/overwrites/venia-ui/lib/RootComponents/Category/index.js +6 -0
- package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.js +112 -0
- package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.module.css +32 -0
- package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.shimmer.js +24 -0
- package/src/overwrites/venia-ui/lib/components/Breadcrumbs/index.js +2 -0
- package/src/overwrites/venia-ui/lib/components/Checkbox/checkbox.js +78 -0
- package/src/overwrites/venia-ui/lib/components/Checkbox/checkbox.module.css +73 -0
- package/src/overwrites/venia-ui/lib/components/Checkbox/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilter.js +60 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilter.module.css +21 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilters.js +65 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilters.module.css +17 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterDefault.js +18 -18
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterDefault.module.css +0 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItem.js +79 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadio.js +76 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadio.module.css +0 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadioGroup.js +86 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterList.js +265 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterList.module.css +20 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/filterBlock.js +135 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/filterBlock.module.css +25 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/filterFooter.js +49 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/filterFooter.module.css +10 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/filterModal.js +166 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/filterModal.module.css +87 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/filterSearch.module.css +3 -0
- package/src/overwrites/venia-ui/lib/components/FilterModal/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/FilterSidebar/__tests__/filterSidebar.spec.js +246 -0
- package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.js +8 -8
- package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.module.css +58 -58
- package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.shimmer.js +24 -0
- package/src/overwrites/venia-ui/lib/components/FilterSidebar/index.js +2 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/addToCartButton.js +116 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/addToCartButton.module.css +38 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/gallery.js +56 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/gallery.module.css +28 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/gallery.shimmer.js +39 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/index.js +3 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/item.js +204 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/item.module.css +109 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/item.shimmer.js +38 -0
- package/src/overwrites/venia-ui/lib/components/Gallery/star.js +12 -0
- package/src/overwrites/venia-ui/lib/components/Header/accountTrigger.js +98 -0
- package/src/overwrites/venia-ui/lib/components/Header/cartTrigger.js +116 -0
- package/src/overwrites/venia-ui/lib/components/Header/header.js +12 -9
- package/src/overwrites/venia-ui/lib/components/Header/storeSwitcher.js +22 -8
- package/src/overwrites/venia-ui/lib/components/Header/storeSwitcher.module.css +107 -0
- package/src/overwrites/venia-ui/lib/components/Header/wishlistTrigger.js +23 -0
- package/src/overwrites/venia-ui/lib/components/MegaMenu/megaMenuItem.js +1 -1
- package/src/overwrites/venia-ui/lib/components/MegaMenu/submenu.module.css +0 -1
- package/src/overwrites/venia-ui/lib/components/Pagination/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/Pagination/navButton.js +65 -0
- package/src/overwrites/venia-ui/lib/components/Pagination/pagination.js +107 -0
- package/src/overwrites/venia-ui/lib/components/Pagination/tile.js +41 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/boolean.js +74 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/boolean.module.css +9 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/date.js +82 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/date.module.css +9 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/dateTime.js +85 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/dateTime.module.css +9 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/multiselect.js +104 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/multiselect.module.css +22 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/price.js +74 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/price.module.css +9 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/select.js +99 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/select.module.css +13 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/text.js +88 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/text.module.css +13 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/textarea.js +94 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/textarea.module.css +13 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/attributeType.js +67 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/customAttributes.js +64 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/customAttributes.module.css +9 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.gql.js +7 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.js +413 -0
- package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.module.css +203 -0
- package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.js +180 -0
- package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.module.css +102 -0
- package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.shimmer.js +51 -0
- package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.shimmer.module.css +7 -0
- package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/thumbnail.js +108 -0
- package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/thumbnail.module.css +47 -0
- package/src/overwrites/venia-ui/lib/components/ProductSort/index.js +2 -0
- package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.js +233 -0
- package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.module.css +65 -0
- package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.shimmer.js +28 -0
- package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.shimmer.module.css +10 -0
- package/src/overwrites/venia-ui/lib/components/ProductSort/sortItem.js +57 -0
- package/src/overwrites/venia-ui/lib/components/ProductSort/sortItem.module.css +23 -0
- package/src/overwrites/venia-ui/lib/components/QuantityStepper/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/QuantityStepper/quantityStepper.js +94 -0
- package/src/overwrites/venia-ui/lib/components/QuantityStepper/quantityStepper.module.css +78 -0
- package/src/overwrites/venia-ui/lib/components/RichContent/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/RichContent/plainHtmlRenderer.js +17 -0
- package/src/overwrites/venia-ui/lib/components/RichContent/richContent.js +59 -0
- package/src/overwrites/venia-ui/lib/components/RichContent/richContent.module.css +146 -0
- package/src/overwrites/venia-ui/lib/components/RichContent/richContentRenderers.js +7 -0
- package/src/overwrites/venia-ui/lib/components/SearchBar/searchBar.module.css +1 -2
- package/src/overwrites/venia-ui/lib/components/SearchBar/searchField.js +3 -2
- package/src/overwrites/venia-ui/lib/components/TextInput/field.module.css +50 -0
- package/src/overwrites/venia-ui/lib/components/TextInput/index.js +1 -0
- package/src/overwrites/venia-ui/lib/components/TextInput/textInput.js +48 -0
- package/src/overwrites/venia-ui/lib/components/TextInput/textInput.module.css +21 -0
- package/src/talons/FilterOption/useFilterOptionModal.js +11 -0
- package/src/talons/FilterOptionModal/useFilterOptionModal.js +11 -0
- package/src/theme/vars.js +12 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { arrayOf, bool, number, shape, string } from 'prop-types';
|
|
3
|
+
import { useIntl } from 'react-intl';
|
|
4
|
+
import {
|
|
5
|
+
ChevronLeft as ChevronLeftIcon,
|
|
6
|
+
ChevronRight as ChevronRightIcon
|
|
7
|
+
} from 'react-feather';
|
|
8
|
+
|
|
9
|
+
import { transparentPlaceholder } from '@magento/peregrine/lib/util/images';
|
|
10
|
+
import { useProductImageCarousel } from '@magento/peregrine/lib/talons/ProductImageCarousel/useProductImageCarousel';
|
|
11
|
+
|
|
12
|
+
import { useStyle } from '@magento/venia-ui/lib/classify';
|
|
13
|
+
import AriaButton from '@magento/venia-ui/lib/components/AriaButton';
|
|
14
|
+
import Icon from '@magento/venia-ui/lib/components/Icon';
|
|
15
|
+
import Image from '@magento/venia-ui/lib/components/Image';
|
|
16
|
+
import defaultClasses from './carousel.module.css';
|
|
17
|
+
import Thumbnail from './thumbnail';
|
|
18
|
+
|
|
19
|
+
const IMAGE_WIDTH = 495;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Carousel component for product images
|
|
23
|
+
* Carousel - Component that holds number of images
|
|
24
|
+
* where typically one image visible, and other
|
|
25
|
+
* images can be navigated through previous and next buttons
|
|
26
|
+
*
|
|
27
|
+
* @typedef ProductImageCarousel
|
|
28
|
+
* @kind functional component
|
|
29
|
+
*
|
|
30
|
+
* @param {props} props
|
|
31
|
+
*
|
|
32
|
+
* @returns {React.Element} React carousel component that displays a product image
|
|
33
|
+
*/
|
|
34
|
+
const ProductImageCarousel = props => {
|
|
35
|
+
const { images } = props;
|
|
36
|
+
const { formatMessage } = useIntl();
|
|
37
|
+
const talonProps = useProductImageCarousel({
|
|
38
|
+
images,
|
|
39
|
+
imageWidth: IMAGE_WIDTH
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const {
|
|
43
|
+
currentImage,
|
|
44
|
+
activeItemIndex,
|
|
45
|
+
altText,
|
|
46
|
+
handleNext,
|
|
47
|
+
handlePrevious,
|
|
48
|
+
handleThumbnailClick,
|
|
49
|
+
sortedImages
|
|
50
|
+
} = talonProps;
|
|
51
|
+
|
|
52
|
+
// create thumbnail image component for every images in sorted order
|
|
53
|
+
const thumbnails = useMemo(
|
|
54
|
+
() =>
|
|
55
|
+
sortedImages.map((item, index) => (
|
|
56
|
+
<Thumbnail
|
|
57
|
+
key={item.uid}
|
|
58
|
+
item={item}
|
|
59
|
+
itemIndex={index}
|
|
60
|
+
isActive={activeItemIndex === index}
|
|
61
|
+
onClickHandler={handleThumbnailClick}
|
|
62
|
+
/>
|
|
63
|
+
)),
|
|
64
|
+
[activeItemIndex, handleThumbnailClick, sortedImages]
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const classes = useStyle(defaultClasses, props.classes);
|
|
68
|
+
|
|
69
|
+
let image;
|
|
70
|
+
if (currentImage.file) {
|
|
71
|
+
image = (
|
|
72
|
+
<Image
|
|
73
|
+
alt={altText}
|
|
74
|
+
classes={{
|
|
75
|
+
image: classes.currentImage,
|
|
76
|
+
root: classes.imageContainer
|
|
77
|
+
}}
|
|
78
|
+
resource={currentImage.file}
|
|
79
|
+
width={IMAGE_WIDTH}
|
|
80
|
+
/>
|
|
81
|
+
);
|
|
82
|
+
} else {
|
|
83
|
+
image = (
|
|
84
|
+
<Image
|
|
85
|
+
alt={altText}
|
|
86
|
+
classes={{
|
|
87
|
+
image: classes.currentImage_placeholder,
|
|
88
|
+
root: classes.imageContainer
|
|
89
|
+
}}
|
|
90
|
+
src={transparentPlaceholder}
|
|
91
|
+
/>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const previousButton = formatMessage({
|
|
96
|
+
id: 'productImageCarousel.previousButtonAriaLabel',
|
|
97
|
+
defaultMessage: 'Previous Image'
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const nextButton = formatMessage({
|
|
101
|
+
id: 'productImageCarousel.nextButtonAriaLabel',
|
|
102
|
+
defaultMessage: 'Next Image'
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const chevronClasses = { root: classes.chevron };
|
|
106
|
+
return (
|
|
107
|
+
<div className={classes.root}>
|
|
108
|
+
<div className={classes.carouselContainer}>
|
|
109
|
+
<AriaButton
|
|
110
|
+
className={classes.previousButton}
|
|
111
|
+
onPress={handlePrevious}
|
|
112
|
+
aria-label={previousButton}
|
|
113
|
+
type="button"
|
|
114
|
+
>
|
|
115
|
+
<Icon
|
|
116
|
+
classes={chevronClasses}
|
|
117
|
+
src={ChevronLeftIcon}
|
|
118
|
+
size={40}
|
|
119
|
+
/>
|
|
120
|
+
</AriaButton>
|
|
121
|
+
{image}
|
|
122
|
+
<AriaButton
|
|
123
|
+
className={classes.nextButton}
|
|
124
|
+
onPress={handleNext}
|
|
125
|
+
aria-label={nextButton}
|
|
126
|
+
type="button"
|
|
127
|
+
>
|
|
128
|
+
<Icon
|
|
129
|
+
classes={chevronClasses}
|
|
130
|
+
src={ChevronRightIcon}
|
|
131
|
+
size={40}
|
|
132
|
+
/>
|
|
133
|
+
</AriaButton>
|
|
134
|
+
</div>
|
|
135
|
+
<div className={classes.thumbnailList}>{thumbnails}</div>
|
|
136
|
+
</div>
|
|
137
|
+
);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Props for {@link ProductImageCarousel}
|
|
142
|
+
*
|
|
143
|
+
* @typedef props
|
|
144
|
+
*
|
|
145
|
+
* @property {Object} classes An object containing the class names for the
|
|
146
|
+
* ProductImageCarousel component
|
|
147
|
+
* @property {string} classes.currentImage classes for visible image
|
|
148
|
+
* @property {string} classes.imageContainer classes for image container
|
|
149
|
+
* @property {string} classes.nextButton classes for next button
|
|
150
|
+
* @property {string} classes.previousButton classes for previous button
|
|
151
|
+
* @property {string} classes.root classes for root container
|
|
152
|
+
* @property {Object[]} images Product images input for Carousel
|
|
153
|
+
* @property {bool} images[].disabled Is image disabled
|
|
154
|
+
* @property {string} images[].file filePath of image
|
|
155
|
+
* @property {string} images[].uid the id of the image
|
|
156
|
+
* @property {string} images[].label label for image
|
|
157
|
+
* @property {string} images[].position Position of image in Carousel
|
|
158
|
+
*/
|
|
159
|
+
ProductImageCarousel.propTypes = {
|
|
160
|
+
classes: shape({
|
|
161
|
+
carouselContainer: string,
|
|
162
|
+
currentImage: string,
|
|
163
|
+
currentImage_placeholder: string,
|
|
164
|
+
imageContainer: string,
|
|
165
|
+
nextButton: string,
|
|
166
|
+
previousButton: string,
|
|
167
|
+
root: string
|
|
168
|
+
}),
|
|
169
|
+
images: arrayOf(
|
|
170
|
+
shape({
|
|
171
|
+
label: string,
|
|
172
|
+
position: number,
|
|
173
|
+
disabled: bool,
|
|
174
|
+
file: string.isRequired,
|
|
175
|
+
uid: string.isRequired
|
|
176
|
+
})
|
|
177
|
+
).isRequired
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export default ProductImageCarousel;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
composes: lg_gap-sm from global;
|
|
3
|
+
/* composes: grid from global;
|
|
4
|
+
composes: grid-cols-auto from global;
|
|
5
|
+
composes: grid-rows-auto from global; */
|
|
6
|
+
/* grid-template-areas:
|
|
7
|
+
'main'
|
|
8
|
+
'thumbs'; */
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@media (min-width: 960px) {
|
|
12
|
+
.root {
|
|
13
|
+
grid-template-areas: 'thumbs main';
|
|
14
|
+
/* These values are mirrored in JS for image sizes. Keep them in sync. */
|
|
15
|
+
grid-template-columns: 17fr 80fr;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.carouselContainer {
|
|
20
|
+
composes: flex from global;
|
|
21
|
+
composes: max-h-[495px] from global;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.imageContainer {
|
|
25
|
+
composes: w-full from global;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.currentImage {
|
|
29
|
+
composes: block from global;
|
|
30
|
+
composes: h-full from global;
|
|
31
|
+
composes: object-center from global;
|
|
32
|
+
composes: object-cover from global;
|
|
33
|
+
composes: w-full from global;
|
|
34
|
+
|
|
35
|
+
composes: lg_object-top from global;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.currentImage_placeholder {
|
|
39
|
+
composes: currentImage;
|
|
40
|
+
|
|
41
|
+
composes: bg-subtle from global;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.previousButton,
|
|
45
|
+
.nextButton {
|
|
46
|
+
composes: flex from global;
|
|
47
|
+
composes: outline-none from global;
|
|
48
|
+
composes: z-foreground from global;
|
|
49
|
+
|
|
50
|
+
composes: lg_hidden from global;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.previousButton {
|
|
54
|
+
composes: justify-start from global;
|
|
55
|
+
composes: ml-sm from global;
|
|
56
|
+
grid-area: 1 / 1 / 2 / 2;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.nextButton {
|
|
60
|
+
composes: justify-end from global;
|
|
61
|
+
composes: mr-sm from global;
|
|
62
|
+
grid-area: 1 / 3 / 2 / 4;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.chevron {
|
|
66
|
+
composes: items-center from global;
|
|
67
|
+
composes: inline-flex from global;
|
|
68
|
+
composes: justify-center from global;
|
|
69
|
+
touch-action: manipulation;
|
|
70
|
+
|
|
71
|
+
composes: border-2 from global;
|
|
72
|
+
composes: border-solid from global;
|
|
73
|
+
composes: border-transparent from global;
|
|
74
|
+
composes: self-center from global;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* TODO @TW: cannot compose */
|
|
78
|
+
.nextButton:focus>.chevron,
|
|
79
|
+
.previousButton:focus>.chevron {
|
|
80
|
+
box-shadow: 0 0 4px 2px rgb(var(--venia-global-color-teal));
|
|
81
|
+
border-radius: 0.5rem;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.thumbnailList {
|
|
85
|
+
composes: flex from global;
|
|
86
|
+
composes: py-5 from global;
|
|
87
|
+
composes: gap-x-[18px] from global;
|
|
88
|
+
/* composes: content-stretch from global;
|
|
89
|
+
composes: gap-xs from global;
|
|
90
|
+
composes: grid from global;
|
|
91
|
+
composes: grid-cols-carouselThumbnailList from global;
|
|
92
|
+
composes: grid-flow-col from global;
|
|
93
|
+
composes: justify-center from global;
|
|
94
|
+
composes: mt-xs from global;
|
|
95
|
+
composes: z-foreground from global;
|
|
96
|
+
|
|
97
|
+
composes: lg_content-start from global;
|
|
98
|
+
composes: lg_gap-sm from global;
|
|
99
|
+
composes: lg_grid-cols-[1fr] from global;
|
|
100
|
+
composes: lg_grid-flow-row from global;
|
|
101
|
+
composes: lg_mt-0 from global; */
|
|
102
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { transparentPlaceholder } from '@magento/peregrine/lib/util/images';
|
|
3
|
+
import { useStyle } from '@magento/venia-ui/lib/classify';
|
|
4
|
+
import Image from '@magento/venia-ui/lib/components/Image';
|
|
5
|
+
import defaultClasses from './carousel.module.css';
|
|
6
|
+
import defaultShimmerClasses from './carousel.shimmer.module.css';
|
|
7
|
+
|
|
8
|
+
const CarouselShimmer = props => {
|
|
9
|
+
const classes = useStyle(
|
|
10
|
+
defaultClasses,
|
|
11
|
+
defaultShimmerClasses,
|
|
12
|
+
props.classes
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
const thumbnails = useMemo(() => {
|
|
16
|
+
return Array.from({ length: 3 })
|
|
17
|
+
.fill(null)
|
|
18
|
+
.map((value, index) => {
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
className={classes.thumnailRoot}
|
|
22
|
+
key={`thumbnail-${index}`}
|
|
23
|
+
>
|
|
24
|
+
<Image
|
|
25
|
+
alt={'...'}
|
|
26
|
+
classes={{ image: classes.thumbnailImage }}
|
|
27
|
+
src={transparentPlaceholder}
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
}, [classes]);
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<div className={classes.root}>
|
|
36
|
+
<div className={classes.carouselContainer}>
|
|
37
|
+
<Image
|
|
38
|
+
alt={'...'}
|
|
39
|
+
classes={{
|
|
40
|
+
image: classes.currentImage_placeholder,
|
|
41
|
+
root: classes.imageContainer
|
|
42
|
+
}}
|
|
43
|
+
src={transparentPlaceholder}
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
<div className={classes.thumbnailList}>{thumbnails}</div>
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default CarouselShimmer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './carousel';
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { bool, func, number, shape, string } from 'prop-types';
|
|
3
|
+
|
|
4
|
+
import { transparentPlaceholder } from '@magento/peregrine/lib/util/images';
|
|
5
|
+
import { useWindowSize } from '@magento/peregrine';
|
|
6
|
+
import { useThumbnail } from '@magento/peregrine/lib/talons/ProductImageCarousel/useThumbnail';
|
|
7
|
+
|
|
8
|
+
import { useStyle } from '@magento/venia-ui/lib/classify';
|
|
9
|
+
import defaultClasses from './thumbnail.module.css';
|
|
10
|
+
import Image from '@magento/venia-ui/lib/components/Image';
|
|
11
|
+
|
|
12
|
+
const DEFAULT_THUMBNAIL_HEIGHT = 80;
|
|
13
|
+
const DEFAULT_THUMBNAIL_WIDTH = 80;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The Thumbnail Component is used for showing thumbnail preview image for ProductImageCarousel
|
|
17
|
+
* Shows up only in desktop devices
|
|
18
|
+
*
|
|
19
|
+
* @typedef Thumbnail
|
|
20
|
+
* @kind functional component
|
|
21
|
+
*
|
|
22
|
+
* @param {props} props
|
|
23
|
+
*
|
|
24
|
+
* @returns {React.Element} React thumbnail component that displays product thumbnail
|
|
25
|
+
*/
|
|
26
|
+
const Thumbnail = props => {
|
|
27
|
+
const classes = useStyle(defaultClasses, props.classes);
|
|
28
|
+
|
|
29
|
+
const {
|
|
30
|
+
isActive,
|
|
31
|
+
item: { file, label },
|
|
32
|
+
onClickHandler,
|
|
33
|
+
itemIndex
|
|
34
|
+
} = props;
|
|
35
|
+
|
|
36
|
+
const talonProps = useThumbnail({
|
|
37
|
+
onClickHandler,
|
|
38
|
+
itemIndex
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const { handleClick } = talonProps;
|
|
42
|
+
const selectedItem = isActive ? 'Current Image' : 'Next Image';
|
|
43
|
+
const windowSize = useWindowSize();
|
|
44
|
+
const isDesktop = windowSize.innerWidth >= 1024;
|
|
45
|
+
|
|
46
|
+
const thumbnailImage = useMemo(() => {
|
|
47
|
+
if (!isDesktop) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return file ? (
|
|
52
|
+
<Image
|
|
53
|
+
alt={label}
|
|
54
|
+
classes={{ image: classes.image }}
|
|
55
|
+
height={DEFAULT_THUMBNAIL_HEIGHT}
|
|
56
|
+
resource={file}
|
|
57
|
+
width={DEFAULT_THUMBNAIL_WIDTH}
|
|
58
|
+
/>
|
|
59
|
+
) : (
|
|
60
|
+
<Image
|
|
61
|
+
alt={label}
|
|
62
|
+
classes={{ image: classes.image }}
|
|
63
|
+
src={transparentPlaceholder}
|
|
64
|
+
/>
|
|
65
|
+
);
|
|
66
|
+
}, [file, isDesktop, label, classes.image]);
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<button
|
|
70
|
+
type="button"
|
|
71
|
+
className={isActive ? classes.rootSelected : classes.root}
|
|
72
|
+
onClick={handleClick}
|
|
73
|
+
aria-label={selectedItem}
|
|
74
|
+
>
|
|
75
|
+
{thumbnailImage}
|
|
76
|
+
</button>
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Props for {@link Thumbnail}
|
|
82
|
+
*
|
|
83
|
+
* @typedef props
|
|
84
|
+
*
|
|
85
|
+
* @property {Object} classes An object containing the class names for the Thumbnail component
|
|
86
|
+
* @property {string} classes.root classes for root container
|
|
87
|
+
* @property {string} classes.rootSelected classes for the selected thumbnail item
|
|
88
|
+
* @property {bool} isActive is image associated is active in carousel
|
|
89
|
+
* @property {string} item.label label for image
|
|
90
|
+
* @property {string} item.file filePath of image
|
|
91
|
+
* @property {number} itemIndex index number of thumbnail
|
|
92
|
+
* @property {func} onClickHandler A callback for handling click events on thumbnail
|
|
93
|
+
*/
|
|
94
|
+
Thumbnail.propTypes = {
|
|
95
|
+
classes: shape({
|
|
96
|
+
root: string,
|
|
97
|
+
rootSelected: string
|
|
98
|
+
}),
|
|
99
|
+
isActive: bool,
|
|
100
|
+
item: shape({
|
|
101
|
+
label: string,
|
|
102
|
+
file: string.isRequired
|
|
103
|
+
}),
|
|
104
|
+
itemIndex: number,
|
|
105
|
+
onClickHandler: func.isRequired
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export default Thumbnail;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** The "thumbnail" is a round pil button below the product image in mobile or
|
|
2
|
+
* as a thumbnail to the left of the product image in desktop.
|
|
3
|
+
*/
|
|
4
|
+
.root {
|
|
5
|
+
composes: border from global;
|
|
6
|
+
composes: border-solid from global;
|
|
7
|
+
composes: border-strong from global;
|
|
8
|
+
composes: min-w-[80px] from global;
|
|
9
|
+
composes: min-h-[80px] from global;
|
|
10
|
+
composes: max-w-[80px] from global;
|
|
11
|
+
composes: max-h-[80px] from global;
|
|
12
|
+
composes: rounded-[4px] from global;
|
|
13
|
+
|
|
14
|
+
composes: lg_border-0 from global;
|
|
15
|
+
composes: lg_h-auto from global;
|
|
16
|
+
composes: lg_w-auto from global;
|
|
17
|
+
composes: hidden from global;
|
|
18
|
+
box-shadow: 0 0 0 1px #E6E9EA;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.rootSelected {
|
|
22
|
+
composes: root;
|
|
23
|
+
|
|
24
|
+
/* composes: bg-gray-900 from global; */
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.image {
|
|
28
|
+
composes: hidden from global;
|
|
29
|
+
composes: max-w-[80px] from global;
|
|
30
|
+
composes: max-h-[80px] from global;
|
|
31
|
+
composes: lg_bg-subtle from global;
|
|
32
|
+
composes: lg_block from global;
|
|
33
|
+
composes: lg_h-full from global;
|
|
34
|
+
composes: lg_object-center from global;
|
|
35
|
+
composes: lg_object-cover from global;
|
|
36
|
+
composes: rounded-[4px] from global;
|
|
37
|
+
composes: lg_w-full from global;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.rootSelected {
|
|
41
|
+
composes: root;
|
|
42
|
+
box-shadow: 0 0 0 2px #4E31DB;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.root:nth-child(-n+5) {
|
|
46
|
+
display: block;
|
|
47
|
+
}
|