orionplace-react 0.1.0 → 0.2.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 (633) hide show
  1. package/README.md +276 -35
  2. package/bin/orionplace-react.mjs +4 -1
  3. package/package.json +18 -5
  4. package/runtime/app.d.mts +6 -0
  5. package/runtime/app.mjs +48 -0
  6. package/runtime/marketplace.d.mts +13 -8
  7. package/runtime/marketplace.mjs +287 -211
  8. package/src/project-readme.mjs +95 -35
  9. package/src/setup.mjs +36 -13
  10. package/templates/app/StorefrontShell.tsx +435 -0
  11. package/templates/app/[[...path]]/page.app.tsx +11 -0
  12. package/templates/app/_storefront/ActivityPage.tsx +23 -0
  13. package/templates/app/_storefront/AddressesPage.tsx +29 -0
  14. package/templates/app/_storefront/AppRoutes.tsx +182 -0
  15. package/templates/app/_storefront/ArticlePage.tsx +81 -0
  16. package/templates/app/_storefront/CartPage.tsx +53 -0
  17. package/templates/app/_storefront/CatalogPage.tsx +37 -0
  18. package/templates/app/_storefront/CategoryPage.tsx +64 -0
  19. package/templates/app/_storefront/ContactPage.tsx +32 -0
  20. package/templates/app/_storefront/HomePage.tsx +140 -0
  21. package/templates/app/_storefront/JournalPage.tsx +36 -0
  22. package/templates/app/_storefront/LogoutPage.tsx +91 -0
  23. package/templates/app/_storefront/ManufacturersPage.tsx +64 -0
  24. package/templates/app/_storefront/OrdersPage.tsx +129 -0
  25. package/templates/app/_storefront/ProductPage.tsx +105 -0
  26. package/templates/app/_storefront/ProfilePage.tsx +75 -0
  27. package/templates/app/_storefront/PromoPage.tsx +66 -0
  28. package/templates/app/_storefront/PromocodesPage.tsx +17 -0
  29. package/templates/app/_storefront/SearchPage.tsx +220 -0
  30. package/templates/app/_storefront/SellersPage.tsx +160 -0
  31. package/templates/app/_storefront/StorefrontErrorRoute.tsx +42 -0
  32. package/templates/app/_storefront/StorefrontPageMetadata.tsx +74 -0
  33. package/templates/app/_storefront/StorefrontPageStatus.tsx +61 -0
  34. package/templates/app/_storefront/StoresPage.tsx +53 -0
  35. package/templates/app/_storefront/SubscriptionsPage.tsx +62 -0
  36. package/templates/app/_storefront/SupportPage.tsx +141 -0
  37. package/templates/app/_storefront/TariffsPage.tsx +180 -0
  38. package/templates/app/_storefront/UnsubscribePage.tsx +29 -0
  39. package/templates/app/_storefront/WalletPage.tsx +78 -0
  40. package/templates/app/_storefront/WishlistPage.tsx +79 -0
  41. package/templates/app/_storefront/storefrontRoutes.tsx +738 -0
  42. package/templates/app/_storefront/useAccountWallet.ts +27 -0
  43. package/templates/app/_storefront/useBlogComments.ts +389 -0
  44. package/templates/app/_storefront/useProductSearch.ts +171 -0
  45. package/templates/app/_storefront/useStorefrontNavigation.ts +36 -0
  46. package/templates/app/activity/page.tsx +9 -0
  47. package/templates/app/addresses/page.tsx +9 -0
  48. package/templates/app/api/[...orionplace]/route.ts +11 -4
  49. package/templates/app/browse/page.tsx +27 -0
  50. package/templates/app/cart/page.tsx +9 -0
  51. package/templates/app/catalog/page.tsx +9 -0
  52. package/templates/app/category/[id]/page.tsx +9 -0
  53. package/templates/app/contact/page.tsx +9 -0
  54. package/templates/app/error.tsx +7 -0
  55. package/templates/app/featured/page.tsx +9 -0
  56. package/templates/app/global-error.tsx +61 -0
  57. package/templates/app/globals.css +50 -2
  58. package/templates/app/journal/[id]/page.tsx +9 -0
  59. package/templates/app/journal/page.tsx +9 -0
  60. package/templates/app/layout.app.tsx +20 -0
  61. package/templates/app/layout.tsx +44 -10
  62. package/templates/app/logout/page.tsx +9 -0
  63. package/templates/app/manufacturers/page.tsx +9 -0
  64. package/templates/app/not-found.tsx +5 -0
  65. package/templates/app/orders/page.tsx +9 -0
  66. package/templates/app/page.module.css +12 -8
  67. package/templates/app/page.tsx +8 -79
  68. package/templates/app/product/[id]/page.tsx +9 -0
  69. package/templates/app/profile/page.tsx +9 -0
  70. package/templates/app/promo/[id]/page.tsx +9 -0
  71. package/templates/app/promocodes/page.tsx +9 -0
  72. package/templates/app/ps3/blog/[...orionplace]/route.ts +13 -0
  73. package/templates/app/sellers/page.tsx +9 -0
  74. package/templates/app/storefront.module.css +406 -0
  75. package/templates/app/stores/page.tsx +9 -0
  76. package/templates/app/subscriptions/page.tsx +9 -0
  77. package/templates/app/tariffs/[slug]/[id]/page.tsx +9 -0
  78. package/templates/app/tariffs/page.tsx +9 -0
  79. package/templates/app/tickets/page.tsx +9 -0
  80. package/templates/app/unsubscribe/page.tsx +9 -0
  81. package/templates/app/wallet/page.tsx +9 -0
  82. package/templates/app/wishlist/page.tsx +9 -0
  83. package/templates/components/orionplace/account/AccountActivity.README.md +70 -0
  84. package/templates/components/orionplace/account/AccountActivity.module.css +16 -0
  85. package/templates/components/orionplace/account/AccountActivity.tsx +94 -0
  86. package/templates/components/orionplace/account/AccountPromocodes.README.md +70 -0
  87. package/templates/components/orionplace/account/AccountPromocodes.module.css +92 -0
  88. package/templates/components/orionplace/account/AccountPromocodes.tsx +257 -0
  89. package/templates/components/orionplace/account/AccountSection.README.md +46 -0
  90. package/templates/components/orionplace/account/AccountSection.module.css +110 -0
  91. package/templates/components/orionplace/account/AccountSection.tsx +109 -0
  92. package/templates/components/orionplace/account/ProfileAvatar.README.md +48 -0
  93. package/templates/components/orionplace/account/ProfileAvatar.module.css +31 -0
  94. package/templates/components/orionplace/account/ProfileAvatar.tsx +138 -0
  95. package/templates/components/orionplace/account/ProfileDeleteAccount.README.md +59 -0
  96. package/templates/components/orionplace/account/ProfileDeleteAccount.module.css +51 -0
  97. package/templates/components/orionplace/account/ProfileDeleteAccount.tsx +171 -0
  98. package/templates/components/orionplace/account/ProfileDetailsForm.README.md +44 -0
  99. package/templates/components/orionplace/account/ProfileDetailsForm.module.css +35 -0
  100. package/templates/components/orionplace/account/ProfileDetailsForm.tsx +178 -0
  101. package/templates/components/orionplace/account/ProfileEmailSettings.README.md +52 -0
  102. package/templates/components/orionplace/account/ProfileEmailSettings.module.css +51 -0
  103. package/templates/components/orionplace/account/ProfileEmailSettings.tsx +276 -0
  104. package/templates/components/orionplace/account/ProfilePasswordForm.README.md +45 -0
  105. package/templates/components/orionplace/account/ProfilePasswordForm.module.css +43 -0
  106. package/templates/components/orionplace/account/ProfilePasswordForm.tsx +227 -0
  107. package/templates/components/orionplace/account/ProfileSignIn.README.md +64 -0
  108. package/templates/components/orionplace/account/ProfileSignIn.module.css +86 -0
  109. package/templates/components/orionplace/account/ProfileSignIn.tsx +463 -0
  110. package/templates/components/orionplace/account/SignInHistory.README.md +52 -0
  111. package/templates/components/orionplace/account/SignInHistory.module.css +81 -0
  112. package/templates/components/orionplace/account/SignInHistory.tsx +231 -0
  113. package/templates/components/orionplace/account/StorefrontLogout.README.md +48 -0
  114. package/templates/components/orionplace/account/StorefrontLogout.module.css +166 -0
  115. package/templates/components/orionplace/account/StorefrontLogout.tsx +73 -0
  116. package/templates/components/orionplace/account/StorefrontProfile.README.md +71 -0
  117. package/templates/components/orionplace/account/StorefrontProfile.module.css +65 -0
  118. package/templates/components/orionplace/account/StorefrontProfile.tsx +189 -0
  119. package/templates/components/orionplace/account/account.module.css +1180 -0
  120. package/templates/components/orionplace/account/profile.module.css +696 -0
  121. package/templates/components/orionplace/address/AddressForm.README.md +152 -0
  122. package/templates/components/orionplace/address/AddressForm.module.css +336 -0
  123. package/templates/components/orionplace/address/AddressForm.tsx +827 -0
  124. package/templates/components/orionplace/address/StorefrontAddresses.README.md +99 -0
  125. package/templates/components/orionplace/address/StorefrontAddresses.module.css +271 -0
  126. package/templates/components/orionplace/address/StorefrontAddresses.tsx +438 -0
  127. package/templates/components/orionplace/banners/MainBanner.README.md +65 -0
  128. package/templates/components/orionplace/banners/MainBanner.module.css +112 -0
  129. package/templates/components/orionplace/banners/MainBanner.tsx +159 -0
  130. package/templates/components/orionplace/blog/BlogArticle.README.md +143 -0
  131. package/templates/components/orionplace/blog/BlogArticle.module.css +304 -0
  132. package/templates/components/orionplace/blog/BlogArticle.tsx +371 -0
  133. package/templates/components/orionplace/blog/BlogCommentForm.README.md +51 -0
  134. package/templates/components/orionplace/blog/BlogCommentForm.module.css +93 -0
  135. package/templates/components/orionplace/blog/BlogCommentForm.tsx +125 -0
  136. package/templates/components/orionplace/blog/BlogComments.README.md +98 -0
  137. package/templates/components/orionplace/blog/BlogComments.module.css +151 -0
  138. package/templates/components/orionplace/blog/BlogComments.tsx +590 -0
  139. package/templates/components/orionplace/blog/BlogPostCard.README.md +51 -0
  140. package/templates/components/orionplace/blog/BlogPostCard.module.css +167 -0
  141. package/templates/components/orionplace/blog/BlogPostCard.tsx +177 -0
  142. package/templates/components/orionplace/blog/BlogPostGroup.README.md +49 -0
  143. package/templates/components/orionplace/blog/BlogPostGroup.module.css +37 -0
  144. package/templates/components/orionplace/blog/BlogPostGroup.tsx +129 -0
  145. package/templates/components/orionplace/blog/StorefrontJournal.README.md +105 -0
  146. package/templates/components/orionplace/blog/StorefrontJournal.module.css +387 -0
  147. package/templates/components/orionplace/blog/StorefrontJournal.tsx +548 -0
  148. package/templates/components/orionplace/branding/BrandLogos.README.md +29 -0
  149. package/templates/components/orionplace/branding/BrandLogos.module.css +7 -0
  150. package/templates/components/orionplace/branding/BrandLogos.tsx +30 -0
  151. package/templates/components/orionplace/cart/CartCheckoutDetails.README.md +92 -0
  152. package/templates/components/orionplace/cart/CartCheckoutDetails.module.css +159 -0
  153. package/templates/components/orionplace/cart/CartCheckoutDetails.tsx +370 -0
  154. package/templates/components/orionplace/cart/CartDeliverySelector.README.md +166 -0
  155. package/templates/components/orionplace/cart/CartDeliverySelector.module.css +105 -0
  156. package/templates/components/orionplace/cart/CartDeliverySelector.tsx +679 -0
  157. package/templates/components/orionplace/cart/CartItemOptions.README.md +172 -0
  158. package/templates/components/orionplace/cart/CartItemOptions.module.css +113 -0
  159. package/templates/components/orionplace/cart/CartItemOptions.tsx +503 -0
  160. package/templates/components/orionplace/cart/CartLineItem.README.md +138 -0
  161. package/templates/components/orionplace/cart/CartLineItem.module.css +57 -0
  162. package/templates/components/orionplace/cart/CartLineItem.tsx +263 -0
  163. package/templates/components/orionplace/cart/CartPreview.README.md +99 -0
  164. package/templates/components/orionplace/cart/CartPreview.module.css +225 -0
  165. package/templates/components/orionplace/cart/CartPreview.tsx +188 -0
  166. package/templates/components/orionplace/cart/DeliveryMap.README.md +65 -0
  167. package/templates/components/orionplace/cart/DeliveryMap.module.css +32 -0
  168. package/templates/components/orionplace/cart/DeliveryMap.tsx +131 -0
  169. package/templates/components/orionplace/cart/StorefrontCart.README.md +281 -0
  170. package/templates/components/orionplace/cart/StorefrontCart.module.css +460 -0
  171. package/templates/components/orionplace/cart/StorefrontCart.tsx +937 -0
  172. package/templates/components/orionplace/catalog/CatalogHeader.README.md +136 -0
  173. package/templates/components/orionplace/catalog/CatalogHeader.module.css +387 -0
  174. package/templates/components/orionplace/catalog/CatalogHeader.tsx +644 -0
  175. package/templates/components/orionplace/catalog/CatalogRepresentative.README.md +68 -0
  176. package/templates/components/orionplace/catalog/CatalogRepresentative.tsx +51 -0
  177. package/templates/components/orionplace/catalog/StorefrontCatalog.README.md +120 -0
  178. package/templates/components/orionplace/catalog/StorefrontCatalog.module.css +179 -0
  179. package/templates/components/orionplace/catalog/StorefrontCatalog.tsx +304 -0
  180. package/templates/components/orionplace/categories/CategoryGroup.README.md +68 -0
  181. package/templates/components/orionplace/categories/CategoryGroup.module.css +110 -0
  182. package/templates/components/orionplace/categories/CategoryGroup.tsx +123 -0
  183. package/templates/components/orionplace/categories/StorefrontCategory.README.md +155 -0
  184. package/templates/components/orionplace/categories/StorefrontCategory.module.css +148 -0
  185. package/templates/components/orionplace/categories/StorefrontCategory.tsx +225 -0
  186. package/templates/components/orionplace/contact/AboutPage.README.md +40 -0
  187. package/templates/components/orionplace/contact/AboutPage.module.css +216 -0
  188. package/templates/components/orionplace/contact/AboutPage.tsx +191 -0
  189. package/templates/components/orionplace/contact/ContactForm.README.md +93 -0
  190. package/templates/components/orionplace/contact/ContactForm.module.css +264 -0
  191. package/templates/components/orionplace/contact/ContactForm.tsx +382 -0
  192. package/templates/components/orionplace/contact/EmailUnsubscribe.README.md +67 -0
  193. package/templates/components/orionplace/contact/EmailUnsubscribe.module.css +94 -0
  194. package/templates/components/orionplace/contact/EmailUnsubscribe.tsx +130 -0
  195. package/templates/components/orionplace/contact/StorefrontContact.README.md +73 -0
  196. package/templates/components/orionplace/contact/StorefrontContact.module.css +101 -0
  197. package/templates/components/orionplace/contact/StorefrontContact.tsx +62 -0
  198. package/templates/components/orionplace/currencies/MainCurrencySwitcher.README.md +37 -0
  199. package/templates/components/orionplace/currencies/MainCurrencySwitcher.tsx +68 -0
  200. package/templates/components/orionplace/events/EventEnrollmentDialog.README.md +108 -0
  201. package/templates/components/orionplace/events/EventEnrollmentDialog.module.css +110 -0
  202. package/templates/components/orionplace/events/EventEnrollmentDialog.tsx +315 -0
  203. package/templates/components/orionplace/events/EventsBlock.README.md +58 -0
  204. package/templates/components/orionplace/events/EventsBlock.module.css +101 -0
  205. package/templates/components/orionplace/events/EventsBlock.tsx +109 -0
  206. package/templates/components/orionplace/locale/MainLanguageSwitcher.README.md +46 -0
  207. package/templates/components/orionplace/locale/MainLanguageSwitcher.module.css +196 -0
  208. package/templates/components/orionplace/locale/MainLanguageSwitcher.tsx +387 -0
  209. package/templates/components/orionplace/manufacturers/ManufacturerIndex.README.md +83 -0
  210. package/templates/components/orionplace/manufacturers/ManufacturerIndex.module.css +271 -0
  211. package/templates/components/orionplace/manufacturers/ManufacturerIndex.tsx +218 -0
  212. package/templates/components/orionplace/manufacturers/StorefrontManufacturers.README.md +122 -0
  213. package/templates/components/orionplace/manufacturers/StorefrontManufacturers.module.css +92 -0
  214. package/templates/components/orionplace/manufacturers/StorefrontManufacturers.tsx +455 -0
  215. package/templates/components/orionplace/orders/OrderDetails.README.md +116 -0
  216. package/templates/components/orionplace/orders/OrderDetails.module.css +730 -0
  217. package/templates/components/orionplace/orders/OrderDetails.tsx +693 -0
  218. package/templates/components/orionplace/orders/OrderPaymentForm.README.md +92 -0
  219. package/templates/components/orionplace/orders/OrderPaymentForm.module.css +105 -0
  220. package/templates/components/orionplace/orders/OrderPaymentForm.tsx +90 -0
  221. package/templates/components/orionplace/orders/StorefrontOrders.README.md +131 -0
  222. package/templates/components/orionplace/orders/StorefrontOrders.module.css +633 -0
  223. package/templates/components/orionplace/orders/StorefrontOrders.tsx +922 -0
  224. package/templates/components/orionplace/payments/PaymentPanel.README.md +114 -0
  225. package/templates/components/orionplace/payments/PaymentPanel.module.css +134 -0
  226. package/templates/components/orionplace/payments/PaymentPanel.tsx +76 -0
  227. package/templates/components/orionplace/products/HoverImageViewer.README.md +62 -0
  228. package/templates/components/orionplace/products/HoverImageViewer.module.css +88 -0
  229. package/templates/components/orionplace/products/HoverImageViewer.tsx +179 -0
  230. package/templates/components/orionplace/products/ProductCard.README.md +152 -0
  231. package/templates/components/orionplace/products/ProductCard.module.css +333 -0
  232. package/templates/components/orionplace/products/ProductCard.tsx +716 -0
  233. package/templates/components/orionplace/products/ProductCardActions.README.md +84 -0
  234. package/templates/components/orionplace/products/ProductCardActions.module.css +146 -0
  235. package/templates/components/orionplace/products/ProductCardActions.tsx +311 -0
  236. package/templates/components/orionplace/products/ProductCardBadges.README.md +44 -0
  237. package/templates/components/orionplace/products/ProductCardBadges.module.css +15 -0
  238. package/templates/components/orionplace/products/ProductCardBadges.tsx +78 -0
  239. package/templates/components/orionplace/products/ProductCardDescription.README.md +33 -0
  240. package/templates/components/orionplace/products/ProductCardDescription.module.css +6 -0
  241. package/templates/components/orionplace/products/ProductCardDescription.tsx +43 -0
  242. package/templates/components/orionplace/products/ProductCardFavorite.README.md +52 -0
  243. package/templates/components/orionplace/products/ProductCardFavorite.module.css +64 -0
  244. package/templates/components/orionplace/products/ProductCardFavorite.tsx +90 -0
  245. package/templates/components/orionplace/products/ProductCardPrice.README.md +33 -0
  246. package/templates/components/orionplace/products/ProductCardPrice.module.css +22 -0
  247. package/templates/components/orionplace/products/ProductCardPrice.tsx +50 -0
  248. package/templates/components/orionplace/products/ProductCardRating.README.md +33 -0
  249. package/templates/components/orionplace/products/ProductCardRating.module.css +7 -0
  250. package/templates/components/orionplace/products/ProductCardRating.tsx +56 -0
  251. package/templates/components/orionplace/products/ProductCardSeller.README.md +36 -0
  252. package/templates/components/orionplace/products/ProductCardSeller.module.css +31 -0
  253. package/templates/components/orionplace/products/ProductCardSeller.tsx +61 -0
  254. package/templates/components/orionplace/products/ProductCardStockNotice.README.md +36 -0
  255. package/templates/components/orionplace/products/ProductCardStockNotice.module.css +8 -0
  256. package/templates/components/orionplace/products/ProductCardStockNotice.tsx +35 -0
  257. package/templates/components/orionplace/products/ProductCardTitle.README.md +30 -0
  258. package/templates/components/orionplace/products/ProductCardTitle.module.css +13 -0
  259. package/templates/components/orionplace/products/ProductCardTitle.tsx +31 -0
  260. package/templates/components/orionplace/products/ProductCardVariants.README.md +77 -0
  261. package/templates/components/orionplace/products/ProductCardVariants.module.css +97 -0
  262. package/templates/components/orionplace/products/ProductCardVariants.tsx +350 -0
  263. package/templates/components/orionplace/products/ProductGroup.README.md +89 -0
  264. package/templates/components/orionplace/products/ProductGroup.module.css +64 -0
  265. package/templates/components/orionplace/products/ProductGroup.tsx +183 -0
  266. package/templates/components/orionplace/products/ProductPreorderDialog.README.md +89 -0
  267. package/templates/components/orionplace/products/ProductPreorderDialog.module.css +320 -0
  268. package/templates/components/orionplace/products/ProductPreorderDialog.tsx +346 -0
  269. package/templates/components/orionplace/products/ProductReviewForm.README.md +72 -0
  270. package/templates/components/orionplace/products/ProductReviewForm.module.css +217 -0
  271. package/templates/components/orionplace/products/ProductReviewForm.tsx +288 -0
  272. package/templates/components/orionplace/products/ProductReviewGallery.README.md +61 -0
  273. package/templates/components/orionplace/products/ProductReviewGallery.module.css +108 -0
  274. package/templates/components/orionplace/products/ProductReviewGallery.tsx +110 -0
  275. package/templates/components/orionplace/products/ProductReviewImageViewer.README.md +49 -0
  276. package/templates/components/orionplace/products/ProductReviewImageViewer.module.css +50 -0
  277. package/templates/components/orionplace/products/ProductReviewImageViewer.tsx +260 -0
  278. package/templates/components/orionplace/products/ProductReviews.README.md +137 -0
  279. package/templates/components/orionplace/products/ProductReviews.module.css +602 -0
  280. package/templates/components/orionplace/products/ProductReviews.tsx +944 -0
  281. package/templates/components/orionplace/products/ProductSecondaryVariantModal.README.md +67 -0
  282. package/templates/components/orionplace/products/ProductSecondaryVariantModal.module.css +79 -0
  283. package/templates/components/orionplace/products/ProductSecondaryVariantModal.tsx +324 -0
  284. package/templates/components/orionplace/products/ProductSpecificationsDialog.README.md +52 -0
  285. package/templates/components/orionplace/products/ProductSpecificationsDialog.module.css +138 -0
  286. package/templates/components/orionplace/products/ProductSpecificationsDialog.tsx +117 -0
  287. package/templates/components/orionplace/products/StorefrontProduct.README.md +200 -0
  288. package/templates/components/orionplace/products/StorefrontProduct.module.css +767 -0
  289. package/templates/components/orionplace/products/StorefrontProduct.tsx +1339 -0
  290. package/templates/components/orionplace/products/StorefrontWishlist.README.md +162 -0
  291. package/templates/components/orionplace/products/StorefrontWishlist.module.css +71 -0
  292. package/templates/components/orionplace/products/StorefrontWishlist.tsx +402 -0
  293. package/templates/components/orionplace/promo/PromoProducts.README.md +133 -0
  294. package/templates/components/orionplace/promo/PromoProducts.module.css +68 -0
  295. package/templates/components/orionplace/promo/PromoProducts.tsx +345 -0
  296. package/templates/components/orionplace/search/MainSearch.README.md +73 -0
  297. package/templates/components/orionplace/search/MainSearch.module.css +202 -0
  298. package/templates/components/orionplace/search/MainSearch.tsx +217 -0
  299. package/templates/components/orionplace/search/ProductSearchResults.README.md +166 -0
  300. package/templates/components/orionplace/search/ProductSearchResults.module.css +358 -0
  301. package/templates/components/orionplace/search/ProductSearchResults.tsx +308 -0
  302. package/templates/components/orionplace/search/SearchFilters.README.md +109 -0
  303. package/templates/components/orionplace/search/SearchFilters.module.css +274 -0
  304. package/templates/components/orionplace/search/SearchFilters.tsx +439 -0
  305. package/templates/components/orionplace/sellers/SellerFilters.README.md +66 -0
  306. package/templates/components/orionplace/sellers/SellerFilters.module.css +232 -0
  307. package/templates/components/orionplace/sellers/SellerFilters.tsx +201 -0
  308. package/templates/components/orionplace/sellers/SellerPhotoGallery.README.md +72 -0
  309. package/templates/components/orionplace/sellers/SellerPhotoGallery.module.css +314 -0
  310. package/templates/components/orionplace/sellers/SellerPhotoGallery.tsx +335 -0
  311. package/templates/components/orionplace/sellers/SellerSummary.README.md +62 -0
  312. package/templates/components/orionplace/sellers/SellerSummary.module.css +182 -0
  313. package/templates/components/orionplace/sellers/SellerSummary.tsx +107 -0
  314. package/templates/components/orionplace/sellers/StorefrontSellers.README.md +120 -0
  315. package/templates/components/orionplace/sellers/StorefrontSellers.module.css +147 -0
  316. package/templates/components/orionplace/sellers/StorefrontSellers.tsx +360 -0
  317. package/templates/components/orionplace/shared/OrionplaceAvatar.README.md +35 -0
  318. package/templates/components/orionplace/shared/OrionplaceAvatar.module.css +35 -0
  319. package/templates/components/orionplace/shared/OrionplaceAvatar.tsx +61 -0
  320. package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.README.md +33 -0
  321. package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.module.css +81 -0
  322. package/templates/components/orionplace/shared/OrionplaceBreadcrumbs.tsx +91 -0
  323. package/templates/components/orionplace/shared/OrionplaceEmptyState.README.md +37 -0
  324. package/templates/components/orionplace/shared/OrionplaceEmptyState.module.css +126 -0
  325. package/templates/components/orionplace/shared/OrionplaceEmptyState.tsx +78 -0
  326. package/templates/components/orionplace/shared/OrionplaceImage.README.md +45 -0
  327. package/templates/components/orionplace/shared/OrionplaceImage.module.css +22 -0
  328. package/templates/components/orionplace/shared/OrionplaceImage.tsx +96 -0
  329. package/templates/components/orionplace/shared/OrionplaceInfoHint.README.md +31 -0
  330. package/templates/components/orionplace/shared/OrionplaceInfoHint.module.css +59 -0
  331. package/templates/components/orionplace/shared/OrionplaceInfoHint.tsx +126 -0
  332. package/templates/components/orionplace/shared/OrionplacePasswordInput.README.md +39 -0
  333. package/templates/components/orionplace/shared/OrionplacePasswordInput.module.css +79 -0
  334. package/templates/components/orionplace/shared/OrionplacePasswordInput.tsx +103 -0
  335. package/templates/components/orionplace/shared/OrionplaceSearchSelect.README.md +97 -0
  336. package/templates/components/orionplace/shared/OrionplaceSearchSelect.module.css +246 -0
  337. package/templates/components/orionplace/shared/OrionplaceSearchSelect.tsx +367 -0
  338. package/templates/components/orionplace/shared/OrionplaceSelect.README.md +69 -0
  339. package/templates/components/orionplace/shared/OrionplaceSelect.module.css +233 -0
  340. package/templates/components/orionplace/shared/OrionplaceSelect.tsx +439 -0
  341. package/templates/components/orionplace/shared/StorefrontErrorPage.README.md +52 -0
  342. package/templates/components/orionplace/shared/StorefrontErrorPage.module.css +141 -0
  343. package/templates/components/orionplace/shared/StorefrontErrorPage.tsx +103 -0
  344. package/templates/components/orionplace/shared/StorefrontPagination.README.md +39 -0
  345. package/templates/components/orionplace/shared/StorefrontPagination.module.css +69 -0
  346. package/templates/components/orionplace/shared/StorefrontPagination.tsx +102 -0
  347. package/templates/components/orionplace/shared/dialogs.css +36 -0
  348. package/templates/components/orionplace/shared/emptyStateArt.ts +231 -0
  349. package/templates/components/orionplace/shared/features.module.css +162 -0
  350. package/templates/components/orionplace/social/SocialLinks.README.md +16 -0
  351. package/templates/components/orionplace/social/SocialLinks.module.css +36 -0
  352. package/templates/components/orionplace/social/SocialLinks.tsx +59 -0
  353. package/templates/components/orionplace/storefront/StorefrontAccount.README.md +59 -0
  354. package/templates/components/orionplace/storefront/StorefrontAccount.module.css +159 -0
  355. package/templates/components/orionplace/storefront/StorefrontAccount.tsx +303 -0
  356. package/templates/components/orionplace/storefront/StorefrontCartButton.README.md +47 -0
  357. package/templates/components/orionplace/storefront/StorefrontCartButton.module.css +88 -0
  358. package/templates/components/orionplace/storefront/StorefrontCartButton.tsx +54 -0
  359. package/templates/components/orionplace/storefront/StorefrontFooter.README.md +55 -0
  360. package/templates/components/orionplace/storefront/StorefrontFooter.module.css +118 -0
  361. package/templates/components/orionplace/storefront/StorefrontFooter.tsx +165 -0
  362. package/templates/components/orionplace/storefront/StorefrontHeader.README.md +150 -0
  363. package/templates/components/orionplace/storefront/StorefrontHeader.module.css +186 -0
  364. package/templates/components/orionplace/storefront/StorefrontHeader.tsx +389 -0
  365. package/templates/components/orionplace/storefront/StorefrontHome.README.md +138 -0
  366. package/templates/components/orionplace/storefront/StorefrontHome.module.css +116 -0
  367. package/templates/components/orionplace/storefront/StorefrontHome.tsx +282 -0
  368. package/templates/components/orionplace/storefront/StorefrontWishlistButton.README.md +51 -0
  369. package/templates/components/orionplace/storefront/StorefrontWishlistButton.module.css +95 -0
  370. package/templates/components/orionplace/storefront/StorefrontWishlistButton.tsx +80 -0
  371. package/templates/components/orionplace/stores/StorefrontStores.README.md +87 -0
  372. package/templates/components/orionplace/stores/StorefrontStores.module.css +218 -0
  373. package/templates/components/orionplace/stores/StorefrontStores.tsx +396 -0
  374. package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.README.md +183 -0
  375. package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.module.css +347 -0
  376. package/templates/components/orionplace/subscriptions/StorefrontSubscriptions.tsx +884 -0
  377. package/templates/components/orionplace/subscriptions/StorefrontTariff.README.md +111 -0
  378. package/templates/components/orionplace/subscriptions/StorefrontTariff.module.css +311 -0
  379. package/templates/components/orionplace/subscriptions/StorefrontTariff.tsx +474 -0
  380. package/templates/components/orionplace/subscriptions/StorefrontTariffs.README.md +102 -0
  381. package/templates/components/orionplace/subscriptions/StorefrontTariffs.module.css +219 -0
  382. package/templates/components/orionplace/subscriptions/StorefrontTariffs.tsx +350 -0
  383. package/templates/components/orionplace/subscriptions/SubscriptionCancelDialog.README.md +67 -0
  384. package/templates/components/orionplace/subscriptions/SubscriptionCancelDialog.tsx +175 -0
  385. package/templates/components/orionplace/subscriptions/SubscriptionChangeDialog.README.md +95 -0
  386. package/templates/components/orionplace/subscriptions/SubscriptionChangeDialog.tsx +634 -0
  387. package/templates/components/orionplace/subscriptions/SubscriptionDialog.module.css +453 -0
  388. package/templates/components/orionplace/subscriptions/SubscriptionExtendDialog.README.md +75 -0
  389. package/templates/components/orionplace/subscriptions/SubscriptionExtendDialog.tsx +384 -0
  390. package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.README.md +116 -0
  391. package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.module.css +168 -0
  392. package/templates/components/orionplace/subscriptions/SubscriptionPlanSummary.tsx +236 -0
  393. package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.README.md +123 -0
  394. package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.module.css +57 -0
  395. package/templates/components/orionplace/subscriptions/SubscriptionRemoteDetails.tsx +101 -0
  396. package/templates/components/orionplace/subscriptions/SubscriptionRenewalDialog.README.md +109 -0
  397. package/templates/components/orionplace/subscriptions/SubscriptionRenewalDialog.tsx +253 -0
  398. package/templates/components/orionplace/support/StorefrontSupport.README.md +157 -0
  399. package/templates/components/orionplace/support/StorefrontSupport.tsx +1040 -0
  400. package/templates/components/orionplace/support/Support.module.css +1133 -0
  401. package/templates/components/orionplace/support/TicketConversation.README.md +105 -0
  402. package/templates/components/orionplace/support/TicketConversation.tsx +502 -0
  403. package/templates/components/orionplace/support/TicketImage.README.md +52 -0
  404. package/templates/components/orionplace/support/TicketImage.tsx +254 -0
  405. package/templates/components/orionplace/support/TicketItemCard.README.md +66 -0
  406. package/templates/components/orionplace/support/TicketItemCard.tsx +140 -0
  407. package/templates/components/orionplace/support/TicketMessageForm.README.md +88 -0
  408. package/templates/components/orionplace/support/TicketMessageForm.tsx +261 -0
  409. package/templates/components/orionplace/support/TicketSubscriptionCard.README.md +53 -0
  410. package/templates/components/orionplace/support/TicketSubscriptionCard.tsx +118 -0
  411. package/templates/components/orionplace/tariffs/TariffCard.README.md +108 -0
  412. package/templates/components/orionplace/tariffs/TariffCard.module.css +86 -0
  413. package/templates/components/orionplace/tariffs/TariffCard.tsx +218 -0
  414. package/templates/components/orionplace/tariffs/TariffCardDescription.README.md +40 -0
  415. package/templates/components/orionplace/tariffs/TariffCardDescription.module.css +72 -0
  416. package/templates/components/orionplace/tariffs/TariffCardDescription.tsx +58 -0
  417. package/templates/components/orionplace/tariffs/TariffCardFeatures.README.md +58 -0
  418. package/templates/components/orionplace/tariffs/TariffCardFeatures.module.css +60 -0
  419. package/templates/components/orionplace/tariffs/TariffCardFeatures.tsx +140 -0
  420. package/templates/components/orionplace/tariffs/TariffCardImage.README.md +36 -0
  421. package/templates/components/orionplace/tariffs/TariffCardImage.module.css +8 -0
  422. package/templates/components/orionplace/tariffs/TariffCardImage.tsx +32 -0
  423. package/templates/components/orionplace/tariffs/TariffCardPrices.README.md +74 -0
  424. package/templates/components/orionplace/tariffs/TariffCardPrices.module.css +142 -0
  425. package/templates/components/orionplace/tariffs/TariffCardPrices.tsx +181 -0
  426. package/templates/components/orionplace/tariffs/TariffCardTitle.README.md +32 -0
  427. package/templates/components/orionplace/tariffs/TariffCardTitle.module.css +9 -0
  428. package/templates/components/orionplace/tariffs/TariffCardTitle.tsx +29 -0
  429. package/templates/components/orionplace/tariffs/TariffCards.README.md +88 -0
  430. package/templates/components/orionplace/tariffs/TariffCards.module.css +24 -0
  431. package/templates/components/orionplace/tariffs/TariffCards.tsx +44 -0
  432. package/templates/components/orionplace/tariffs/TariffSubscriptionModal.README.md +92 -0
  433. package/templates/components/orionplace/tariffs/TariffSubscriptionModal.module.css +214 -0
  434. package/templates/components/orionplace/tariffs/TariffSubscriptionModal.tsx +299 -0
  435. package/templates/components/orionplace/theme/OrionplaceThemeProvider.README.md +30 -0
  436. package/templates/components/orionplace/theme/OrionplaceThemeProvider.module.css +8 -0
  437. package/templates/components/orionplace/theme/OrionplaceThemeProvider.tsx +32 -0
  438. package/templates/components/orionplace/units/UnitSwitcher.README.md +35 -0
  439. package/templates/components/orionplace/units/UnitSwitcher.tsx +58 -0
  440. package/templates/components/orionplace/wallet/StorefrontWallet.README.md +154 -0
  441. package/templates/components/orionplace/wallet/StorefrontWallet.module.css +507 -0
  442. package/templates/components/orionplace/wallet/StorefrontWallet.tsx +915 -0
  443. package/templates/components/orionplace/wallet/WalletBalance.README.md +46 -0
  444. package/templates/components/orionplace/wallet/WalletBalance.module.css +46 -0
  445. package/templates/components/orionplace/wallet/WalletBalance.tsx +51 -0
  446. package/templates/components/orionplace/wallet/WalletTopUpForm.README.md +54 -0
  447. package/templates/components/orionplace/wallet/WalletTopUpForm.module.css +152 -0
  448. package/templates/components/orionplace/wallet/WalletTopUpForm.tsx +181 -0
  449. package/templates/hooks/useAccountActivity.ts +251 -0
  450. package/templates/hooks/useAccountAddresses.ts +81 -0
  451. package/templates/hooks/useAccountPromocodes.ts +91 -0
  452. package/templates/hooks/useOrionplaceActionMenu.ts +118 -0
  453. package/templates/hooks/useOrionplaceAddressForm.ts +262 -0
  454. package/templates/hooks/useOrionplaceApi.ts +98 -0
  455. package/templates/hooks/useOrionplaceAppLoad.ts +38 -6
  456. package/templates/hooks/useOrionplaceBlogReading.ts +351 -0
  457. package/templates/hooks/useOrionplaceDialog.ts +85 -0
  458. package/templates/hooks/useOrionplaceHomeProducts.ts +97 -0
  459. package/templates/hooks/useOrionplaceMap.tsx +230 -0
  460. package/templates/hooks/useOrionplaceMediaFormat.ts +33 -0
  461. package/templates/hooks/useOrionplaceProduct.ts +28 -0
  462. package/templates/hooks/useOrionplaceProfile.ts +347 -0
  463. package/templates/hooks/useOrionplaceReviews.ts +352 -0
  464. package/templates/hooks/useOrionplaceStableHeight.ts +65 -0
  465. package/templates/hooks/useOrionplaceStorefront.tsx +575 -0
  466. package/templates/hooks/useOrionplaceTariffPurchase.ts +152 -0
  467. package/templates/interfaces/orionplace/accounts/IContact.ts +21 -0
  468. package/templates/interfaces/orionplace/accounts/IEmailNotificationLocale.ts +17 -0
  469. package/templates/interfaces/orionplace/accounts/IEmailVerification.ts +59 -0
  470. package/templates/interfaces/orionplace/accounts/IProfileActions.ts +38 -0
  471. package/templates/interfaces/orionplace/accounts/IProfileData.ts +123 -0
  472. package/templates/interfaces/orionplace/accounts/IProfileMedia.ts +17 -0
  473. package/templates/interfaces/orionplace/accounts/IStorefrontProfile.ts +54 -0
  474. package/templates/interfaces/orionplace/address/IAddressCitySuggestion.ts +19 -0
  475. package/templates/interfaces/orionplace/address/IAddressEditor.ts +9 -0
  476. package/templates/interfaces/orionplace/address/IAddressLocationSuggestion.ts +22 -0
  477. package/templates/interfaces/orionplace/address/IAddressRegionSearch.ts +30 -0
  478. package/templates/interfaces/orionplace/address/IAddressSuggestion.ts +20 -0
  479. package/templates/interfaces/orionplace/address/IUserAddress.ts +87 -0
  480. package/templates/interfaces/orionplace/appBase/IAppLoad.ts +4 -3
  481. package/templates/interfaces/orionplace/appBase/IAppLoadCommon.ts +22 -31
  482. package/templates/interfaces/orionplace/appBase/IApploadUserProfile.ts +1 -1
  483. package/templates/interfaces/orionplace/appBase/IForm.ts +1 -1
  484. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonBanner.ts +7 -7
  485. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonPath.ts +2 -2
  486. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonSEO.ts +20 -7
  487. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonTariff.ts +2 -2
  488. package/templates/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonVariables.ts +1 -0
  489. package/templates/interfaces/orionplace/blog/IBlogApi.ts +247 -0
  490. package/templates/interfaces/orionplace/blog/IBlogPostPreview.ts +30 -0
  491. package/templates/interfaces/orionplace/cart/ICartActions.ts +67 -0
  492. package/templates/interfaces/orionplace/cart/ICartData.ts +382 -0
  493. package/templates/interfaces/orionplace/cart/ICartDeliveryActions.ts +68 -0
  494. package/templates/interfaces/orionplace/cart/ICartModal.ts +22 -0
  495. package/templates/interfaces/orionplace/cart/IDeliveryMap.ts +29 -0
  496. package/templates/interfaces/orionplace/catalog/ICatalogDirectory.ts +75 -0
  497. package/templates/interfaces/orionplace/category/ICategory.ts +2 -1
  498. package/templates/interfaces/orionplace/domains/IDomain.ts +2 -2
  499. package/templates/interfaces/orionplace/forms/ICustomerSubfilter.ts +19 -0
  500. package/templates/interfaces/orionplace/index.ts +64 -30
  501. package/templates/interfaces/orionplace/marketing/IPromoActions.ts +51 -0
  502. package/templates/interfaces/orionplace/orders/IOrderActions.ts +99 -0
  503. package/templates/interfaces/orionplace/orders/IOrderHistory.ts +259 -0
  504. package/templates/interfaces/orionplace/orders/IProductPreorder.ts +31 -0
  505. package/templates/interfaces/orionplace/payments/IInvoice.ts +147 -0
  506. package/templates/interfaces/orionplace/products/IProduct.ts +178 -151
  507. package/templates/interfaces/orionplace/products/IProductFeedbackApi.ts +218 -0
  508. package/templates/interfaces/orionplace/products/IProductSearchApi.ts +146 -0
  509. package/templates/interfaces/orionplace/products/IProductSearchFacets.ts +35 -0
  510. package/templates/interfaces/orionplace/products/IProductSecondaryVariantRequest.ts +15 -0
  511. package/templates/interfaces/orionplace/products/IProductSpecification.ts +14 -0
  512. package/templates/interfaces/orionplace/products/IWishlist.ts +22 -0
  513. package/templates/interfaces/orionplace/sellers/ISellerDirectory.ts +70 -0
  514. package/templates/interfaces/orionplace/shared/IBreadcrumb.ts +10 -0
  515. package/templates/interfaces/orionplace/shared/IStorefrontControls.ts +6 -0
  516. package/templates/interfaces/orionplace/state.ts +1 -1
  517. package/templates/interfaces/orionplace/stores/IStoreDirectory.ts +63 -0
  518. package/templates/interfaces/orionplace/subscribeTariff/ISubscribeTariff.ts +41 -31
  519. package/templates/interfaces/orionplace/subscribeTariff/ITariffSelection.ts +11 -0
  520. package/templates/interfaces/orionplace/subscribes/ISubscribe.ts +1 -1
  521. package/templates/interfaces/orionplace/subscribes/ISubscriptionApi.ts +125 -0
  522. package/templates/interfaces/orionplace/tickets/ICustomerTicketApi.ts +223 -0
  523. package/templates/interfaces/orionplace/transport.ts +7 -3
  524. package/templates/lib/orionplace/accountLabels.ts +22 -0
  525. package/templates/lib/orionplace/activityLabels.ts +65 -0
  526. package/templates/lib/orionplace/activityPresentation.ts +9 -0
  527. package/templates/lib/orionplace/addressChanges.ts +26 -0
  528. package/templates/lib/orionplace/addressPresentation.ts +58 -0
  529. package/templates/lib/orionplace/api.ts +326 -0
  530. package/templates/lib/orionplace/appLoadClient.ts +63 -21
  531. package/templates/lib/orionplace/appLoadResult.ts +75 -21
  532. package/templates/lib/orionplace/appLoadServer.ts +66 -21
  533. package/templates/lib/orionplace/blogArticle.ts +97 -0
  534. package/templates/lib/orionplace/blogArticleHtml.ts +370 -0
  535. package/templates/lib/orionplace/blogComments.ts +102 -0
  536. package/templates/lib/orionplace/blogJournal.ts +115 -0
  537. package/templates/lib/orionplace/blogLabels.ts +108 -0
  538. package/templates/lib/orionplace/blogPresentation.ts +67 -0
  539. package/templates/lib/orionplace/browseLabels.ts +98 -0
  540. package/templates/lib/orionplace/cartAddress.ts +86 -0
  541. package/templates/lib/orionplace/cartController.ts +104 -0
  542. package/templates/lib/orionplace/cartLabels.ts +261 -0
  543. package/templates/lib/orionplace/cartOptions.ts +115 -0
  544. package/templates/lib/orionplace/cartPreview.ts +120 -0
  545. package/templates/lib/orionplace/cartPromo.ts +150 -0
  546. package/templates/lib/orionplace/cartShipment.ts +61 -0
  547. package/templates/lib/orionplace/cartSnapshot.ts +21 -0
  548. package/templates/lib/orionplace/catalog.ts +150 -0
  549. package/templates/lib/orionplace/categoryLabels.ts +21 -0
  550. package/templates/lib/orionplace/contact.ts +47 -0
  551. package/templates/lib/orionplace/contactLabels.ts +102 -0
  552. package/templates/lib/orionplace/currency.ts +128 -0
  553. package/templates/lib/orionplace/deliveryMap.ts +86 -0
  554. package/templates/lib/orionplace/directoryLabels.ts +133 -0
  555. package/templates/lib/orionplace/domain.ts +11 -6
  556. package/templates/lib/orionplace/errorPageLabels.ts +74 -0
  557. package/templates/lib/orionplace/eventEnrollment.ts +22 -0
  558. package/templates/lib/orionplace/featureData.ts +28 -0
  559. package/templates/lib/orionplace/featureLabels.ts +271 -0
  560. package/templates/lib/orionplace/featuredLabels.ts +28 -0
  561. package/templates/lib/orionplace/footerLabels.ts +35 -0
  562. package/templates/lib/orionplace/guestSession.ts +55 -0
  563. package/templates/lib/orionplace/headerLabels.ts +68 -0
  564. package/templates/lib/orionplace/homeContent.ts +193 -0
  565. package/templates/lib/orionplace/homeLabels.ts +52 -0
  566. package/templates/lib/orionplace/htmlText.ts +51 -0
  567. package/templates/lib/orionplace/manufacturerDirectory.ts +71 -0
  568. package/templates/lib/orionplace/manufacturerIndex.ts +92 -0
  569. package/templates/lib/orionplace/modalWindow.ts +109 -0
  570. package/templates/lib/orionplace/nativeApp.ts +365 -0
  571. package/templates/lib/orionplace/navigation.tsx +121 -0
  572. package/templates/lib/orionplace/notice.ts +22 -0
  573. package/templates/lib/orionplace/orderLabels.ts +311 -0
  574. package/templates/lib/orionplace/orderPresentation.ts +574 -0
  575. package/templates/lib/orionplace/pageMetadata.ts +247 -0
  576. package/templates/lib/orionplace/pageSeo.ts +274 -0
  577. package/templates/lib/orionplace/paginationScroll.ts +131 -0
  578. package/templates/lib/orionplace/phone.ts +22 -0
  579. package/templates/lib/orionplace/presentation.ts +84 -0
  580. package/templates/lib/orionplace/productActionLabels.ts +60 -0
  581. package/templates/lib/orionplace/productAvailability.ts +30 -0
  582. package/templates/lib/orionplace/productGallery.ts +64 -0
  583. package/templates/lib/orionplace/productLabels.ts +82 -0
  584. package/templates/lib/orionplace/productPage.ts +308 -0
  585. package/templates/lib/orionplace/productPhotos.ts +67 -0
  586. package/templates/lib/orionplace/productSearch.ts +232 -0
  587. package/templates/lib/orionplace/productSeller.ts +56 -0
  588. package/templates/lib/orionplace/profile.ts +157 -0
  589. package/templates/lib/orionplace/profileLabels.ts +151 -0
  590. package/templates/lib/orionplace/promoLabels.ts +75 -0
  591. package/templates/lib/orionplace/promoPresentation.ts +381 -0
  592. package/templates/lib/orionplace/reviewLabels.ts +172 -0
  593. package/templates/lib/orionplace/reviewPresentation.ts +64 -0
  594. package/templates/lib/orionplace/reviewScope.ts +38 -0
  595. package/templates/lib/orionplace/searchFilters.ts +99 -0
  596. package/templates/lib/orionplace/searchHistory.ts +144 -0
  597. package/templates/lib/orionplace/sellerDirectory.ts +120 -0
  598. package/templates/lib/orionplace/seo.ts +52 -0
  599. package/templates/lib/orionplace/serverApi.ts +158 -0
  600. package/templates/lib/orionplace/serverLocale.ts +29 -0
  601. package/templates/lib/orionplace/serverMetadata.ts +86 -0
  602. package/templates/lib/orionplace/serverRecords.ts +25 -0
  603. package/templates/lib/orionplace/serverRoute.tsx +51 -0
  604. package/templates/lib/orionplace/sessionLabels.ts +27 -0
  605. package/templates/lib/orionplace/signInReturn.ts +89 -0
  606. package/templates/lib/orionplace/storeDirectory.ts +47 -0
  607. package/templates/lib/orionplace/storefrontRecords.ts +29 -0
  608. package/templates/lib/orionplace/subscriptionChanges.ts +120 -0
  609. package/templates/lib/orionplace/subscriptionLabels.ts +67 -0
  610. package/templates/lib/orionplace/subscriptionManageLabels.ts +306 -0
  611. package/templates/lib/orionplace/subscriptionPlans.ts +122 -0
  612. package/templates/lib/orionplace/subscriptionRemote.ts +85 -0
  613. package/templates/lib/orionplace/subscriptionUsage.ts +58 -0
  614. package/templates/lib/orionplace/tariffLabels.ts +123 -0
  615. package/templates/lib/orionplace/tariffPage.ts +54 -0
  616. package/templates/lib/orionplace/tariffVariables.ts +136 -0
  617. package/templates/lib/orionplace/tariffs.ts +192 -0
  618. package/templates/lib/orionplace/ticketItems.ts +75 -0
  619. package/templates/lib/orionplace/ticketLabels.ts +335 -0
  620. package/templates/lib/orionplace/ticketLocation.ts +79 -0
  621. package/templates/lib/orionplace/ticketRequests.ts +70 -0
  622. package/templates/lib/orionplace/walletTransaction.ts +105 -0
  623. package/templates/orionplace/COMPONENT-DOWNLOAD.md +66 -0
  624. package/templates/orionplace/COMPONENTS.md +35 -0
  625. package/templates/providers/OrionplaceProvider.tsx +164 -12
  626. package/templates/proxy.ts +8 -3
  627. package/templates/stores/orionplace.ts +212 -49
  628. package/templates/stores/orionplaceBrowse.ts +89 -0
  629. package/templates/stores/orionplaceCatalog.ts +144 -0
  630. package/templates/stores/orionplaceProducts.ts +389 -0
  631. package/templates/stores/orionplaceScope.ts +104 -0
  632. package/templates/stores/orionplaceSelections.ts +130 -0
  633. package/templates/themes/orionplace.ts +106 -0
