orionplace-react 0.1.0 → 0.2.1

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 +332 -38
  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,133 @@
1
+ # PromoProducts · React
2
+
3
+ ## English
4
+
5
+ `PromoProducts` shows the products covered by one promo-code offer and the
6
+ offer conditions returned with them. `promoTypeId` is the offer ID stored in a
7
+ promo code's `promo_type.id`; every `onLoad` call receives `products_search`
8
+ with that value in `filters.is_good_for_promo`.
9
+
10
+ Pass the first server response through `initial` to include the offer,
11
+ breadcrumbs and product cards in the initial HTML. Otherwise `loadOnMount`
12
+ loads it in the browser. The first page replaces the offer and calls
13
+ `onLoaded(promo)`; later pages replace only products and pagination, preserving
14
+ the first page's offer. A first page without `page_data.promo` calls
15
+ `onLoaded(null)` and shows that the offer is no longer running. A present offer
16
+ with no matching products has a separate empty state.
17
+
18
+ The offer block uses the selected language and currency. It shows the offer
19
+ name, discount and maximum discount (`maximum_discount`), covered sellers,
20
+ categories or products, the minimum order (`minimum_order_amount`: what the covered
21
+ products must cost together; a dollar amount, shown as “$ 544 ≈ 40 256 ₽” in another currency and “$ 544” in dollars), a first-purchase-only rule (`first_order_only`),
22
+ whether already-discounted products qualify, and its start and finish dates.
23
+ `promoCode` names the code in the breadcrumb. When it is empty, the localized
24
+ offer name is used; without either that entry is left out. The other breadcrumb entries link to the profile and its
25
+ promo-code tab.
26
+
27
+ Every returned product is stored in the isolated product store and rendered
28
+ through `ProductGroup`. `productActionsDisabled` or a pending page request
29
+ disables its controls. The product events have the same separate payloads as
30
+ `StorefrontWishlist`: product and seller objects for selection; product ID and
31
+ variant for main or secondary selection; the secondary lookup request; desired
32
+ wishlist state; cart quantity or cart-item ID; and product ID for subscribe,
33
+ unsubscribe and preorder. `productHref` supplies the product-card links.
34
+
35
+ Changing `promoTypeId` clears the previous offer and products, cancels the old
36
+ request and loads the new offer. If a later-page request fails, the confirmed
37
+ offer and products remain visible with Retry.
38
+
39
+ Source is maintained in
40
+ `components/orionplace/promo/PromoProducts.tsx`; the response contract is in
41
+ `interfaces/orionplace/products/IProductSearchApi.ts`.
42
+
43
+ ### Props
44
+
45
+ | Prop | Meaning |
46
+ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
47
+ | `promoTypeId: number` | ID of the promo type handled by PromoProducts. |
48
+ | `promoCode?: string` | Promotion code used to load the matching offer. |
49
+ | `initial?: { products?: { data: IProduct[]; rpag: IApiPagination; }; min_max?: IProductSearchRanges; variants?: Record<string, IProductVariantFilter>; selects?: IProductSearchChoices; c_cat_products?: number; promo?: IPromoDefinition \| null; }` | Server-provided initial data used for the first render and hydration. |
50
+ | `initialError?: string` | Server-provided initial error used for the first render and hydration. |
51
+ | `loadOnMount?: boolean` | Starts the load callback after hydration when server data was not supplied. |
52
+ | `productActionsDisabled?: boolean` | Disables cart, wishlist, subscription and preorder actions. |
53
+ | `productHref?: (id: number) => string` | Builds the product destination from the callback arguments. |
54
+ | `onLoad: (action: PromoProductsLoadAction) => Promise<PromoProductsPage> \| PromoProductsPage` | Called when the component needs its primary data. The callback payload is shown in its type. |
55
+ | `onLoaded?: (promo: IPromoDefinition \| null) => void` | Called when the requested data loads successfully. The callback payload is shown in its type. |
56
+ | `onPageChange?: (page: number) => void` | Called when the visitor requests another page. The callback payload is shown in its type. |
57
+ | `onSelect?: (product: IProduct) => void` | Passes the displayed product object when its image or name is selected. The application handles product navigation. |
58
+ | `onSelectSeller?: (seller: IProductSeller) => void` | Passes the displayed product’s seller object when the seller is selected. The application opens the seller page. |
59
+ | `onSelectVariant?: (selection: ProductActionSelection & { variant: IProductVariantValue; }) => void` | Passes the previously displayed product ID in `product` and chosen primary variant in `variant`. An available variant product replaces the card; the application loads missing product data. |
60
+ | `onRequestSecondaryVariants?: (request: IProductSecondaryVariantRequest) => void` | Passes the product ID in `product`, product group ID in `productGroup` and primary variant in `variant` when its secondary variants need loading. The application loads them and supplies them to the product store. |
61
+ | `onSelectSecondaryVariant?: (selection: ProductActionSelection & { variant: IProductSecondaryVariant; }) => void` | Passes the previously displayed product ID in `product` and chosen secondary variant in `variant` after replacing the displayed product. The secondary-variant data remains available. |
62
+ | `onToggleFavorite?: (selection: ProductActionSelection & { selected: boolean; }) => void` | Passes the product ID in `product` and desired wishlist state in `selected` after the heart is pressed. The application confirms the change with a request and updates product data. |
63
+ | `onAdd?: (selection: ProductActionSelection & { quantity: number; }) => void` | Passes the product ID in `product` and the requested total quantity in `quantity` when adding an item or changing its quantity. The application sends the request and supplies confirmed product data. |
64
+ | `onRemove?: (selection: ProductActionSelection & { cartItem: number; }) => void` | Passes the product ID in `product` and cart item ID in `cartItem` when removing the last unit. The application removes that cart item and supplies confirmed product data. |
65
+ | `onSubscribe?: (selection: ProductActionSelection) => void` | Passes the product ID in `product` when an availability notification is requested. The application handles any required sign-in, sends the request and updates subscription state. |
66
+ | `onUnsubscribe?: (selection: ProductActionSelection) => void` | Passes the product ID in `product` when cancelling an availability notification. The application sends the request and supplies the confirmed subscription state. |
67
+ | `onPreorder?: (selection: ProductActionSelection) => void` | Passes the product ID in `product` when preorder is selected. The application collects the required contact details and submits the request. |
68
+
69
+ ## Русский
70
+
71
+ `PromoProducts` показывает товары, на которые действует предложение промокода,
72
+ и полученные вместе с ними условия. `promoTypeId` — ID предложения из
73
+ `promo_type.id` промокода. Каждый вызов `onLoad` получает метод
74
+ `products_search` с этим значением в `filters.is_good_for_promo`.
75
+
76
+ Передайте первый серверный ответ через `initial`, чтобы условия, путь и карточки
77
+ товаров вошли в первоначальный HTML. Иначе `loadOnMount` загружает их в
78
+ браузере. Первая страница заменяет предложение и вызывает `onLoaded(promo)`.
79
+ Следующие страницы заменяют только товары и пагинацию, сохраняя предложение с
80
+ первой страницы. Если в первой странице нет `page_data.promo`, компонент
81
+ вызывает `onLoaded(null)` и сообщает, что акция больше не действует. Для
82
+ действующей акции без подходящих товаров показано отдельное пустое состояние.
83
+
84
+ Блок предложения использует выбранные язык и валюту. В нём видны название,
85
+ скидка и максимальная скидка (`maximum_discount`), подходящие продавцы, категории
86
+ или товары, минимальная сумма заказа (`minimum_order_amount`: сколько должны стоить вместе
87
+ товары, на которые действует код; сумма в долларах: «$ 544 ≈ 40 256 ₽» в другой валюте и «$ 544» в долларах), правило
88
+ «только для первой покупки» (`first_order_only`), возможность применять промокод к товару со скидкой, а
89
+ также даты начала и окончания. `promoCode` задаёт код в пути страницы. Если он пуст, используется
90
+ локализованное название предложения; без кода и известной акции этот элемент не выводится.
91
+ Другие элементы пути ведут в профиль и на вкладку промокодов.
92
+
93
+ Каждый полученный товар сохраняется в отдельном хранилище товаров и выводится
94
+ через `ProductGroup`. `productActionsDisabled` или выполняемый запрос страницы
95
+ блокирует элементы карточек. События товаров имеют те же отдельные данные, что
96
+ и в `StorefrontWishlist`: товар и продавец для выбора; ID товара и вариант для
97
+ основного или дополнительного выбора; запрос дополнительных вариантов;
98
+ желаемое состояние избранного; количество или ID позиции корзины; ID товара
99
+ для подписки, отписки и предзаказа. `productHref` задаёт ссылки карточек.
100
+
101
+ Изменение `promoTypeId` очищает прежнее предложение и товары, отменяет старый
102
+ запрос и загружает новую акцию. Если не удалось загрузить следующую страницу,
103
+ подтверждённые условия и товары остаются рядом с кнопкой повтора.
104
+
105
+ Исходный файл:
106
+ `components/orionplace/promo/PromoProducts.tsx`; контракт ответа находится в
107
+ `interfaces/orionplace/products/IProductSearchApi.ts`.
108
+
109
+ ### Свойства
110
+
111
+ | Свойство | Назначение |
112
+ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
113
+ | `promoTypeId: number` | ID типа промопредложения, с которым работает PromoProducts. |
114
+ | `promoCode?: string` | Промокод для загрузки соответствующего предложения. |
115
+ | `initial?: { products?: { data: IProduct[]; rpag: IApiPagination; }; min_max?: IProductSearchRanges; variants?: Record<string, IProductVariantFilter>; selects?: IProductSearchChoices; c_cat_products?: number; promo?: IPromoDefinition \| null; }` | Начальные данные с сервера для первого рендера и гидратации. |
116
+ | `initialError?: string` | Начальное значение ошибки, полученное на сервере для первого рендера и гидратации. |
117
+ | `loadOnMount?: boolean` | Запускает загрузку после гидратации, если серверные данные не переданы. |
118
+ | `productActionsDisabled?: boolean` | Блокирует корзину, избранное, подписку и предзаказ. |
119
+ | `productHref?: (id: number) => string` | Строит адрес ссылки товара из аргументов обработчика. |
120
+ | `onLoad: (action: PromoProductsLoadAction) => Promise<PromoProductsPage> \| PromoProductsPage` | Вызывается, когда компоненту нужны основные данные. Данные обработчика указаны в его типе. |
121
+ | `onLoaded?: (promo: IPromoDefinition \| null) => void` | Вызывается, когда запрошенные данные успешно загружены. Данные обработчика указаны в его типе. |
122
+ | `onPageChange?: (page: number) => void` | Вызывается, когда покупатель открывает другую страницу. Данные обработчика указаны в его типе. |
123
+ | `onSelect?: (product: IProduct) => void` | Передаёт объект отображаемого товара при выборе его изображения или названия. Приложение выполняет переход к товару. |
124
+ | `onSelectSeller?: (seller: IProductSeller) => void` | Передаёт объект продавца отображаемого товара при выборе продавца. Приложение открывает его страницу. |
125
+ | `onSelectVariant?: (selection: ProductActionSelection & { variant: IProductVariantValue; }) => void` | Передаёт ID ранее отображаемого товара в `product` и выбранный основной вариант в `variant`. Доступный товар выбранного варианта заменяет карточку; отсутствующие данные загружает приложение. |
126
+ | `onRequestSecondaryVariants?: (request: IProductSecondaryVariantRequest) => void` | Передаёт ID товара в `product`, ID группы товаров в `productGroup` и основной вариант в `variant`, когда для него нужно загрузить дополнительные варианты. Приложение загружает и передаёт их в хранилище товаров. |
127
+ | `onSelectSecondaryVariant?: (selection: ProductActionSelection & { variant: IProductSecondaryVariant; }) => void` | Передаёт ID ранее отображаемого товара в `product` и выбранный дополнительный вариант в `variant` после замены отображаемого товара. Выбор сохраняет данные дополнительных вариантов. |
128
+ | `onToggleFavorite?: (selection: ProductActionSelection & { selected: boolean; }) => void` | Передаёт ID товара в `product` и желаемое состояние избранного в `selected` после нажатия сердца. Приложение подтверждает изменение запросом и обновляет данные товара. |
129
+ | `onAdd?: (selection: ProductActionSelection & { quantity: number; }) => void` | Передаёт `product` — ID товара и `quantity` — запрошенное итоговое количество при добавлении или изменении количества. Приложение выполняет запрос и передаёт подтверждённые данные товара. |
130
+ | `onRemove?: (selection: ProductActionSelection & { cartItem: number; }) => void` | Передаёт ID товара в `product` и ID позиции корзины в `cartItem` при удалении последней единицы. Приложение удаляет эту позицию и передаёт подтверждённые данные товара. |
131
+ | `onSubscribe?: (selection: ProductActionSelection) => void` | Передаёт ID товара в `product` при выборе уведомления о поступлении. Приложение выполняет вход, если он нужен, отправляет запрос и обновляет состояние подписки. |
132
+ | `onUnsubscribe?: (selection: ProductActionSelection) => void` | Передаёт ID товара в `product` при отмене уведомления о поступлении. Приложение отправляет запрос и передаёт подтверждённое состояние подписки. |
133
+ | `onPreorder?: (selection: ProductActionSelection) => void` | Передаёт ID товара в `product` при выборе предзаказа. Приложение собирает необходимые контактные данные и отправляет запрос. |
@@ -0,0 +1,68 @@
1
+ .root {
2
+ composes: feature featureStack account from '../account/account.module.css';
3
+ width: 100%;
4
+ container-type: inline-size;
5
+ }
6
+
7
+ .title {
8
+ composes: featureTitle from '../account/account.module.css';
9
+ }
10
+
11
+ /* The offer is one card of the account entry list, as in the other
12
+ packages. */
13
+ .offers {
14
+ composes: entryList from '../account/account.module.css';
15
+ }
16
+
17
+ .offer {
18
+ composes: entry from '../account/account.module.css';
19
+ }
20
+
21
+ .offerHead {
22
+ composes: entryHead from '../account/account.module.css';
23
+ }
24
+
25
+ .offerName {
26
+ composes: entryTitle from '../account/account.module.css';
27
+ }
28
+
29
+ .icon {
30
+ composes: entryIcon from '../account/account.module.css';
31
+ }
32
+
33
+ .facts {
34
+ composes: entryFacts from '../account/account.module.css';
35
+ }
36
+
37
+ .fact {
38
+ composes: entryFact from '../account/account.module.css';
39
+ }
40
+
41
+ .term {
42
+ composes: entryTerm from '../account/account.module.css';
43
+ }
44
+
45
+ .value {
46
+ composes: entryValue from '../account/account.module.css';
47
+ }
48
+
49
+ .hint {
50
+ composes: featureCopy featureMuted from '../account/account.module.css';
51
+ }
52
+
53
+ .error {
54
+ composes: notice noticeError from '../account/account.module.css';
55
+ }
56
+
57
+ .button {
58
+ composes: featureButton from '../account/account.module.css';
59
+ }
60
+
61
+ .screenReaderOnly {
62
+ position: absolute;
63
+ width: 1px;
64
+ height: 1px;
65
+ overflow: hidden;
66
+ clip-path: inset(50%);
67
+ white-space: nowrap;
68
+ }
@@ -0,0 +1,345 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import {
5
+ useOrionplaceProductsStore,
6
+ useOrionplaceSelections,
7
+ } from '@/providers/OrionplaceProvider';
8
+ import type { IApiPagination } from '@/interfaces/orionplace/accounts/IProfileData';
9
+ import type { IPromoDefinition } from '@/interfaces/orionplace/cart/ICartData';
10
+ import type { IProduct } from '@/interfaces/orionplace/products/IProduct';
11
+ import type {
12
+ IProductSearchRequest,
13
+ IProductSearchResponse,
14
+ } from '@/interfaces/orionplace/products/IProductSearchApi';
15
+ import type { IBreadcrumb } from '@/interfaces/orionplace/shared/IBreadcrumb';
16
+ import { accountLabels } from '@/lib/orionplace/accountLabels';
17
+ import { featureLabels } from '@/lib/orionplace/featureLabels';
18
+ import { mergePagination } from '@/lib/orionplace/featureData';
19
+ import { promoLabels } from '@/lib/orionplace/promoLabels';
20
+ import {
21
+ promoIconPaths,
22
+ promoName,
23
+ promoOfferConditions,
24
+ } from '@/lib/orionplace/promoPresentation';
25
+ import {
26
+ ProductGroup,
27
+ type ProductGroupEvents,
28
+ type ProductGroupProps,
29
+ } from '@/components/orionplace/products/ProductGroup';
30
+ import { OrionplaceBreadcrumbs } from '@/components/orionplace/shared/OrionplaceBreadcrumbs';
31
+ import { OrionplaceEmptyState } from '@/components/orionplace/shared/OrionplaceEmptyState';
32
+ import { StorefrontPagination } from '@/components/orionplace/shared/StorefrontPagination';
33
+ import styles from './PromoProducts.module.css';
34
+ import { apiErrorMessage } from '@/lib/orionplace/api';
35
+
36
+ type PromoProductsPage = NonNullable<IProductSearchResponse['page_data']>;
37
+
38
+ export interface PromoProductsLoadAction {
39
+ endpoint: 'products_search';
40
+ request: IProductSearchRequest & {
41
+ filters: { is_good_for_promo: number };
42
+ };
43
+ signal: AbortSignal;
44
+ }
45
+
46
+ export interface PromoProductsProps extends ProductGroupEvents {
47
+ promoTypeId: number;
48
+ promoCode?: string;
49
+ initial?: PromoProductsPage;
50
+ initialError?: string;
51
+ loadOnMount?: boolean;
52
+ productActionsDisabled?: boolean;
53
+ productHref?: ProductGroupProps['productHref'];
54
+ onLoad: (
55
+ action: PromoProductsLoadAction,
56
+ ) => Promise<PromoProductsPage> | PromoProductsPage;
57
+ onLoaded?: (promo: IPromoDefinition | null) => void;
58
+ onPageChange?: (page: number) => void;
59
+ }
60
+
61
+ function PromoIcon({ path }: { path: string }) {
62
+ return (
63
+ <svg
64
+ viewBox="0 0 24 24"
65
+ fill="none"
66
+ stroke="currentColor"
67
+ strokeWidth="1.5"
68
+ strokeLinecap="round"
69
+ strokeLinejoin="round"
70
+ aria-hidden="true"
71
+ className={styles.icon}
72
+ >
73
+ <path d={path} />
74
+ </svg>
75
+ );
76
+ }
77
+
78
+ export function PromoProducts({
79
+ promoTypeId,
80
+ promoCode = '',
81
+ initial,
82
+ initialError = '',
83
+ loadOnMount = true,
84
+ productActionsDisabled = false,
85
+ productHref,
86
+ onLoad,
87
+ onLoaded,
88
+ onPageChange,
89
+ ...events
90
+ }: PromoProductsProps) {
91
+ const locale = useOrionplaceSelections((state) => state.localeCode);
92
+ const currencyId = useOrionplaceSelections((state) => state.currencyId);
93
+ const currencies = useOrionplaceSelections(
94
+ (state) => state.init?.currencies,
95
+ );
96
+ const currency = currencies?.[currencyId];
97
+ const productStore = useOrionplaceProductsStore();
98
+ const common = featureLabels(locale);
99
+ const copy = promoLabels(locale);
100
+ const account = accountLabels(locale);
101
+ const [promo, setPromo] = useState<IPromoDefinition | null>(
102
+ initial?.promo ?? null,
103
+ );
104
+ const [products, setProducts] = useState<IProduct[]>(
105
+ initial?.products?.data ?? [],
106
+ );
107
+ const [pagination, setPagination] = useState<Partial<IApiPagination>>(
108
+ initial?.products?.rpag ?? {},
109
+ );
110
+ const [loaded, setLoaded] = useState(Boolean(initial));
111
+ const [pending, setPending] = useState(
112
+ loadOnMount && !initial && !initialError,
113
+ );
114
+ const [error, setError] = useState(initialError);
115
+ const activeRequest = useRef<AbortController | undefined>(undefined);
116
+ const requested = useRef(false);
117
+ const previousPromo = useRef(promoTypeId);
118
+ const callbacks = useRef({ onLoad, onLoaded });
119
+ callbacks.current = { onLoad, onLoaded };
120
+
121
+ const conditions = promoOfferConditions(
122
+ promo,
123
+ locale,
124
+ currencyId,
125
+ currency,
126
+ copy,
127
+ currencies,
128
+ );
129
+ // The code has no page of its own; an address without a code or a known
130
+ // offer has no entry to name.
131
+ const breadcrumbs: IBreadcrumb[] = [
132
+ {
133
+ id: 'profile',
134
+ label: account.profile,
135
+ to: { path: '/profile', query: { locale } },
136
+ },
137
+ {
138
+ id: 'promocodes',
139
+ label: copy.crumbPromocodes,
140
+ to: {
141
+ path: '/promocodes',
142
+ query: { locale },
143
+ },
144
+ },
145
+ {
146
+ id: 'code',
147
+ label: promoCode || promoName(promo, locale),
148
+ },
149
+ { id: 'products', label: copy.crumbProducts },
150
+ ].filter((crumb) => crumb.label);
151
+
152
+ async function fetchPage(controller: AbortController, page: number) {
153
+ const data = await callbacks.current.onLoad({
154
+ endpoint: 'products_search',
155
+ request: {
156
+ filters: { is_good_for_promo: promoTypeId },
157
+ paginate: { page, pp_items: 12 },
158
+ },
159
+ signal: controller.signal,
160
+ });
161
+ if (controller.signal.aborted) {
162
+ return;
163
+ }
164
+
165
+ if (page === 1) {
166
+ const offer = data.promo ?? null;
167
+ setPromo(offer);
168
+ callbacks.current.onLoaded?.(offer);
169
+ }
170
+ const nextProducts = data.products?.data ?? [];
171
+ for (const product of nextProducts) {
172
+ productStore
173
+ .getState()
174
+ .setProduct(product, 'products', data.selects?.sellers);
175
+ }
176
+ setProducts(nextProducts);
177
+ setPagination((previous) =>
178
+ mergePagination(page === 1 ? {} : previous, data.products?.rpag),
179
+ );
180
+ setLoaded(true);
181
+ }
182
+
183
+ async function load(page = 1) {
184
+ if (activeRequest.current) {
185
+ return;
186
+ }
187
+ const controller = new AbortController();
188
+ activeRequest.current = controller;
189
+ setPending(true);
190
+ setError('');
191
+ try {
192
+ await fetchPage(controller, page);
193
+ } catch (reason) {
194
+ if (!controller.signal.aborted) {
195
+ setError(
196
+ apiErrorMessage(reason) || common.failed,
197
+ );
198
+ }
199
+ } finally {
200
+ if (activeRequest.current === controller) {
201
+ activeRequest.current = undefined;
202
+ setPending(false);
203
+ }
204
+ }
205
+ }
206
+
207
+ function changePage(page: number) {
208
+ onPageChange?.(page);
209
+ void load(page);
210
+ }
211
+
212
+ useEffect(() => {
213
+ for (const product of initial?.products?.data ?? []) {
214
+ productStore
215
+ .getState()
216
+ .setProduct(product, 'products', initial?.selects?.sellers);
217
+ }
218
+ if (initial) {
219
+ callbacks.current.onLoaded?.(initial.promo ?? null);
220
+ }
221
+ }, [initial, productStore]);
222
+
223
+ useEffect(() => {
224
+ if (!requested.current && loadOnMount && !initial && !initialError) {
225
+ requested.current = true;
226
+ void load();
227
+ }
228
+ return () => {
229
+ activeRequest.current?.abort();
230
+ activeRequest.current = undefined;
231
+ requested.current = false;
232
+ };
233
+ }, []);
234
+
235
+ useEffect(() => {
236
+ if (previousPromo.current === promoTypeId) {
237
+ return;
238
+ }
239
+ previousPromo.current = promoTypeId;
240
+ activeRequest.current?.abort();
241
+ activeRequest.current = undefined;
242
+ setPending(false);
243
+ setPromo(null);
244
+ setProducts([]);
245
+ setPagination({});
246
+ setLoaded(false);
247
+ setError('');
248
+ if (loadOnMount) {
249
+ void load();
250
+ }
251
+ }, [promoTypeId]);
252
+
253
+ return (
254
+ <section
255
+ className={styles.root}
256
+ data-feature-part="PromoProducts"
257
+ aria-busy={pending || undefined}
258
+ >
259
+ <OrionplaceBreadcrumbs
260
+ items={breadcrumbs}
261
+ loading={pending && !loaded}
262
+ />
263
+ <h1 className={styles.title}>{copy.products}</h1>
264
+
265
+ {promo ? (
266
+ <>
267
+ <div className={styles.offers}>
268
+ <div
269
+ className={styles.offer}
270
+ data-promo-offer
271
+ >
272
+ <div className={styles.offerHead}>
273
+ <PromoIcon path={promoIconPaths.ticket} />
274
+ <span className={styles.offerName}>{promoName(promo, locale)}</span>
275
+ </div>
276
+ <dl className={styles.facts}>
277
+ {conditions.map((condition) => (
278
+ <div
279
+ key={condition.key}
280
+ className={styles.fact}
281
+ data-promo-condition={condition.key}
282
+ >
283
+ <PromoIcon path={promoIconPaths[condition.icon]} />
284
+ <dt className={styles.term}>{condition.label}</dt>
285
+ <dd className={styles.value}>{condition.value}</dd>
286
+ </div>
287
+ ))}
288
+ </dl>
289
+ </div>
290
+ </div>
291
+ <p className={styles.hint}>{copy.productsHint}</p>
292
+ </>
293
+ ) : null}
294
+
295
+ {error ? (
296
+ <div
297
+ role="alert"
298
+ className={styles.error}
299
+ >
300
+ <span>{error}</span>
301
+ <button
302
+ type="button"
303
+ className={styles.button}
304
+ disabled={pending}
305
+ onClick={() => void load()}
306
+ >
307
+ {common.retry}
308
+ </button>
309
+ </div>
310
+ ) : null}
311
+ {pending ? (
312
+ <p
313
+ role="status"
314
+ className="op-feature-loading"
315
+ >
316
+ <span className={styles.screenReaderOnly}>{common.loading}</span>
317
+ </p>
318
+ ) : null}
319
+
320
+ {products.length ? (
321
+ <div data-promo-products>
322
+ <ProductGroup
323
+ products={products}
324
+ productIds={products.map((product) => product.id)}
325
+ layout="grid"
326
+ disabled={productActionsDisabled || pending}
327
+ productHref={productHref}
328
+ {...events}
329
+ />
330
+ </div>
331
+ ) : loaded && !pending ? (
332
+ <OrionplaceEmptyState
333
+ kind="promocodes"
334
+ message={promo ? copy.productsEmpty : copy.productsMissing}
335
+ />
336
+ ) : null}
337
+
338
+ <StorefrontPagination
339
+ pagination={pagination}
340
+ pending={pending}
341
+ onChange={changePage}
342
+ />
343
+ </section>
344
+ );
345
+ }
@@ -0,0 +1,73 @@
1
+ # MainSearch
2
+
3
+ ## English
4
+
5
+ `MainSearch` edits the shared `searchQuery` in the browse store. On `/browse`,
6
+ an initially empty store adopts the trimmed `q` query parameter after the first
7
+ render while showing that same value in the server-rendered input. Search hints
8
+ come from `init.search_hints`; the selected locale is used first and duplicate
9
+ captions are removed. `history` adds the signed-in customer's matching saved
10
+ queries. Focusing or editing the field calls `onHistorySearch` after a short
11
+ pause. Choosing a saved query calls `onSearch`; its remove button passes the
12
+ record ID to `onHistoryDelete`. `historyPending` announces that saved queries
13
+ are loading. `historyError` displays a failed history request. `historyDeleting`
14
+ keeps each affected remove button disabled until its request finishes.
15
+
16
+ Submitting a non-empty value trims its outer whitespace and calls `onSearch`
17
+ with the resulting text. The component does not navigate or send an API request.
18
+ `disabled` blocks editing and submission. `label` supplies the input placeholder
19
+ and accessible name; `buttonLabel` names the submit control. The storefront
20
+ connects these callbacks to `profile_query_search`, `profile_search_update` and
21
+ `profile_search_delete`; the component keeps transport and navigation in the
22
+ application.
23
+
24
+ ### Props
25
+
26
+ | Prop | Meaning |
27
+ | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
28
+ | `label?: string` | Placeholder and accessible name of the search field. |
29
+ | `buttonLabel?: string` | Accessible name of the submit button. |
30
+ | `disabled?: boolean` | Blocks editing, submission and saved-query actions. |
31
+ | `history?: readonly MainSearchHistoryItem[]` | Saved searches shown while the field has focus. Each entry contains its ID in `id` and query in `q`. |
32
+ | `historyPending?: boolean` | Replaces the saved-query list with a loading message. |
33
+ | `historyError?: string` | Message for a failed history request. An empty string hides the message. |
34
+ | `historyDeleting?: readonly number[]` | IDs of entries awaiting a deletion response. Their remove buttons stay disabled. |
35
+ | `onSearch?: (query: string) => void` | Passes nonempty search text with surrounding whitespace removed on form submission, or the selected history entry’s text. The history list closes before the callback. |
36
+ | `onHistorySearch?: (query: string) => void` | Receives the trimmed field text after focus or editing. An empty string requests the most recent saved searches. The application loads and supplies `history`. |
37
+ | `onHistoryDelete?: (id: number) => void` | Passes the entry ID when its remove button is pressed. The application removes the entry and supplies updated history. |
38
+
39
+ ## Русский
40
+
41
+ `MainSearch` редактирует общее поле `searchQuery` в хранилище просмотра. На
42
+ странице `/browse` пустое хранилище принимает очищенный от внешних пробелов
43
+ параметр `q` после первого отображения, а то же значение сразу показывается в
44
+ серверном HTML поля. Подсказки берутся из `init.search_hints`: сначала выбирается
45
+ текст для текущего языка, повторяющиеся подписи удаляются. `history` добавляет
46
+ подходящие сохранённые запросы вошедшего покупателя. При фокусе или изменении
47
+ поля после короткой паузы вызывается `onHistorySearch`. Выбор сохранённого
48
+ запроса вызывает `onSearch`, а кнопка удаления передаёт ID записи в
49
+ `onHistoryDelete`. `historyPending` сообщает о загрузке истории. `historyError`
50
+ показывает ошибку запроса истории, а `historyDeleting` блокирует кнопку удаления
51
+ соответствующей записи до ответа.
52
+
53
+ При отправке непустого значения компонент удаляет внешние пробелы и вызывает
54
+ `onSearch` с полученным текстом. Компонент сам не переходит на другую страницу и
55
+ не отправляет API-запрос. `disabled` блокирует ввод и отправку. `label` задаёт
56
+ подсказку и доступное имя поля, а `buttonLabel` — имя кнопки отправки. Магазин
57
+ связывает эти обработчики с `profile_query_search`, `profile_search_update` и
58
+ `profile_search_delete`; переход и отправка запросов остаются в приложении.
59
+
60
+ ### Свойства
61
+
62
+ | Свойство | Назначение |
63
+ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
64
+ | `label?: string` | Подсказка и доступное имя поля поиска. |
65
+ | `buttonLabel?: string` | Доступное имя кнопки отправки. |
66
+ | `disabled?: boolean` | Блокирует ввод, отправку и действия с сохранёнными запросами. |
67
+ | `history?: readonly MainSearchHistoryItem[]` | Сохранённые запросы, показанные при фокусе в поле. `id` содержит ID записи, `q` — запрос. |
68
+ | `historyPending?: boolean` | Заменяет список сохранённых запросов сообщением о загрузке. |
69
+ | `historyError?: string` | Сообщение об ошибке запроса истории. Пустая строка скрывает сообщение. |
70
+ | `historyDeleting?: readonly number[]` | ID записей, удаление которых ожидает ответа. Их кнопки удаления недоступны. |
71
+ | `onSearch?: (query: string) => void` | Передаёт непустой поисковый текст без пробелов по краям при отправке формы или текст выбранной записи истории. Перед вызовом список истории закрывается. |
72
+ | `onHistorySearch?: (query: string) => void` | Получает текст поля без пробелов по краям при фокусе или вводе. Пустая строка запрашивает последние сохранённые запросы. Приложение загружает и передаёт `history`. |
73
+ | `onHistoryDelete?: (id: number) => void` | Передаёт ID записи при нажатии её кнопки удаления. Приложение удаляет запись и передаёт обновлённую историю. |