pixelize-design-library 2.4.2-beta.55 → 2.4.2-beta.57

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 (365) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/COMPONENT-GOTCHAS.md +50 -22
  3. package/DESIGN-GUIDE.md +19 -2
  4. package/dist/Components/AddressCard/AddressCard.d.ts +4 -0
  5. package/dist/Components/AddressCard/AddressCard.js +25 -0
  6. package/dist/Components/AddressCard/AddressCardGroup.d.ts +4 -0
  7. package/dist/Components/AddressCard/AddressCardGroup.js +7 -0
  8. package/dist/Components/AddressCard/AddressCardProps.d.ts +43 -0
  9. package/dist/Components/AddressCard/AddressCardProps.js +2 -0
  10. package/dist/Components/BagBar/BagBar.d.ts +4 -0
  11. package/dist/Components/BagBar/BagBar.js +32 -0
  12. package/dist/Components/BagBar/BagBarProps.d.ts +30 -0
  13. package/dist/Components/BagBar/BagBarProps.js +2 -0
  14. package/dist/Components/CartItem/CartItem.d.ts +4 -0
  15. package/dist/Components/CartItem/CartItem.js +60 -0
  16. package/dist/Components/CartItem/CartItemProps.d.ts +64 -0
  17. package/dist/Components/CartItem/CartItemProps.js +2 -0
  18. package/dist/Components/CartItem/cartItemOptions.d.ts +3 -0
  19. package/dist/Components/CartItem/cartItemOptions.js +13 -0
  20. package/dist/Components/CheckoutKit/selectable.d.ts +58 -0
  21. package/dist/Components/CheckoutKit/selectable.js +120 -0
  22. package/dist/Components/Commerce/commerceTypes.d.ts +52 -0
  23. package/dist/Components/Commerce/commerceTypes.js +2 -0
  24. package/dist/Components/Commerce/commerceVariants.d.ts +13 -0
  25. package/dist/Components/Commerce/commerceVariants.js +51 -0
  26. package/dist/Components/Commerce/index.d.ts +2 -0
  27. package/dist/Components/Commerce/index.js +18 -0
  28. package/dist/Components/Commerce/useContainerWidth.d.ts +3 -0
  29. package/dist/Components/Commerce/useContainerWidth.js +25 -0
  30. package/dist/Components/CouponField/CouponField.d.ts +4 -0
  31. package/dist/Components/CouponField/CouponField.js +72 -0
  32. package/dist/Components/CouponField/CouponFieldProps.d.ts +49 -0
  33. package/dist/Components/CouponField/CouponFieldProps.js +2 -0
  34. package/dist/Components/DatePicker/DatePickerProps.d.ts +1 -1
  35. package/dist/Components/DatePicker/PickerPortal.d.ts +11 -0
  36. package/dist/Components/DatePicker/PickerPortal.js +26 -0
  37. package/dist/Components/DatePicker/RangeDatePicker.d.ts +1 -1
  38. package/dist/Components/DatePicker/RangeDatePicker.js +67 -32
  39. package/dist/Components/DatePicker/SingleDatePicker.js +49 -13
  40. package/dist/Components/DatePicker/TimeOnlyPicker.js +39 -4
  41. package/dist/Components/DetailSections/DetailSections.d.ts +4 -0
  42. package/dist/Components/DetailSections/DetailSections.js +112 -0
  43. package/dist/Components/DetailSections/DetailSectionsProps.d.ts +58 -0
  44. package/dist/Components/DetailSections/DetailSectionsProps.js +2 -0
  45. package/dist/Components/Input/PhoneNumberInputProps.d.ts +1 -1
  46. package/dist/Components/MediaGallery/MediaFrame.d.ts +31 -0
  47. package/dist/Components/MediaGallery/MediaFrame.js +55 -0
  48. package/dist/Components/MediaGallery/MediaGallery.d.ts +4 -0
  49. package/dist/Components/MediaGallery/MediaGallery.js +206 -0
  50. package/dist/Components/MediaGallery/MediaGalleryProps.d.ts +76 -0
  51. package/dist/Components/MediaGallery/MediaGalleryProps.js +20 -0
  52. package/dist/Components/MediaGallery/MediaLightbox.d.ts +4 -0
  53. package/dist/Components/MediaGallery/MediaLightbox.js +116 -0
  54. package/dist/Components/MediaGallery/MediaLightboxProps.d.ts +40 -0
  55. package/dist/Components/MediaGallery/MediaLightboxProps.js +15 -0
  56. package/dist/Components/MediaGallery/MediaThumb.d.ts +18 -0
  57. package/dist/Components/MediaGallery/MediaThumb.js +25 -0
  58. package/dist/Components/MediaGallery/glass.d.ts +31 -0
  59. package/dist/Components/MediaGallery/glass.js +47 -0
  60. package/dist/Components/MediaGallery/mediaGalleryModel.d.ts +22 -0
  61. package/dist/Components/MediaGallery/mediaGalleryModel.js +83 -0
  62. package/dist/Components/MediaGallery/motion.d.ts +5 -0
  63. package/dist/Components/MediaGallery/motion.js +12 -0
  64. package/dist/Components/MediaGallery/useMatchMedia.d.ts +2 -0
  65. package/dist/Components/MediaGallery/useMatchMedia.js +20 -0
  66. package/dist/Components/MultiSelect/MultiSelectProps.d.ts +1 -1
  67. package/dist/Components/OffersList/OffersList.d.ts +4 -0
  68. package/dist/Components/OffersList/OffersList.js +83 -0
  69. package/dist/Components/OffersList/OffersListProps.d.ts +34 -0
  70. package/dist/Components/OffersList/OffersListProps.js +2 -0
  71. package/dist/Components/OptionChip/OptionChip.d.ts +4 -0
  72. package/dist/Components/OptionChip/OptionChip.js +97 -0
  73. package/dist/Components/OptionChip/OptionChipProps.d.ts +33 -0
  74. package/dist/Components/OptionChip/OptionChipProps.js +2 -0
  75. package/dist/Components/OptionChip/optionInk.d.ts +12 -0
  76. package/dist/Components/OptionChip/optionInk.js +25 -0
  77. package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.d.ts +4 -0
  78. package/dist/Components/OrderStatusTimeline/OrderStatusTimeline.js +57 -0
  79. package/dist/Components/OrderStatusTimeline/OrderStatusTimelineProps.d.ts +29 -0
  80. package/dist/Components/OrderStatusTimeline/OrderStatusTimelineProps.js +2 -0
  81. package/dist/Components/OrderSummary/OrderSummary.d.ts +4 -0
  82. package/dist/Components/OrderSummary/OrderSummary.js +63 -0
  83. package/dist/Components/OrderSummary/OrderSummaryProps.d.ts +53 -0
  84. package/dist/Components/OrderSummary/OrderSummaryProps.js +2 -0
  85. package/dist/Components/PaymentOption/PaymentOption.d.ts +4 -0
  86. package/dist/Components/PaymentOption/PaymentOption.js +24 -0
  87. package/dist/Components/PaymentOption/PaymentOptionGroup.d.ts +4 -0
  88. package/dist/Components/PaymentOption/PaymentOptionGroup.js +7 -0
  89. package/dist/Components/PaymentOption/PaymentOptionProps.d.ts +32 -0
  90. package/dist/Components/PaymentOption/PaymentOptionProps.js +2 -0
  91. package/dist/Components/PinInput/PinInputProps.d.ts +1 -1
  92. package/dist/Components/PincodeChecker/PincodeChecker.d.ts +4 -0
  93. package/dist/Components/PincodeChecker/PincodeChecker.js +175 -0
  94. package/dist/Components/PincodeChecker/PincodeCheckerProps.d.ts +57 -0
  95. package/dist/Components/PincodeChecker/PincodeCheckerProps.js +2 -0
  96. package/dist/Components/PriceBlock/PriceBlock.d.ts +4 -0
  97. package/dist/Components/PriceBlock/PriceBlock.js +41 -0
  98. package/dist/Components/PriceBlock/PriceBlockProps.d.ts +39 -0
  99. package/dist/Components/PriceBlock/PriceBlockProps.js +2 -0
  100. package/dist/Components/ProductBadges/ProductBadges.d.ts +4 -0
  101. package/dist/Components/ProductBadges/ProductBadges.js +61 -0
  102. package/dist/Components/ProductBadges/ProductBadgesProps.d.ts +18 -0
  103. package/dist/Components/ProductBadges/ProductBadgesProps.js +2 -0
  104. package/dist/Components/ProductCard/ProductCard.d.ts +3 -2
  105. package/dist/Components/ProductCard/ProductCard.js +103 -52
  106. package/dist/Components/ProductCard/ProductCardAction.d.ts +17 -0
  107. package/dist/Components/ProductCard/ProductCardAction.js +65 -0
  108. package/dist/Components/ProductCard/ProductCardGrid.d.ts +4 -0
  109. package/dist/Components/ProductCard/ProductCardGrid.js +20 -0
  110. package/dist/Components/ProductCard/ProductCardMedia.d.ts +18 -0
  111. package/dist/Components/ProductCard/ProductCardMedia.js +35 -0
  112. package/dist/Components/ProductCard/ProductCardProps.d.ts +138 -56
  113. package/dist/Components/ProductCard/ProductCardSkeleton.d.ts +4 -0
  114. package/dist/Components/ProductCard/ProductCardSkeleton.js +17 -0
  115. package/dist/Components/ProductCard/ProductCardSwatches.d.ts +15 -0
  116. package/dist/Components/ProductCard/ProductCardSwatches.js +37 -0
  117. package/dist/Components/ProductCard/QuickAddSheet.d.ts +4 -0
  118. package/dist/Components/ProductCard/QuickAddSheet.js +109 -0
  119. package/dist/Components/ProductCard/QuickAddSheetProps.d.ts +38 -0
  120. package/dist/Components/ProductCard/QuickAddSheetProps.js +2 -0
  121. package/dist/Components/ProductCard/cardLabels.d.ts +2 -0
  122. package/dist/Components/ProductCard/cardLabels.js +16 -0
  123. package/dist/Components/ProductCard/cardMetrics.d.ts +27 -0
  124. package/dist/Components/ProductCard/cardMetrics.js +55 -0
  125. package/dist/Components/ProductCard/productCardFixtures.d.ts +7 -0
  126. package/dist/Components/ProductCard/productCardFixtures.js +61 -0
  127. package/dist/Components/ProductCard/productCardModel.d.ts +22 -0
  128. package/dist/Components/ProductCard/productCardModel.js +79 -0
  129. package/dist/Components/ProductCard/useMinWidth.d.ts +2 -0
  130. package/dist/Components/ProductCard/useMinWidth.js +20 -0
  131. package/dist/Components/ProductDetails/ProductDetails.d.ts +3 -2
  132. package/dist/Components/ProductDetails/ProductDetails.js +209 -33
  133. package/dist/Components/ProductDetails/ProductDetailsProps.d.ts +143 -41
  134. package/dist/Components/ProductDetails/productDetailsModel.d.ts +14 -0
  135. package/dist/Components/ProductDetails/productDetailsModel.js +45 -0
  136. package/dist/Components/ProductDetails/useInViewport.d.ts +3 -0
  137. package/dist/Components/ProductDetails/useInViewport.js +18 -0
  138. package/dist/Components/QuantityStepper/QuantityStepper.d.ts +4 -0
  139. package/dist/Components/QuantityStepper/QuantityStepper.js +59 -0
  140. package/dist/Components/QuantityStepper/QuantityStepperProps.d.ts +24 -0
  141. package/dist/Components/QuantityStepper/QuantityStepperProps.js +2 -0
  142. package/dist/Components/Rating/Rating.d.ts +4 -0
  143. package/dist/Components/Rating/Rating.js +81 -0
  144. package/dist/Components/Rating/RatingProps.d.ts +27 -0
  145. package/dist/Components/Rating/RatingProps.js +2 -0
  146. package/dist/Components/ReviewList/ReviewList.d.ts +4 -0
  147. package/dist/Components/ReviewList/ReviewList.js +94 -0
  148. package/dist/Components/ReviewList/ReviewListProps.d.ts +68 -0
  149. package/dist/Components/ReviewList/ReviewListProps.js +2 -0
  150. package/dist/Components/ReviewSummary/ReviewSummary.d.ts +4 -0
  151. package/dist/Components/ReviewSummary/ReviewSummary.js +47 -0
  152. package/dist/Components/ReviewSummary/ReviewSummaryProps.d.ts +31 -0
  153. package/dist/Components/ReviewSummary/ReviewSummaryProps.js +2 -0
  154. package/dist/Components/Search/SearchProps.d.ts +1 -1
  155. package/dist/Components/SearchSelect/SearchSelectProps.d.ts +1 -1
  156. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +1 -1
  157. package/dist/Components/SegmentedControl/SegmentedControl.js +17 -5
  158. package/dist/Components/SegmentedControl/SegmentedControlProps.d.ts +6 -0
  159. package/dist/Components/SegmentedControl/segmentedInk.d.ts +2 -0
  160. package/dist/Components/SegmentedControl/segmentedInk.js +4 -1
  161. package/dist/Components/SegmentedControl/useSlidingPill.d.ts +2 -0
  162. package/dist/Components/SegmentedControl/useSlidingPill.js +6 -1
  163. package/dist/Components/Select/SelectProps.d.ts +1 -1
  164. package/dist/Components/SelectSearch/SelectSearchProps.d.ts +1 -1
  165. package/dist/Components/SelectV2/SelectV2Props.d.ts +1 -1
  166. package/dist/Components/SideBar/SecondaryBar.js +13 -8
  167. package/dist/Components/SideBar/SideBarProps.d.ts +3 -1
  168. package/dist/Components/SideBar/components/MenuItemBox.js +47 -10
  169. package/dist/Components/SideBar/components/MenuPopoverContent.js +4 -3
  170. package/dist/Components/SpecTable/SpecTable.d.ts +4 -0
  171. package/dist/Components/SpecTable/SpecTable.js +39 -0
  172. package/dist/Components/SpecTable/SpecTableProps.d.ts +25 -0
  173. package/dist/Components/SpecTable/SpecTableProps.js +2 -0
  174. package/dist/Components/Spinner/Spinner.d.ts +1 -1
  175. package/dist/Components/Spinner/Spinner.js +2 -2
  176. package/dist/Components/Spinner/SpinnerProps.d.ts +2 -0
  177. package/dist/Components/StageProgress/StepperStage.js +2 -1
  178. package/dist/Components/StatCard/StatCard.d.ts +1 -1
  179. package/dist/Components/StatCard/StatCard.js +2 -2
  180. package/dist/Components/StatCard/StatCardProps.d.ts +4 -0
  181. package/dist/Components/StickyBuyBar/StickyBuyBar.d.ts +3 -0
  182. package/dist/Components/StickyBuyBar/StickyBuyBar.js +85 -0
  183. package/dist/Components/StickyBuyBar/StickyBuyBarProps.d.ts +54 -0
  184. package/dist/Components/StickyBuyBar/StickyBuyBarProps.js +2 -0
  185. package/dist/Components/StockStatus/StockStatus.d.ts +4 -0
  186. package/dist/Components/StockStatus/StockStatus.js +31 -0
  187. package/dist/Components/StockStatus/StockStatusProps.d.ts +14 -0
  188. package/dist/Components/StockStatus/StockStatusProps.js +2 -0
  189. package/dist/Components/Table/Table.js +2 -1
  190. package/dist/Components/Table/TableProps.d.ts +5 -2
  191. package/dist/Components/Table/columnLabel.d.ts +6 -0
  192. package/dist/Components/Table/columnLabel.js +27 -0
  193. package/dist/Components/Table/components/TableBody.js +5 -1
  194. package/dist/Components/Table/components/TableHeader.js +3 -2
  195. package/dist/Components/Table/filters/ActiveFilters.js +2 -1
  196. package/dist/Components/Table/filters/TableFilters.js +2 -1
  197. package/dist/Components/Table/hooks/useTable.js +3 -2
  198. package/dist/Components/Table/settings/ManageColumns.js +4 -3
  199. package/dist/Components/Table/settings/TableSettings.js +2 -1
  200. package/dist/Components/TrustBadges/TrustBadges.d.ts +4 -0
  201. package/dist/Components/TrustBadges/TrustBadges.js +24 -0
  202. package/dist/Components/TrustBadges/TrustBadgesProps.d.ts +20 -0
  203. package/dist/Components/TrustBadges/TrustBadgesProps.js +2 -0
  204. package/dist/Components/VariantSelector/VariantSelector.d.ts +4 -0
  205. package/dist/Components/VariantSelector/VariantSelector.js +123 -0
  206. package/dist/Components/VariantSelector/VariantSelectorProps.d.ts +27 -0
  207. package/dist/Components/VariantSelector/VariantSelectorProps.js +2 -0
  208. package/dist/Components/VariantSelector/variantSelection.d.ts +6 -0
  209. package/dist/Components/VariantSelector/variantSelection.js +25 -0
  210. package/dist/Components/WishlistToggle/WishlistToggle.d.ts +4 -0
  211. package/dist/Components/WishlistToggle/WishlistToggle.js +65 -0
  212. package/dist/Components/WishlistToggle/WishlistToggleProps.d.ts +19 -0
  213. package/dist/Components/WishlistToggle/WishlistToggleProps.js +2 -0
  214. package/dist/Theme/assertPalette.d.ts +1 -1
  215. package/dist/Theme/assertPalette.js +1 -1
  216. package/dist/Theme/tokens/brands/index.js +2 -0
  217. package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts +1 -0
  218. package/dist/Theme/tokens/builders/buildDarkPalette.js +2 -0
  219. package/dist/Theme/tokens/builders/index.d.ts +1 -0
  220. package/dist/Theme/tokens/builders/index.js +1 -0
  221. package/dist/Theme/tokens/builders/rechartsTheme.d.ts +56 -0
  222. package/dist/Theme/tokens/builders/rechartsTheme.js +43 -0
  223. package/dist/Theme/tokens/builders/star.d.ts +3 -0
  224. package/dist/Theme/tokens/builders/star.js +8 -0
  225. package/dist/Theme/tokens/primitives/controlSizes.js +1 -1
  226. package/dist/Theme/tokens/types.d.ts +3 -1
  227. package/dist/Theme/useChartTheme.d.ts +4 -0
  228. package/dist/Theme/useChartTheme.js +12 -0
  229. package/dist/Utils/price.d.ts +16 -0
  230. package/dist/Utils/price.js +34 -0
  231. package/dist/esm/Components/AddressCard/AddressCard.js +20 -0
  232. package/dist/esm/Components/AddressCard/AddressCardGroup.js +5 -0
  233. package/dist/esm/Components/AddressCard/AddressCardProps.js +1 -0
  234. package/dist/esm/Components/BagBar/BagBar.js +27 -0
  235. package/dist/esm/Components/BagBar/BagBarProps.js +1 -0
  236. package/dist/esm/Components/CartItem/CartItem.js +55 -0
  237. package/dist/esm/Components/CartItem/CartItemProps.js +1 -0
  238. package/dist/esm/Components/CartItem/cartItemOptions.js +9 -0
  239. package/dist/esm/Components/CheckoutKit/selectable.js +112 -0
  240. package/dist/esm/Components/Commerce/commerceTypes.js +1 -0
  241. package/dist/esm/Components/Commerce/commerceVariants.js +41 -0
  242. package/dist/esm/Components/Commerce/index.js +2 -0
  243. package/dist/esm/Components/Commerce/useContainerWidth.js +21 -0
  244. package/dist/esm/Components/CouponField/CouponField.js +67 -0
  245. package/dist/esm/Components/CouponField/CouponFieldProps.js +1 -0
  246. package/dist/esm/Components/DatePicker/PickerPortal.js +21 -0
  247. package/dist/esm/Components/DatePicker/RangeDatePicker.js +34 -32
  248. package/dist/esm/Components/DatePicker/SingleDatePicker.js +16 -13
  249. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +6 -4
  250. package/dist/esm/Components/DetailSections/DetailSections.js +107 -0
  251. package/dist/esm/Components/DetailSections/DetailSectionsProps.js +1 -0
  252. package/dist/esm/Components/MediaGallery/MediaFrame.js +48 -0
  253. package/dist/esm/Components/MediaGallery/MediaGallery.js +201 -0
  254. package/dist/esm/Components/MediaGallery/MediaGalleryProps.js +17 -0
  255. package/dist/esm/Components/MediaGallery/MediaLightbox.js +78 -0
  256. package/dist/esm/Components/MediaGallery/MediaLightboxProps.js +12 -0
  257. package/dist/esm/Components/MediaGallery/MediaThumb.js +23 -0
  258. package/dist/esm/Components/MediaGallery/glass.js +42 -0
  259. package/dist/esm/Components/MediaGallery/mediaGalleryModel.js +71 -0
  260. package/dist/esm/Components/MediaGallery/motion.js +8 -0
  261. package/dist/esm/Components/MediaGallery/useMatchMedia.js +16 -0
  262. package/dist/esm/Components/OffersList/OffersList.js +81 -0
  263. package/dist/esm/Components/OffersList/OffersListProps.js +1 -0
  264. package/dist/esm/Components/OptionChip/OptionChip.js +95 -0
  265. package/dist/esm/Components/OptionChip/OptionChipProps.js +1 -0
  266. package/dist/esm/Components/OptionChip/optionInk.js +21 -0
  267. package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimeline.js +55 -0
  268. package/dist/esm/Components/OrderStatusTimeline/OrderStatusTimelineProps.js +1 -0
  269. package/dist/esm/Components/OrderSummary/OrderSummary.js +58 -0
  270. package/dist/esm/Components/OrderSummary/OrderSummaryProps.js +1 -0
  271. package/dist/esm/Components/PaymentOption/PaymentOption.js +19 -0
  272. package/dist/esm/Components/PaymentOption/PaymentOptionGroup.js +5 -0
  273. package/dist/esm/Components/PaymentOption/PaymentOptionProps.js +1 -0
  274. package/dist/esm/Components/PincodeChecker/PincodeChecker.js +170 -0
  275. package/dist/esm/Components/PincodeChecker/PincodeCheckerProps.js +1 -0
  276. package/dist/esm/Components/PriceBlock/PriceBlock.js +39 -0
  277. package/dist/esm/Components/PriceBlock/PriceBlockProps.js +1 -0
  278. package/dist/esm/Components/ProductBadges/ProductBadges.js +59 -0
  279. package/dist/esm/Components/ProductBadges/ProductBadgesProps.js +1 -0
  280. package/dist/esm/Components/ProductCard/ProductCard.js +105 -54
  281. package/dist/esm/Components/ProductCard/ProductCardAction.js +60 -0
  282. package/dist/esm/Components/ProductCard/ProductCardGrid.js +18 -0
  283. package/dist/esm/Components/ProductCard/ProductCardMedia.js +33 -0
  284. package/dist/esm/Components/ProductCard/ProductCardSkeleton.js +12 -0
  285. package/dist/esm/Components/ProductCard/ProductCardSwatches.js +35 -0
  286. package/dist/esm/Components/ProductCard/QuickAddSheet.js +71 -0
  287. package/dist/esm/Components/ProductCard/QuickAddSheetProps.js +1 -0
  288. package/dist/esm/Components/ProductCard/cardLabels.js +13 -0
  289. package/dist/esm/Components/ProductCard/cardMetrics.js +52 -0
  290. package/dist/esm/Components/ProductCard/productCardFixtures.js +58 -0
  291. package/dist/esm/Components/ProductCard/productCardModel.js +65 -0
  292. package/dist/esm/Components/ProductCard/useMinWidth.js +16 -0
  293. package/dist/esm/Components/ProductDetails/ProductDetails.js +210 -34
  294. package/dist/esm/Components/ProductDetails/productDetailsModel.js +35 -0
  295. package/dist/esm/Components/ProductDetails/useInViewport.js +14 -0
  296. package/dist/esm/Components/QuantityStepper/QuantityStepper.js +57 -0
  297. package/dist/esm/Components/QuantityStepper/QuantityStepperProps.js +1 -0
  298. package/dist/esm/Components/Rating/Rating.js +79 -0
  299. package/dist/esm/Components/Rating/RatingProps.js +1 -0
  300. package/dist/esm/Components/ReviewList/ReviewList.js +89 -0
  301. package/dist/esm/Components/ReviewList/ReviewListProps.js +1 -0
  302. package/dist/esm/Components/ReviewSummary/ReviewSummary.js +42 -0
  303. package/dist/esm/Components/ReviewSummary/ReviewSummaryProps.js +1 -0
  304. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +19 -7
  305. package/dist/esm/Components/SegmentedControl/segmentedInk.js +2 -0
  306. package/dist/esm/Components/SegmentedControl/useSlidingPill.js +6 -1
  307. package/dist/esm/Components/SideBar/SecondaryBar.js +14 -9
  308. package/dist/esm/Components/SideBar/components/MenuItemBox.js +14 -10
  309. package/dist/esm/Components/SideBar/components/MenuPopoverContent.js +4 -3
  310. package/dist/esm/Components/SpecTable/SpecTable.js +34 -0
  311. package/dist/esm/Components/SpecTable/SpecTableProps.js +1 -0
  312. package/dist/esm/Components/Spinner/Spinner.js +2 -2
  313. package/dist/esm/Components/StageProgress/StepperStage.js +2 -1
  314. package/dist/esm/Components/StatCard/StatCard.js +2 -2
  315. package/dist/esm/Components/StickyBuyBar/StickyBuyBar.js +80 -0
  316. package/dist/esm/Components/StickyBuyBar/StickyBuyBarProps.js +1 -0
  317. package/dist/esm/Components/StockStatus/StockStatus.js +29 -0
  318. package/dist/esm/Components/StockStatus/StockStatusProps.js +1 -0
  319. package/dist/esm/Components/Table/Table.js +2 -1
  320. package/dist/esm/Components/Table/columnLabel.js +21 -0
  321. package/dist/esm/Components/Table/components/TableBody.js +5 -1
  322. package/dist/esm/Components/Table/components/TableHeader.js +3 -2
  323. package/dist/esm/Components/Table/filters/ActiveFilters.js +2 -1
  324. package/dist/esm/Components/Table/filters/TableFilters.js +2 -1
  325. package/dist/esm/Components/Table/hooks/useTable.js +3 -2
  326. package/dist/esm/Components/Table/settings/ManageColumns.js +4 -3
  327. package/dist/esm/Components/Table/settings/TableSettings.js +2 -1
  328. package/dist/esm/Components/TrustBadges/TrustBadges.js +22 -0
  329. package/dist/esm/Components/TrustBadges/TrustBadgesProps.js +1 -0
  330. package/dist/esm/Components/VariantSelector/VariantSelector.js +118 -0
  331. package/dist/esm/Components/VariantSelector/VariantSelectorProps.js +1 -0
  332. package/dist/esm/Components/VariantSelector/variantSelection.js +19 -0
  333. package/dist/esm/Components/WishlistToggle/WishlistToggle.js +63 -0
  334. package/dist/esm/Components/WishlistToggle/WishlistToggleProps.js +1 -0
  335. package/dist/esm/Theme/assertPalette.js +1 -1
  336. package/dist/esm/Theme/tokens/brands/index.js +2 -0
  337. package/dist/esm/Theme/tokens/builders/buildDarkPalette.js +2 -0
  338. package/dist/esm/Theme/tokens/builders/index.js +1 -0
  339. package/dist/esm/Theme/tokens/builders/rechartsTheme.js +37 -0
  340. package/dist/esm/Theme/tokens/builders/star.js +4 -0
  341. package/dist/esm/Theme/tokens/primitives/controlSizes.js +1 -1
  342. package/dist/esm/Theme/useChartTheme.js +8 -0
  343. package/dist/esm/Utils/price.js +27 -0
  344. package/dist/esm/index.js +36 -0
  345. package/dist/index.d.ts +66 -0
  346. package/dist/index.js +86 -4
  347. package/package.json +1 -1
  348. package/dist/Components/ProductCard/ProductLabel.d.ts +0 -7
  349. package/dist/Components/ProductCard/ProductLabel.js +0 -20
  350. package/dist/Components/ProductCard/ProductPrice.d.ts +0 -10
  351. package/dist/Components/ProductCard/ProductPrice.js +0 -126
  352. package/dist/Components/ProductCard/ProductReview.d.ts +0 -8
  353. package/dist/Components/ProductCard/ProductReview.js +0 -30
  354. package/dist/Components/ProductCard/ProductTags.d.ts +0 -8
  355. package/dist/Components/ProductCard/ProductTags.js +0 -53
  356. package/dist/Components/ProductDetails/ProductDtlPrice.d.ts +0 -7
  357. package/dist/Components/ProductDetails/ProductDtlPrice.js +0 -24
  358. package/dist/Components/ProductDetails/ProductImageSlider.d.ts +0 -13
  359. package/dist/Components/ProductDetails/ProductImageSlider.js +0 -240
  360. package/dist/esm/Components/ProductCard/ProductLabel.js +0 -18
  361. package/dist/esm/Components/ProductCard/ProductPrice.js +0 -121
  362. package/dist/esm/Components/ProductCard/ProductReview.js +0 -28
  363. package/dist/esm/Components/ProductCard/ProductTags.js +0 -48
  364. package/dist/esm/Components/ProductDetails/ProductDtlPrice.js +0 -22
  365. package/dist/esm/Components/ProductDetails/ProductImageSlider.js +0 -204
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useRef } from "react";
3
+ import { Box, Flex, Text, VisuallyHidden } from "@chakra-ui/react";
4
+ import { useCustomTheme } from "../../Theme/useCustomTheme.js";
5
+ import { transitionFor } from "../../Theme/tokens/primitives/motion.js";
6
+ import { reducedMotionSx } from "../../Theme/chakra/motion.js";
7
+ import { focusVisibleStyles } from "../../Theme/chakra/focusRing.styles.js";
8
+ const TARGET = "1.5rem";
9
+ const UNAVAILABLE_OPACITY = 0.45;
10
+ /** Colour dots for the first swatch axis: hover or focus previews the image, a press keeps it. */
11
+ const ProductCardSwatches = ({ axis, limit, dot, activeId, soldOutIds, labels, onPreview, onPick }) => {
12
+ const { colors } = useCustomTheme();
13
+ const cells = useRef([]);
14
+ const shown = axis.values.slice(0, limit);
15
+ const rest = axis.values.length - shown.length;
16
+ const activeIndex = Math.max(0, shown.findIndex((value) => value.id === activeId));
17
+ const onKeyDown = (event) => {
18
+ var _a;
19
+ const step = event.key === "ArrowRight" || event.key === "ArrowDown" ? 1 : event.key === "ArrowLeft" || event.key === "ArrowUp" ? -1 : 0;
20
+ if (step === 0)
21
+ return;
22
+ event.preventDefault();
23
+ const next = (activeIndex + step + shown.length) % shown.length;
24
+ onPick(shown[next].id);
25
+ (_a = cells.current[next]) === null || _a === void 0 ? void 0 : _a.focus();
26
+ };
27
+ return (_jsxs(Flex, { "data-control": true, position: "relative", zIndex: 2, align: "center", minH: TARGET, ml: "-0.375rem", maxW: "100%", children: [_jsx(Flex, { role: "radiogroup", "aria-label": axis.label, onKeyDown: onKeyDown, onMouseLeave: () => onPreview(null), children: shown.map((value, index) => {
28
+ const selected = value.id === activeId;
29
+ const soldOut = soldOutIds.has(value.id);
30
+ return (_jsx(Box, { as: "button", type: "button", role: "radio", ref: (el) => {
31
+ cells.current[index] = el;
32
+ }, "aria-checked": selected, "aria-label": soldOut ? `${value.label}, ${labels.soldOut.toLowerCase()}` : value.label, tabIndex: index === activeIndex ? 0 : -1, title: value.label, onClick: () => onPick(value.id), onMouseEnter: () => onPreview(value.id), onFocus: () => onPreview(value.id), onBlur: () => onPreview(null), display: "inline-flex", alignItems: "center", justifyContent: "center", boxSize: TARGET, flexShrink: 0, borderRadius: "full", cursor: "pointer", sx: { outline: "none", ...focusVisibleStyles(colors) }, children: _jsx(Box, { as: "span", display: "inline-flex", p: "2px", borderWidth: "2px", borderStyle: "solid", borderRadius: "full", borderColor: selected ? colors.header[900] : "transparent", transition: transitionFor(["border-color"]), sx: reducedMotionSx(), children: _jsx(Box, { as: "span", display: "block", boxSize: `${dot}px`, borderRadius: "full", backgroundColor: value.swatch, opacity: soldOut ? UNAVAILABLE_OPACITY : 1, boxShadow: `inset 0 0 0 1px ${colors.boxborder[200]}` }) }) }, value.id));
33
+ }) }), rest > 0 ? (_jsxs(_Fragment, { children: [_jsxs(Text, { as: "span", "aria-hidden": true, ml: 1, fontSize: "0.75rem", fontWeight: 500, color: colors.textMuted, sx: { fontVariantNumeric: "tabular-nums" }, children: ["+", rest] }), _jsx(VisuallyHidden, { children: labels.moreColours(rest) })] })) : null] }));
34
+ };
35
+ export default ProductCardSwatches;
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Flex, Text } from "@chakra-ui/react";
4
+ import { useCustomTheme } from "../../Theme/useCustomTheme.js";
5
+ import { formatPrice } from "../../Utils/price.js";
6
+ import Button from "../Button/Button.js";
7
+ import Drawer, { DrawerBody, DrawerFooter, DrawerHeader } from "../Drawer/Drawer.js";
8
+ import Modal, { ModalBody, ModalFooter } from "../Modal/Modal.js";
9
+ import PriceBlock from "../PriceBlock/PriceBlock.js";
10
+ import QuantityStepper from "../QuantityStepper/QuantityStepper.js";
11
+ import VariantSelector from "../VariantSelector/VariantSelector.js";
12
+ import { findVariant } from "../Commerce/commerceVariants.js";
13
+ import { rangeOf, firstMissingAxis } from "./productCardModel.js";
14
+ import { useMinWidth } from "./useMinWidth.js";
15
+ const DEFAULT_LABELS = {
16
+ heading: "Choose options",
17
+ quantity: "Quantity",
18
+ confirm: "Add to bag",
19
+ confirmWithTotal: (total) => `Add to bag — ${total}`,
20
+ prompt: (axisLabel) => `Select a ${axisLabel}`,
21
+ };
22
+ const DESKTOP_QUERY = "(min-width: 48em)";
23
+ /** Bottom sheet on phones, centred panel on desktop; holds the option picker so a card never grows. */
24
+ const QuickAddSheet = ({ isOpen, onClose, title, brand, media, axes, variants, defaultSelection, onConfirm, presentation = "auto", drawerContentProps, labels, currency, locale, "data-testid": testId, }) => {
25
+ var _a, _b, _c;
26
+ const { colors } = useCustomTheme();
27
+ const desktop = useMinWidth(DESKTOP_QUERY);
28
+ const copy = { ...DEFAULT_LABELS, ...labels };
29
+ const [selection, setSelection] = useState(defaultSelection !== null && defaultSelection !== void 0 ? defaultSelection : {});
30
+ const [quantity, setQuantity] = useState(1);
31
+ const [error, setError] = useState();
32
+ const [wasOpen, setWasOpen] = useState(isOpen);
33
+ if (isOpen !== wasOpen) {
34
+ setWasOpen(isOpen);
35
+ if (isOpen) {
36
+ setSelection(defaultSelection !== null && defaultSelection !== void 0 ? defaultSelection : {});
37
+ setQuantity(1);
38
+ setError(undefined);
39
+ }
40
+ }
41
+ const fmt = { currency, locale };
42
+ const variant = findVariant(axes, variants, selection);
43
+ const range = rangeOf(variants);
44
+ const maxQuantity = (variant === null || variant === void 0 ? void 0 : variant.stock) !== undefined && variant.stock > 0 ? variant.stock : undefined;
45
+ const confirmLabel = variant ? copy.confirmWithTotal(formatPrice(variant.price * quantity, fmt)) : copy.confirm;
46
+ const onSelect = (next) => {
47
+ setSelection(next);
48
+ setError(undefined);
49
+ const nextVariant = findVariant(axes, variants, next);
50
+ if ((nextVariant === null || nextVariant === void 0 ? void 0 : nextVariant.stock) !== undefined && nextVariant.stock > 0)
51
+ setQuantity((q) => Math.min(q, nextVariant.stock));
52
+ };
53
+ const confirm = () => {
54
+ var _a;
55
+ if (!variant) {
56
+ const missing = firstMissingAxis(axes, selection);
57
+ setError(copy.prompt(((_a = missing === null || missing === void 0 ? void 0 : missing.label) !== null && _a !== void 0 ? _a : "option").toLowerCase()));
58
+ return;
59
+ }
60
+ onConfirm(variant, quantity);
61
+ };
62
+ const summary = (_jsxs(Flex, { align: "center", gap: 3, mb: 4, children: [media ? (_jsx(Box, { as: "img", src: (_a = media.thumb) !== null && _a !== void 0 ? _a : media.src, alt: "", boxSize: "4.5rem", flexShrink: 0, borderRadius: "xl", objectFit: "cover", bg: colors.background[100] })) : null, _jsxs(Flex, { direction: "column", gap: 0.5, minW: 0, children: [brand ? (_jsx(Text, { fontSize: "xs", color: colors.textMuted, noOfLines: 1, children: brand })) : null, _jsx(Text, { fontSize: "sm", fontWeight: 500, color: colors.header[900], noOfLines: 2, children: title }), _jsx(PriceBlock, { size: "sm", price: (_b = variant === null || variant === void 0 ? void 0 : variant.price) !== null && _b !== void 0 ? _b : (_c = variants[0]) === null || _c === void 0 ? void 0 : _c.price, mrp: variant === null || variant === void 0 ? void 0 : variant.mrp, priceRange: variant ? undefined : range, currency: currency, locale: locale })] })] }));
63
+ const body = (_jsxs(Flex, { direction: "column", gap: 5, "data-testid": testId, children: [summary, _jsx(VariantSelector, { axes: axes, variants: variants, value: selection, onValueChange: onSelect, error: error, showSelectedLabel: true, showLowStock: true }), _jsxs(Flex, { align: "center", justify: "space-between", gap: 3, children: [_jsx(Text, { as: "span", fontSize: "sm", fontWeight: 600, color: colors.header[900], children: copy.quantity }), _jsx(QuantityStepper, { value: quantity, min: 1, max: maxQuantity, onValueChange: setQuantity, itemLabel: title })] })] }));
64
+ const action = (_jsx(Button, { size: "lg", width: "100%", onClick: confirm, children: confirmLabel }));
65
+ const asModal = presentation === "modal" || (presentation === "auto" && desktop);
66
+ if (asModal) {
67
+ return (_jsxs(Modal, { size: "md", isOpen: isOpen, onClose: onClose, isCentered: true, title: copy.heading, children: [_jsx(ModalBody, { children: body }), _jsx(ModalFooter, { children: action })] }));
68
+ }
69
+ return (_jsxs(Drawer, { isOpen: isOpen, onClose: onClose, placement: "bottom", size: "md", contentProps: { maxW: "100%", w: "100%", maxH: "90vh", borderTopRadius: "2xl", overflow: "auto", ...drawerContentProps }, children: [_jsx(DrawerHeader, { children: copy.heading }), _jsx(DrawerBody, { children: body }), _jsx(DrawerFooter, { children: action })] }));
70
+ };
71
+ export default QuickAddSheet;
@@ -0,0 +1,13 @@
1
+ export const DEFAULT_LABELS = {
2
+ save: (title) => `Save ${title}`,
3
+ chooseOptions: (title) => `Choose options for ${title}`,
4
+ addToBag: (title) => `Add to bag: ${title}`,
5
+ notifyMe: "Notify me",
6
+ notifyMeFor: (title) => `Notify me when ${title} is back`,
7
+ chooseOptionsText: "Choose options",
8
+ addToBagText: "Add to bag",
9
+ soldOut: "Sold out",
10
+ selected: "Selected",
11
+ moreColours: (count) => `${count} more colours`,
12
+ imageUnavailable: "Image unavailable",
13
+ };
@@ -0,0 +1,52 @@
1
+ export const DENSITY = {
2
+ compact: {
3
+ badgeInset: "0.5rem",
4
+ wishlistInset: "0",
5
+ actionInset: "0.25rem",
6
+ bodyTop: "0.5rem",
7
+ bodyGap: "1px",
8
+ brand: { size: "0.75rem", line: 16 },
9
+ title: { size: "0.8125rem", line: 18 },
10
+ price: "sm",
11
+ dot: 12,
12
+ railWidth: "9.75rem",
13
+ listMedia: "6rem",
14
+ rowGap: "1.5rem",
15
+ },
16
+ comfortable: {
17
+ badgeInset: "0.625rem",
18
+ wishlistInset: "0.125rem",
19
+ actionInset: "0.375rem",
20
+ bodyTop: "0.625rem",
21
+ bodyGap: "2px",
22
+ brand: { size: "0.75rem", line: 16 },
23
+ title: { size: "0.875rem", line: 20 },
24
+ price: "sm",
25
+ dot: 14,
26
+ railWidth: "12.5rem",
27
+ listMedia: "7rem",
28
+ rowGap: "1.5rem",
29
+ },
30
+ spacious: {
31
+ badgeInset: "0.75rem",
32
+ wishlistInset: "0.25rem",
33
+ actionInset: "0.5rem",
34
+ bodyTop: "0.75rem",
35
+ bodyGap: "3px",
36
+ brand: { size: "0.8125rem", line: 18 },
37
+ title: { size: "0.9375rem", line: 22 },
38
+ price: "md",
39
+ dot: 16,
40
+ railWidth: "12.5rem",
41
+ listMedia: "7rem",
42
+ rowGap: "2rem",
43
+ },
44
+ };
45
+ export const CSS_RATIO = {
46
+ "4/5": "4 / 5",
47
+ "1/1": "1 / 1",
48
+ "3/4": "3 / 4",
49
+ };
50
+ export const MEDIA_RADIUS = "1rem";
51
+ export const TITLE_LINES = 2;
52
+ export const FINE_POINTER = "@media (hover: hover) and (pointer: fine)";
@@ -0,0 +1,58 @@
1
+ export const jacketMedia = [
2
+ { id: "indigo-front", src: "/p/indigo-front.webp", alt: "Jacket in indigo, front" },
3
+ { id: "indigo-back", src: "/p/indigo-back.webp", alt: "Jacket in indigo, back" },
4
+ { id: "ice-front", src: "/p/ice-front.webp", alt: "Jacket in ice blue, front" },
5
+ { id: "ice-back", src: "/p/ice-back.webp", alt: "Jacket in ice blue, back" },
6
+ { id: "black-front", src: "/p/black-front.webp", alt: "Jacket in black, front" },
7
+ { id: "olive-front", src: "/p/olive-front.webp", alt: "Jacket in olive, front" },
8
+ ];
9
+ export const jacketAxes = [
10
+ {
11
+ id: "colour",
12
+ label: "Colour",
13
+ type: "swatch",
14
+ values: [
15
+ { id: "indigo", label: "Indigo Wash", swatch: "steelblue" },
16
+ { id: "ice", label: "Ice Blue", swatch: "lightsteelblue" },
17
+ { id: "black", label: "Washed Black", swatch: "black" },
18
+ { id: "olive", label: "Olive", swatch: "olive" },
19
+ ],
20
+ },
21
+ {
22
+ id: "size",
23
+ label: "Size",
24
+ type: "chip",
25
+ values: [
26
+ { id: "m", label: "M" },
27
+ { id: "l", label: "L" },
28
+ ],
29
+ },
30
+ ];
31
+ const sized = (colour, size, stock) => ({
32
+ id: `jacket-${colour}-${size}`,
33
+ options: { colour, size },
34
+ price: 3499,
35
+ mrp: 4999,
36
+ stock,
37
+ });
38
+ export const jacketVariants = [
39
+ sized("indigo", "m", 10),
40
+ sized("indigo", "l", 4),
41
+ sized("ice", "m", 9),
42
+ sized("ice", "l", 9),
43
+ sized("black", "m", 0),
44
+ sized("black", "l", 0),
45
+ sized("olive", "m", 6),
46
+ sized("olive", "l", 6),
47
+ ];
48
+ export const jacketMediaIds = {
49
+ "colour:indigo": ["indigo-front", "indigo-back"],
50
+ "colour:ice": ["ice-front", "ice-back"],
51
+ "colour:black": ["black-front"],
52
+ "colour:olive": ["olive-front"],
53
+ };
54
+ export const mugMedia = [
55
+ { id: "front", src: "/p/mug.webp", alt: "Mug, front" },
56
+ { id: "detail", src: "/p/mug-d.webp", alt: "Mug, glaze close-up" },
57
+ ];
58
+ export const mugVariants = [{ id: "mug-default", options: {}, price: 699, stock: 46 }];
@@ -0,0 +1,65 @@
1
+ import { findVariant, isOptionAvailable, priceRange, stockState } from "../Commerce/commerceVariants.js";
2
+ export const DEFAULT_SWATCH_LIMIT = 3;
3
+ export const hasChoice = (axes) => axes.some((axis) => axis.values.length > 1);
4
+ /** The first colour-like axis whose values all carry a swatch; the card draws dots only for this one. */
5
+ export const swatchAxisOf = (axes) => axes.find((axis) => (axis.type === "swatch" || axis.type === "image-tile") &&
6
+ axis.values.length > 1 &&
7
+ axis.values.every((value) => value.swatch));
8
+ /** The one variant a product without a real choice resolves to, when there is one. */
9
+ export const soleVariantOf = (axes, variants) => {
10
+ var _a;
11
+ if (hasChoice(axes))
12
+ return undefined;
13
+ const selection = {};
14
+ axes.forEach((axis) => {
15
+ if (axis.values[0])
16
+ selection[axis.id] = axis.values[0].id;
17
+ });
18
+ return (_a = findVariant(axes, variants, selection)) !== null && _a !== void 0 ? _a : (axes.length === 0 ? variants[0] : undefined);
19
+ };
20
+ export const isSoldOut = (outOfStock, stock, variants) => {
21
+ if (outOfStock !== undefined)
22
+ return outOfStock;
23
+ if (stock !== undefined)
24
+ return stock <= 0;
25
+ return variants.length > 0 && variants.every((variant) => stockState(variant) === "out-of-stock");
26
+ };
27
+ /** Units left, only when a real count says the product is low; undefined otherwise. */
28
+ export const lowStockCount = (stock, sole) => {
29
+ const count = stock !== null && stock !== void 0 ? stock : sole === null || sole === void 0 ? void 0 : sole.stock;
30
+ if (count === undefined)
31
+ return undefined;
32
+ const state = stockState({ stock: count, backorder: sole === null || sole === void 0 ? void 0 : sole.backorder });
33
+ return state === "low-stock" ? count : undefined;
34
+ };
35
+ export const deriveAction = (override, soldOut, axes) => {
36
+ if (override)
37
+ return override;
38
+ if (soldOut)
39
+ return "notify";
40
+ return hasChoice(axes) ? "options" : "add";
41
+ };
42
+ const optionKey = (axisId, valueId) => `${axisId}:${valueId}`;
43
+ /** Frames for the active swatch value: its mapped media, else the whole pool. */
44
+ export const framesFor = (media, mediaIdsByOption, axisId, valueId) => {
45
+ if (!axisId || !valueId || !mediaIdsByOption)
46
+ return media;
47
+ const ids = mediaIdsByOption[optionKey(axisId, valueId)];
48
+ if (!ids)
49
+ return media;
50
+ const frames = ids.map((id) => media.find((item) => item.id === id)).filter((item) => !!item);
51
+ return frames.length > 0 ? frames : media;
52
+ };
53
+ /** Variants that share the picked colour, so the price range follows the dot. */
54
+ export const variantsFor = (variants, axisId, valueId) => {
55
+ if (!axisId || !valueId)
56
+ return variants;
57
+ const scoped = variants.filter((variant) => variant.options[axisId] === valueId);
58
+ return scoped.length > 0 ? scoped : variants;
59
+ };
60
+ export const rangeOf = (variants) => {
61
+ const range = priceRange(variants);
62
+ return range && range.min !== range.max ? range : undefined;
63
+ };
64
+ export const valueSoldOut = (variants, axisId, valueId) => variants.length > 0 && !isOptionAvailable(variants, {}, axisId, valueId);
65
+ export const firstMissingAxis = (axes, selection) => axes.find((axis) => selection[axis.id] === undefined);
@@ -0,0 +1,16 @@
1
+ import { useEffect, useState } from "react";
2
+ const supported = () => typeof window !== "undefined" && typeof window.matchMedia === "function";
3
+ /** `matches` for a media query; false where matchMedia does not exist (SSR, jsdom). */
4
+ export const useMinWidth = (query) => {
5
+ const [matches, setMatches] = useState(() => (supported() ? window.matchMedia(query).matches : false));
6
+ useEffect(() => {
7
+ if (!supported())
8
+ return undefined;
9
+ const list = window.matchMedia(query);
10
+ const onChange = () => setMatches(list.matches);
11
+ onChange();
12
+ list.addEventListener("change", onChange);
13
+ return () => list.removeEventListener("change", onChange);
14
+ }, [query]);
15
+ return matches;
16
+ };
@@ -1,42 +1,218 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
3
- import { Box, Flex, Text, HStack, IconButton, useBreakpointValue } from "@chakra-ui/react";
2
+ import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
3
+ import { Box, Flex, Text, VisuallyHidden } from "@chakra-ui/react";
4
+ import { BellRing, Check, CircleAlert, Share2 } from "lucide-react";
4
5
  import { useCustomTheme } from "../../Theme/useCustomTheme.js";
