@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.
Files changed (165) hide show
  1. package/.github/workflows/dependabot.yml +28 -28
  2. package/package.json +18 -18
  3. package/src/componentOverrideMapping.js +14 -0
  4. package/src/components/BecomeSellerLink/becomeSellerLink.js +1 -1
  5. package/src/components/BecomeSellerLink/becomeSellerLink.module.css +0 -4
  6. package/src/components/CurrencySwitcher/currencySwitcher.himmer.js +6 -0
  7. package/src/components/CurrencySwitcher/currencySwitcher.module.css +102 -0
  8. package/src/components/CurrencySwitcher/index.js +107 -0
  9. package/src/components/CurrencySwitcher/switcherItem.js +47 -0
  10. package/src/components/CurrencySwitcher/switcherItem.module.css +20 -0
  11. package/src/components/FilterOption/FilterOptionModal.module.css +90 -0
  12. package/src/components/FilterOption/filterOptionModal.js +48 -0
  13. package/src/components/FilterOptionModal/filterOptionModal.js +66 -0
  14. package/src/components/Header/becomeSellerLink.module.css +0 -4
  15. package/src/components/Header/websiteSwitcher.js +0 -1
  16. package/src/components/Header/websiteSwitcher.module.css +107 -111
  17. package/src/components/WebsiteSwitcher/websiteSwitcher.js +18 -6
  18. package/src/components/WebsiteSwitcher/websiteSwitcher.module.css +107 -111
  19. package/src/overwrites/peregrine/lib/talons/FilterModal/useFilterList.js +62 -0
  20. package/src/overwrites/peregrine/lib/talons/MegaMenu/useMegaMenuItem.js +66 -0
  21. package/src/overwrites/peregrine/lib/talons/MegaMenu/useSubMenu.js +20 -0
  22. package/src/overwrites/peregrine/lib/talons/RootComponents/Category/useCategoryContent.js +0 -2
  23. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/index.js +1 -0
  24. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.js +77 -0
  25. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.module.css +39 -0
  26. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.png +0 -0
  27. package/src/overwrites/venia-ui/lib/RootComponents/Category/category.gql.js +17 -0
  28. package/src/overwrites/venia-ui/lib/RootComponents/Category/category.js +91 -0
  29. package/src/overwrites/venia-ui/lib/RootComponents/Category/category.module.css +76 -0
  30. package/src/overwrites/venia-ui/lib/RootComponents/Category/categoryContent.js +12 -14
  31. package/src/overwrites/venia-ui/lib/RootComponents/Category/categoryContent.shimmer.js +74 -0
  32. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/001.jpg +0 -0
  33. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/002.jpg +0 -0
  34. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/003.jpg +0 -0
  35. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/004.jpg +0 -0
  36. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/005.jpg +0 -0
  37. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/006.jpg +0 -0
  38. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/007.jpg +0 -0
  39. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/008.jpg +0 -0
  40. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/009.jpg +0 -0
  41. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/010.jpg +0 -0
  42. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/011.jpg +0 -0
  43. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/012.jpg +0 -0
  44. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/index.js +12 -0
  45. package/src/overwrites/venia-ui/lib/RootComponents/Category/index.js +6 -0
  46. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.js +112 -0
  47. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.module.css +32 -0
  48. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.shimmer.js +24 -0
  49. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/index.js +2 -0
  50. package/src/overwrites/venia-ui/lib/components/Checkbox/checkbox.js +78 -0
  51. package/src/overwrites/venia-ui/lib/components/Checkbox/checkbox.module.css +73 -0
  52. package/src/overwrites/venia-ui/lib/components/Checkbox/index.js +1 -0
  53. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilter.js +60 -0
  54. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilter.module.css +21 -0
  55. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilters.js +65 -0
  56. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilters.module.css +17 -0
  57. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/index.js +1 -0
  58. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterDefault.js +18 -18
  59. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterDefault.module.css +0 -0
  60. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItem.js +79 -0
  61. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadio.js +76 -0
  62. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadio.module.css +0 -0
  63. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadioGroup.js +86 -0
  64. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterList.js +265 -0
  65. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterList.module.css +20 -0
  66. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/index.js +1 -0
  67. package/src/overwrites/venia-ui/lib/components/FilterModal/filterBlock.js +135 -0
  68. package/src/overwrites/venia-ui/lib/components/FilterModal/filterBlock.module.css +25 -0
  69. package/src/overwrites/venia-ui/lib/components/FilterModal/filterFooter.js +49 -0
  70. package/src/overwrites/venia-ui/lib/components/FilterModal/filterFooter.module.css +10 -0
  71. package/src/overwrites/venia-ui/lib/components/FilterModal/filterModal.js +166 -0
  72. package/src/overwrites/venia-ui/lib/components/FilterModal/filterModal.module.css +87 -0
  73. package/src/overwrites/venia-ui/lib/components/FilterModal/filterSearch.module.css +3 -0
  74. package/src/overwrites/venia-ui/lib/components/FilterModal/index.js +1 -0
  75. package/src/overwrites/venia-ui/lib/components/FilterSidebar/__tests__/filterSidebar.spec.js +246 -0
  76. package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.js +8 -8
  77. package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.module.css +58 -58
  78. package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.shimmer.js +24 -0
  79. package/src/overwrites/venia-ui/lib/components/FilterSidebar/index.js +2 -0
  80. package/src/overwrites/venia-ui/lib/components/Gallery/addToCartButton.js +116 -0
  81. package/src/overwrites/venia-ui/lib/components/Gallery/addToCartButton.module.css +38 -0
  82. package/src/overwrites/venia-ui/lib/components/Gallery/gallery.js +56 -0
  83. package/src/overwrites/venia-ui/lib/components/Gallery/gallery.module.css +28 -0
  84. package/src/overwrites/venia-ui/lib/components/Gallery/gallery.shimmer.js +39 -0
  85. package/src/overwrites/venia-ui/lib/components/Gallery/index.js +3 -0
  86. package/src/overwrites/venia-ui/lib/components/Gallery/item.js +204 -0
  87. package/src/overwrites/venia-ui/lib/components/Gallery/item.module.css +109 -0
  88. package/src/overwrites/venia-ui/lib/components/Gallery/item.shimmer.js +38 -0
  89. package/src/overwrites/venia-ui/lib/components/Gallery/star.js +12 -0
  90. package/src/overwrites/venia-ui/lib/components/Header/accountTrigger.js +98 -0
  91. package/src/overwrites/venia-ui/lib/components/Header/cartTrigger.js +116 -0
  92. package/src/overwrites/venia-ui/lib/components/Header/header.js +12 -9
  93. package/src/overwrites/venia-ui/lib/components/Header/storeSwitcher.js +22 -8
  94. package/src/overwrites/venia-ui/lib/components/Header/storeSwitcher.module.css +107 -0
  95. package/src/overwrites/venia-ui/lib/components/Header/wishlistTrigger.js +23 -0
  96. package/src/overwrites/venia-ui/lib/components/MegaMenu/megaMenuItem.js +1 -1
  97. package/src/overwrites/venia-ui/lib/components/MegaMenu/submenu.module.css +0 -1
  98. package/src/overwrites/venia-ui/lib/components/Pagination/index.js +1 -0
  99. package/src/overwrites/venia-ui/lib/components/Pagination/navButton.js +65 -0
  100. package/src/overwrites/venia-ui/lib/components/Pagination/pagination.js +107 -0
  101. package/src/overwrites/venia-ui/lib/components/Pagination/tile.js +41 -0
  102. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/boolean.js +74 -0
  103. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/boolean.module.css +9 -0
  104. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/index.js +1 -0
  105. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/date.js +82 -0
  106. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/date.module.css +9 -0
  107. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/index.js +1 -0
  108. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/dateTime.js +85 -0
  109. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/dateTime.module.css +9 -0
  110. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/index.js +1 -0
  111. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/index.js +1 -0
  112. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/multiselect.js +104 -0
  113. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/multiselect.module.css +22 -0
  114. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/index.js +1 -0
  115. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/price.js +74 -0
  116. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/price.module.css +9 -0
  117. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/index.js +1 -0
  118. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/select.js +99 -0
  119. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/select.module.css +13 -0
  120. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/index.js +1 -0
  121. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/text.js +88 -0
  122. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/text.module.css +13 -0
  123. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/index.js +1 -0
  124. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/textarea.js +94 -0
  125. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/textarea.module.css +13 -0
  126. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/attributeType.js +67 -0
  127. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/index.js +1 -0
  128. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/customAttributes.js +64 -0
  129. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/customAttributes.module.css +9 -0
  130. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/index.js +1 -0
  131. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/index.js +1 -0
  132. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.gql.js +7 -0
  133. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.js +413 -0
  134. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.module.css +203 -0
  135. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.js +180 -0
  136. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.module.css +102 -0
  137. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.shimmer.js +51 -0
  138. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.shimmer.module.css +7 -0
  139. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/index.js +1 -0
  140. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/thumbnail.js +108 -0
  141. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/thumbnail.module.css +47 -0
  142. package/src/overwrites/venia-ui/lib/components/ProductSort/index.js +2 -0
  143. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.js +233 -0
  144. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.module.css +65 -0
  145. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.shimmer.js +28 -0
  146. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.shimmer.module.css +10 -0
  147. package/src/overwrites/venia-ui/lib/components/ProductSort/sortItem.js +57 -0
  148. package/src/overwrites/venia-ui/lib/components/ProductSort/sortItem.module.css +23 -0
  149. package/src/overwrites/venia-ui/lib/components/QuantityStepper/index.js +1 -0
  150. package/src/overwrites/venia-ui/lib/components/QuantityStepper/quantityStepper.js +94 -0
  151. package/src/overwrites/venia-ui/lib/components/QuantityStepper/quantityStepper.module.css +78 -0
  152. package/src/overwrites/venia-ui/lib/components/RichContent/index.js +1 -0
  153. package/src/overwrites/venia-ui/lib/components/RichContent/plainHtmlRenderer.js +17 -0
  154. package/src/overwrites/venia-ui/lib/components/RichContent/richContent.js +59 -0
  155. package/src/overwrites/venia-ui/lib/components/RichContent/richContent.module.css +146 -0
  156. package/src/overwrites/venia-ui/lib/components/RichContent/richContentRenderers.js +7 -0
  157. package/src/overwrites/venia-ui/lib/components/SearchBar/searchBar.module.css +1 -2
  158. package/src/overwrites/venia-ui/lib/components/SearchBar/searchField.js +3 -2
  159. package/src/overwrites/venia-ui/lib/components/TextInput/field.module.css +50 -0
  160. package/src/overwrites/venia-ui/lib/components/TextInput/index.js +1 -0
  161. package/src/overwrites/venia-ui/lib/components/TextInput/textInput.js +48 -0
  162. package/src/overwrites/venia-ui/lib/components/TextInput/textInput.module.css +21 -0
  163. package/src/talons/FilterOption/useFilterOptionModal.js +11 -0
  164. package/src/talons/FilterOptionModal/useFilterOptionModal.js +11 -0
  165. 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,7 @@
1
+ .thumbnailRoot {
2
+ composes: root from './thumbnail.module.css';
3
+ }
4
+
5
+ .thumbnailImage {
6
+ composes: image from './thumbnail.module.css';
7
+ }
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ export { default } from './productSort';
2
+ export { default as ProductSortShimmer } from './productSort.shimmer';