orionplace-react 0.7.8 → 0.8.0

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 (669) hide show
  1. package/README.md +7 -614
  2. package/bin/orionplace-react.mjs +10 -176
  3. package/package.json +7 -59
  4. package/LICENSE +0 -21
  5. package/runtime/app.d.mts +0 -6
  6. package/runtime/app.mjs +0 -48
  7. package/runtime/marketplace.d.mts +0 -129
  8. package/runtime/marketplace.mjs +0 -905
  9. package/src/install.mjs +0 -356
  10. package/src/project-readme.mjs +0 -442
  11. package/src/service.mjs +0 -186
  12. package/src/setup.mjs +0 -274
  13. package/src/sitemap.mjs +0 -93
  14. package/src/update.mjs +0 -36
  15. package/src/validation.mjs +0 -27
  16. package/templates/app/StorefrontShell.tsx +0 -443
  17. package/templates/app/[[...path]]/page.app.tsx +0 -11
  18. package/templates/app/_storefront/ActivityPage.tsx +0 -23
  19. package/templates/app/_storefront/AddressesPage.tsx +0 -29
  20. package/templates/app/_storefront/AppRoutes.tsx +0 -184
  21. package/templates/app/_storefront/ArticlePage.tsx +0 -84
  22. package/templates/app/_storefront/CartPage.tsx +0 -53
  23. package/templates/app/_storefront/CatalogPage.tsx +0 -37
  24. package/templates/app/_storefront/CategoryPage.tsx +0 -68
  25. package/templates/app/_storefront/ContactPage.tsx +0 -32
  26. package/templates/app/_storefront/HomePage.tsx +0 -140
  27. package/templates/app/_storefront/JournalPage.tsx +0 -36
  28. package/templates/app/_storefront/LogoutPage.tsx +0 -91
  29. package/templates/app/_storefront/ManufacturersPage.tsx +0 -64
  30. package/templates/app/_storefront/OrdersPage.tsx +0 -129
  31. package/templates/app/_storefront/PrivacyPage.tsx +0 -15
  32. package/templates/app/_storefront/ProductPage.tsx +0 -113
  33. package/templates/app/_storefront/ProfilePage.tsx +0 -75
  34. package/templates/app/_storefront/PromoPage.tsx +0 -66
  35. package/templates/app/_storefront/PromocodesPage.tsx +0 -17
  36. package/templates/app/_storefront/SearchPage.tsx +0 -225
  37. package/templates/app/_storefront/SellersPage.tsx +0 -166
  38. package/templates/app/_storefront/StorefrontErrorRoute.tsx +0 -42
  39. package/templates/app/_storefront/StorefrontPageMetadata.tsx +0 -117
  40. package/templates/app/_storefront/StorefrontPageStatus.tsx +0 -61
  41. package/templates/app/_storefront/StorefrontProductStructuredData.tsx +0 -77
  42. package/templates/app/_storefront/StoresPage.tsx +0 -53
  43. package/templates/app/_storefront/SubscriptionsPage.tsx +0 -62
  44. package/templates/app/_storefront/SupportPage.tsx +0 -141
  45. package/templates/app/_storefront/TariffsPage.tsx +0 -180
  46. package/templates/app/_storefront/UnsubscribePage.tsx +0 -29
  47. package/templates/app/_storefront/WalletPage.tsx +0 -78
  48. package/templates/app/_storefront/WishlistPage.tsx +0 -79
  49. package/templates/app/_storefront/storefrontRoutes.tsx +0 -769
  50. package/templates/app/_storefront/useAccountWallet.ts +0 -27
  51. package/templates/app/_storefront/useBlogComments.ts +0 -389
  52. package/templates/app/_storefront/useProductSearch.ts +0 -242
  53. package/templates/app/_storefront/useStorefrontNavigation.ts +0 -36
  54. package/templates/app/activity/page.tsx +0 -9
  55. package/templates/app/addresses/page.tsx +0 -9
  56. package/templates/app/api/[...orionplace]/route.ts +0 -21
  57. package/templates/app/browse/page.tsx +0 -27
  58. package/templates/app/cart/page.tsx +0 -9
  59. package/templates/app/catalog/page.tsx +0 -9
  60. package/templates/app/category/[id]/page.tsx +0 -9
  61. package/templates/app/contact/page.tsx +0 -9
  62. package/templates/app/error.tsx +0 -7
  63. package/templates/app/featured/page.tsx +0 -9
  64. package/templates/app/global-error.tsx +0 -61
  65. package/templates/app/globals.css +0 -58
  66. package/templates/app/journal/[id]/page.tsx +0 -9
  67. package/templates/app/journal/page.tsx +0 -9
  68. package/templates/app/layout.app.tsx +0 -20
  69. package/templates/app/layout.tsx +0 -66
  70. package/templates/app/logout/page.tsx +0 -9
  71. package/templates/app/manufacturers/page.tsx +0 -9
  72. package/templates/app/not-found.tsx +0 -5
  73. package/templates/app/orders/page.tsx +0 -9
  74. package/templates/app/page.module.css +0 -137
  75. package/templates/app/page.tsx +0 -9
  76. package/templates/app/privacy/page.tsx +0 -9
  77. package/templates/app/product/[id]/page.tsx +0 -9
  78. package/templates/app/profile/page.tsx +0 -9
  79. package/templates/app/promo/[id]/page.tsx +0 -9
  80. package/templates/app/promocodes/page.tsx +0 -9
  81. package/templates/app/ps3/blog/[...orionplace]/route.ts +0 -13
  82. package/templates/app/robots.txt/route.ts +0 -11
  83. package/templates/app/sellers/page.tsx +0 -9
  84. package/templates/app/sitemap.xml/route.ts +0 -12
  85. package/templates/app/storefront.module.css +0 -406
  86. package/templates/app/stores/page.tsx +0 -9
  87. package/templates/app/subscriptions/page.tsx +0 -9
  88. package/templates/app/tariffs/[slug]/[id]/page.tsx +0 -9
  89. package/templates/app/tariffs/page.tsx +0 -9
  90. package/templates/app/tickets/page.tsx +0 -9
  91. package/templates/app/unsubscribe/page.tsx +0 -9
  92. package/templates/app/wallet/page.tsx +0 -9
  93. package/templates/app/wishlist/page.tsx +0 -9
  94. package/templates/components/orionplace/account/AccountActivity.README.md +0 -70
  95. package/templates/components/orionplace/account/AccountActivity.module.css +0 -16
  96. package/templates/components/orionplace/account/AccountActivity.tsx +0 -94
  97. package/templates/components/orionplace/account/AccountPromocodes.README.md +0 -70
  98. package/templates/components/orionplace/account/AccountPromocodes.module.css +0 -92
  99. package/templates/components/orionplace/account/AccountPromocodes.tsx +0 -257
  100. package/templates/components/orionplace/account/AccountSection.README.md +0 -46
  101. package/templates/components/orionplace/account/AccountSection.module.css +0 -110
  102. package/templates/components/orionplace/account/AccountSection.tsx +0 -109
  103. package/templates/components/orionplace/account/ProfileAvatar.README.md +0 -48
  104. package/templates/components/orionplace/account/ProfileAvatar.module.css +0 -31
  105. package/templates/components/orionplace/account/ProfileAvatar.tsx +0 -138
  106. package/templates/components/orionplace/account/ProfileDeleteAccount.README.md +0 -59
  107. package/templates/components/orionplace/account/ProfileDeleteAccount.module.css +0 -51
  108. package/templates/components/orionplace/account/ProfileDeleteAccount.tsx +0 -171
  109. package/templates/components/orionplace/account/ProfileDetailsForm.README.md +0 -48
  110. package/templates/components/orionplace/account/ProfileDetailsForm.module.css +0 -35
  111. package/templates/components/orionplace/account/ProfileDetailsForm.tsx +0 -183
  112. package/templates/components/orionplace/account/ProfileEmailSettings.README.md +0 -52
  113. package/templates/components/orionplace/account/ProfileEmailSettings.module.css +0 -51
  114. package/templates/components/orionplace/account/ProfileEmailSettings.tsx +0 -276
  115. package/templates/components/orionplace/account/ProfilePasswordForm.README.md +0 -45
  116. package/templates/components/orionplace/account/ProfilePasswordForm.module.css +0 -43
  117. package/templates/components/orionplace/account/ProfilePasswordForm.tsx +0 -227
  118. package/templates/components/orionplace/account/ProfileSignIn.README.md +0 -64
  119. package/templates/components/orionplace/account/ProfileSignIn.module.css +0 -86
  120. package/templates/components/orionplace/account/ProfileSignIn.tsx +0 -463
  121. package/templates/components/orionplace/account/SignInHistory.README.md +0 -52
  122. package/templates/components/orionplace/account/SignInHistory.module.css +0 -81
  123. package/templates/components/orionplace/account/SignInHistory.tsx +0 -231
  124. package/templates/components/orionplace/account/StorefrontLogout.README.md +0 -48
  125. package/templates/components/orionplace/account/StorefrontLogout.module.css +0 -166
  126. package/templates/components/orionplace/account/StorefrontLogout.tsx +0 -73
  127. package/templates/components/orionplace/account/StorefrontProfile.README.md +0 -71
  128. package/templates/components/orionplace/account/StorefrontProfile.module.css +0 -65
  129. package/templates/components/orionplace/account/StorefrontProfile.tsx +0 -189
  130. package/templates/components/orionplace/account/account.module.css +0 -1180
  131. package/templates/components/orionplace/account/profile.module.css +0 -696
  132. package/templates/components/orionplace/address/AddressForm.README.md +0 -152
  133. package/templates/components/orionplace/address/AddressForm.module.css +0 -336
  134. package/templates/components/orionplace/address/AddressForm.tsx +0 -827
  135. package/templates/components/orionplace/address/StorefrontAddresses.README.md +0 -99
  136. package/templates/components/orionplace/address/StorefrontAddresses.module.css +0 -271
  137. package/templates/components/orionplace/address/StorefrontAddresses.tsx +0 -438
  138. package/templates/components/orionplace/banners/MainBanner.README.md +0 -65
  139. package/templates/components/orionplace/banners/MainBanner.module.css +0 -112
  140. package/templates/components/orionplace/banners/MainBanner.tsx +0 -159
  141. package/templates/components/orionplace/blog/BlogArticle.README.md +0 -183
  142. package/templates/components/orionplace/blog/BlogArticle.module.css +0 -333
  143. package/templates/components/orionplace/blog/BlogArticle.tsx +0 -545
  144. package/templates/components/orionplace/blog/BlogCommentForm.README.md +0 -51
  145. package/templates/components/orionplace/blog/BlogCommentForm.module.css +0 -93
  146. package/templates/components/orionplace/blog/BlogCommentForm.tsx +0 -125
  147. package/templates/components/orionplace/blog/BlogComments.README.md +0 -98
  148. package/templates/components/orionplace/blog/BlogComments.module.css +0 -151
  149. package/templates/components/orionplace/blog/BlogComments.tsx +0 -590
  150. package/templates/components/orionplace/blog/BlogPostCard.README.md +0 -51
  151. package/templates/components/orionplace/blog/BlogPostCard.module.css +0 -167
  152. package/templates/components/orionplace/blog/BlogPostCard.tsx +0 -177
  153. package/templates/components/orionplace/blog/BlogPostGroup.README.md +0 -49
  154. package/templates/components/orionplace/blog/BlogPostGroup.module.css +0 -37
  155. package/templates/components/orionplace/blog/BlogPostGroup.tsx +0 -129
  156. package/templates/components/orionplace/blog/StorefrontJournal.README.md +0 -105
  157. package/templates/components/orionplace/blog/StorefrontJournal.module.css +0 -387
  158. package/templates/components/orionplace/blog/StorefrontJournal.tsx +0 -549
  159. package/templates/components/orionplace/branding/BrandLogos.README.md +0 -29
  160. package/templates/components/orionplace/branding/BrandLogos.module.css +0 -7
  161. package/templates/components/orionplace/branding/BrandLogos.tsx +0 -30
  162. package/templates/components/orionplace/cart/CartCheckoutDetails.README.md +0 -96
  163. package/templates/components/orionplace/cart/CartCheckoutDetails.module.css +0 -159
  164. package/templates/components/orionplace/cart/CartCheckoutDetails.tsx +0 -381
  165. package/templates/components/orionplace/cart/CartDeliverySelector.README.md +0 -166
  166. package/templates/components/orionplace/cart/CartDeliverySelector.module.css +0 -105
  167. package/templates/components/orionplace/cart/CartDeliverySelector.tsx +0 -679
  168. package/templates/components/orionplace/cart/CartItemOptions.README.md +0 -172
  169. package/templates/components/orionplace/cart/CartItemOptions.module.css +0 -113
  170. package/templates/components/orionplace/cart/CartItemOptions.tsx +0 -503
  171. package/templates/components/orionplace/cart/CartLineItem.README.md +0 -138
  172. package/templates/components/orionplace/cart/CartLineItem.module.css +0 -57
  173. package/templates/components/orionplace/cart/CartLineItem.tsx +0 -263
  174. package/templates/components/orionplace/cart/CartPreview.README.md +0 -99
  175. package/templates/components/orionplace/cart/CartPreview.module.css +0 -225
  176. package/templates/components/orionplace/cart/CartPreview.tsx +0 -188
  177. package/templates/components/orionplace/cart/DeliveryMap.README.md +0 -65
  178. package/templates/components/orionplace/cart/DeliveryMap.module.css +0 -32
  179. package/templates/components/orionplace/cart/DeliveryMap.tsx +0 -131
  180. package/templates/components/orionplace/cart/StorefrontCart.README.md +0 -281
  181. package/templates/components/orionplace/cart/StorefrontCart.module.css +0 -460
  182. package/templates/components/orionplace/cart/StorefrontCart.tsx +0 -937
  183. package/templates/components/orionplace/catalog/CatalogHeader.README.md +0 -136
  184. package/templates/components/orionplace/catalog/CatalogHeader.module.css +0 -387
  185. package/templates/components/orionplace/catalog/CatalogHeader.tsx +0 -644
  186. package/templates/components/orionplace/catalog/CatalogRepresentative.README.md +0 -68
  187. package/templates/components/orionplace/catalog/CatalogRepresentative.tsx +0 -51
  188. package/templates/components/orionplace/catalog/StorefrontCatalog.README.md +0 -120
  189. package/templates/components/orionplace/catalog/StorefrontCatalog.module.css +0 -179
  190. package/templates/components/orionplace/catalog/StorefrontCatalog.tsx +0 -304
  191. package/templates/components/orionplace/categories/CategoryGroup.README.md +0 -68
  192. package/templates/components/orionplace/categories/CategoryGroup.module.css +0 -110
  193. package/templates/components/orionplace/categories/CategoryGroup.tsx +0 -123
  194. package/templates/components/orionplace/categories/StorefrontCategory.README.md +0 -155
  195. package/templates/components/orionplace/categories/StorefrontCategory.module.css +0 -148
  196. package/templates/components/orionplace/categories/StorefrontCategory.tsx +0 -225
  197. package/templates/components/orionplace/contact/AboutPage.README.md +0 -40
  198. package/templates/components/orionplace/contact/AboutPage.module.css +0 -216
  199. package/templates/components/orionplace/contact/AboutPage.tsx +0 -191
  200. package/templates/components/orionplace/contact/ContactForm.README.md +0 -93
  201. package/templates/components/orionplace/contact/ContactForm.module.css +0 -264
  202. package/templates/components/orionplace/contact/ContactForm.tsx +0 -382
  203. package/templates/components/orionplace/contact/EmailUnsubscribe.README.md +0 -67
  204. package/templates/components/orionplace/contact/EmailUnsubscribe.module.css +0 -95
  205. package/templates/components/orionplace/contact/EmailUnsubscribe.tsx +0 -130
  206. package/templates/components/orionplace/contact/StorefrontContact.README.md +0 -73
  207. package/templates/components/orionplace/contact/StorefrontContact.module.css +0 -101
  208. package/templates/components/orionplace/contact/StorefrontContact.tsx +0 -62
  209. package/templates/components/orionplace/currencies/MainCurrencySwitcher.README.md +0 -37
  210. package/templates/components/orionplace/currencies/MainCurrencySwitcher.tsx +0 -68
  211. package/templates/components/orionplace/events/EventEnrollmentDialog.README.md +0 -108
  212. package/templates/components/orionplace/events/EventEnrollmentDialog.module.css +0 -110
  213. package/templates/components/orionplace/events/EventEnrollmentDialog.tsx +0 -315
  214. package/templates/components/orionplace/events/EventsBlock.README.md +0 -58
  215. package/templates/components/orionplace/events/EventsBlock.module.css +0 -101
  216. package/templates/components/orionplace/events/EventsBlock.tsx +0 -109
  217. package/templates/components/orionplace/legal/CookieNotice.README.md +0 -42
  218. package/templates/components/orionplace/legal/CookieNotice.module.css +0 -48
  219. package/templates/components/orionplace/legal/CookieNotice.tsx +0 -82
  220. package/templates/components/orionplace/legal/StorefrontPrivacy.README.md +0 -49
  221. package/templates/components/orionplace/legal/StorefrontPrivacy.module.css +0 -166
  222. package/templates/components/orionplace/legal/StorefrontPrivacy.tsx +0 -83
  223. package/templates/components/orionplace/locale/MainLanguageSwitcher.README.md +0 -46
  224. package/templates/components/orionplace/locale/MainLanguageSwitcher.module.css +0 -196
  225. package/templates/components/orionplace/locale/MainLanguageSwitcher.tsx +0 -387
  226. package/templates/components/orionplace/manufacturers/ManufacturerIndex.README.md +0 -83
  227. package/templates/components/orionplace/manufacturers/ManufacturerIndex.module.css +0 -271
  228. package/templates/components/orionplace/manufacturers/ManufacturerIndex.tsx +0 -218
  229. package/templates/components/orionplace/manufacturers/StorefrontManufacturers.README.md +0 -122
  230. package/templates/components/orionplace/manufacturers/StorefrontManufacturers.module.css +0 -92
  231. package/templates/components/orionplace/manufacturers/StorefrontManufacturers.tsx +0 -455
  232. package/templates/components/orionplace/orders/OrderDetails.README.md +0 -116
  233. package/templates/components/orionplace/orders/OrderDetails.module.css +0 -730
  234. package/templates/components/orionplace/orders/OrderDetails.tsx +0 -693
  235. package/templates/components/orionplace/orders/OrderPaymentForm.README.md +0 -92
  236. package/templates/components/orionplace/orders/OrderPaymentForm.module.css +0 -105
  237. package/templates/components/orionplace/orders/OrderPaymentForm.tsx +0 -90
  238. package/templates/components/orionplace/orders/StorefrontOrders.README.md +0 -131
  239. package/templates/components/orionplace/orders/StorefrontOrders.module.css +0 -633
  240. package/templates/components/orionplace/orders/StorefrontOrders.tsx +0 -922
  241. package/templates/components/orionplace/payments/PaymentPanel.README.md +0 -114
  242. package/templates/components/orionplace/payments/PaymentPanel.module.css +0 -134
  243. package/templates/components/orionplace/payments/PaymentPanel.tsx +0 -76
  244. package/templates/components/orionplace/products/HoverImageViewer.README.md +0 -62
  245. package/templates/components/orionplace/products/HoverImageViewer.module.css +0 -88
  246. package/templates/components/orionplace/products/HoverImageViewer.tsx +0 -179
  247. package/templates/components/orionplace/products/ProductCard.README.md +0 -154
  248. package/templates/components/orionplace/products/ProductCard.module.css +0 -333
  249. package/templates/components/orionplace/products/ProductCard.tsx +0 -730
  250. package/templates/components/orionplace/products/ProductCardActions.README.md +0 -84
  251. package/templates/components/orionplace/products/ProductCardActions.module.css +0 -146
  252. package/templates/components/orionplace/products/ProductCardActions.tsx +0 -311
  253. package/templates/components/orionplace/products/ProductCardBadges.README.md +0 -44
  254. package/templates/components/orionplace/products/ProductCardBadges.module.css +0 -15
  255. package/templates/components/orionplace/products/ProductCardBadges.tsx +0 -78
  256. package/templates/components/orionplace/products/ProductCardDescription.README.md +0 -33
  257. package/templates/components/orionplace/products/ProductCardDescription.module.css +0 -6
  258. package/templates/components/orionplace/products/ProductCardDescription.tsx +0 -43
  259. package/templates/components/orionplace/products/ProductCardFavorite.README.md +0 -52
  260. package/templates/components/orionplace/products/ProductCardFavorite.module.css +0 -64
  261. package/templates/components/orionplace/products/ProductCardFavorite.tsx +0 -90
  262. package/templates/components/orionplace/products/ProductCardPrice.README.md +0 -33
  263. package/templates/components/orionplace/products/ProductCardPrice.module.css +0 -22
  264. package/templates/components/orionplace/products/ProductCardPrice.tsx +0 -50
  265. package/templates/components/orionplace/products/ProductCardRating.README.md +0 -33
  266. package/templates/components/orionplace/products/ProductCardRating.module.css +0 -7
  267. package/templates/components/orionplace/products/ProductCardRating.tsx +0 -56
  268. package/templates/components/orionplace/products/ProductCardSeller.README.md +0 -36
  269. package/templates/components/orionplace/products/ProductCardSeller.module.css +0 -31
  270. package/templates/components/orionplace/products/ProductCardSeller.tsx +0 -61
  271. package/templates/components/orionplace/products/ProductCardStockNotice.README.md +0 -36
  272. package/templates/components/orionplace/products/ProductCardStockNotice.module.css +0 -8
  273. package/templates/components/orionplace/products/ProductCardStockNotice.tsx +0 -35
  274. package/templates/components/orionplace/products/ProductCardTitle.README.md +0 -30
  275. package/templates/components/orionplace/products/ProductCardTitle.module.css +0 -13
  276. package/templates/components/orionplace/products/ProductCardTitle.tsx +0 -31
  277. package/templates/components/orionplace/products/ProductCardVariants.README.md +0 -77
  278. package/templates/components/orionplace/products/ProductCardVariants.module.css +0 -97
  279. package/templates/components/orionplace/products/ProductCardVariants.tsx +0 -350
  280. package/templates/components/orionplace/products/ProductGroup.README.md +0 -91
  281. package/templates/components/orionplace/products/ProductGroup.module.css +0 -64
  282. package/templates/components/orionplace/products/ProductGroup.tsx +0 -186
  283. package/templates/components/orionplace/products/ProductPreorderDialog.README.md +0 -89
  284. package/templates/components/orionplace/products/ProductPreorderDialog.module.css +0 -320
  285. package/templates/components/orionplace/products/ProductPreorderDialog.tsx +0 -346
  286. package/templates/components/orionplace/products/ProductReviewForm.README.md +0 -72
  287. package/templates/components/orionplace/products/ProductReviewForm.module.css +0 -217
  288. package/templates/components/orionplace/products/ProductReviewForm.tsx +0 -288
  289. package/templates/components/orionplace/products/ProductReviewGallery.README.md +0 -61
  290. package/templates/components/orionplace/products/ProductReviewGallery.module.css +0 -108
  291. package/templates/components/orionplace/products/ProductReviewGallery.tsx +0 -110
  292. package/templates/components/orionplace/products/ProductReviewImageViewer.README.md +0 -60
  293. package/templates/components/orionplace/products/ProductReviewImageViewer.module.css +0 -59
  294. package/templates/components/orionplace/products/ProductReviewImageViewer.tsx +0 -312
  295. package/templates/components/orionplace/products/ProductReviews.README.md +0 -137
  296. package/templates/components/orionplace/products/ProductReviews.module.css +0 -602
  297. package/templates/components/orionplace/products/ProductReviews.tsx +0 -944
  298. package/templates/components/orionplace/products/ProductSecondaryVariantModal.README.md +0 -67
  299. package/templates/components/orionplace/products/ProductSecondaryVariantModal.module.css +0 -79
  300. package/templates/components/orionplace/products/ProductSecondaryVariantModal.tsx +0 -324
  301. package/templates/components/orionplace/products/ProductSpecificationsDialog.README.md +0 -52
  302. package/templates/components/orionplace/products/ProductSpecificationsDialog.module.css +0 -138
  303. package/templates/components/orionplace/products/ProductSpecificationsDialog.tsx +0 -117
  304. package/templates/components/orionplace/products/StorefrontProduct.README.md +0 -200
  305. package/templates/components/orionplace/products/StorefrontProduct.module.css +0 -767
  306. package/templates/components/orionplace/products/StorefrontProduct.tsx +0 -1339
  307. package/templates/components/orionplace/products/StorefrontWishlist.README.md +0 -162
  308. package/templates/components/orionplace/products/StorefrontWishlist.module.css +0 -71
  309. package/templates/components/orionplace/products/StorefrontWishlist.tsx +0 -402
  310. package/templates/components/orionplace/promo/PromoProducts.README.md +0 -133
  311. package/templates/components/orionplace/promo/PromoProducts.module.css +0 -68
  312. package/templates/components/orionplace/promo/PromoProducts.tsx +0 -345
  313. package/templates/components/orionplace/search/MainSearch.README.md +0 -73
  314. package/templates/components/orionplace/search/MainSearch.module.css +0 -202
  315. package/templates/components/orionplace/search/MainSearch.tsx +0 -217
  316. package/templates/components/orionplace/search/ProductSearchResults.README.md +0 -166
  317. package/templates/components/orionplace/search/ProductSearchResults.module.css +0 -361
  318. package/templates/components/orionplace/search/ProductSearchResults.tsx +0 -359
  319. package/templates/components/orionplace/search/SearchFilters.README.md +0 -109
  320. package/templates/components/orionplace/search/SearchFilters.module.css +0 -274
  321. package/templates/components/orionplace/search/SearchFilters.tsx +0 -439
  322. package/templates/components/orionplace/sellers/SellerFilters.README.md +0 -66
  323. package/templates/components/orionplace/sellers/SellerFilters.module.css +0 -232
  324. package/templates/components/orionplace/sellers/SellerFilters.tsx +0 -201
  325. package/templates/components/orionplace/sellers/SellerPhotoGallery.README.md +0 -72
  326. package/templates/components/orionplace/sellers/SellerPhotoGallery.module.css +0 -314
  327. package/templates/components/orionplace/sellers/SellerPhotoGallery.tsx +0 -335
  328. package/templates/components/orionplace/sellers/SellerSummary.README.md +0 -62
  329. package/templates/components/orionplace/sellers/SellerSummary.module.css +0 -182
  330. package/templates/components/orionplace/sellers/SellerSummary.tsx +0 -107
  331. package/templates/components/orionplace/sellers/StorefrontSellers.README.md +0 -120
  332. package/templates/components/orionplace/sellers/StorefrontSellers.module.css +0 -147
  333. package/templates/components/orionplace/sellers/StorefrontSellers.tsx +0 -360
  334. package/templates/components/orionplace/shared/OrionplaceAvatar.README.md +0 -35
  335. package/templates/components/orionplace/shared/OrionplaceAvatar.module.css +0 -35
  336. package/templates/components/orionplace/shared/OrionplaceAvatar.tsx +0 -61
  337. package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.README.md +0 -33
  338. package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.module.css +0 -81
  339. package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.tsx +0 -91
  340. package/templates/components/orionplace/shared/OrionplaceEmptyState.README.md +0 -37
  341. package/templates/components/orionplace/shared/OrionplaceEmptyState.module.css +0 -126
  342. package/templates/components/orionplace/shared/OrionplaceEmptyState.tsx +0 -78
  343. package/templates/components/orionplace/shared/OrionplaceImage.README.md +0 -45
  344. package/templates/components/orionplace/shared/OrionplaceImage.module.css +0 -22
  345. package/templates/components/orionplace/shared/OrionplaceImage.tsx +0 -97
  346. package/templates/components/orionplace/shared/OrionplaceInfoHint.README.md +0 -31
  347. package/templates/components/orionplace/shared/OrionplaceInfoHint.module.css +0 -59
  348. package/templates/components/orionplace/shared/OrionplaceInfoHint.tsx +0 -126
  349. package/templates/components/orionplace/shared/OrionplacePasswordInput.README.md +0 -39
  350. package/templates/components/orionplace/shared/OrionplacePasswordInput.module.css +0 -79
  351. package/templates/components/orionplace/shared/OrionplacePasswordInput.tsx +0 -103
  352. package/templates/components/orionplace/shared/OrionplaceSearchSelect.README.md +0 -97
  353. package/templates/components/orionplace/shared/OrionplaceSearchSelect.module.css +0 -246
  354. package/templates/components/orionplace/shared/OrionplaceSearchSelect.tsx +0 -367
  355. package/templates/components/orionplace/shared/OrionplaceSelect.README.md +0 -69
  356. package/templates/components/orionplace/shared/OrionplaceSelect.module.css +0 -233
  357. package/templates/components/orionplace/shared/OrionplaceSelect.tsx +0 -439
  358. package/templates/components/orionplace/shared/StorefrontErrorPage.README.md +0 -52
  359. package/templates/components/orionplace/shared/StorefrontErrorPage.module.css +0 -141
  360. package/templates/components/orionplace/shared/StorefrontErrorPage.tsx +0 -103
  361. package/templates/components/orionplace/shared/StorefrontPagination.README.md +0 -45
  362. package/templates/components/orionplace/shared/StorefrontPagination.module.css +0 -69
  363. package/templates/components/orionplace/shared/StorefrontPagination.tsx +0 -158
  364. package/templates/components/orionplace/shared/dialogs.css +0 -36
  365. package/templates/components/orionplace/shared/emptyStateArt.ts +0 -231
  366. package/templates/components/orionplace/shared/features.module.css +0 -162
  367. package/templates/components/orionplace/social/SocialLinks.README.md +0 -16
  368. package/templates/components/orionplace/social/SocialLinks.module.css +0 -36
  369. package/templates/components/orionplace/social/SocialLinks.tsx +0 -59
  370. package/templates/components/orionplace/storefront/StorefrontAccount.README.md +0 -59
  371. package/templates/components/orionplace/storefront/StorefrontAccount.module.css +0 -159
  372. package/templates/components/orionplace/storefront/StorefrontAccount.tsx +0 -303
  373. package/templates/components/orionplace/storefront/StorefrontCartButton.README.md +0 -47
  374. package/templates/components/orionplace/storefront/StorefrontCartButton.module.css +0 -88
  375. package/templates/components/orionplace/storefront/StorefrontCartButton.tsx +0 -54
  376. package/templates/components/orionplace/storefront/StorefrontFooter.README.md +0 -55
  377. package/templates/components/orionplace/storefront/StorefrontFooter.module.css +0 -118
  378. package/templates/components/orionplace/storefront/StorefrontFooter.tsx +0 -168
  379. package/templates/components/orionplace/storefront/StorefrontHeader.README.md +0 -150
  380. package/templates/components/orionplace/storefront/StorefrontHeader.module.css +0 -186
  381. package/templates/components/orionplace/storefront/StorefrontHeader.tsx +0 -389
  382. package/templates/components/orionplace/storefront/StorefrontHome.README.md +0 -138
  383. package/templates/components/orionplace/storefront/StorefrontHome.module.css +0 -116
  384. package/templates/components/orionplace/storefront/StorefrontHome.tsx +0 -282
  385. package/templates/components/orionplace/storefront/StorefrontWishlistButton.README.md +0 -51
  386. package/templates/components/orionplace/storefront/StorefrontWishlistButton.module.css +0 -95
  387. package/templates/components/orionplace/storefront/StorefrontWishlistButton.tsx +0 -80
  388. package/templates/components/orionplace/stores/StorefrontStores.README.md +0 -87
  389. package/templates/components/orionplace/stores/StorefrontStores.module.css +0 -218
  390. package/templates/components/orionplace/stores/StorefrontStores.tsx +0 -397
  391. package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.README.md +0 -183
  392. package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.module.css +0 -347
  393. package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.tsx +0 -884
  394. package/templates/components/orionplace/subscriptions/StorefrontTariff.README.md +0 -124
  395. package/templates/components/orionplace/subscriptions/StorefrontTariff.module.css +0 -311
  396. package/templates/components/orionplace/subscriptions/StorefrontTariff.tsx +0 -485
  397. package/templates/components/orionplace/subscriptions/StorefrontTariffs.README.md +0 -115
  398. package/templates/components/orionplace/subscriptions/StorefrontTariffs.module.css +0 -219
  399. package/templates/components/orionplace/subscriptions/StorefrontTariffs.tsx +0 -367
  400. package/templates/components/orionplace/subscriptions/SubscriptionCancelDialog.README.md +0 -67
  401. package/templates/components/orionplace/subscriptions/SubscriptionCancelDialog.tsx +0 -175
  402. package/templates/components/orionplace/subscriptions/SubscriptionChangeDialog.README.md +0 -95
  403. package/templates/components/orionplace/subscriptions/SubscriptionChangeDialog.tsx +0 -634
  404. package/templates/components/orionplace/subscriptions/SubscriptionDialog.module.css +0 -453
  405. package/templates/components/orionplace/subscriptions/SubscriptionExtendDialog.README.md +0 -75
  406. package/templates/components/orionplace/subscriptions/SubscriptionExtendDialog.tsx +0 -384
  407. package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.README.md +0 -116
  408. package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.module.css +0 -168
  409. package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.tsx +0 -236
  410. package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.README.md +0 -123
  411. package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.module.css +0 -57
  412. package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.tsx +0 -101
  413. package/templates/components/orionplace/subscriptions/SubscriptionRenewalDialog.README.md +0 -109
  414. package/templates/components/orionplace/subscriptions/SubscriptionRenewalDialog.tsx +0 -253
  415. package/templates/components/orionplace/support/StorefrontSupport.README.md +0 -157
  416. package/templates/components/orionplace/support/StorefrontSupport.tsx +0 -1040
  417. package/templates/components/orionplace/support/Support.module.css +0 -1133
  418. package/templates/components/orionplace/support/TicketConversation.README.md +0 -105
  419. package/templates/components/orionplace/support/TicketConversation.tsx +0 -502
  420. package/templates/components/orionplace/support/TicketImage.README.md +0 -52
  421. package/templates/components/orionplace/support/TicketImage.tsx +0 -254
  422. package/templates/components/orionplace/support/TicketItemCard.README.md +0 -66
  423. package/templates/components/orionplace/support/TicketItemCard.tsx +0 -140
  424. package/templates/components/orionplace/support/TicketMessageForm.README.md +0 -88
  425. package/templates/components/orionplace/support/TicketMessageForm.tsx +0 -261
  426. package/templates/components/orionplace/support/TicketSubscriptionCard.README.md +0 -53
  427. package/templates/components/orionplace/support/TicketSubscriptionCard.tsx +0 -118
  428. package/templates/components/orionplace/tariffs/TariffCard.README.md +0 -108
  429. package/templates/components/orionplace/tariffs/TariffCard.module.css +0 -86
  430. package/templates/components/orionplace/tariffs/TariffCard.tsx +0 -225
  431. package/templates/components/orionplace/tariffs/TariffCardDescription.README.md +0 -40
  432. package/templates/components/orionplace/tariffs/TariffCardDescription.module.css +0 -72
  433. package/templates/components/orionplace/tariffs/TariffCardDescription.tsx +0 -58
  434. package/templates/components/orionplace/tariffs/TariffCardFeatures.README.md +0 -58
  435. package/templates/components/orionplace/tariffs/TariffCardFeatures.module.css +0 -60
  436. package/templates/components/orionplace/tariffs/TariffCardFeatures.tsx +0 -140
  437. package/templates/components/orionplace/tariffs/TariffCardImage.README.md +0 -36
  438. package/templates/components/orionplace/tariffs/TariffCardImage.module.css +0 -8
  439. package/templates/components/orionplace/tariffs/TariffCardImage.tsx +0 -32
  440. package/templates/components/orionplace/tariffs/TariffCardPrices.README.md +0 -82
  441. package/templates/components/orionplace/tariffs/TariffCardPrices.module.css +0 -142
  442. package/templates/components/orionplace/tariffs/TariffCardPrices.tsx +0 -191
  443. package/templates/components/orionplace/tariffs/TariffCardTitle.README.md +0 -32
  444. package/templates/components/orionplace/tariffs/TariffCardTitle.module.css +0 -9
  445. package/templates/components/orionplace/tariffs/TariffCardTitle.tsx +0 -29
  446. package/templates/components/orionplace/tariffs/TariffCards.README.md +0 -88
  447. package/templates/components/orionplace/tariffs/TariffCards.module.css +0 -24
  448. package/templates/components/orionplace/tariffs/TariffCards.tsx +0 -44
  449. package/templates/components/orionplace/tariffs/TariffSubscriptionModal.README.md +0 -92
  450. package/templates/components/orionplace/tariffs/TariffSubscriptionModal.module.css +0 -214
  451. package/templates/components/orionplace/tariffs/TariffSubscriptionModal.tsx +0 -299
  452. package/templates/components/orionplace/theme/OrionplaceThemeProvider.README.md +0 -30
  453. package/templates/components/orionplace/theme/OrionplaceThemeProvider.module.css +0 -8
  454. package/templates/components/orionplace/theme/OrionplaceThemeProvider.tsx +0 -32
  455. package/templates/components/orionplace/units/UnitSwitcher.README.md +0 -35
  456. package/templates/components/orionplace/units/UnitSwitcher.tsx +0 -58
  457. package/templates/components/orionplace/wallet/StorefrontWallet.README.md +0 -154
  458. package/templates/components/orionplace/wallet/StorefrontWallet.module.css +0 -507
  459. package/templates/components/orionplace/wallet/StorefrontWallet.tsx +0 -915
  460. package/templates/components/orionplace/wallet/WalletBalance.README.md +0 -46
  461. package/templates/components/orionplace/wallet/WalletBalance.module.css +0 -46
  462. package/templates/components/orionplace/wallet/WalletBalance.tsx +0 -51
  463. package/templates/components/orionplace/wallet/WalletTopUpForm.README.md +0 -54
  464. package/templates/components/orionplace/wallet/WalletTopUpForm.module.css +0 -152
  465. package/templates/components/orionplace/wallet/WalletTopUpForm.tsx +0 -181
  466. package/templates/hooks/useAccountActivity.ts +0 -251
  467. package/templates/hooks/useAccountAddresses.ts +0 -81
  468. package/templates/hooks/useAccountPromocodes.ts +0 -91
  469. package/templates/hooks/useOrionplaceActionMenu.ts +0 -118
  470. package/templates/hooks/useOrionplaceAddressForm.ts +0 -262
  471. package/templates/hooks/useOrionplaceApi.ts +0 -98
  472. package/templates/hooks/useOrionplaceAppLoad.ts +0 -66
  473. package/templates/hooks/useOrionplaceBlogReading.ts +0 -351
  474. package/templates/hooks/useOrionplaceDialog.ts +0 -85
  475. package/templates/hooks/useOrionplaceHomeProducts.ts +0 -97
  476. package/templates/hooks/useOrionplaceMap.tsx +0 -230
  477. package/templates/hooks/useOrionplaceMediaFormat.ts +0 -33
  478. package/templates/hooks/useOrionplaceProduct.ts +0 -28
  479. package/templates/hooks/useOrionplaceProfile.ts +0 -347
  480. package/templates/hooks/useOrionplaceReviews.ts +0 -352
  481. package/templates/hooks/useOrionplaceStableHeight.ts +0 -65
  482. package/templates/hooks/useOrionplaceStorefront.tsx +0 -593
  483. package/templates/hooks/useOrionplaceTariffPurchase.ts +0 -212
  484. package/templates/interfaces/orionplace/accounts/IContact.ts +0 -21
  485. package/templates/interfaces/orionplace/accounts/IEmailNotificationLocale.ts +0 -17
  486. package/templates/interfaces/orionplace/accounts/IEmailVerification.ts +0 -59
  487. package/templates/interfaces/orionplace/accounts/IProfileActions.ts +0 -38
  488. package/templates/interfaces/orionplace/accounts/IProfileData.ts +0 -125
  489. package/templates/interfaces/orionplace/accounts/IProfileMedia.ts +0 -17
  490. package/templates/interfaces/orionplace/accounts/IStorefrontProfile.ts +0 -54
  491. package/templates/interfaces/orionplace/address/IAddressCitySuggestion.ts +0 -19
  492. package/templates/interfaces/orionplace/address/IAddressEditor.ts +0 -9
  493. package/templates/interfaces/orionplace/address/IAddressLocationSuggestion.ts +0 -22
  494. package/templates/interfaces/orionplace/address/IAddressRegionSearch.ts +0 -30
  495. package/templates/interfaces/orionplace/address/IAddressSuggestion.ts +0 -20
  496. package/templates/interfaces/orionplace/address/IUserAddress.ts +0 -87
  497. package/templates/interfaces/orionplace/apiBase/TMethod.ts +0 -1
  498. package/templates/interfaces/orionplace/appBase/IAppLoad.ts +0 -16
  499. package/templates/interfaces/orionplace/appBase/IAppLoadCommon.ts +0 -47
  500. package/templates/interfaces/orionplace/appBase/IApploadUserProfile.ts +0 -15
  501. package/templates/interfaces/orionplace/appBase/IForm.ts +0 -21
  502. package/templates/interfaces/orionplace/appBase/ISEO.ts +0 -21
  503. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonBanner.ts +0 -11
  504. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonContact.ts +0 -8
  505. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonCurrency.ts +0 -15
  506. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonEvents.ts +0 -18
  507. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonLocale.ts +0 -14
  508. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonLogos.ts +0 -6
  509. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonPath.ts +0 -22
  510. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonSEO.ts +0 -26
  511. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonSocial.ts +0 -15
  512. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonTariff.ts +0 -7
  513. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonUnit.ts +0 -12
  514. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonVariables.ts +0 -8
  515. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonVisualSettings.ts +0 -11
  516. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonWalletValue.ts +0 -3
  517. package/templates/interfaces/orionplace/blog/IBlogApi.ts +0 -247
  518. package/templates/interfaces/orionplace/blog/IBlogPostPreview.ts +0 -30
  519. package/templates/interfaces/orionplace/cart/ICartActions.ts +0 -67
  520. package/templates/interfaces/orionplace/cart/ICartData.ts +0 -382
  521. package/templates/interfaces/orionplace/cart/ICartDeliveryActions.ts +0 -68
  522. package/templates/interfaces/orionplace/cart/ICartModal.ts +0 -22
  523. package/templates/interfaces/orionplace/cart/IDeliveryMap.ts +0 -29
  524. package/templates/interfaces/orionplace/catalog/ICatalogDirectory.ts +0 -75
  525. package/templates/interfaces/orionplace/category/ICategory.ts +0 -41
  526. package/templates/interfaces/orionplace/domains/IDomain.ts +0 -13
  527. package/templates/interfaces/orionplace/forms/ICustomerSubfilter.ts +0 -19
  528. package/templates/interfaces/orionplace/index.ts +0 -64
  529. package/templates/interfaces/orionplace/marketing/IPromoActions.ts +0 -51
  530. package/templates/interfaces/orionplace/orders/IOrderActions.ts +0 -99
  531. package/templates/interfaces/orionplace/orders/IOrderHistory.ts +0 -259
  532. package/templates/interfaces/orionplace/orders/IProductPreorder.ts +0 -31
  533. package/templates/interfaces/orionplace/payments/IInvoice.ts +0 -147
  534. package/templates/interfaces/orionplace/products/IProduct.ts +0 -262
  535. package/templates/interfaces/orionplace/products/IProductFeedbackApi.ts +0 -218
  536. package/templates/interfaces/orionplace/products/IProductSearchApi.ts +0 -146
  537. package/templates/interfaces/orionplace/products/IProductSearchFacets.ts +0 -35
  538. package/templates/interfaces/orionplace/products/IProductSecondaryVariantRequest.ts +0 -15
  539. package/templates/interfaces/orionplace/products/IProductSpecification.ts +0 -14
  540. package/templates/interfaces/orionplace/products/IWishlist.ts +0 -22
  541. package/templates/interfaces/orionplace/sellers/ISellerDirectory.ts +0 -70
  542. package/templates/interfaces/orionplace/shared/IBreadcrumb.ts +0 -10
  543. package/templates/interfaces/orionplace/shared/IGeoCoordinates.ts +0 -4
  544. package/templates/interfaces/orionplace/shared/IStorefrontControls.ts +0 -6
  545. package/templates/interfaces/orionplace/shared/ITransformValue.ts +0 -3
  546. package/templates/interfaces/orionplace/state.ts +0 -4
  547. package/templates/interfaces/orionplace/stores/IStoreDirectory.ts +0 -63
  548. package/templates/interfaces/orionplace/subscribeOptions/ISubscribeOption.ts +0 -9
  549. package/templates/interfaces/orionplace/subscribeTariff/ISubscribeTariff.ts +0 -56
  550. package/templates/interfaces/orionplace/subscribeTariff/ITariffSelection.ts +0 -11
  551. package/templates/interfaces/orionplace/subscribes/ISubscribe.ts +0 -28
  552. package/templates/interfaces/orionplace/subscribes/ISubscriptionApi.ts +0 -127
  553. package/templates/interfaces/orionplace/tickets/ICustomerTicketApi.ts +0 -223
  554. package/templates/interfaces/orionplace/transport.ts +0 -34
  555. package/templates/lib/orionplace/accountLabels.ts +0 -29
  556. package/templates/lib/orionplace/activityLabels.ts +0 -96
  557. package/templates/lib/orionplace/activityPresentation.ts +0 -9
  558. package/templates/lib/orionplace/addressChanges.ts +0 -26
  559. package/templates/lib/orionplace/addressPresentation.ts +0 -58
  560. package/templates/lib/orionplace/api.ts +0 -326
  561. package/templates/lib/orionplace/appLoadClient.ts +0 -80
  562. package/templates/lib/orionplace/appLoadResult.ts +0 -120
  563. package/templates/lib/orionplace/appLoadServer.ts +0 -183
  564. package/templates/lib/orionplace/blogArticle.ts +0 -122
  565. package/templates/lib/orionplace/blogArticleHtml.ts +0 -371
  566. package/templates/lib/orionplace/blogComments.ts +0 -102
  567. package/templates/lib/orionplace/blogImageViewer.ts +0 -84
  568. package/templates/lib/orionplace/blogJournal.ts +0 -128
  569. package/templates/lib/orionplace/blogLabels.ts +0 -158
  570. package/templates/lib/orionplace/blogPresentation.ts +0 -67
  571. package/templates/lib/orionplace/blogProductPlacements.ts +0 -105
  572. package/templates/lib/orionplace/browseLabels.ts +0 -145
  573. package/templates/lib/orionplace/cartAddress.ts +0 -86
  574. package/templates/lib/orionplace/cartController.ts +0 -104
  575. package/templates/lib/orionplace/cartLabels.ts +0 -390
  576. package/templates/lib/orionplace/cartOptions.ts +0 -115
  577. package/templates/lib/orionplace/cartPreview.ts +0 -135
  578. package/templates/lib/orionplace/cartPromo.ts +0 -150
  579. package/templates/lib/orionplace/cartShipment.ts +0 -61
  580. package/templates/lib/orionplace/cartSnapshot.ts +0 -21
  581. package/templates/lib/orionplace/catalog.ts +0 -150
  582. package/templates/lib/orionplace/categoryLabels.ts +0 -29
  583. package/templates/lib/orionplace/contact.ts +0 -47
  584. package/templates/lib/orionplace/contactLabels.ts +0 -152
  585. package/templates/lib/orionplace/currency.ts +0 -128
  586. package/templates/lib/orionplace/deliveryMap.ts +0 -86
  587. package/templates/lib/orionplace/directoryLabels.ts +0 -198
  588. package/templates/lib/orionplace/domain.ts +0 -21
  589. package/templates/lib/orionplace/errorPageLabels.ts +0 -89
  590. package/templates/lib/orionplace/eventEnrollment.ts +0 -22
  591. package/templates/lib/orionplace/featureData.ts +0 -28
  592. package/templates/lib/orionplace/featureLabels.ts +0 -406
  593. package/templates/lib/orionplace/featuredLabels.ts +0 -38
  594. package/templates/lib/orionplace/footerLabels.ts +0 -53
  595. package/templates/lib/orionplace/guestSession.ts +0 -55
  596. package/templates/lib/orionplace/headerLabels.ts +0 -98
  597. package/templates/lib/orionplace/homeContent.ts +0 -193
  598. package/templates/lib/orionplace/homeLabels.ts +0 -74
  599. package/templates/lib/orionplace/htmlText.ts +0 -51
  600. package/templates/lib/orionplace/manufacturerDirectory.ts +0 -71
  601. package/templates/lib/orionplace/manufacturerIndex.ts +0 -107
  602. package/templates/lib/orionplace/modalWindow.ts +0 -109
  603. package/templates/lib/orionplace/nativeApp.ts +0 -365
  604. package/templates/lib/orionplace/navigation.tsx +0 -121
  605. package/templates/lib/orionplace/notice.ts +0 -22
  606. package/templates/lib/orionplace/orderLabels.ts +0 -458
  607. package/templates/lib/orionplace/orderPresentation.ts +0 -617
  608. package/templates/lib/orionplace/pageMetadata.ts +0 -361
  609. package/templates/lib/orionplace/pageSeo.ts +0 -662
  610. package/templates/lib/orionplace/paginationScroll.ts +0 -131
  611. package/templates/lib/orionplace/phone.ts +0 -22
  612. package/templates/lib/orionplace/presentation.ts +0 -84
  613. package/templates/lib/orionplace/privacyLabels.ts +0 -273
  614. package/templates/lib/orionplace/productActionLabels.ts +0 -108
  615. package/templates/lib/orionplace/productAvailability.ts +0 -30
  616. package/templates/lib/orionplace/productGallery.ts +0 -64
  617. package/templates/lib/orionplace/productLabels.ts +0 -119
  618. package/templates/lib/orionplace/productListLocation.ts +0 -130
  619. package/templates/lib/orionplace/productPage.ts +0 -308
  620. package/templates/lib/orionplace/productPhotos.ts +0 -67
  621. package/templates/lib/orionplace/productSearch.ts +0 -280
  622. package/templates/lib/orionplace/productSeller.ts +0 -56
  623. package/templates/lib/orionplace/productStructuredData.ts +0 -221
  624. package/templates/lib/orionplace/profile.ts +0 -169
  625. package/templates/lib/orionplace/profileLabels.ts +0 -227
  626. package/templates/lib/orionplace/promoLabels.ts +0 -111
  627. package/templates/lib/orionplace/promoPresentation.ts +0 -381
  628. package/templates/lib/orionplace/reviewLabels.ts +0 -256
  629. package/templates/lib/orionplace/reviewPresentation.ts +0 -64
  630. package/templates/lib/orionplace/reviewScope.ts +0 -38
  631. package/templates/lib/orionplace/searchFilters.ts +0 -99
  632. package/templates/lib/orionplace/searchHistory.ts +0 -144
  633. package/templates/lib/orionplace/sellerDirectory.ts +0 -120
  634. package/templates/lib/orionplace/seo.ts +0 -52
  635. package/templates/lib/orionplace/serverApi.ts +0 -158
  636. package/templates/lib/orionplace/serverLocale.ts +0 -29
  637. package/templates/lib/orionplace/serverMetadata.ts +0 -93
  638. package/templates/lib/orionplace/serverRecords.ts +0 -31
  639. package/templates/lib/orionplace/serverRoute.tsx +0 -59
  640. package/templates/lib/orionplace/sessionLabels.ts +0 -38
  641. package/templates/lib/orionplace/signInReturn.ts +0 -89
  642. package/templates/lib/orionplace/storeDirectory.ts +0 -47
  643. package/templates/lib/orionplace/storefrontRecords.ts +0 -42
  644. package/templates/lib/orionplace/subscriptionChanges.ts +0 -120
  645. package/templates/lib/orionplace/subscriptionLabels.ts +0 -100
  646. package/templates/lib/orionplace/subscriptionManageLabels.ts +0 -422
  647. package/templates/lib/orionplace/subscriptionPlans.ts +0 -122
  648. package/templates/lib/orionplace/subscriptionRemote.ts +0 -85
  649. package/templates/lib/orionplace/subscriptionUsage.ts +0 -58
  650. package/templates/lib/orionplace/tariffLabels.ts +0 -176
  651. package/templates/lib/orionplace/tariffPage.ts +0 -54
  652. package/templates/lib/orionplace/tariffVariables.ts +0 -174
  653. package/templates/lib/orionplace/tariffs.ts +0 -241
  654. package/templates/lib/orionplace/ticketItems.ts +0 -75
  655. package/templates/lib/orionplace/ticketLabels.ts +0 -428
  656. package/templates/lib/orionplace/ticketLocation.ts +0 -79
  657. package/templates/lib/orionplace/ticketRequests.ts +0 -70
  658. package/templates/lib/orionplace/walletTransaction.ts +0 -105
  659. package/templates/orionplace/COMPONENT-DOWNLOAD.md +0 -66
  660. package/templates/orionplace/COMPONENTS.md +0 -35
  661. package/templates/providers/OrionplaceProvider.tsx +0 -191
  662. package/templates/proxy.ts +0 -63
  663. package/templates/stores/orionplace.ts +0 -282
  664. package/templates/stores/orionplaceBrowse.ts +0 -89
  665. package/templates/stores/orionplaceCatalog.ts +0 -162
  666. package/templates/stores/orionplaceProducts.ts +0 -389
  667. package/templates/stores/orionplaceScope.ts +0 -104
  668. package/templates/stores/orionplaceSelections.ts +0 -130
  669. package/templates/themes/orionplace.ts +0 -106