5
- import ProductImageSlider from "./ProductImageSlider.js";
6
- import ProductLabel from "../ProductCard/ProductLabel.js";
7
- import ProductTags from "../ProductCard/ProductTags.js";
8
- import ProductDtlPrice from "./ProductDtlPrice.js";
6
+ import { transitionFor } from "../../Theme/tokens/primitives/motion.js";
7
+ import { reducedMotionSx, usePrefersReducedMotion } from "../../Theme/chakra/motion.js";
8
+ import { focusVisibleStyles } from "../../Theme/chakra/focusRing.styles.js";
9
+ import { formatPrice } from "../../Utils/price.js";
9
10
  import Button from "../Button/Button.js";
10
- import { ShoppingCartIcon, Minus, Plus } from "lucide-react";
11
- import ProductReview from "../ProductCard/ProductReview.js";
12
- import FormattedDescription from "../Common/FormattedDescription.js";
13
- const ProductDetails = ({ id, price, label, shortdesc, tags, images, batch, onAddToCart, onNotifyMe, onOptionChange, addToCart, goToCart, OnGoToCart, rating, reviews, notifyMe, isQtyEditable = false, displayRating = true, }) => {
14
- var _a, _b, _c, _d, _e;
11
+ import Skeletons from "../Skeletons/Skeletons.js";
12
+ import MediaGallery from "../MediaGallery/MediaGallery.js";
13
+ import { useContainerWidth } from "../Commerce/useContainerWidth.js";
14
+ import { useMatchMedia } from "../MediaGallery/useMatchMedia.js";
15
+ import ProductBadges from "../ProductBadges/ProductBadges.js";
16
+ import Rating from "../Rating/Rating.js";
17
+ import PriceBlock from "../PriceBlock/PriceBlock.js";
18
+ import StockStatus from "../StockStatus/StockStatus.js";
19
+ import WishlistToggle from "../WishlistToggle/WishlistToggle.js";
20
+ import VariantSelector from "../VariantSelector/VariantSelector.js";
21
+ import QuantityStepper from "../QuantityStepper/QuantityStepper.js";
22
+ import OffersList from "../OffersList/OffersList.js";
23
+ import PincodeChecker from "../PincodeChecker/PincodeChecker.js";
24
+ import TrustBadges from "../TrustBadges/TrustBadges.js";
25
+ import StickyBuyBar from "../StickyBuyBar/StickyBuyBar.js";
26
+ import DetailSections from "../DetailSections/DetailSections.js";
27
+ import ReviewSummary from "../ReviewSummary/ReviewSummary.js";
28
+ import ReviewList from "../ReviewList/ReviewList.js";
29
+ import { findVariant, priceRange, selectionComplete, stockState } from "../Commerce/commerceVariants.js";
30
+ import { DEFAULT_MAX_QUANTITY, activeMediaIds, clampQuantity, firstUnpickedAxis, packUnitPrice, quantityCeiling, resolveVariants, soldOutEverywhere, } from "./productDetailsModel.js";
31
+ import { useInViewport } from "./useInViewport.js";
32
+ const DESKTOP_QUERY = "(min-width: 1024px)";
33
+ const DESKTOP_MIN_WIDTH = 960;
34
+ const DEFAULT_ADDED_MS = 1600;
35
+ const DEFAULT_LABELS = {
36
+ addToBag: "Add to bag",
37
+ buyNow: "Buy now",
38
+ notifyMe: "Notify me",
39
+ goToBag: "Go to bag",
40
+ added: "Added",
41
+ addedAnnouncement: "Added to bag",
42
+ addFailed: "Couldn't add this to your bag. Try again.",
43
+ selectPrompt: (axisLabel) => `Select a ${axisLabel}`,
44
+ taxNote: "Inclusive of all taxes",
45
+ jumpToReviews: (ratingText) => `${ratingText}. Go to reviews`,
46
+ share: "Share",
47
+ wishlistSave: "Save for later",
48
+ };
49
+ const withGuide = (axes, guide) => {
50
+ var _a;
51
+ if (!guide)
52
+ return axes;
53
+ const axisId = (_a = guide.axisId) !== null && _a !== void 0 ? _a : "size";
54
+ return axes.map((axis) => { var _a; return axis.id === axisId && !axis.guide ? { ...axis, guide: { label: (_a = guide.label) !== null && _a !== void 0 ? _a : "Size guide", onClick: guide.onClick } } : axis; });
55
+ };
56
+ const scrollToNode = (node, reduced) => {
57
+ if (node && typeof node.scrollIntoView === "function") {
58
+ node.scrollIntoView({ behavior: reduced ? "auto" : "smooth", block: "center" });
59
+ }
60
+ };
61
+ /** Product page that wires one selection to price, stock, gallery frames and the primary action; every region has a slot. */
62
+ const ProductDetails = ({ product, selection: selectionProp, defaultSelection, onSelectionChange, quantity: quantityProp, defaultQuantity = 1, onQuantityChange, maxQuantity = DEFAULT_MAX_QUANTITY, onAddToBag, onBuyNow, onNotify, onGoToBag, addedDuration = DEFAULT_ADDED_MS, wishlisted, defaultWishlisted, onWishlistChange, onShare, offers, offersProps, trustItems, pincode, sizeGuide, onGuideClick, reviews, ratingBreakdown, reviewsProps, onWriteReview, detailSectionsProps, care, breadcrumbs, layout = "auto", mediaSlot, metaSlot, infoSlot, belowFold, relatedSlot, isLoading = false, labels: labelOverrides, currency, locale, "data-testid": testId, }) => {
63
+ var _a, _b, _c, _d, _e, _f, _g, _h;
15
64
  const { colors } = useCustomTheme();
16
- const isMobile = useBreakpointValue({ base: true, md: false });
17
- const [selectedOption, setSelectedOption] = React.useState(price === null || price === void 0 ? void 0 : price[0]);
18
- const [qty, setQty] = React.useState(1);
19
- React.useEffect(() => {
20
- setQty(1);
21
- }, [selectedOption]);
22
- const handleIncrement = () => {
23
- setQty((prev) => {
24
- var _a;
25
- const stock = (_a = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.stocks) !== null && _a !== void 0 ? _a : Infinity;
26
- if (prev >= stock)
27
- return prev;
28
- return prev + 1;
29
- });
65
+ const reduced = usePrefersReducedMotion();
66
+ const uid = useId();
67
+ const labels = { ...DEFAULT_LABELS, ...labelOverrides };
68
+ const fmt = useMemo(() => ({ currency, locale }), [currency, locale]);
69
+ const rootRef = useRef(null);
70
+ const containerWidth = useContainerWidth(rootRef);
71
+ const wide = useMatchMedia(DESKTOP_QUERY, false);
72
+ const desktop = layout === "auto" ? (containerWidth === undefined ? wide : containerWidth >= DESKTOP_MIN_WIDTH) : layout === "desktop";
73
+ const variants = useMemo(() => resolveVariants(product), [product]);
74
+ const axes = useMemo(() => withGuide(product.axes, sizeGuide), [product.axes, sizeGuide]);
75
+ const [innerSelection, setInnerSelection] = useState(defaultSelection !== null && defaultSelection !== void 0 ? defaultSelection : {});
76
+ const selection = selectionProp !== null && selectionProp !== void 0 ? selectionProp : innerSelection;
77
+ const complete = selectionComplete(product.axes, selection);
78
+ const variant = findVariant(product.axes, variants, selection);
79
+ const unpicked = firstUnpickedAxis(product.axes, selection);
80
+ const selectPrompt = unpicked ? labels.selectPrompt(unpicked.label.toLowerCase()) : "";
81
+ const state = variant ? stockState(variant) : soldOutEverywhere(variants) ? "out-of-stock" : undefined;
82
+ const notifyMode = state === "out-of-stock";
83
+ const ceiling = quantityCeiling(variant, maxQuantity);
84
+ const [innerQuantity, setInnerQuantity] = useState(defaultQuantity);
85
+ const quantity = clampQuantity(quantityProp !== null && quantityProp !== void 0 ? quantityProp : innerQuantity, ceiling);
86
+ const [bag, setBag] = useState("idle");
87
+ const [addFailed, setAddFailed] = useState(false);
88
+ const [showSelectError, setShowSelectError] = useState(false);
89
+ const [promptTick, setPromptTick] = useState(0);
90
+ const [announcement, setAnnouncement] = useState("");
91
+ const timer = useRef();
92
+ const mounted = useRef(true);
93
+ const selectorRef = useRef(null);
94
+ const ctaRef = useRef(null);
95
+ const reviewsRef = useRef(null);
96
+ const ctaInView = useInViewport(ctaRef, !desktop && !isLoading);
97
+ useEffect(() => {
98
+ mounted.current = true;
99
+ return () => {
100
+ mounted.current = false;
101
+ clearTimeout(timer.current);
102
+ };
103
+ }, []);
104
+ const variantId = variant === null || variant === void 0 ? void 0 : variant.id;
105
+ useEffect(() => {
106
+ clearTimeout(timer.current);
107
+ setBag("idle");
108
+ setAddFailed(false);
109
+ }, [variantId, quantity]);
110
+ useEffect(() => {
111
+ var _a, _b;
112
+ if (promptTick === 0)
113
+ return;
114
+ const group = (_a = selectorRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('[role="radiogroup"][aria-invalid="true"]');
115
+ scrollToNode(group !== null && group !== void 0 ? group : selectorRef.current, reduced);
116
+ (_b = group === null || group === void 0 ? void 0 : group.querySelector('[role="radio"][tabindex="0"]')) === null || _b === void 0 ? void 0 : _b.focus({ preventScroll: true });
117
+ }, [promptTick, reduced]);
118
+ const handleSelection = useCallback((next, matched) => {
119
+ if (selectionProp === undefined)
120
+ setInnerSelection(next);
121
+ if (selectionComplete(product.axes, next))
122
+ setShowSelectError(false);
123
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(next, matched);
124
+ }, [selectionProp, product.axes, onSelectionChange]);
125
+ const handleQuantity = (next) => {
126
+ if (quantityProp === undefined)
127
+ setInnerQuantity(next);
128
+ onQuantityChange === null || onQuantityChange === void 0 ? void 0 : onQuantityChange(next);
129
+ };
130
+ const promptSelection = () => {
131
+ setShowSelectError(true);
132
+ setPromptTick((tick) => tick + 1);
133
+ };
134
+ const handleAdd = async () => {
135
+ if (!complete || !variant) {
136
+ promptSelection();
137
+ return;
138
+ }
139
+ if (bag === "in-bag") {
140
+ onGoToBag === null || onGoToBag === void 0 ? void 0 : onGoToBag();
141
+ return;
142
+ }
143
+ if (bag !== "idle")
144
+ return;
145
+ setAddFailed(false);
146
+ try {
147
+ const pending = onAddToBag === null || onAddToBag === void 0 ? void 0 : onAddToBag(variant.id, quantity);
148
+ if (pending && typeof pending.then === "function") {
149
+ setBag("adding");
150
+ await pending;
151
+ }
152
+ }
153
+ catch {
154
+ if (mounted.current) {
155
+ setBag("idle");
156
+ setAddFailed(true);
157
+ }
158
+ return;
159
+ }
160
+ if (!mounted.current)
161
+ return;
162
+ setBag("added");
163
+ setAnnouncement(labels.addedAnnouncement);
164
+ timer.current = setTimeout(() => {
165
+ setBag(onGoToBag ? "in-bag" : "idle");
166
+ setAnnouncement("");
167
+ }, addedDuration);
30
168
  };
31
- const handleDecrement = () => {
32
- setQty((prev) => (prev > 1 ? prev - 1 : 1));
169
+ const handleBuyNow = () => {
170
+ if (!complete || !variant) {
171
+ promptSelection();
172
+ return;
173
+ }
174
+ onBuyNow === null || onBuyNow === void 0 ? void 0 : onBuyNow(variant.id, quantity);
33
175
  };
34
- return (_jsxs(Flex, { direction: ["column", "row"], maxW: "6xl", mx: "auto", align: "start", gap: 5, children: [_jsx(Box, { position: "relative", color: colors.text[500], borderRadius: "md", flex: "1", minH: isMobile ? undefined : "31.25rem", children: _jsx(ProductImageSlider, { images: images, thumbHeight: isMobile ? 48 : 80, imageSize: isMobile ? 360 : 480, thumbnailsToShow: isMobile ? 4 : 6, batch: batch, productName: label }) }), _jsxs(Box, { flex: "1", children: [label && _jsx(ProductLabel, { label: label, size: "sm" }), shortdesc && _jsx(Box, { my: 3, children: _jsx(FormattedDescription, { content: shortdesc }) }), ((rating !== undefined && rating !== null) || (reviews !== undefined && reviews !== null)) && displayRating && (_jsx(ProductReview, { rating: rating, reviewCount: reviews, mb: 3 })), tags && _jsx(ProductTags, { tags: tags, size: "sm" }), price && (_jsx(ProductDtlPrice, { price: price, onSelect: (option) => {
35
- setSelectedOption(option);
36
- onOptionChange === null || onOptionChange === void 0 ? void 0 : onOptionChange(option);
37
- } })), typeof (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.stocks) === "number" && ((_a = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.stocks) !== null && _a !== void 0 ? _a : 0) <= 0 && (_jsx(Box, { sx: { ml: "1.1rem", mt: "0.5rem", mb: "0.5rem" }, children: _jsx(Button, { colorScheme: "gray", size: "sm",
38
- // width="50%"
39
- // onClick={button?.onClick}
40
- isDisabled: true, children: "Out of Stock" }) })), goToCart && (_jsx(Button, { size: "sm", colorScheme: "red", leftIcon: _jsx(ShoppingCartIcon, {}), sx: { ml: "1.1rem" }, onClick: OnGoToCart, children: "Go to cart" })), addToCart && (((_b = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.stocks) !== null && _b !== void 0 ? _b : 1) > 0) && isQtyEditable && (_jsx(HStack, { sx: { ml: "1.1rem", mb: 4 }, spacing: 4, children: _jsxs(HStack, { children: [_jsx(IconButton, { icon: _jsx(Minus, { size: 16 }), "aria-label": "Decrease quantity", size: "xs", onClick: handleDecrement, isDisabled: qty <= 1, isRound: true, variant: "outline", colorScheme: "red" }), _jsx(Text, { fontWeight: "bold", w: 8, textAlign: "center", children: qty }), _jsx(IconButton, { icon: _jsx(Plus, { size: 16 }), "aria-label": "Increase quantity", size: "xs", onClick: handleIncrement, isDisabled: qty >= ((_c = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.stocks) !== null && _c !== void 0 ? _c : Infinity), isRound: true, variant: "outline", colorScheme: "red" })] }) })), addToCart && (((_d = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.stocks) !== null && _d !== void 0 ? _d : 1) > 0) && (_jsx(Button, { size: "sm", colorScheme: "red", leftIcon: _jsx(ShoppingCartIcon, {}), sx: { ml: "1.1rem" }, onClick: () => (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.var_id) !== undefined && (onAddToCart === null || onAddToCart === void 0 ? void 0 : onAddToCart(id, selectedOption.var_id, qty)), children: "Add to cart" })), addToCart && (((_e = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.stocks) !== null && _e !== void 0 ? _e : 1) <= 0) && notifyMe && (_jsx(Button, { size: "sm", colorScheme: "red", variant: "outline", sx: { ml: "1.1rem" }, onClick: () => (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.var_id) !== undefined && (onNotifyMe === null || onNotifyMe === void 0 ? void 0 : onNotifyMe(id, selectedOption.var_id)), children: "Notify Me" }))] })] }));
176
+ const handleNotify = () => onNotify === null || onNotify === void 0 ? void 0 : onNotify(variant === null || variant === void 0 ? void 0 : variant.id);
177
+ const jumpToReviews = () => scrollToNode(reviewsRef.current, reduced);
178
+ const range = !variant && !complete ? priceRange(variants) : null;
179
+ const price = (_a = variant === null || variant === void 0 ? void 0 : variant.price) !== null && _a !== void 0 ? _a : product.price;
180
+ const mrp = variant ? variant.mrp : product.mrp;
181
+ const showRange = range !== null && range.min !== range.max;
182
+ const activeIds = activeMediaIds(product, selection, variant);
183
+ const primaryLabel = bag === "added" ? labels.added : bag === "in-bag" ? labels.goToBag : notifyMode ? labels.notifyMe : labels.addToBag;
184
+ const barMode = notifyMode
185
+ ? "notify"
186
+ : !complete
187
+ ? "select-option"
188
+ : bag === "added"
189
+ ? "added"
190
+ : bag === "in-bag"
191
+ ? "go-to-bag"
192
+ : "add";
193
+ const showStepper = !notifyMode && ceiling > 0;
194
+ const showBuyNow = !!onBuyNow && !notifyMode && bag === "idle";
195
+ const ratingText = product.rating === undefined
196
+ ? ""
197
+ : `Rated ${product.rating.toFixed(1)} out of 5${product.ratingCount ? ` from ${product.ratingCount.toLocaleString(locale !== null && locale !== void 0 ? locale : "en-IN")} ratings` : ""}`;
198
+ const mrpForLegal = variant ? ((_b = variant.mrp) !== null && _b !== void 0 ? _b : variant.price) : ((_c = product.mrp) !== null && _c !== void 0 ? _c : product.price);
199
+ const hasLegal = !!(product.netQuantity || product.manufacturer || product.originCountry);
200
+ const reviewsHeadingId = `${uid}-reviews`;
201
+ const showReviews = reviews !== undefined || product.ratingCount !== undefined;
202
+ const sectionGap = desktop ? 18 : 10;
203
+ const gutter = desktop ? 6 : 4;
204
+ const wishlist = (_jsx(WishlistToggle, { selected: wishlisted, defaultSelected: defaultWishlisted, onSelectedChange: onWishlistChange, size: desktop ? "lg" : "md", variant: desktop ? "soft" : "glass", label: labels.wishlistSave }));
205
+ const badgeSlot = product.badges && product.badges.length > 0 ? _jsx(ProductBadges, { badges: product.badges, max: 2, variant: "glass", size: "md" }) : undefined;
206
+ const gallery = mediaSlot !== null && mediaSlot !== void 0 ? mediaSlot : (_jsx(MediaGallery, { media: product.media, layout: desktop ? "thumbs-left" : "swipe", aspectRatio: "4/5", activeMediaIds: activeIds, sticky: desktop, stickyTop: 24, badges: badgeSlot, actions: desktop ? undefined : wishlist, isLoading: isLoading, "aria-label": product.title }));
207
+ const primaryButton = (_jsx(Button, { size: desktop ? "md" : "lg", width: "100%", variant: notifyMode ? "outline" : "solid", label: primaryLabel, leftIcon: bag === "added" ? _jsx(Check, { size: 18, "aria-hidden": true }) : notifyMode ? _jsx(BellRing, { size: 18, "aria-hidden": true }) : undefined, isLoading: bag === "adding", onClick: notifyMode ? handleNotify : handleAdd, fontWeight: 600 }));
208
+ const buyPanel = isLoading ? (_jsxs(Flex, { direction: "column", gap: 4, "aria-busy": "true", children: [_jsx(Skeletons, { type: "skeleton", height: "1rem", width: "30%" }), _jsx(Skeletons, { type: "skeleton", height: "2rem", width: "90%" }), _jsx(Skeletons, { type: "skeleton", height: "2.5rem", width: "45%" }), _jsx(Skeletons, { type: "skeleton", height: "3rem", width: "100%" }), _jsx(Skeletons, { type: "skeleton", height: "3rem", width: "100%" })] })) : (_jsxs(Flex, { direction: "column", gap: 6, children: [_jsxs(Flex, { direction: "column", gap: 2, children: [_jsxs(Flex, { align: "center", justify: "space-between", gap: 3, minH: product.brand || onShare ? "2.75rem" : undefined, children: [product.brand ? (_jsx(Text, { as: "span", fontSize: "sm", fontWeight: 600, color: colors.textMuted, children: product.brand })) : (_jsx("span", {})), onShare ? (_jsx(Box, { as: "button", type: "button", "aria-label": labels.share, onClick: onShare, display: "inline-flex", alignItems: "center", justifyContent: "center", boxSize: "2.75rem", mr: "-0.625rem", borderRadius: "full", color: colors.header[900], transition: transitionFor(["background-color"]), _hover: { bg: colors.background[100] }, sx: { ...focusVisibleStyles(colors), ...reducedMotionSx() }, children: _jsx(Share2, { size: 20, "aria-hidden": true }) })) : null] }), _jsx(Text, { as: "h1", fontSize: desktop ? "1.75rem" : "1.375rem", lineHeight: 1.25, fontWeight: 700, letterSpacing: "-0.02em", color: colors.header[900], children: product.title }), product.rating !== undefined && showReviews ? (_jsx(Box, { as: "button", type: "button", onClick: jumpToReviews, "aria-label": labels.jumpToReviews(ratingText), alignSelf: "flex-start", display: "inline-flex", alignItems: "center", minH: "2.75rem", borderRadius: "md", sx: { ...focusVisibleStyles(colors) }, children: _jsx(Rating, { value: product.rating, count: product.ratingCount, size: "sm", "aria-label": ratingText, locale: locale }) })) : product.rating !== undefined ? (_jsx(Rating, { value: product.rating, count: product.ratingCount, size: "sm", locale: locale })) : null] }), _jsxs(Flex, { direction: "column", gap: 2, children: [_jsx(PriceBlock, { size: "lg", price: price, mrp: mrp, priceRange: showRange ? range : undefined, showSavings: true, taxNote: labels.taxNote, unitPrice: packUnitPrice(product, selection, price), ...fmt }), state ? _jsx(StockStatus, { status: state, count: variant === null || variant === void 0 ? void 0 : variant.stock }) : null, metaSlot] }), offers && offers.length > 0 ? _jsx(OffersList, { offers: offers, ...offersProps }) : null, axes.length > 0 ? (_jsx(Box, { ref: selectorRef, children: _jsx(VariantSelector, { axes: axes, variants: variants, value: selection, onValueChange: handleSelection, error: showSelectError && !complete ? selectPrompt : undefined, showSelectedLabel: true, showLowStock: true, onGuideClick: onGuideClick }) })) : null, _jsxs(Flex, { direction: "column", gap: 3, ref: ctaRef, children: [_jsxs(Flex, { align: "center", gap: 3, children: [showStepper ? (_jsx(QuantityStepper, { size: desktop ? "md" : "lg", value: quantity, onValueChange: handleQuantity, min: 1, max: ceiling, itemLabel: product.title })) : null, _jsx(Box, { flex: 1, minW: 0, children: primaryButton }), desktop ? wishlist : null] }), showBuyNow ? _jsx(Button, { size: desktop ? "md" : "lg", width: "100%", variant: "outline", label: labels.buyNow, onClick: handleBuyNow }) : null, addFailed ? (_jsxs(Flex, { role: "alert", align: "center", gap: 1.5, color: colors.semanticText.error, fontSize: "sm", fontWeight: 600, children: [_jsx(CircleAlert, { size: 14, "aria-hidden": true }), _jsx(Text, { as: "span", children: labels.addFailed })] })) : null] }), pincode ? _jsx(PincodeChecker, { ...pincode }) : null, trustItems && trustItems.length > 0 ? _jsx(TrustBadges, { items: trustItems, layout: desktop ? "grid" : "row" }) : null, infoSlot] }));
209
+ return (_jsxs(Box, { ref: rootRef, "data-testid": testId, "data-layout": desktop ? "desktop" : "mobile", w: "100%", maxW: "82rem", mx: "auto", px: desktop ? 6 : 0, children: [_jsx(VisuallyHidden, { role: "status", "aria-live": "polite", "aria-atomic": "true", children: announcement }), breadcrumbs ? _jsx(Box, { px: desktop ? 0 : gutter, py: 3, children: breadcrumbs }) : null, _jsxs(Flex, { direction: desktop ? "row" : "column", align: desktop ? "flex-start" : "stretch", gap: desktop ? 12 : 5, children: [_jsx(Box, { flex: desktop ? "1.63 1 0" : undefined, minW: 0, w: desktop ? undefined : "100%", children: gallery }), _jsx(Box, { flex: desktop ? "1 1 0" : undefined, minW: 0, px: desktop ? 0 : gutter, children: buyPanel })] }), !isLoading ? (_jsxs(Flex, { direction: "column", gap: sectionGap, mt: sectionGap, px: desktop ? 0 : gutter, children: [_jsx(DetailSections, { description: product.description, highlights: product.highlights, specs: product.specs, care: care, shipping: product.returnsNote, legal: hasLegal
210
+ ? {
211
+ netQuantity: product.netQuantity,
212
+ manufacturer: product.manufacturer,
213
+ originCountry: product.originCountry,
214
+ mrpNote: `${formatPrice(mrpForLegal, fmt)} · ${(_e = (_d = detailSectionsProps === null || detailSectionsProps === void 0 ? void 0 : detailSectionsProps.labels) === null || _d === void 0 ? void 0 : _d.mrpIncludesTaxes) !== null && _e !== void 0 ? _e : "Maximum retail price, inclusive of all taxes"}`,
215
+ }
216
+ : undefined, defaultOpenIds: desktop ? ["description", "highlights", "specs"] : undefined, ...detailSectionsProps }), showReviews ? (_jsx(Box, { ref: reviewsRef, children: _jsxs(Flex, { direction: "column", gap: 6, children: [_jsx(ReviewSummary, { id: reviewsHeadingId, rating: (_f = product.rating) !== null && _f !== void 0 ? _f : 0, count: (_h = (_g = product.ratingCount) !== null && _g !== void 0 ? _g : reviews === null || reviews === void 0 ? void 0 : reviews.length) !== null && _h !== void 0 ? _h : 0, breakdown: ratingBreakdown, onWriteReview: onWriteReview, locale: locale }), reviews && (reviews.length > 0 || (reviewsProps === null || reviewsProps === void 0 ? void 0 : reviewsProps.isLoading)) ? (_jsx(ReviewList, { reviews: reviews, locale: locale, ...reviewsProps })) : null] }) })) : null, belowFold, relatedSlot] })) : null, !desktop && !isLoading ? (_jsx(StickyBuyBar, { price: price, mrp: mrp, mode: barMode, visible: !ctaInView, isLoading: bag === "adding", itemLabel: product.title, onAddToBag: handleAdd, onSelectOption: promptSelection, onNotify: handleNotify, onGoToBag: () => onGoToBag === null || onGoToBag === void 0 ? void 0 : onGoToBag(), onBuyNow: onBuyNow ? handleBuyNow : undefined, labels: { add: labels.addToBag, selectOption: selectPrompt || labels.addToBag, notify: labels.notifyMe, added: labels.added, goToBag: labels.goToBag, buyNow: labels.buyNow }, ...fmt })) : null] }));
41
217
  };
42
218
  export default ProductDetails;