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,67 @@
1
+ # ProductSecondaryVariantModal
2
+
3
+ ## English
4
+
5
+ Opens a focused dialog for a product's additional variant choices. The
6
+ `variantId` identifies the selected main variant; the product store supplies
7
+ the matching secondary options or their loading and error state.
8
+ `onChangePrimary` requests another main choice and `onRetry` requests the
9
+ secondary options again. In `purchaseMode`, choosing a secondary product
10
+ shows its cart, availability or preorder action. The component emits the
11
+ selected product through `onSelect` before the requested purchase action.
12
+ `onClose` dismisses the dialog and returns focus to the opener. Changing
13
+ `modal` while the dialog is open switches it in place and keeps the focus on
14
+ the control the visitor is on.
15
+
16
+ ### Props
17
+
18
+ | Prop | Meaning |
19
+ | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
20
+ | `productId: number` | ID of the product handled by ProductSecondaryVariantModal. |
21
+ | `collection?: OrionplaceProductCollection` | Product-store collection used to resolve the supplied product ID. |
22
+ | `variantId: number` | ID of the variant handled by ProductSecondaryVariantModal. |
23
+ | `purchaseMode?: boolean` | Selects the supported purchase flow for this product action. |
24
+ | `actionsDisabled?: boolean` | Disables product actions while the surrounding flow is busy. |
25
+ | `modal?: boolean` | `true` (default) opens a modal window over the page; `false` shows a nonmodal window in its container, without locking scrolling or moving focus. |
26
+ | `onChangePrimary?: (variant: IProductVariantValue) => void` | Called when the visitor changes the primary selection. The callback payload is shown in its type. |
27
+ | `onSelect?: (variant: IProductSecondaryVariant) => void` | Called when the visitor chooses the component’s primary item. The callback payload is shown in its type. |
28
+ | `onRetry?: () => void` | Called when the visitor retries the failed request. The callback has no payload. |
29
+ | `onClose?: () => void` | Called when the visitor closes the panel or dialog. The callback has no payload. |
30
+ | `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. |
31
+ | `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. |
32
+ | `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. |
33
+ | `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. |
34
+ | `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. |
35
+
36
+ ## Русский
37
+
38
+ Открывает диалог для выбора дополнительного варианта товара. `variantId`
39
+ задаёт выбранный основной вариант; хранилище товаров предоставляет
40
+ соответствующие дополнительные варианты или состояние загрузки и ошибки.
41
+ `onChangePrimary` запрашивает другое основное значение, а `onRetry` повторяет
42
+ запрос дополнительных вариантов. В режиме `purchaseMode` после выбора
43
+ товара появляются доступные для него действия: корзина, уведомление или
44
+ предзаказ. `onSelect` передаёт выбранный товар перед действием покупки.
45
+ `onClose` закрывает диалог и возвращает фокус на кнопку, которая его открыла.
46
+ Если изменить `modal`, пока диалог открыт, он переключается на месте, а фокус
47
+ остаётся на элементе, с которым работает посетитель.
48
+
49
+ ### Свойства
50
+
51
+ | Свойство | Назначение |
52
+ | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
53
+ | `productId: number` | ID товара, с которым работает ProductSecondaryVariantModal. |
54
+ | `collection?: OrionplaceProductCollection` | Коллекция store товаров, в которой компонент ищет переданный ID товара. |
55
+ | `variantId: number` | ID варианта товара, с которым работает ProductSecondaryVariantModal. |
56
+ | `purchaseMode?: boolean` | Выбирает поддерживаемый сценарий покупки товара. |
57
+ | `actionsDisabled?: boolean` | Блокирует действия с товаром, пока внешний сценарий занят. |
58
+ | `modal?: boolean` | `true` (по умолчанию) открывает модальное окно поверх страницы; `false` показывает немодальное окно в своём контейнере, без блокировки прокрутки и переноса фокуса. |
59
+ | `onChangePrimary?: (variant: IProductVariantValue) => void` | Вызывается, когда покупатель меняет основной выбор. Данные обработчика указаны в его типе. |
60
+ | `onSelect?: (variant: IProductSecondaryVariant) => void` | Вызывается, когда покупатель выбирает основной элемент компонента. Данные обработчика указаны в его типе. |
61
+ | `onRetry?: () => void` | Вызывается, когда покупатель повторяет неудачный запрос. Обработчик не получает данные. |
62
+ | `onClose?: () => void` | Вызывается, когда покупатель закрывает панель или диалог. Обработчик не получает данные. |
63
+ | `onAdd?: (selection: ProductActionSelection & { quantity: number; }) => void` | Передаёт `product` — ID товара и `quantity` — запрошенное итоговое количество при добавлении или изменении количества. Приложение выполняет запрос и передаёт подтверждённые данные товара. |
64
+ | `onRemove?: (selection: ProductActionSelection & { cartItem: number; }) => void` | Передаёт ID товара в `product` и ID позиции корзины в `cartItem` при удалении последней единицы. Приложение удаляет эту позицию и передаёт подтверждённые данные товара. |
65
+ | `onSubscribe?: (selection: ProductActionSelection) => void` | Передаёт ID товара в `product` при выборе уведомления о поступлении. Приложение выполняет вход, если он нужен, отправляет запрос и обновляет состояние подписки. |
66
+ | `onUnsubscribe?: (selection: ProductActionSelection) => void` | Передаёт ID товара в `product` при отмене уведомления о поступлении. Приложение отправляет запрос и передаёт подтверждённое состояние подписки. |
67
+ | `onPreorder?: (selection: ProductActionSelection) => void` | Передаёт ID товара в `product` при выборе предзаказа. Приложение собирает необходимые контактные данные и отправляет запрос. |
@@ -0,0 +1,79 @@
1
+ .modal {
2
+ box-sizing: border-box;
3
+ width: 440px;
4
+ max-width: calc(100vw - 32px);
5
+ max-height: calc(100dvh - 32px);
6
+ margin: auto;
7
+ padding: 24px;
8
+ overflow: auto;
9
+ border: 1px solid var(--orionplace-border);
10
+ background: var(--orionplace-surface);
11
+ color: var(--orionplace-text);
12
+ }
13
+ .modal::backdrop { background: #0006; backdrop-filter: blur(2px); }
14
+ .inline { position: relative; width: 100%; max-width: 100%; max-height: none; margin: 0; }
15
+ .header { display: flex; align-items: start; justify-content: space-between; gap: 16px; margin-bottom: 20px; }
16
+ .header h3 { margin: 0; font-size: 14px; line-height: calc(20 / 14); font-weight: 500; text-transform: uppercase; letter-spacing: .08em; }
17
+ .header button { display: grid; width: 36px; height: 36px; flex-shrink: 0; place-items: center; padding: 0; border: 0; background: transparent; color: inherit; font-size: 20px; line-height: 28px; cursor: pointer; outline: none; }
18
+ .header button:focus-visible { background: var(--orionplace-hover); }
19
+ @media (hover: hover) {
20
+ .header button:hover {
21
+ background: var(--orionplace-hover);
22
+ }
23
+ }
24
+ .product { display: flex; align-items: center; gap: 12px; min-width: 0; margin-bottom: 20px; }
25
+ .product img { width: 64px; height: 80px; flex-shrink: 0; object-fit: contain; }
26
+ .product p { margin: 0; min-width: 0; overflow-wrap: anywhere; font-size: 14px; line-height: calc(20 / 14); }
27
+ .group { display: grid; gap: 8px; }
28
+ .group p { margin: 0; color: var(--orionplace-muted); font-size: 11px; line-height: 16px; text-transform: uppercase; letter-spacing: .08em; }
29
+ .choices { display: flex; flex-wrap: wrap; gap: 8px; }
30
+ .choice {
31
+ display: inline-flex;
32
+ align-items: center;
33
+ gap: 8px;
34
+ min-height: 36px;
35
+ max-width: 100%;
36
+ padding: 0 12px;
37
+ border: 1px solid var(--orionplace-border);
38
+ background: var(--orionplace-surface);
39
+ color: var(--orionplace-muted);
40
+ font: inherit;
41
+ font-size: 12px;
42
+ line-height: calc(16 / 12);
43
+ cursor: pointer;
44
+ }
45
+ .choice[aria-pressed='true'] { border-color: var(--orionplace-text); color: var(--orionplace-text); }
46
+ .choice:focus-visible { border-color: var(--orionplace-text); outline: none; }
47
+ @media (hover: hover) {
48
+ .choice:hover {
49
+ border-color: var(--orionplace-text);
50
+ }
51
+ }
52
+ .choice:disabled { opacity: .4; cursor: default; }
53
+ .color { box-sizing: content-box; width: 12px; height: 12px; flex-shrink: 0; border-radius: 50%; border: 1px solid var(--orionplace-border); }
54
+ .state { min-height: 96px; margin-top: 20px; }
55
+ .notice { composes: notice from '../account/account.module.css'; }
56
+ .noticeError { composes: notice noticeError from '../account/account.module.css'; }
57
+ /* Retry is a text button, as in Nuxt and Svelte. */
58
+ .retry {
59
+ height: 36px;
60
+ margin-top: 12px;
61
+ padding: 0 16px;
62
+ border: 1px solid var(--orionplace-text);
63
+ background: var(--orionplace-surface);
64
+ color: var(--orionplace-text);
65
+ font: inherit;
66
+ font-size: 12px;
67
+ line-height: calc(16 / 12);
68
+ text-transform: uppercase;
69
+ letter-spacing: .08em;
70
+ cursor: pointer;
71
+ outline: none;
72
+ }
73
+ .retry:focus-visible { background: var(--orionplace-hover); }
74
+ @media (hover: hover) {
75
+ .retry:hover {
76
+ background: var(--orionplace-hover);
77
+ }
78
+ }
79
+ .screenReaderOnly { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
@@ -0,0 +1,324 @@
1
+ 'use client';
2
+
3
+ import '@/components/orionplace/shared/dialogs.css';
4
+
5
+ import { useEffect, useId, useRef, useState } from 'react';
6
+ import type { MouseEvent } from 'react';
7
+ import {
8
+ useOrionplaceProducts,
9
+ useOrionplaceProductsStore,
10
+ useOrionplaceSelections,
11
+ } from '@/providers/OrionplaceProvider';
12
+ import type {
13
+ IProductSecondaryVariant,
14
+ IProductVariantValue,
15
+ } from '@/interfaces/orionplace/products/IProduct';
16
+ import type { OrionplaceProductCollection } from '@/stores/orionplaceProducts';
17
+ import {
18
+ getAvailableNestedValueFromObject,
19
+ getAvailableValueFromObject,
20
+ } from '@/lib/orionplace/presentation';
21
+ import { productLabels } from '@/lib/orionplace/productLabels';
22
+ import { useDialogLayoutEffect } from '@/hooks/useOrionplaceDialog';
23
+ import {
24
+ createPageScrollLock,
25
+ focusedElement,
26
+ restoreFocus,
27
+ } from '@/lib/orionplace/modalWindow';
28
+ import { OrionplaceImage } from '@/components/orionplace/shared/OrionplaceImage';
29
+ import { ProductCardActions } from './ProductCardActions';
30
+ import type { ProductActionSelection } from './ProductCardActions';
31
+ import styles from './ProductSecondaryVariantModal.module.css';
32
+
33
+ export interface ProductSecondaryVariantModalProps {
34
+ productId: number;
35
+ collection?: OrionplaceProductCollection;
36
+ variantId: number;
37
+ purchaseMode?: boolean;
38
+ /** `false` shows the window in the page flow, without blocking the page. */
39
+ modal?: boolean;
40
+ actionsDisabled?: boolean;
41
+ onChangePrimary?: (variant: IProductVariantValue) => void;
42
+ onSelect?: (variant: IProductSecondaryVariant) => void;
43
+ onRetry?: () => void;
44
+ onClose?: () => void;
45
+ onAdd?: (selection: ProductActionSelection & { quantity: number }) => void;
46
+ onRemove?: (selection: ProductActionSelection & { cartItem: number }) => void;
47
+ onSubscribe?: (selection: ProductActionSelection) => void;
48
+ onUnsubscribe?: (selection: ProductActionSelection) => void;
49
+ onPreorder?: (selection: ProductActionSelection) => void;
50
+ }
51
+
52
+ export function ProductSecondaryVariantModal({
53
+ productId,
54
+ collection = 'products',
55
+ variantId,
56
+ purchaseMode = false,
57
+ modal = true,
58
+ actionsDisabled = false,
59
+ onChangePrimary,
60
+ onSelect,
61
+ onRetry,
62
+ onClose,
63
+ onAdd,
64
+ onRemove,
65
+ onSubscribe,
66
+ onUnsubscribe,
67
+ onPreorder,
68
+ }: ProductSecondaryVariantModalProps) {
69
+ const id = useId();
70
+ const dialog = useRef<HTMLDialogElement>(null);
71
+ const closeButton = useRef<HTMLButtonElement>(null);
72
+ const opener = useRef<HTMLElement | undefined>(undefined);
73
+ const [pageScroll] = useState(() => createPageScrollLock());
74
+ const store = useOrionplaceProductsStore();
75
+ const [selected, setSelected] = useState<IProductSecondaryVariant>();
76
+ const localeCode = useOrionplaceSelections((state) => state.localeCode);
77
+ const product = useOrionplaceProducts((state) => {
78
+ const currentId = selected?.product.id ?? productId;
79
+ const base = collection === 'featured' ? state.init?.featured : state.init?.products;
80
+ return state.updates[collection][currentId] ??
81
+ base?.find((item) => item.id === currentId);
82
+ });
83
+ const state = useOrionplaceProducts((current) => current.secondaryVariants[
84
+ `${product?.product_group_id ?? 0}:${variantId}`
85
+ ]);
86
+ const copy = productLabels(localeCode);
87
+ const primary = product?.variants.main_variant;
88
+ const productName = getAvailableNestedValueFromObject(
89
+ product?.locale,
90
+ localeCode,
91
+ 'product_name',
92
+ ) || '';
93
+ const primaryName = getAvailableValueFromObject(
94
+ primary?.locale,
95
+ localeCode,
96
+ ) || copy.variants;
97
+ const secondaryName = getAvailableValueFromObject(
98
+ state?.data?.secondary.locale,
99
+ localeCode,
100
+ ) || copy.secondary;
101
+
102
+ // The window opens when it mounts. The element with the focus outside the
103
+ // window is its opener: a modal window gives it the focus back when it
104
+ // closes. The host can switch between the modal and the inline window
105
+ // while it is open; the focus then stays on the control the visitor is
106
+ // on.
107
+ useDialogLayoutEffect(() => {
108
+ const node = dialog.current;
109
+ if (!node || typeof document === 'undefined') {
110
+ return;
111
+ }
112
+ const switching = node.open && pageScroll.locked !== modal;
113
+ const focused = focusedElement();
114
+ const inside =
115
+ focused && node.contains(focused) ? focused : undefined;
116
+ if (!inside) {
117
+ opener.current = focused;
118
+ }
119
+ node.close();
120
+ if (modal) {
121
+ pageScroll.lock();
122
+ node.showModal();
123
+ } else {
124
+ // Inline, the window stays in the page flow: the page keeps scrolling
125
+ // and focus stays where it is (opened by its attribute, as show()
126
+ // would move focus into it).
127
+ pageScroll.unlock();
128
+ node.setAttribute('open', '');
129
+ }
130
+ if (switching && inside) {
131
+ restoreFocus(inside, { reveal: true });
132
+ } else if (modal) {
133
+ closeButton.current?.focus({ preventScroll: true });
134
+ }
135
+ }, [modal]);
136
+
137
+ // Unmounting closes the window as a close does.
138
+ useDialogLayoutEffect(() => {
139
+ const node = dialog.current;
140
+
141
+ return () => {
142
+ node?.close();
143
+ if (pageScroll.locked) {
144
+ pageScroll.unlock();
145
+ restoreFocus(opener.current);
146
+ }
147
+ };
148
+ }, [pageScroll]);
149
+
150
+ useEffect(() => {
151
+ setSelected(undefined);
152
+ }, [variantId]);
153
+
154
+ function variantName(value: { id: number; locale: Record<string, string> }) {
155
+ return getAvailableValueFromObject(value.locale, localeCode) || String(value.id);
156
+ }
157
+
158
+ function selectOption(option: IProductSecondaryVariant) {
159
+ if (!purchaseMode) {
160
+ onSelect?.(option);
161
+ return;
162
+ }
163
+ const target = store.getState().getProduct(option.product.id, collection) ??
164
+ option.product;
165
+ store.getState().setProduct(target, collection);
166
+ setSelected(option);
167
+ }
168
+
169
+ function confirm<T extends ProductActionSelection>(
170
+ selection: T,
171
+ callback?: (value: T) => void,
172
+ ) {
173
+ if (selected && !actionsDisabled) {
174
+ onSelect?.(selected);
175
+ callback?.(selection);
176
+ }
177
+ }
178
+
179
+ function onBackdropClick(event: MouseEvent<HTMLDialogElement>) {
180
+ const bounds = dialog.current?.getBoundingClientRect();
181
+ if (
182
+ event.target === dialog.current && bounds &&
183
+ (event.clientX < bounds.left || event.clientX > bounds.right ||
184
+ event.clientY < bounds.top || event.clientY > bounds.bottom)
185
+ ) {
186
+ onClose?.();
187
+ }
188
+ }
189
+
190
+ return (
191
+ <dialog
192
+ data-stable-modal="fit"
193
+ ref={dialog}
194
+ aria-labelledby={`${id}-title`}
195
+ className={`${styles.modal} ${modal ? '' : styles.inline}`.trim()}
196
+ data-product-part="ProductSecondaryVariantModal"
197
+ data-secondary-variant-modal
198
+ onKeyDown={(event) => {
199
+ // Escape belongs to this window, not to the page behind it.
200
+ if (event.key === 'Escape') {
201
+ event.stopPropagation();
202
+ }
203
+ }}
204
+ onCancel={(event) => {
205
+ event.preventDefault();
206
+ onClose?.();
207
+ }}
208
+ onClick={onBackdropClick}
209
+ >
210
+ <header className={styles.header}>
211
+ <h3 id={`${id}-title`}>{copy.chooseVariant}</h3>
212
+ <button
213
+ ref={closeButton}
214
+ type="button"
215
+ aria-label={copy.closeVariants}
216
+ onClick={() => onClose?.()}
217
+ >
218
+ <span aria-hidden="true">×</span>
219
+ </button>
220
+ </header>
221
+ {product && (
222
+ <div className={styles.product}>
223
+ <OrionplaceImage
224
+ src={product.images?.small[0] || product.images?.full[0]}
225
+ alt={productName}
226
+ loading="lazy"
227
+ />
228
+ <p>{productName}</p>
229
+ </div>
230
+ )}
231
+ {primary && (
232
+ <div role="group" aria-label={primaryName} className={styles.group}>
233
+ <p>{primaryName}</p>
234
+ <div className={styles.choices}>
235
+ {primary.value.map((value) => (
236
+ <button
237
+ key={value.id}
238
+ type="button"
239
+ disabled={!validId(value.reload_product) || !validId(value.id)}
240
+ aria-pressed={value.id === variantId}
241
+ data-modal-primary={value.id}
242
+ className={styles.choice}
243
+ onClick={() => onChangePrimary?.(value)}
244
+ >
245
+ {primary.is_color && value.color && (
246
+ <span
247
+ className={styles.color}
248
+ style={{ backgroundColor: value.color }}
249
+ aria-hidden="true"
250
+ />
251
+ )}
252
+ {variantName(value)}
253
+ </button>
254
+ ))}
255
+ </div>
256
+ </div>
257
+ )}
258
+ <div className={styles.state} aria-busy={!state || state.status === 'loading'} aria-live="polite">
259
+ {!state || state.status === 'loading' ? (
260
+ <p role="status" className="op-feature-loading">
261
+ <span className={styles.screenReaderOnly}>{copy.loadingVariants}</span>
262
+ </p>
263
+ ) : state.status === 'failed' || state.status === 'unavailable' ? (
264
+ <div>
265
+ <p
266
+ role="alert"
267
+ className={state.status === 'failed' ? styles.noticeError : styles.notice}
268
+ >
269
+ {state.status === 'failed' ? copy.variantsFailed : copy.variantsUnavailable}
270
+ </p>
271
+ <button type="button" className={styles.retry} onClick={() => onRetry?.()}>
272
+ {copy.retryVariants}
273
+ </button>
274
+ </div>
275
+ ) : state.data?.variants.length ? (
276
+ <div role="group" aria-label={secondaryName} className={styles.group}>
277
+ <p>{secondaryName}</p>
278
+ <div className={styles.choices}>
279
+ {state.data.variants.map((option) => (
280
+ <button
281
+ key={option.product.id}
282
+ type="button"
283
+ disabled={!validId(option.product.id)}
284
+ aria-pressed={option.product.id === (selected?.product.id ?? productId)}
285
+ data-modal-secondary={option.product.id}
286
+ className={styles.choice}
287
+ onClick={() => selectOption(option)}
288
+ >
289
+ {state.data?.secondary.is_color && option.value.color && (
290
+ <span
291
+ className={styles.color}
292
+ style={{ backgroundColor: option.value.color }}
293
+ aria-hidden="true"
294
+ />
295
+ )}
296
+ {variantName(option.value)}
297
+ </button>
298
+ ))}
299
+ </div>
300
+ </div>
301
+ ) : (
302
+ <p role="status">{copy.variantsEmpty}</p>
303
+ )}
304
+ </div>
305
+ {purchaseMode && selected && (
306
+ <ProductCardActions
307
+ productId={selected.product.id}
308
+ collection={collection}
309
+ disabled={actionsDisabled}
310
+ variantSelectionResolved
311
+ onAdd={(value) => confirm(value, onAdd)}
312
+ onRemove={(value) => confirm(value, onRemove)}
313
+ onSubscribe={(value) => confirm(value, onSubscribe)}
314
+ onUnsubscribe={(value) => confirm(value, onUnsubscribe)}
315
+ onPreorder={(value) => confirm(value, onPreorder)}
316
+ />
317
+ )}
318
+ </dialog>
319
+ );
320
+ }
321
+
322
+ function validId(value: number | null | undefined) {
323
+ return Number.isInteger(value) && Number(value) > 0;
324
+ }
@@ -0,0 +1,52 @@
1
+ # ProductSpecificationsDialog · React
2
+
3
+ ## English
4
+
5
+ `ProductSpecificationsDialog` displays the finished characteristic groups that
6
+ the product page already localized and formatted. A group with an empty title
7
+ has no heading. Each row shows its label and multiline value. A row with `to`
8
+ uses that pathname and query as a Next.js link and calls `onClose` when chosen.
9
+ The component sends no request.
10
+
11
+ Mounting opens a native modal dialog, locks document scrolling while preserving
12
+ the scrollbar gutter, and keeps long groups in an internal scrolling area.
13
+ Escape, the close button, a backdrop click and a row link call `onClose`; the
14
+ parent removes the component, which restores page scrolling and returns focus
15
+ to the opener.
16
+
17
+ Source is maintained in
18
+ `components/orionplace/products/ProductSpecificationsDialog.tsx`; row and group
19
+ interfaces are in
20
+ `interfaces/orionplace/products/IProductSpecification.ts`.
21
+
22
+ ### Props
23
+
24
+ | Prop | Meaning |
25
+ | -------------------------------------- | -------------------------------------------------------------------------------- |
26
+ | `groups: IProductSpecificationGroup[]` | Finished specification groups shown in the dialog. |
27
+ | `onClose?: () => void` | Called when the visitor closes the panel or dialog. The callback has no payload. |
28
+
29
+ ## Русский
30
+
31
+ `ProductSpecificationsDialog` показывает готовые группы характеристик,
32
+ которые страница товара уже локализовала и отформатировала. У группы с пустым
33
+ названием нет заголовка. В строке видны название и многострочное значение.
34
+ Строка с `to` использует этот путь и параметры как ссылку Next.js и вызывает
35
+ `onClose` при выборе. Компонент не отправляет запросы.
36
+
37
+ При монтировании открывается нативное модальное окно. Оно блокирует прокрутку
38
+ документа, сохраняет место полосы прокрутки и показывает длинные группы во
39
+ внутренней прокручиваемой области. Escape, кнопка закрытия, щелчок по фону и
40
+ ссылка в строке вызывают `onClose`; родитель удаляет компонент, после чего
41
+ прокрутка страницы и фокус возвращаются.
42
+
43
+ Исходный файл:
44
+ `components/orionplace/products/ProductSpecificationsDialog.tsx`; интерфейсы строк и групп
45
+ находятся в `interfaces/orionplace/products/IProductSpecification.ts`.
46
+
47
+ ### Свойства
48
+
49
+ | Свойство | Назначение |
50
+ | -------------------------------------- | ---------------------------------------------------------------------------------------- |
51
+ | `groups: IProductSpecificationGroup[]` | Заполненные группы характеристик в диалоге. |
52
+ | `onClose?: () => void` | Вызывается, когда покупатель закрывает панель или диалог. Обработчик не получает данные. |
@@ -0,0 +1,138 @@
1
+ .dialog {
2
+ width: calc(100vw - 2rem);
3
+ max-width: 40rem;
4
+ max-height: calc(100dvh - 2rem);
5
+ box-sizing: border-box;
6
+ margin: auto;
7
+ overflow: hidden;
8
+ padding: 0;
9
+ border: 1px solid var(--orionplace-border);
10
+ border-radius: 0;
11
+ color: var(--orionplace-text);
12
+ background: var(--orionplace-surface);
13
+ font: inherit;
14
+ }
15
+
16
+ .dialog::backdrop {
17
+ background: rgb(0 0 0 / 35%);
18
+ backdrop-filter: blur(2px);
19
+ }
20
+
21
+ .layout {
22
+ display: flex;
23
+ height: 100%;
24
+ min-height: 0;
25
+ flex-direction: column;
26
+ }
27
+
28
+ .layout > header {
29
+ display: flex;
30
+ flex-shrink: 0;
31
+ align-items: center;
32
+ justify-content: space-between;
33
+ gap: 1rem;
34
+ padding: 0.5rem 0.5rem 0.5rem 1rem;
35
+ border-bottom: 1px solid var(--orionplace-border);
36
+ }
37
+
38
+ .layout h2 {
39
+ margin: 0;
40
+ font-size: 0.75rem;
41
+ line-height: calc(1 / 0.75);
42
+ font-weight: 500;
43
+ letter-spacing: 0.08em;
44
+ text-transform: uppercase;
45
+ }
46
+
47
+ .layout > header button {
48
+ display: grid;
49
+ width: 2.5rem;
50
+ height: 2.5rem;
51
+ place-items: center;
52
+ padding: 0;
53
+ border: 0;
54
+ color: inherit;
55
+ background: transparent;
56
+ font: inherit;
57
+ font-size: 1.5rem;
58
+ line-height: calc(2 / 1.5);
59
+ cursor: pointer;
60
+ }
61
+
62
+ .layout > header button:focus-visible {
63
+ background: var(--orionplace-hover);
64
+ outline: none;
65
+ }
66
+
67
+ @media (hover: hover) {
68
+ .layout > header button:hover {
69
+ background: var(--orionplace-hover);
70
+ outline: none;
71
+ }
72
+ }
73
+
74
+ .body {
75
+ display: grid;
76
+ min-height: 0;
77
+ flex: 1;
78
+ align-content: start;
79
+ gap: 1rem;
80
+ overflow-y: auto;
81
+ padding: 0.75rem 1rem;
82
+ }
83
+
84
+ .group {
85
+ display: grid;
86
+ gap: 0.25rem;
87
+ }
88
+
89
+ .group h3 {
90
+ margin: 0;
91
+ color: var(--orionplace-muted);
92
+ font-size: 0.875rem;
93
+ line-height: calc(1.25 / 0.875);
94
+ font-weight: 400;
95
+ }
96
+
97
+ .group dl {
98
+ display: grid;
99
+ margin: 0;
100
+ }
101
+
102
+ .group dl > div {
103
+ display: grid;
104
+ grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
105
+ gap: 1rem;
106
+ padding: 0.625rem 0;
107
+ border-bottom: 1px solid var(--orionplace-border);
108
+ font-size: 0.875rem;
109
+ line-height: calc(1.25 / 0.875);
110
+ }
111
+
112
+ .group dt {
113
+ color: var(--orionplace-muted);
114
+ overflow-wrap: anywhere;
115
+ }
116
+
117
+ .group dd {
118
+ margin: 0;
119
+ overflow-wrap: anywhere;
120
+ white-space: pre-line;
121
+ }
122
+
123
+ .group a {
124
+ color: var(--orionplace-accent);
125
+ text-decoration: none;
126
+ }
127
+
128
+ .group a:focus-visible {
129
+ color: var(--orionplace-text);
130
+ outline: none;
131
+ }
132
+
133
+ @media (hover: hover) {
134
+ .group a:hover {
135
+ color: var(--orionplace-text);
136
+ outline: none;
137
+ }
138
+ }