@@ -0,0 +1,261 @@
1
+ const en = {
2
+ title: 'Cart',
3
+ checkout: 'Checkout',
4
+ checkoutAction: 'Checkout',
5
+ items: 'Items',
6
+ empty: 'Your cart is empty.',
7
+ browse: 'Continue shopping',
8
+ address: 'Delivery address',
9
+ addAddress: 'Add',
10
+ chooseAddress: 'Choose a saved address',
11
+ selectedAddress: 'Delivery to',
12
+ unsavedAddress:
13
+ 'This address is not in your saved addresses. Choose a saved address to replace it.',
14
+ abroadHidden:
15
+ 'Saved addresses in countries without delivery are not listed.',
16
+ savedAbroad:
17
+ 'The address is saved, but there is no delivery to this country. Choose another address.',
18
+ payment: 'Payment method',
19
+ choosePayment: 'Choose payment method',
20
+ recipient: 'Recipient',
21
+ myself: 'Myself',
22
+ myselfHint: 'Myself: I will receive the order',
23
+ otherRecipient: 'Other',
24
+ otherRecipientHint: 'Other recipient',
25
+ name: 'Full name',
26
+ phone: 'Phone number',
27
+ comment: 'Order comment',
28
+ quantity: 'Quantity',
29
+ delivery: 'Delivery',
30
+ chooseDelivery: 'Choose delivery',
31
+ selectDelivery: 'Please select a delivery method',
32
+ shipment: 'Shipment',
33
+ of: 'of',
34
+ shipsFrom: 'Ships from',
35
+ digitalDelivery: 'Digital delivery',
36
+ digitalItems: 'Digital items, no shipping needed',
37
+ splitShipments:
38
+ 'Your order ships in {count} parts from different stores. Choose delivery for each part.',
39
+ choose: 'Choose',
40
+ refreshDelivery: 'Refresh',
41
+ refreshDeliveryHint: 'Refresh delivery methods',
42
+ noDelivery: 'No delivery methods are available. Try another address.',
43
+ deliveryChanged:
44
+ 'Delivery conditions changed. Check the selected method and price.',
45
+ pickup: 'Choose a pickup point',
46
+ pickupAction: 'Choose',
47
+ noPoints: 'No pickup points were returned.',
48
+ pointSearch: 'Find a pickup point by address',
49
+ courier: 'Confirm delivery to the selected address',
50
+ courierAction: 'Confirm',
51
+ pickupType: 'Pickup point',
52
+ courierType: 'Courier delivery',
53
+ selectedPoint: 'Selected',
54
+ postalCode: 'Postal code',
55
+ pickupMap: 'Pickup points on the map',
56
+ mapUnavailable: 'The map could not be loaded.',
57
+ remove: 'Remove',
58
+ clear: 'Clear',
59
+ clearQuestion: 'Remove all items from your cart?',
60
+ unavailable: 'Unavailable for this order',
61
+ estimate: 'Estimated delivery cost',
62
+ goods: 'Items',
63
+ discount: 'Discount',
64
+ promoDiscount: 'Promo discount',
65
+ deliveryDiscount: 'Delivery discount',
66
+ total: 'Total',
67
+ promo: 'Promo code',
68
+ apply: 'Apply',
69
+ removePromo: 'Remove',
70
+ removePromoHint: 'Remove promo code',
71
+ promoSignIn: 'Sign in to apply a promo code',
72
+ promoRemoved: 'Promo code {code} was removed from the cart.',
73
+ promoNotApplied: 'Promo code {code} was not applied.',
74
+ promoMinimumOrder: 'Minimum order for this code: {amount}.',
75
+ promoMissingAmount: 'Add {amount} more of the covered products.',
76
+ // Why a promo code gives no discount, by `promo_notice.reason`. OrionMarketplace's
77
+ // own `message` is shown for a reason this list does not name.
78
+ promoReasons: {
79
+ no_lines: 'Add items to the cart to use this promo code.',
80
+ not_matched: 'The promo code does not cover the items in your cart.',
81
+ product_discounted:
82
+ 'The promo code does not apply to items that already have a discount.',
83
+ below_minimum: 'The order total is below the promo code minimum.',
84
+ subscriptions_only: 'This promo code is for subscriptions only.',
85
+ too_small: 'The cart total is too small for this promo code.',
86
+ nothing_to_ship:
87
+ 'Delivery is already free, so the promo code gives nothing.',
88
+ expired: 'The promo code has expired.',
89
+ not_active: 'The promo code is no longer active.',
90
+ not_started: 'The promotion has not started yet.',
91
+ usage_limit: 'The promo code has been used the maximum number of times.',
92
+ promotion_limit: 'The promotion has run out.',
93
+ not_yours: 'This promo code belongs to another customer.',
94
+ personal_limit:
95
+ 'You have already used this promo code the maximum number of times.',
96
+ first_order_only: 'This promo code is for the first purchase only.',
97
+ wrong_domain: 'This promo code is not valid in this store.',
98
+ } as Record<string, string>,
99
+ options: 'Item options',
100
+ optionLimit: 'Maximum quantity: {count}',
101
+ optionUnavailable: 'This option cannot be added now.',
102
+ optionSelected: 'Also selected',
103
+ optionSingle: 'One choice',
104
+ optionRequired: 'Required',
105
+ optionMissing: 'Needed to place the order',
106
+ optionMultiple: 'Several choices',
107
+ optionFile: 'Attach a file',
108
+ optionText: 'Your text',
109
+ selectedFile: 'Attached file',
110
+ optionFileLimit: 'Up to {size} MB',
111
+ optionFileTooLarge: 'The file is larger than {size} MB.',
112
+ clearOption: 'Clear',
113
+ clearOptionHint: 'Clear saved text and file',
114
+ stockChanged: 'Item quantities or prices changed. Please review your cart.',
115
+ placeOrder: 'Order',
116
+ created: 'Order created',
117
+ viewOrder: 'View order',
118
+ paymentLinkFailed:
119
+ 'The order is placed, but the payment link could not be created: {error}. Pay for the order later on its page.',
120
+ payLater: 'Open the order to pay',
121
+ review: 'Review your items, delivery and total before placing the order.',
122
+ refreshRequired: 'Refresh your cart before continuing.',
123
+ orderUncertain:
124
+ 'Could not confirm the order. Check your order history before trying again.',
125
+ };
126
+
127
+ const ru: typeof en = {
128
+ title: 'Корзина',
129
+ checkout: 'Оформление заказа',
130
+ checkoutAction: 'Оформить',
131
+ items: 'Товары',
132
+ empty: 'Корзина пуста.',
133
+ browse: 'Продолжить покупки',
134
+ address: 'Адрес доставки',
135
+ addAddress: 'Добавить',
136
+ chooseAddress: 'Выберите сохранённый адрес',
137
+ selectedAddress: 'Доставка по адресу',
138
+ unsavedAddress:
139
+ 'Этого адреса нет среди сохранённых. Чтобы заменить его, выберите сохранённый адрес.',
140
+ abroadHidden:
141
+ 'Сохранённые адреса в странах без доставки не показаны.',
142
+ savedAbroad:
143
+ 'Адрес сохранён, но доставки в эту страну нет. Выберите другой адрес.',
144
+ payment: 'Способ оплаты',
145
+ choosePayment: 'Выберите способ оплаты',
146
+ recipient: 'Получатель',
147
+ myself: 'Себе',
148
+ myselfHint: 'Себе: получу заказ самостоятельно',
149
+ otherRecipient: 'Другому',
150
+ otherRecipientHint: 'Другому получателю',
151
+ name: 'ФИО',
152
+ phone: 'Номер телефона',
153
+ comment: 'Комментарий к заказу',
154
+ quantity: 'Количество',
155
+ delivery: 'Доставка',
156
+ chooseDelivery: 'Выбрать доставку',
157
+ selectDelivery: 'Выберите способ доставки',
158
+ shipment: 'Отправление',
159
+ of: 'из',
160
+ shipsFrom: 'Отправка из',
161
+ digitalDelivery: 'Электронная доставка',
162
+ digitalItems: 'Цифровые товары, доставка не нужна',
163
+ splitShipments:
164
+ 'Заказ придёт несколькими отправлениями из разных магазинов: {count}. Выберите доставку для каждого.',
165
+ choose: 'Выбрать',
166
+ refreshDelivery: 'Обновить',
167
+ refreshDeliveryHint: 'Обновить способы доставки',
168
+ noDelivery: 'Нет доступных способов доставки. Попробуйте другой адрес.',
169
+ deliveryChanged:
170
+ 'Условия доставки изменились. Проверьте выбранный способ и стоимость.',
171
+ pickup: 'Выбрать пункт выдачи',
172
+ pickupAction: 'Выбрать',
173
+ noPoints: 'Пункты выдачи не найдены.',
174
+ pointSearch: 'Найти пункт выдачи по адресу',
175
+ courier: 'Подтвердить доставку по выбранному адресу',
176
+ courierAction: 'Подтвердить',
177
+ pickupType: 'Пункт выдачи',
178
+ courierType: 'Курьерская доставка',
179
+ selectedPoint: 'Выбран',
180
+ postalCode: 'Индекс',
181
+ pickupMap: 'Пункты выдачи на карте',
182
+ mapUnavailable: 'Не удалось загрузить карту.',
183
+ remove: 'Удалить',
184
+ clear: 'Очистить',
185
+ clearQuestion: 'Удалить все товары из корзины?',
186
+ unavailable: 'Недоступны для этого заказа',
187
+ estimate: 'Предварительная стоимость доставки',
188
+ goods: 'Товары',
189
+ discount: 'Скидка',
190
+ promoDiscount: 'Скидка промокода',
191
+ deliveryDiscount: 'Скидка на доставку',
192
+ total: 'Итого',
193
+ promo: 'Промокод',
194
+ apply: 'Применить',
195
+ removePromo: 'Удалить',
196
+ removePromoHint: 'Удалить промокод',
197
+ promoSignIn: 'Войдите, чтобы применить промокод',
198
+ promoRemoved: 'Промокод {code} удалён из корзины.',
199
+ promoNotApplied: 'Промокод {code} не применён.',
200
+ promoMinimumOrder: 'Минимальная сумма заказа для промокода: {amount}.',
201
+ promoMissingAmount: 'Добавьте товаров ещё на {amount}.',
202
+ promoReasons: {
203
+ no_lines: 'Добавьте товары в корзину, чтобы применить промокод.',
204
+ not_matched: 'Промокод не действует на товары в корзине.',
205
+ product_discounted:
206
+ 'Промокод не действует на товары, у которых уже есть скидка.',
207
+ below_minimum: 'Сумма заказа меньше минимальной для промокода.',
208
+ subscriptions_only: 'Этот промокод действует только на подписки.',
209
+ too_small: 'Сумма корзины слишком мала для этого промокода.',
210
+ nothing_to_ship:
211
+ 'Доставка уже бесплатная, промокод ничего не даёт.',
212
+ expired: 'Срок действия промокода истёк.',
213
+ not_active: 'Промокод больше не действует.',
214
+ not_started: 'Акция ещё не началась.',
215
+ usage_limit: 'Промокод уже использован максимальное число раз.',
216
+ promotion_limit: 'Акция закончилась.',
217
+ not_yours: 'Этот промокод выдан другому покупателю.',
218
+ personal_limit:
219
+ 'Вы уже использовали этот промокод максимальное число раз.',
220
+ first_order_only: 'Промокод действует только на первую покупку.',
221
+ wrong_domain: 'Промокод не действует в этом магазине.',
222
+ },
223
+ options: 'Дополнения к товару',
224
+ optionLimit: 'Максимальное количество: {count}',
225
+ optionUnavailable: 'Это дополнение сейчас нельзя добавить.',
226
+ optionSelected: 'Также выбрано',
227
+ optionSingle: 'Один вариант',
228
+ optionRequired: 'Обязательно',
229
+ optionMissing: 'Нужно для оформления заказа',
230
+ optionMultiple: 'Несколько вариантов',
231
+ optionFile: 'Прикрепить файл',
232
+ optionText: 'Ваш текст',
233
+ selectedFile: 'Прикреплённый файл',
234
+ optionFileLimit: 'До {size} МБ',
235
+ optionFileTooLarge: 'Файл больше {size} МБ.',
236
+ clearOption: 'Очистить',
237
+ clearOptionHint: 'Очистить сохранённый текст и файл',
238
+ stockChanged: 'Количество или цены товаров изменились. Проверьте корзину.',
239
+ placeOrder: 'Заказать',
240
+ created: 'Заказ создан',
241
+ viewOrder: 'Посмотреть заказ',
242
+ paymentLinkFailed:
243
+ 'Заказ создан, но ссылку на оплату получить не удалось: {error}. Оплатите заказ позже на странице заказа.',
244
+ payLater: 'Открыть заказ для оплаты',
245
+ review: 'Проверьте товары, доставку и итоговую сумму перед оформлением.',
246
+ refreshRequired: 'Обновите корзину, чтобы продолжить.',
247
+ orderUncertain:
248
+ 'Не удалось подтвердить создание заказа. Перед повторной попыткой проверьте историю заказов.',
249
+ };
250
+
251
+ /**
252
+ * The notice of an order placed without a payment link: the backend's reason
253
+ * is shown as it came, without its closing full stop.
254
+ */
255
+ export function cartPaymentLinkError(template: string, error: string) {
256
+ return template.replace('{error}', error.trim().replace(/[.\s]+$/, ''));
257
+ }
258
+
259
+ export function cartLabels(locale: string) {
260
+ return locale.toLowerCase().startsWith('ru') ? ru : en;
261
+ }
@@ -0,0 +1,115 @@
1
+ import type { IProduct } from '@/interfaces/orionplace/products/IProduct';
2
+ import type {
3
+ ICartDelivery,
4
+ ICartOption,
5
+ ICartOptionGroup,
6
+ } from '@/interfaces/orionplace/cart/ICartData';
7
+
8
+ export interface ICartOptionRow {
9
+ option: ICartOption;
10
+ product: IProduct;
11
+ maxQuantity: number;
12
+ }
13
+
14
+ export interface ICartOptionCard {
15
+ key: string;
16
+ rows: ICartOptionRow[];
17
+ productIds: number[];
18
+ }
19
+
20
+ const NO_LIMIT = 0;
21
+
22
+ function quantityInOtherRows(group: ICartOptionGroup, option: ICartOption) {
23
+ return (group.options ?? [])
24
+ .filter(
25
+ (row) => row.id !== option.id && row.product?.id === option.product?.id,
26
+ )
27
+ .reduce((total, row) => total + row.quantity, 0);
28
+ }
29
+
30
+ export function cartOptionMaxQuantity(
31
+ group: ICartOptionGroup,
32
+ option: ICartOption,
33
+ ) {
34
+ const limits = [option.quantity + (option.quantity_left ?? 0)];
35
+ const perRow = group.limits?.c_max_product_quantity_in_group ?? NO_LIMIT;
36
+ const perProduct =
37
+ group.limits?.c_max_products_quantity_for_group ?? NO_LIMIT;
38
+
39
+ if (perRow > NO_LIMIT) {
40
+ limits.push(perRow);
41
+ }
42
+ if (perProduct > NO_LIMIT) {
43
+ limits.push(perProduct - quantityInOtherRows(group, option));
44
+ }
45
+
46
+ return Math.max(0, Math.floor(Math.min(...limits)));
47
+ }
48
+
49
+ export function cartOptionRows(group: ICartOptionGroup): ICartOptionRow[] {
50
+ const rows: ICartOptionRow[] = [];
51
+ for (const option of group.options ?? []) {
52
+ if (option.product) {
53
+ rows.push({
54
+ option,
55
+ product: option.product,
56
+ maxQuantity: cartOptionMaxQuantity(group, option),
57
+ });
58
+ }
59
+ }
60
+ return rows;
61
+ }
62
+
63
+ export function cartOptionProducts(group: ICartOptionGroup) {
64
+ return cartOptionRows(group).map((row) => row.product);
65
+ }
66
+
67
+ export function cartOptionCards(group: ICartOptionGroup): ICartOptionCard[] {
68
+ const cards = new Map<string, ICartOptionCard>();
69
+ for (const row of cartOptionRows(group)) {
70
+ const productGroup = row.product.product_group_id;
71
+ const key =
72
+ Number.isInteger(productGroup) && Number(productGroup) > 0
73
+ ? `group:${productGroup}`
74
+ : `product:${row.product.id}`;
75
+ const card = cards.get(key) ?? { key, rows: [], productIds: [] };
76
+ card.rows.push(row);
77
+ card.productIds.push(row.product.id);
78
+ cards.set(key, card);
79
+ }
80
+ return [...cards.values()];
81
+ }
82
+
83
+ export function cartOptionActiveRow(card: ICartOptionCard, chosen?: number) {
84
+ return (
85
+ card.rows.find((row) => row.option.id === chosen) ??
86
+ card.rows.find((row) => row.option.quantity > 0) ??
87
+ card.rows[0]
88
+ );
89
+ }
90
+
91
+ export function cartOptionGroupFilled(group: ICartOptionGroup) {
92
+ const type = group.option_type?.option_type || '';
93
+ if (type === 'text' || type === 'textarea') {
94
+ return group.option_text_data.trim() !== '';
95
+ }
96
+ if (type === 'file') {
97
+ return Boolean(group.option_file_data);
98
+ }
99
+ return (group.options ?? []).some((option) => option.quantity > 0);
100
+ }
101
+
102
+ /**
103
+ * True when every required option group of every line in the shipments is
104
+ * filled. The backend refuses the order otherwise, so the place-order button
105
+ * waits for it like it waits for the delivery and the payment.
106
+ */
107
+ export function cartRequiredOptionsFilled(deliveries: ICartDelivery[]) {
108
+ return deliveries.every((delivery) =>
109
+ (delivery.product_items ?? []).every((product) =>
110
+ (product?.option_group ?? []).every(
111
+ (group) => !group.option_group_required || cartOptionGroupFilled(group),
112
+ ),
113
+ ),
114
+ );
115
+ }
@@ -0,0 +1,120 @@
1
+ import type { ICartItemMutationResponse } from '@/interfaces/orionplace/cart/ICartActions';
2
+ import type { ICartPreviewState } from '@/interfaces/orionplace/cart/ICartModal';
3
+ import type { IProduct } from '@/interfaces/orionplace/products/IProduct';
4
+ import { getAvailableNestedValueFromObject } from '@/lib/orionplace/presentation';
5
+
6
+ export function cartPreviewLabels(locale: string) {
7
+ if (locale.toLowerCase().startsWith('ru')) {
8
+ return {
9
+ title: 'Корзина',
10
+ quantity: 'Товаров',
11
+ pieces: (count: number) => `${count} шт.`,
12
+ empty: 'В корзине пока нет товаров',
13
+ loading: 'Загрузка корзины…',
14
+ failed: 'Не удалось загрузить корзину. Повторите запрос.',
15
+ unavailable: 'Просмотр корзины недоступен.',
16
+ retry: 'Повторить',
17
+ remove: 'Удалить из корзины',
18
+ removeFailed: 'Не удалось удалить товар. Повторите попытку.',
19
+ checkout: 'Перейти в корзину',
20
+ };
21
+ }
22
+ return {
23
+ title: 'Cart',
24
+ quantity: 'Items',
25
+ pieces: (count: number) => `Qty ${count}`,
26
+ empty: 'Your cart is empty',
27
+ loading: 'Loading cart…',
28
+ failed: 'Could not load the cart. Please try again.',
29
+ unavailable: 'Cart preview is unavailable.',
30
+ retry: 'Retry',
31
+ remove: 'Remove from cart',
32
+ removeFailed: 'Could not remove the item. Please try again.',
33
+ checkout: 'Go to cart',
34
+ };
35
+ }
36
+
37
+ export function cartPreviewState(): ICartPreviewState {
38
+ return {
39
+ open: false,
40
+ pending: false,
41
+ products: [],
42
+ error: '',
43
+ removing: [],
44
+ removeError: '',
45
+ };
46
+ }
47
+
48
+ /** The preview response also carries the header's cart position counter. */
49
+ export function cartPreviewCounter(
50
+ data: { cart?: { c_cart_positions?: unknown } } | null | undefined,
51
+ ): number | undefined {
52
+ const count = data?.cart?.c_cart_positions;
53
+
54
+ return Number.isInteger(count) ? (count as number) : undefined;
55
+ }
56
+
57
+ /** A removal is confirmed only by the new counter in its response. */
58
+ export function cartPreviewRemoval(
59
+ data: ICartItemMutationResponse['page_data'] | undefined,
60
+ ): NonNullable<ICartItemMutationResponse['page_data']> {
61
+ if (!data || !Number.isInteger(data.c_cart_positions)) {
62
+ throw new Error('Invalid cart removal response');
63
+ }
64
+
65
+ return data;
66
+ }
67
+
68
+ /** The preview lists cart products only from a complete `cart_data` array. */
69
+ export function cartPreviewProducts(
70
+ data: { cart_data?: unknown } | null | undefined,
71
+ ): IProduct[] {
72
+ const products = data?.cart_data;
73
+ const complete =
74
+ Array.isArray(products) &&
75
+ products.every(
76
+ (item) => item && typeof item.id === 'number' && item.locale,
77
+ );
78
+
79
+ if (!complete) {
80
+ throw new Error('Invalid cart preview response');
81
+ }
82
+
83
+ return products as IProduct[];
84
+ }
85
+
86
+ export function cartPreviewItems(
87
+ products: readonly IProduct[],
88
+ locale: string,
89
+ currencyId: string,
90
+ ) {
91
+ return products.map((product) => {
92
+ const counts = product.cart_counts;
93
+ const original =
94
+ counts?.cart_item_price_no_discount?.[currencyId]?.transform_value;
95
+ const final =
96
+ counts?.cart_item_price_after_promo?.[currencyId]?.transform_value;
97
+ return {
98
+ id: product.id,
99
+ cartItem: counts?.cart_id ?? 0,
100
+ name:
101
+ getAvailableNestedValueFromObject(
102
+ product.locale,
103
+ locale,
104
+ 'product_name',
105
+ ) || `#${product.id}`,
106
+ image: product.images?.small?.[0],
107
+ quantity: counts?.modal_quantity ?? 0,
108
+ original: original ?? undefined,
109
+ price: final ?? original ?? undefined,
110
+ discounted:
111
+ original !== undefined && final !== undefined && final < original,
112
+ };
113
+ });
114
+ }
115
+
116
+ export function cartPreviewQuantity(
117
+ items: ReadonlyArray<{ quantity: number }>,
118
+ ) {
119
+ return items.reduce((total, item) => total + item.quantity, 0);
120
+ }
@@ -0,0 +1,150 @@
1
+ import { ECartPromoNoticeReason } from '@/interfaces/orionplace/cart/ICartData';
2
+ import type { ICartPromoNotice } from '@/interfaces/orionplace/cart/ICartData';
3
+ import type { IAppLoadCommonCurrency } from '@/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonCurrency';
4
+ import { formatDollarAmount } from '@/lib/orionplace/currency';
5
+ import { fieldErrorText } from '@/lib/orionplace/api';
6
+
7
+ interface IPromoNoticeLabels {
8
+ promoRemoved: string;
9
+ promoNotApplied: string;
10
+ promoMinimumOrder: string;
11
+ promoMissingAmount: string;
12
+ promoReasons: Record<string, string>;
13
+ }
14
+
15
+ /** A refused `marketing_promo_promo_apply`: OrionMarketplace's text and its notice. */
16
+ export interface ICartPromoRefusal {
17
+ message: string;
18
+ notice: ICartPromoNotice | null;
19
+ }
20
+
21
+ /** What the cart writes for a promo notice: one sentence each. */
22
+ export interface ICartPromoNoticeText {
23
+ title: string;
24
+ reason: string;
25
+ minimum: string;
26
+ missing: string;
27
+ text: string;
28
+ }
29
+
30
+ // Reasons about the cart's items. A code with one of them and
31
+ // `is_removed: true` was refused when applied, so it was never in the cart.
32
+ const CART_REASONS = new Set<string>([
33
+ ECartPromoNoticeReason.NO_LINES,
34
+ ECartPromoNoticeReason.NOT_MATCHED,
35
+ ECartPromoNoticeReason.PRODUCT_DISCOUNTED,
36
+ ECartPromoNoticeReason.BELOW_MINIMUM,
37
+ ECartPromoNoticeReason.SUBSCRIPTIONS_ONLY,
38
+ ECartPromoNoticeReason.TOO_SMALL,
39
+ ECartPromoNoticeReason.NOTHING_TO_SHIP,
40
+ ]);
41
+
42
+ /**
43
+ * The cart's promo notice in the customer's words: the package's own text
44
+ * for a known `reason` (OrionMarketplace's `message` otherwise), the code it is about
45
+ * when the cart removed or refused it, and for `below_minimum` the minimum
46
+ * order and the amount still missing. Both are dollar amounts: with
47
+ * `currencies` they read «$ 544 ≈ 40 256 ₽» while another currency is
48
+ * selected. A notice limited to other currencies (`currency_ids`) is not
49
+ * shown.
50
+ */
51
+ export function cartPromoNotice(
52
+ notice: ICartPromoNotice | null | undefined,
53
+ labels: IPromoNoticeLabels,
54
+ currencyId: string,
55
+ currency: IAppLoadCommonCurrency | undefined,
56
+ locale: string,
57
+ currencies?: Record<string, IAppLoadCommonCurrency> | null,
58
+ ): ICartPromoNoticeText | undefined {
59
+ if (!notice?.reason || !cartPromoNoticeShown(notice, currencyId)) {
60
+ return undefined;
61
+ }
62
+
63
+ const reason = labels.promoReasons[notice.reason] || notice.message || '';
64
+ const heading = CART_REASONS.has(notice.reason)
65
+ ? labels.promoNotApplied
66
+ : labels.promoRemoved;
67
+ const title = !notice.is_removed
68
+ ? ''
69
+ : notice.promocode
70
+ ? heading.replace('{code}', notice.promocode)
71
+ : heading.replace(' {code}', '');
72
+ const amount = formatDollarAmount(
73
+ notice.minimum_order_amount,
74
+ currencyId,
75
+ currency,
76
+ locale,
77
+ currencies,
78
+ );
79
+ const minimum = amount
80
+ ? labels.promoMinimumOrder.replace('{amount}', amount)
81
+ : '';
82
+ const short = hasAmount(notice.missing_amount)
83
+ ? formatDollarAmount(
84
+ notice.missing_amount,
85
+ currencyId,
86
+ currency,
87
+ locale,
88
+ currencies,
89
+ )
90
+ : '';
91
+ const missing = short
92
+ ? labels.promoMissingAmount.replace('{amount}', short)
93
+ : '';
94
+
95
+ return {
96
+ title,
97
+ reason,
98
+ minimum,
99
+ missing,
100
+ text: [title, reason, minimum, missing].filter(Boolean).join(' '),
101
+ };
102
+ }
103
+
104
+ /**
105
+ * `currency_ids` limits a notice to some currencies, for example a fixed
106
+ * code that takes $10 off in dollars and nothing in rubles; `null` or an
107
+ * absent list means every currency.
108
+ */
109
+ export function cartPromoNoticeShown(
110
+ notice: Pick<ICartPromoNotice, 'currency_ids'>,
111
+ currencyId: string,
112
+ ): boolean {
113
+ const ids = notice.currency_ids;
114
+
115
+ return !Array.isArray(ids) || ids.map(String).includes(String(currencyId));
116
+ }
117
+
118
+ // OrionMarketplace sends zero in every currency once the minimum is reached.
119
+ function hasAmount(amounts: ICartPromoNotice['missing_amount']): boolean {
120
+ return Object.values(amounts ?? {}).some(
121
+ (amount) => Number(amount?.transform_value) > 0,
122
+ );
123
+ }
124
+
125
+ /**
126
+ * OrionMarketplace refuses a promo code with a field error: the code is unknown or no
127
+ * longer valid (`form_errors.promocode`), or it gives this cart nothing
128
+ * (`form_errors.__all__` with `page_data.promo_notice`). Anything else, such
129
+ * as a lost connection, is not a refusal.
130
+ */
131
+ export function cartPromoRefusal(error: unknown): ICartPromoRefusal | undefined {
132
+ if (!error || typeof error !== 'object' || !('fields' in error)) {
133
+ return undefined;
134
+ }
135
+
136
+ const fields = error.fields;
137
+ const message = fields && typeof fields === 'object'
138
+ ? fieldErrorText(fields as Record<string, unknown>)
139
+ : '';
140
+ if (!message) {
141
+ return undefined;
142
+ }
143
+
144
+ const data = 'data' in error ? error.data : undefined;
145
+ const notice = data && typeof data === 'object' && 'promo_notice' in data
146
+ ? (data.promo_notice as ICartPromoNotice | null)
147
+ : null;
148
+
149
+ return { message, notice: notice?.reason ? notice : null };
150
+ }