@@ -1,1339 +0,0 @@
1
- 'use client';
2
-
3
- import { StorefrontLink as Link } from '@/lib/orionplace/navigation';
4
- import {
5
- useCallback,
6
- useEffect,
7
- useMemo,
8
- useRef,
9
- useState,
10
- type KeyboardEvent,
11
- type MouseEvent,
12
- type TouchEvent,
13
- } from 'react';
14
- import {
15
- useOrionplace,
16
- useOrionplaceCatalog,
17
- useOrionplaceProductsStore,
18
- useOrionplaceSelections,
19
- } from '@/providers/OrionplaceProvider';
20
- import { useOrionplaceProduct } from '@/hooks/useOrionplaceProduct';
21
- import { selectInit } from '@/stores/orionplace';
22
- import type {
23
- IProduct,
24
- IProductSeller,
25
- } from '@/interfaces/orionplace/products/IProduct';
26
- import { EProductStatus } from '@/interfaces/orionplace/products/IProduct';
27
- import type { IProductSearchRequest } from '@/interfaces/orionplace/products/IProductSearchApi';
28
- import type { IBreadcrumb } from '@/interfaces/orionplace/shared/IBreadcrumb';
29
- import { apiErrorMessage, OrionplaceApiError } from '@/lib/orionplace/api';
30
- import { catalogTrailToCategory } from '@/lib/orionplace/catalog';
31
- import { categoryLabels } from '@/lib/orionplace/categoryLabels';
32
- import { featureLabels } from '@/lib/orionplace/featureLabels';
33
- import { htmlTextParagraphs } from '@/lib/orionplace/htmlText';
34
- import { productActionLabels } from '@/lib/orionplace/productActionLabels';
35
- import {
36
- productThumbnailKeyTarget,
37
- productThumbnailRailEdges,
38
- productThumbnailScrollTarget,
39
- type ProductThumbnailRailMetrics,
40
- } from '@/lib/orionplace/productGallery';
41
- import { productPhotoAfterSwipe } from '@/lib/orionplace/productPhotos';
42
- import { productLabels } from '@/lib/orionplace/productLabels';
43
- import {
44
- productPageManufacturer,
45
- productPagePhotos,
46
- productPageReturns,
47
- productPageReviewStat,
48
- productPageSpecifications,
49
- } from '@/lib/orionplace/productPage';
50
- import {
51
- getAvailableNestedValueFromObject,
52
- safePublicUrl,
53
- } from '@/lib/orionplace/presentation';
54
- import { reviewLabels } from '@/lib/orionplace/reviewLabels';
55
- import { safeBlogArticleHtml } from '@/lib/orionplace/blogArticleHtml';
56
- import { OrionplaceAvatar } from '@/components/orionplace/shared/OrionplaceAvatar';
57
- import { OrionplaceBreadcrumbs } from '@/components/orionplace/shared/OrionplaceBreadcrumbs';
58
- import { OrionplaceEmptyState } from '@/components/orionplace/shared/OrionplaceEmptyState';
59
- import { OrionplaceImage } from '@/components/orionplace/shared/OrionplaceImage';
60
- import { ProductCard, type ProductCardProps } from './ProductCard';
61
- import {
62
- ProductPreorderDialog,
63
- type ProductPreorderSelection,
64
- } from './ProductPreorderDialog';
65
- import { ProductReviews, type ProductReviewsProps } from './ProductReviews';
66
- import { ProductSpecificationsDialog } from './ProductSpecificationsDialog';
67
- import { ProductReviewImageViewer } from './ProductReviewImageViewer';
68
- import styles from './StorefrontProduct.module.css';
69
-
70
- export interface ProductPageLoadAction {
71
- endpoint: 'products_search' | 'products_preview';
72
- request: IProductSearchRequest & {
73
- filters: NonNullable<IProductSearchRequest['filters']> & {
74
- id: number;
75
- view_key?: string;
76
- };
77
- };
78
- signal: AbortSignal;
79
- }
80
-
81
- export interface ProductPreorderAction {
82
- endpoint: 'preorders_create';
83
- request: ProductPreorderSelection;
84
- signal: AbortSignal;
85
- }
86
-
87
- export interface ProductActionNotice {
88
- message: string;
89
- tone?: 'success' | 'error';
90
- emailRequired?: boolean;
91
- }
92
-
93
- type CardCallbacks = Pick<
94
- ProductCardProps,
95
- | 'variantProductIds'
96
- | 'onToggleFavorite'
97
- | 'onSelectVariant'
98
- | 'onSelectSecondaryVariant'
99
- | 'onRequestSecondaryVariants'
100
- | 'onAdd'
101
- | 'onRemove'
102
- | 'onSubscribe'
103
- | 'onUnsubscribe'
104
- >;
105
-
106
- export interface StorefrontProductProps extends CardCallbacks {
107
- productId: number;
108
- initialProduct?: IProduct;
109
- preloaded?: boolean;
110
- previewKey?: string;
111
- loadOnMount?: boolean;
112
- initialError?: string;
113
- actionPending?: boolean;
114
- actionNotice?: ProductActionNotice;
115
- needsRefresh?: boolean;
116
- profileHref?: string;
117
- reviewProps?: Omit<ProductReviewsProps, 'productId'>;
118
- onLoad?: (
119
- action: ProductPageLoadAction,
120
- ) => Promise<IProduct | undefined> | IProduct | undefined;
121
- onLoaded?: (product: IProduct) => void;
122
- onMissing?: () => void;
123
- onSelectSeller?: (seller: IProductSeller) => void;
124
- onOpenPreorder?: (product: IProduct) => void;
125
- onSubmitPreorder?: (
126
- action: ProductPreorderAction,
127
- ) => Promise<boolean | void> | boolean | void;
128
- /**
129
- * Opens the sign-in page from the preorder dialog when OrionMarketplace asks a guest
130
- * to sign in first (error code `sign_in`).
131
- */
132
- onSignIn?: () => void;
133
- onRetryRefresh?: () => Promise<void> | void;
134
- }
135
-
136
- const railInset = 40;
137
- const emptyUnits = {};
138
- const publishedPreviewStatuses: number[] = [
139
- EProductStatus.PUBLISHED,
140
- EProductStatus.LOW_STOCK,
141
- EProductStatus.LOW_SALE_STOCK,
142
- ];
143
-
144
- function isModifiedClick(event: MouseEvent<HTMLAnchorElement>) {
145
- return (
146
- event.button > 0 ||
147
- event.metaKey ||
148
- event.ctrlKey ||
149
- event.shiftKey ||
150
- event.altKey
151
- );
152
- }
153
-
154
- export function StorefrontProduct({
155
- productId,
156
- initialProduct,
157
- preloaded = false,
158
- previewKey = '',
159
- loadOnMount = true,
160
- initialError = '',
161
- actionPending = false,
162
- actionNotice,
163
- needsRefresh = false,
164
- profileHref,
165
- reviewProps,
166
- variantProductIds,
167
- onLoad,
168
- onLoaded,
169
- onMissing,
170
- onSelectSeller,
171
- onOpenPreorder,
172
- onSubmitPreorder,
173
- onSignIn,
174
- onRetryRefresh,
175
- onToggleFavorite,
176
- onSelectVariant,
177
- onSelectSecondaryVariant,
178
- onRequestSecondaryVariants,
179
- onAdd,
180
- onRemove,
181
- onSubscribe,
182
- onUnsubscribe,
183
- }: StorefrontProductProps) {
184
- const init = useOrionplace(selectInit);
185
- const locale = useOrionplaceSelections((state) => state.localeCode);
186
- const weightId = useOrionplaceSelections((state) => state.weightId);
187
- const lengthId = useOrionplaceSelections((state) => state.lengthId);
188
- const weights = useOrionplaceSelections((state) => state.init?.weights);
189
- const lengths = useOrionplaceSelections((state) => state.init?.lengths);
190
- const catalog = useOrionplaceCatalog((state) => state.catalog);
191
- const productStore = useOrionplaceProductsStore();
192
- const rootProduct = useOrionplaceProduct(productId);
193
- const [currentId, setCurrentId] = useState(productId);
194
- const storedProduct = useOrionplaceProduct(currentId);
195
- const [localProduct, setLocalProduct] = useState<IProduct | undefined>(() =>
196
- initialProduct?.id === productId
197
- ? initialProduct
198
- : preloaded
199
- ? rootProduct
200
- : undefined,
201
- );
202
- const [confirmed, setConfirmed] = useState(Boolean(localProduct));
203
- const [settled, setSettled] = useState(Boolean(localProduct));
204
- const [pending, setPending] = useState(false);
205
- const [error, setError] = useState(initialError);
206
- const [requestedVariantId, setRequestedVariantId] = useState<number>();
207
- const requestedVariant = useOrionplaceProduct(
208
- requestedVariantId ?? currentId,
209
- );
210
- const [image, setImage] = useState(0);
211
- const swipeStart = useRef<{ x: number; y: number } | undefined>(undefined);
212
- const [mounted, setMounted] = useState(false);
213
- const [descriptionOpen, setDescriptionOpen] = useState(false);
214
- const [descriptionLong, setDescriptionLong] = useState(false);
215
- const [specificationsOpen, setSpecificationsOpen] = useState(false);
216
- // A tap on the main photo opens it full screen; the page keeps the photo
217
- // chosen there.
218
- const [viewerOpen, setViewerOpen] = useState(false);
219
- const [specificationsLong, setSpecificationsLong] = useState(false);
220
- const [preorderId, setPreorderId] = useState<number>();
221
- const [preorderPending, setPreorderPending] = useState(false);
222
- const [preorderError, setPreorderError] = useState('');
223
- const [preorderFields, setPreorderFields] = useState<Record<string, string>>({});
224
- const [preorderSignIn, setPreorderSignIn] = useState(false);
225
- const [railEdges, setRailEdges] = useState({ back: false, forward: false });
226
- const request = useRef<AbortController | undefined>(undefined);
227
- const preorderRequest = useRef<AbortController | undefined>(undefined);
228
- const rail = useRef<HTMLDivElement>(null);
229
- const descriptionBody = useRef<HTMLDivElement>(null);
230
- const specificationsBody = useRef<HTMLDivElement>(null);
231
- const callbacks = useRef({
232
- onLoad,
233
- onLoaded,
234
- onMissing,
235
- onSubmitPreorder,
236
- });
237
- callbacks.current = {
238
- onLoad,
239
- onLoaded,
240
- onMissing,
241
- onSubmitPreorder,
242
- };
243
-
244
- const labels = reviewLabels(locale);
245
- const common = featureLabels(locale);
246
- const cardLabels = productLabels(locale);
247
- const actionLabels = productActionLabels(locale);
248
- const categoryNames = categoryLabels(locale);
249
- const product = confirmed
250
- ? (storedProduct ??
251
- (localProduct?.id === currentId ? localProduct : undefined))
252
- : undefined;
253
- const title =
254
- getAvailableNestedValueFromObject(
255
- product?.locale,
256
- locale,
257
- 'product_name',
258
- ) || labels.product;
259
- const descriptionSource =
260
- getAvailableNestedValueFromObject(
261
- product?.locale,
262
- locale,
263
- 'product_description',
264
- ) || '';
265
- const descriptionText = useMemo(
266
- () => htmlTextParagraphs(descriptionSource),
267
- [descriptionSource],
268
- );
269
- const descriptionHtml = useMemo(
270
- () => (mounted ? safeBlogArticleHtml(descriptionSource) : ''),
271
- [descriptionSource, mounted],
272
- );
273
- const hasDescription = mounted
274
- ? Boolean(descriptionHtml)
275
- : descriptionText.length > 0;
276
- const photos = useMemo(() => productPagePhotos(product), [product]);
277
- const manufacturer = useMemo(
278
- () => productPageManufacturer(product, locale),
279
- [product, locale],
280
- );
281
- const reviewStat = useMemo(() => productPageReviewStat(product), [product]);
282
- const returns = useMemo(
283
- () => productPageReturns(product, locale, labels),
284
- [product, locale, labels],
285
- );
286
- const specifications = useMemo(
287
- () =>
288
- productPageSpecifications({
289
- product,
290
- locale,
291
- weights: weights ?? emptyUnits,
292
- lengths: lengths ?? emptyUnits,
293
- weightId,
294
- lengthId,
295
- labels,
296
- }),
297
- [product, locale, weights, lengths, weightId, lengthId, labels],
298
- );
299
- const categoryPath =
300
- typeof product?.main_category === 'number'
301
- ? catalogTrailToCategory(catalog, product.main_category)
302
- : [];
303
- const breadcrumbs: IBreadcrumb[] = [
304
- {
305
- id: 'catalog',
306
- label: categoryNames.catalog,
307
- to: {
308
- path: '/catalog',
309
- query: { locale },
310
- },
311
- },
312
- ...categoryPath.map((category) => ({
313
- id: category.id,
314
- label:
315
- getAvailableNestedValueFromObject(category.locale, locale, 'cg_name') ||
316
- `${categoryNames.category} ${category.id}`,
317
- to: {
318
- path: `/category/${category.id}`,
319
- query: { locale },
320
- },
321
- })),
322
- { id: `product-${currentId}`, label: title },
323
- ];
324
- const seller = init?.visual_settings?.single_seller_mode
325
- ? undefined
326
- : product?.seller;
327
- const sellerHref = seller
328
- ? `/sellers?locale=${encodeURIComponent(locale)}&seller=${seller.id}`
329
- : '';
330
- const safeProfileHref = safePublicUrl(
331
- profileHref ?? `/profile?locale=${encodeURIComponent(locale)}`,
332
- );
333
- const previewStatus =
334
- !previewKey || !product
335
- ? ''
336
- : product.status.status === EProductStatus.PUBLISHED_AS_OPTION
337
- ? cardLabels.previewOption
338
- : !publishedPreviewStatuses.includes(product.status.status)
339
- ? cardLabels.previewUnpublished
340
- : '';
341
- const showSkeleton = !product && !error && (!settled || pending);
342
-
343
- const load = useCallback(async () => {
344
- if (!callbacks.current.onLoad) {
345
- setSettled(true);
346
- return;
347
- }
348
- request.current?.abort();
349
- const controller = new AbortController();
350
- request.current = controller;
351
- setPending(true);
352
- setError('');
353
- try {
354
- const found = await callbacks.current.onLoad({
355
- endpoint: previewKey ? 'products_preview' : 'products_search',
356
- request: {
357
- filters: previewKey
358
- ? { id: productId, view_key: previewKey }
359
- : { id: productId },
360
- paginate: { page: 1, pp_items: 1 },
361
- },
362
- signal: controller.signal,
363
- });
364
- if (controller.signal.aborted) {
365
- return;
366
- }
367
- setSettled(true);
368
- setConfirmed(Boolean(found));
369
- if (found) {
370
- productStore.getState().setProduct(found);
371
- setLocalProduct(found);
372
- setCurrentId(found.id);
373
- } else {
374
- callbacks.current.onMissing?.();
375
- }
376
- } catch (reason) {
377
- if (!controller.signal.aborted) {
378
- setSettled(true);
379
- setError(
380
- apiErrorMessage(reason) || common.failed,
381
- );
382
- }
383
- } finally {
384
- if (request.current === controller) {
385
- request.current = undefined;
386
- setPending(false);
387
- }
388
- }
389
- }, [common.failed, previewKey, productId, productStore]);
390
-
391
- useEffect(() => {
392
- setMounted(true);
393
- return () => {
394
- request.current?.abort();
395
- preorderRequest.current?.abort();
396
- };
397
- }, []);
398
-
399
- useEffect(() => {
400
- request.current?.abort();
401
- const seeded =
402
- initialProduct?.id === productId
403
- ? initialProduct
404
- : preloaded
405
- ? productStore.getState().getProduct(productId)
406
- : undefined;
407
- setCurrentId(productId);
408
- setRequestedVariantId(undefined);
409
- setImage(0);
410
- setLocalProduct(seeded);
411
- setConfirmed(Boolean(seeded));
412
- setSettled(Boolean(seeded));
413
- setError(initialError);
414
- setSpecificationsOpen(false);
415
- setPreorderId(undefined);
416
- if (seeded) {
417
- productStore.getState().setProduct(seeded);
418
- } else if (loadOnMount && callbacks.current.onLoad) {
419
- void load();
420
- }
421
- }, [
422
- productId,
423
- previewKey,
424
- preloaded,
425
- initialProduct,
426
- initialError,
427
- loadOnMount,
428
- load,
429
- productStore,
430
- ]);
431
-
432
- const notifiedProduct = useRef<IProduct | undefined>(undefined);
433
- useEffect(() => {
434
- if (product && notifiedProduct.current !== product) {
435
- notifiedProduct.current = product;
436
- callbacks.current.onLoaded?.(product);
437
- }
438
- }, [product]);
439
-
440
- useEffect(() => {
441
- if (requestedVariantId && requestedVariant?.id === requestedVariantId) {
442
- setCurrentId(requestedVariantId);
443
- setRequestedVariantId(undefined);
444
- setImage(0);
445
- }
446
- }, [requestedVariantId, requestedVariant]);
447
-
448
- useEffect(() => {
449
- setDescriptionOpen(false);
450
- setDescriptionLong(false);
451
- }, [descriptionSource]);
452
-
453
- useEffect(() => {
454
- setSpecificationsLong(false);
455
- if (!specifications.length) {
456
- setSpecificationsOpen(false);
457
- }
458
- }, [specifications]);
459
-
460
- function railIsVertical(element: HTMLElement) {
461
- return getComputedStyle(element).flexDirection === 'column';
462
- }
463
-
464
- function railMetrics(element: HTMLElement): ProductThumbnailRailMetrics {
465
- return railIsVertical(element)
466
- ? {
467
- position: element.scrollTop,
468
- size: element.scrollHeight,
469
- viewport: element.clientHeight,
470
- }
471
- : {
472
- position: element.scrollLeft,
473
- size: element.scrollWidth,
474
- viewport: element.clientWidth,
475
- };
476
- }
477
-
478
- const updateRail = useCallback(() => {
479
- const element = rail.current;
480
- setRailEdges(
481
- element
482
- ? productThumbnailRailEdges(railMetrics(element))
483
- : { back: false, forward: false },
484
- );
485
- }, []);
486
-
487
- useEffect(() => {
488
- const element = rail.current;
489
- if (!element) {
490
- setRailEdges({ back: false, forward: false });
491
- return;
492
- }
493
- const observer =
494
- typeof ResizeObserver === 'undefined'
495
- ? undefined
496
- : new ResizeObserver(updateRail);
497
- observer?.observe(element);
498
- updateRail();
499
-
500
- return () => observer?.disconnect();
501
- }, [photos, updateRail]);
502
-
503
- useEffect(() => {
504
- const element = descriptionBody.current;
505
- if (!element || descriptionOpen) {
506
- return;
507
- }
508
- const measure = () => {
509
- setDescriptionLong(element.scrollHeight > element.clientHeight + 1);
510
- };
511
- const observer =
512
- typeof ResizeObserver === 'undefined'
513
- ? undefined
514
- : new ResizeObserver(measure);
515
- observer?.observe(element);
516
- measure();
517
-
518
- return () => observer?.disconnect();
519
- }, [descriptionHtml, descriptionText, descriptionOpen]);
520
-
521
- useEffect(() => {
522
- const element = specificationsBody.current;
523
- if (!element) {
524
- return;
525
- }
526
- const measure = () => {
527
- setSpecificationsLong(element.scrollHeight > element.clientHeight + 1);
528
- };
529
- const observer =
530
- typeof ResizeObserver === 'undefined'
531
- ? undefined
532
- : new ResizeObserver(measure);
533
- observer?.observe(element);
534
- measure();
535
-
536
- return () => observer?.disconnect();
537
- }, [specifications]);
538
-
539
- useEffect(() => {
540
- const element = rail.current;
541
- const thumbnail = element?.children[image];
542
- if (!element || !(thumbnail instanceof HTMLElement)) {
543
- return;
544
- }
545
- const bounds = railIsVertical(element)
546
- ? { start: thumbnail.offsetTop, length: thumbnail.offsetHeight }
547
- : { start: thumbnail.offsetLeft, length: thumbnail.offsetWidth };
548
- const target = productThumbnailScrollTarget(
549
- bounds,
550
- railMetrics(element),
551
- railInset,
552
- );
553
- if (target !== undefined) {
554
- scrollRail(element, target);
555
- }
556
- }, [image]);
557
-
558
- useEffect(() => {
559
- setImage(0);
560
- if (rail.current) {
561
- rail.current.scrollTop = 0;
562
- rail.current.scrollLeft = 0;
563
- }
564
- updateRail();
565
- }, [photos, updateRail]);
566
-
567
- const viewerPhotos = useMemo(
568
- () => photos.map((photo, id) => ({ id, image: photo })),
569
- [photos],
570
- );
571
-
572
- function openViewerKey(event: { key: string; preventDefault: () => void }) {
573
- if (event.key === 'Enter' || event.key === ' ') {
574
- event.preventDefault();
575
- setViewerOpen(true);
576
- }
577
- }
578
-
579
- function showImage(index: number) {
580
- if (photos.length) {
581
- setImage((index + photos.length) % photos.length);
582
- }
583
- }
584
-
585
- // A sideways swipe on a touch screen steps to the next or previous photo,
586
- // as on the product cards.
587
- function startSwipe(event: TouchEvent<HTMLElement>) {
588
- const touch = event.touches[0];
589
- swipeStart.current =
590
- touch && event.touches.length === 1
591
- ? { x: touch.clientX, y: touch.clientY }
592
- : undefined;
593
- }
594
-
595
- function endSwipe(event: TouchEvent<HTMLElement>) {
596
- const touch = event.changedTouches[0];
597
- const start = swipeStart.current;
598
-
599
- swipeStart.current = undefined;
600
- if (!start || !touch) {
601
- return;
602
- }
603
- showImage(
604
- productPhotoAfterSwipe(
605
- image,
606
- photos.length,
607
- touch.clientX - start.x,
608
- touch.clientY - start.y,
609
- ),
610
- );
611
- }
612
-
613
- function scrollRail(element: HTMLElement, position: number) {
614
- const reduced = window.matchMedia(
615
- '(prefers-reduced-motion: reduce)',
616
- ).matches;
617
- const behavior = reduced ? 'auto' : 'smooth';
618
- if (railIsVertical(element)) {
619
- element.scrollTo({ top: position, behavior });
620
- } else {
621
- element.scrollTo({ left: position, behavior });
622
- }
623
- }
624
-
625
- function stepRail(direction: 1 | -1) {
626
- const element = rail.current;
627
- const thumbnail = element?.firstElementChild;
628
- if (!element || !(thumbnail instanceof HTMLElement)) {
629
- return;
630
- }
631
- const style = getComputedStyle(element);
632
- const step = railIsVertical(element)
633
- ? thumbnail.offsetHeight + Number.parseFloat(style.rowGap || '0')
634
- : thumbnail.offsetWidth + Number.parseFloat(style.columnGap || '0');
635
- scrollRail(element, railMetrics(element).position + direction * step);
636
- }
637
-
638
- function thumbnailKeydown(
639
- event: KeyboardEvent<HTMLButtonElement>,
640
- index: number,
641
- ) {
642
- const target = productThumbnailKeyTarget(event.key, index, photos.length);
643
- if (target === undefined) {
644
- return;
645
- }
646
- event.preventDefault();
647
- setImage(target);
648
- const button = rail.current?.children[target];
649
- if (button instanceof HTMLElement) {
650
- button.focus({ preventScroll: true });
651
- }
652
- }
653
-
654
- function selectMainVariant(
655
- selection: Parameters<NonNullable<ProductCardProps['onSelectVariant']>>[0],
656
- ) {
657
- const target = selection.variant.reload_product;
658
- if (target) {
659
- setRequestedVariantId(target);
660
- const available = productStore.getState().getProduct(target);
661
- if (available) {
662
- setCurrentId(target);
663
- setRequestedVariantId(undefined);
664
- setImage(0);
665
- }
666
- }
667
- onSelectVariant?.(selection);
668
- }
669
-
670
- function selectSecondaryVariant(
671
- selection: Parameters<
672
- NonNullable<ProductCardProps['onSelectSecondaryVariant']>
673
- >[0],
674
- ) {
675
- setCurrentId(selection.variant.product.id);
676
- setImage(0);
677
- onSelectSecondaryVariant?.(selection);
678
- }
679
-
680
- function openPreorder(selection: { product: number }) {
681
- const selected = productStore.getState().getProduct(selection.product);
682
- setPreorderError('');
683
- setPreorderFields({});
684
- setPreorderSignIn(false);
685
- setPreorderId(selection.product);
686
- if (selected) {
687
- onOpenPreorder?.(selected);
688
- }
689
- }
690
-
691
- async function submitPreorder(selection: ProductPreorderSelection) {
692
- if (!callbacks.current.onSubmitPreorder || preorderPending) {
693
- return;
694
- }
695
- const controller = new AbortController();
696
- preorderRequest.current = controller;
697
- setPreorderPending(true);
698
- setPreorderError('');
699
- setPreorderFields({});
700
- setPreorderSignIn(false);
701
- try {
702
- const saved = await callbacks.current.onSubmitPreorder({
703
- endpoint: 'preorders_create',
704
- request: selection,
705
- signal: controller.signal,
706
- });
707
- if (!controller.signal.aborted && saved !== false) {
708
- setPreorderId(undefined);
709
- }
710
- } catch (reason) {
711
- if (!controller.signal.aborted) {
712
- setPreorderError(
713
- apiErrorMessage(reason) || actionLabels.failed,
714
- );
715
- if (reason instanceof OrionplaceApiError) {
716
- setPreorderFields(reason.fields);
717
- setPreorderSignIn(reason.codes.includes('sign_in'));
718
- }
719
- }
720
- } finally {
721
- if (preorderRequest.current === controller) {
722
- preorderRequest.current = undefined;
723
- setPreorderPending(false);
724
- }
725
- }
726
- }
727
-
728
- function information() {
729
- if (!hasDescription && !specifications.length) {
730
- return null;
731
- }
732
-
733
- return (
734
- <div
735
- className={styles.information}
736
- data-product-information
737
- >
738
- {hasDescription ? (
739
- <section
740
- className={styles.informationSection}
741
- data-product-description
742
- >
743
- <h2>{labels.description}</h2>
744
- {mounted ? (
745
- <div
746
- ref={descriptionBody}
747
- id="product-description-text"
748
- className={`${styles.description} ${
749
- descriptionOpen ? '' : styles.descriptionShort
750
- } ${
751
- !descriptionOpen && descriptionLong
752
- ? styles.descriptionFade
753
- : ''
754
- }`}
755
- dangerouslySetInnerHTML={{ __html: descriptionHtml }}
756
- />
757
- ) : (
758
- <div
759
- ref={descriptionBody}
760
- id="product-description-text"
761
- className={`${styles.description} ${styles.descriptionShort}`}
762
- >
763
- {descriptionText.map((paragraph, index) => (
764
- <p key={`${index}:${paragraph}`}>{paragraph}</p>
765
- ))}
766
- </div>
767
- )}
768
- {descriptionLong ? (
769
- <button
770
- type="button"
771
- className={styles.textAction}
772
- aria-controls="product-description-text"
773
- aria-expanded={descriptionOpen}
774
- data-product-description-toggle
775
- onClick={() => setDescriptionOpen((value) => !value)}
776
- >
777
- {descriptionOpen ? labels.less : labels.more}
778
- </button>
779
- ) : null}
780
- </section>
781
- ) : null}
782
-
783
- {specifications.length ? (
784
- <section
785
- className={styles.informationSection}
786
- data-product-specifications
787
- >
788
- <h2>{labels.characteristics}</h2>
789
- <div
790
- ref={specificationsBody}
791
- id="product-specifications-list"
792
- className={`${styles.specifications} ${
793
- specificationsLong ? styles.specificationsFade : ''
794
- }`}
795
- >
796
- {specifications.map((group) => (
797
- <div
798
- key={group.key}
799
- className={styles.specificationGroup}
800
- >
801
- {group.title ? <h3>{group.title}</h3> : null}
802
- <dl>
803
- {group.rows.map((row) => (
804
- <div key={row.key}>
805
- <dt>{row.label}</dt>
806
- <dd>
807
- {row.to ? (
808
- <Link
809
- href={{
810
- pathname: row.to.path,
811
- query: row.to.query,
812
- }}
813
- >
814
- {row.value}
815
- </Link>
816
- ) : (
817
- row.value
818
- )}
819
- </dd>
820
- </div>
821
- ))}
822
- </dl>
823
- </div>
824
- ))}
825
- </div>
826
- {specificationsLong ? (
827
- <button
828
- type="button"
829
- className={styles.textAction}
830
- aria-haspopup="dialog"
831
- data-product-specifications-toggle
832
- onClick={() => setSpecificationsOpen(true)}
833
- >
834
- {labels.allCharacteristics}
835
- </button>
836
- ) : null}
837
- </section>
838
- ) : null}
839
- </div>
840
- );
841
- }
842
-
843
- const reviewCaption = reviewStat
844
- ? pluralReviewWord(reviewStat.count, cardLabels.reviews, locale)
845
- : '';
846
-
847
- return (
848
- <section
849
- className={styles.root}
850
- data-feature-part="StorefrontProduct"
851
- aria-busy={showSkeleton || undefined}
852
- >
853
- {error ? (
854
- <div
855
- className={styles.error}
856
- role="alert"
857
- >
858
- {error}
859
- <button
860
- className={styles.noticeAction}
861
- type="button"
862
- disabled={pending}
863
- onClick={() => void load()}
864
- >
865
- {common.retry}
866
- </button>
867
- </div>
868
- ) : null}
869
- {pending || showSkeleton ? (
870
- <p
871
- className="op-feature-loading"
872
- role="status"
873
- >
874
- <span className={styles.screenReaderOnly}>{common.loading}</span>
875
- </p>
876
- ) : null}
877
- {product || showSkeleton ? (
878
- <div className={styles.breadcrumbs}>
879
- <OrionplaceBreadcrumbs
880
- items={breadcrumbs}
881
- loading={!product}
882
- />
883
- </div>
884
- ) : null}
885
-
886
- {product ? (
887
- <>
888
- <div className={styles.layout}>
889
- {photos.length ? (
890
- <section
891
- className={styles.gallery}
892
- aria-label={labels.gallery}
893
- data-product-gallery
894
- >
895
- <div
896
- className={
897
- photos.length > 1
898
- ? `${styles.mainImage} ${styles.mainImageSwipe}`
899
- : styles.mainImage
900
- }
901
- data-product-main-image
902
- onTouchStart={startSwipe}
903
- onTouchEnd={endSwipe}
904
- >
905
- <OrionplaceImage
906
- src={photos[image]}
907
- alt={title}
908
- width={800}
909
- height={1000}
910
- loading="eager"
911
- role="button"
912
- tabIndex={0}
913
- aria-label={labels.openProductPhoto}
914
- data-product-photo-open
915
- onClick={() => setViewerOpen(true)}
916
- onKeyDown={openViewerKey}
917
- className={styles.mainImageAsset}
918
- />
919
- {photos.length > 1 ? (
920
- <>
921
- <button
922
- type="button"
923
- className={`${styles.imageArrow} ${styles.imagePrevious}`}
924
- aria-label={labels.previousImage}
925
- data-product-image-previous
926
- onClick={() => showImage(image - 1)}
927
- >
928
- <svg
929
- viewBox="0 0 24 24"
930
- fill="none"
931
- stroke="currentColor"
932
- strokeWidth="1.5"
933
- aria-hidden="true"
934
- >
935
- <path d="m15 5-7 7 7 7" />
936
- </svg>
937
- </button>
938
- <button
939
- type="button"
940
- className={`${styles.imageArrow} ${styles.imageNext}`}
941
- aria-label={labels.nextImage}
942
- data-product-image-next
943
- onClick={() => showImage(image + 1)}
944
- >
945
- <svg
946
- viewBox="0 0 24 24"
947
- fill="none"
948
- stroke="currentColor"
949
- strokeWidth="1.5"
950
- aria-hidden="true"
951
- >
952
- <path d="m9 5 7 7-7 7" />
953
- </svg>
954
- </button>
955
- </>
956
- ) : null}
957
- </div>
958
- {photos.length > 1 ? (
959
- <div
960
- className={styles.thumbnailRail}
961
- data-product-thumbnail-rail
962
- >
963
- <div
964
- ref={rail}
965
- className={styles.thumbnails}
966
- data-product-thumbnails
967
- onScroll={updateRail}
968
- >
969
- {photos.map((photo, index) => (
970
- <button
971
- key={`${photo}:${index}`}
972
- type="button"
973
- className={`${styles.thumbnail} ${
974
- index === image ? styles.thumbnailSelected : ''
975
- }`}
976
- aria-label={`${labels.gallery} ${index + 1}`}
977
- aria-pressed={index === image}
978
- tabIndex={index === image ? 0 : -1}
979
- data-product-thumbnail={index}
980
- onClick={() => setImage(index)}
981
- onKeyDown={(event) => thumbnailKeydown(event, index)}
982
- >
983
- <OrionplaceImage
984
- src={photo}
985
- alt=""
986
- width={72}
987
- height={90}
988
- className={styles.thumbnailImage}
989
- />
990
- </button>
991
- ))}
992
- </div>
993
- <button
994
- type="button"
995
- className={`${styles.railArrow} ${styles.railPrevious}`}
996
- aria-label={labels.thumbnailsBack}
997
- disabled={!railEdges.back}
998
- data-product-thumbnails-previous
999
- onClick={() => stepRail(-1)}
1000
- >
1001
- <svg
1002
- viewBox="0 0 24 24"
1003
- fill="none"
1004
- stroke="currentColor"
1005
- strokeWidth="1.5"
1006
- aria-hidden="true"
1007
- >
1008
- <path d="m15 5-7 7 7 7" />
1009
- </svg>
1010
- </button>
1011
- <button
1012
- type="button"
1013
- className={`${styles.railArrow} ${styles.railNext}`}
1014
- aria-label={labels.thumbnailsForward}
1015
- disabled={!railEdges.forward}
1016
- data-product-thumbnails-next
1017
- onClick={() => stepRail(1)}
1018
- >
1019
- <svg
1020
- viewBox="0 0 24 24"
1021
- fill="none"
1022
- stroke="currentColor"
1023
- strokeWidth="1.5"
1024
- aria-hidden="true"
1025
- >
1026
- <path d="m9 5 7 7-7 7" />
1027
- </svg>
1028
- </button>
1029
- </div>
1030
- ) : null}
1031
- </section>
1032
- ) : null}
1033
-
1034
- <div
1035
- className={styles.summary}
1036
- data-product-summary
1037
- >
1038
- <header className={styles.heading}>
1039
- <h1>{title}</h1>
1040
- {reviewStat ? (
1041
- <a
1042
- href="#product-reviews"
1043
- className={styles.reviewSummary}
1044
- aria-label={`${labels.showReviews}: ${reviewStat.average} ${
1045
- labels.ofFive
1046
- }, ${reviewStat.count} ${reviewCaption}`}
1047
- data-product-review-summary
1048
- onClick={(event) => {
1049
- event.preventDefault();
1050
- document
1051
- .getElementById('product-reviews')
1052
- ?.scrollIntoView({
1053
- behavior: 'smooth',
1054
- block: 'start',
1055
- });
1056
- }}
1057
- >
1058
- <span
1059
- className={styles.stars}
1060
- aria-hidden="true"
1061
- >
1062
- {[1, 2, 3, 4, 5].map((star) => (
1063
- <span
1064
- key={star}
1065
- className={
1066
- star <= Math.round(reviewStat.average)
1067
- ? styles.starSelected
1068
- : ''
1069
- }
1070
- >
1071
- ★
1072
- </span>
1073
- ))}
1074
- </span>
1075
- <span className={styles.reviewAverage}>
1076
- {reviewStat.average}
1077
- </span>
1078
- <span>
1079
- · {reviewStat.count} {reviewCaption}
1080
- </span>
1081
- </a>
1082
- ) : null}
1083
- </header>
1084
-
1085
- {previewStatus ? (
1086
- <p
1087
- className={styles.attention}
1088
- role="status"
1089
- data-product-preview-status
1090
- >
1091
- {previewStatus}
1092
- </p>
1093
- ) : null}
1094
-
1095
- <ProductCard
1096
- key={currentId}
1097
- productId={currentId}
1098
- initialProduct={product}
1099
- details
1100
- actionsDisabled={actionPending || needsRefresh}
1101
- variantProductIds={variantProductIds}
1102
- onSelectSeller={onSelectSeller}
1103
- onAdd={onAdd}
1104
- onRemove={onRemove}
1105
- onToggleFavorite={onToggleFavorite}
1106
- onSubscribe={onSubscribe}
1107
- onUnsubscribe={onUnsubscribe}
1108
- onPreorder={openPreorder}
1109
- onRequestSecondaryVariants={onRequestSecondaryVariants}
1110
- onSelectVariant={selectMainVariant}
1111
- onSelectSecondaryVariant={selectSecondaryVariant}
1112
- renderAfterPrice={information}
1113
- />
1114
-
1115
- {actionNotice?.message ? (
1116
- <div
1117
- role={actionNotice.tone === 'error' ? 'alert' : 'status'}
1118
- className={`${styles.notice} ${
1119
- actionNotice.tone === 'error'
1120
- ? styles.noticeError
1121
- : styles.noticeSuccess
1122
- }`}
1123
- data-product-action-notice
1124
- >
1125
- {actionNotice.message}
1126
- {needsRefresh && onRetryRefresh ? (
1127
- <button
1128
- className={styles.noticeAction}
1129
- type="button"
1130
- disabled={actionPending}
1131
- onClick={() => void onRetryRefresh()}
1132
- >
1133
- {actionLabels.retry}
1134
- </button>
1135
- ) : null}
1136
- {actionNotice.emailRequired && safeProfileHref ? (
1137
- <a
1138
- className={styles.noticeAction}
1139
- href={safeProfileHref}
1140
- >
1141
- {common.navigation.profile}
1142
- </a>
1143
- ) : null}
1144
- </div>
1145
- ) : null}
1146
-
1147
- {returns.length ? (
1148
- <section
1149
- className={styles.returns}
1150
- data-product-returns
1151
- >
1152
- <h2>{labels.returns}</h2>
1153
- <dl>
1154
- {returns.map((entry) => (
1155
- <div key={entry.key}>
1156
- <dt>{entry.label}</dt>
1157
- <dd>{entry.value}</dd>
1158
- </div>
1159
- ))}
1160
- </dl>
1161
- </section>
1162
- ) : null}
1163
-
1164
- {manufacturer || seller ? (
1165
- <div className={styles.partners}>
1166
- {manufacturer ? (
1167
- <Link
1168
- href={{
1169
- pathname: manufacturer.to.path,
1170
- query: manufacturer.to.query,
1171
- }}
1172
- className={styles.partner}
1173
- aria-label={`${labels.manufacturerHint}: ${manufacturer.name}`}
1174
- data-product-manufacturer
1175
- >
1176
- {manufacturer.logo ? (
1177
- <span data-product-manufacturer-logo>
1178
- <OrionplaceImage
1179
- src={manufacturer.logo}
1180
- alt=""
1181
- width={64}
1182
- height={40}
1183
- className={styles.partnerLogo}
1184
- dataLogoType="manufacturer"
1185
- />
1186
- </span>
1187
- ) : (
1188
- <OrionplaceAvatar name={manufacturer.name} />
1189
- )}
1190
- <span className={styles.partnerText}>
1191
- <small>{labels.manufacturer}</small>
1192
- <span>{manufacturer.name}</span>
1193
- </span>
1194
- <svg
1195
- viewBox="0 0 24 24"
1196
- fill="none"
1197
- stroke="currentColor"
1198
- strokeWidth="1.5"
1199
- aria-hidden="true"
1200
- >
1201
- <path d="m9 5 7 7-7 7" />
1202
- </svg>
1203
- </Link>
1204
- ) : null}
1205
- {seller ? (
1206
- <a
1207
- href={sellerHref}
1208
- className={styles.partner}
1209
- aria-label={`${labels.sellerHint}: ${seller.name}`}
1210
- data-product-seller-link
1211
- onClick={(event) => {
1212
- if (!isModifiedClick(event) && onSelectSeller) {
1213
- event.preventDefault();
1214
- onSelectSeller(seller);
1215
- }
1216
- }}
1217
- >
1218
- <OrionplaceAvatar
1219
- src={seller.avatar}
1220
- name={seller.name}
1221
- />
1222
- <span className={styles.partnerText}>
1223
- <small>{labels.seller}</small>
1224
- <span>
1225
- {seller.name}
1226
- {Number(seller.raiting) > 0 ? (
1227
- <em>★ {seller.raiting}</em>
1228
- ) : null}
1229
- </span>
1230
- </span>
1231
- <svg
1232
- viewBox="0 0 24 24"
1233
- fill="none"
1234
- stroke="currentColor"
1235
- strokeWidth="1.5"
1236
- aria-hidden="true"
1237
- >
1238
- <path d="m9 5 7 7-7 7" />
1239
- </svg>
1240
- </a>
1241
- ) : null}
1242
- </div>
1243
- ) : null}
1244
- </div>
1245
- </div>
1246
-
1247
- <div
1248
- id="product-reviews"
1249
- className={styles.reviews}
1250
- >
1251
- <ProductReviews
1252
- key={currentId}
1253
- {...reviewProps}
1254
- productId={currentId}
1255
- />
1256
- </div>
1257
- {preorderId !== undefined ? (
1258
- <ProductPreorderDialog
1259
- productId={preorderId}
1260
- pending={preorderPending}
1261
- error={preorderError}
1262
- fieldErrors={preorderFields}
1263
- suggestSignIn={preorderSignIn}
1264
- onSubmit={(selection) => void submitPreorder(selection)}
1265
- onClose={() => setPreorderId(undefined)}
1266
- onSignIn={onSignIn}
1267
- />
1268
- ) : null}
1269
- {specificationsOpen ? (
1270
- <ProductSpecificationsDialog
1271
- groups={specifications}
1272
- onClose={() => setSpecificationsOpen(false)}
1273
- />
1274
- ) : null}
1275
- {viewerOpen && photos.length ? (
1276
- <ProductReviewImageViewer
1277
- images={viewerPhotos}
1278
- index={image}
1279
- label={labels.productPhotos}
1280
- alt={title}
1281
- onChange={(photo) => setImage(photo.index)}
1282
- onClose={() => setViewerOpen(false)}
1283
- />
1284
- ) : null}
1285
- </>
1286
- ) : showSkeleton ? (
1287
- <ProductSkeleton />
1288
- ) : !pending && !error ? (
1289
- <OrionplaceEmptyState
1290
- kind="search"
1291
- message={labels.notFound}
1292
- />
1293
- ) : null}
1294
- </section>
1295
- );
1296
- }
1297
-
1298
- function pluralReviewWord(count: number, forms: string[], locale: string) {
1299
- let rule: Intl.LDMLPluralRule;
1300
- try {
1301
- rule = new Intl.PluralRules(locale).select(count);
1302
- } catch {
1303
- rule = new Intl.PluralRules('en').select(count);
1304
- }
1305
- if (rule === 'one') {
1306
- return forms[0] ?? '';
1307
- }
1308
- if (rule === 'few' && forms.length > 2) {
1309
- return forms[1] ?? '';
1310
- }
1311
-
1312
- return forms.at(-1) ?? '';
1313
- }
1314
-
1315
- function ProductSkeleton() {
1316
- return (
1317
- <div
1318
- className={styles.skeleton}
1319
- aria-hidden="true"
1320
- data-product-skeleton
1321
- >
1322
- <div className={styles.skeletonGallery}>
1323
- <span className={styles.skeletonImage} />
1324
- <div className={styles.skeletonThumbs}>
1325
- {[1, 2, 3, 4].map((item) => (
1326
- <span key={item} />
1327
- ))}
1328
- </div>
1329
- </div>
1330
- <div className={styles.skeletonSummary}>
1331
- <span className={styles.skeletonTitle} />
1332
- <span className={styles.skeletonPrice} />
1333
- {[1, 2, 3, 4, 5, 6].map((item) => (
1334
- <span key={item} />
1335
- ))}
1336
- </div>
1337
- </div>
1338
- );
1339
- }