orionplace-nuxt 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (520) hide show
  1. package/README.md +711 -24
  2. package/bin/orionplace-nuxt.mjs +39 -11
  3. package/package.json +26 -6
  4. package/runtime/api.mjs +4 -1
  5. package/runtime/domain.mjs +4 -2
  6. package/runtime/marketplace.mjs +287 -211
  7. package/src/asset-loading-plugin.mjs +10 -0
  8. package/src/module.mjs +44 -14
  9. package/src/project-readme.mjs +507 -35
  10. package/src/setup.mjs +100 -51
  11. package/src/update.mjs +36 -0
  12. package/src/validation.mjs +6 -0
  13. package/templates/.vscode/settings.json +5 -0
  14. package/templates/app/app.vue +48 -0
  15. package/templates/app/assets/css/orionplace-tokens.css +21 -0
  16. package/templates/app/assets/css/orionplace.css +28 -0
  17. package/templates/app/components/orionplace/account/AccountActivity.README.md +31 -0
  18. package/templates/app/components/orionplace/account/AccountActivity.vue +61 -0
  19. package/templates/app/components/orionplace/account/AccountPromocodes.README.md +50 -0
  20. package/templates/app/components/orionplace/account/AccountPromocodes.vue +267 -0
  21. package/templates/app/components/orionplace/account/AccountSection.README.md +31 -0
  22. package/templates/app/components/orionplace/account/AccountSection.vue +132 -0
  23. package/templates/app/components/orionplace/account/ProfileAvatar.vue +139 -0
  24. package/templates/app/components/orionplace/account/ProfileDeleteAccount.vue +161 -0
  25. package/templates/app/components/orionplace/account/ProfileDetailsForm.vue +172 -0
  26. package/templates/app/components/orionplace/account/ProfileEmailSettings.vue +269 -0
  27. package/templates/app/components/orionplace/account/ProfilePasswordForm.vue +201 -0
  28. package/templates/app/components/orionplace/account/ProfileSignIn.vue +446 -0
  29. package/templates/app/components/orionplace/account/SignInHistory.README.md +27 -0
  30. package/templates/app/components/orionplace/account/SignInHistory.vue +218 -0
  31. package/templates/app/components/orionplace/account/StorefrontLogout.README.md +15 -0
  32. package/templates/app/components/orionplace/account/StorefrontLogout.vue +109 -0
  33. package/templates/app/components/orionplace/account/StorefrontProfile.README.md +145 -0
  34. package/templates/app/components/orionplace/account/StorefrontProfile.vue +168 -0
  35. package/templates/app/components/orionplace/account/account.css +1047 -0
  36. package/templates/app/components/orionplace/account/profile.css +696 -0
  37. package/templates/app/components/orionplace/address/AddressForm.README.md +67 -0
  38. package/templates/app/components/orionplace/address/AddressForm.vue +537 -0
  39. package/templates/app/components/orionplace/address/StorefrontAddresses.README.md +44 -0
  40. package/templates/app/components/orionplace/address/StorefrontAddresses.vue +438 -0
  41. package/templates/app/components/orionplace/banners/MainBanner.vue +171 -0
  42. package/templates/app/components/orionplace/banners/examples/BannerExample.vue +6 -0
  43. package/templates/app/components/orionplace/blog/BlogArticle.README.md +44 -0
  44. package/templates/app/components/orionplace/blog/BlogArticle.vue +829 -0
  45. package/templates/app/components/orionplace/blog/BlogCommentForm.README.md +28 -0
  46. package/templates/app/components/orionplace/blog/BlogCommentForm.vue +129 -0
  47. package/templates/app/components/orionplace/blog/BlogComments.README.md +36 -0
  48. package/templates/app/components/orionplace/blog/BlogComments.vue +373 -0
  49. package/templates/app/components/orionplace/blog/BlogPostCard.vue +307 -0
  50. package/templates/app/components/orionplace/blog/BlogPostGroup.vue +108 -0
  51. package/templates/app/components/orionplace/blog/StorefrontJournal.README.md +42 -0
  52. package/templates/app/components/orionplace/blog/StorefrontJournal.vue +669 -0
  53. package/templates/app/components/orionplace/branding/BrandLogos.vue +25 -0
  54. package/templates/app/components/orionplace/branding/examples/BrandLogosExample.vue +6 -0
  55. package/templates/app/components/orionplace/cart/CartCheckoutDetails.README.md +81 -0
  56. package/templates/app/components/orionplace/cart/CartCheckoutDetails.vue +367 -0
  57. package/templates/app/components/orionplace/cart/CartDeliverySelector.README.md +95 -0
  58. package/templates/app/components/orionplace/cart/CartDeliverySelector.vue +724 -0
  59. package/templates/app/components/orionplace/cart/CartItemOptions.README.md +98 -0
  60. package/templates/app/components/orionplace/cart/CartItemOptions.vue +693 -0
  61. package/templates/app/components/orionplace/cart/CartLineItem.README.md +70 -0
  62. package/templates/app/components/orionplace/cart/CartLineItem.vue +271 -0
  63. package/templates/app/components/orionplace/cart/CartPreview.README.md +43 -0
  64. package/templates/app/components/orionplace/cart/CartPreview.vue +263 -0
  65. package/templates/app/components/orionplace/cart/DeliveryMap.README.md +48 -0
  66. package/templates/app/components/orionplace/cart/DeliveryMap.vue +155 -0
  67. package/templates/app/components/orionplace/cart/StorefrontCart.README.md +89 -0
  68. package/templates/app/components/orionplace/cart/StorefrontCart.vue +689 -0
  69. package/templates/app/components/orionplace/catalog/CatalogHeader.vue +681 -0
  70. package/templates/app/components/orionplace/catalog/CatalogRepresentative.vue +59 -0
  71. package/templates/app/components/orionplace/catalog/StorefrontCatalog.README.md +35 -0
  72. package/templates/app/components/orionplace/catalog/StorefrontCatalog.vue +179 -0
  73. package/templates/app/components/orionplace/catalog/examples/CatalogHeaderExample.vue +6 -0
  74. package/templates/app/components/orionplace/categories/CategoryGroup.vue +125 -0
  75. package/templates/app/components/orionplace/categories/StorefrontCategory.README.md +60 -0
  76. package/templates/app/components/orionplace/categories/StorefrontCategory.vue +277 -0
  77. package/templates/app/components/orionplace/categories/examples/CategoryGroupExample.vue +7 -0
  78. package/templates/app/components/orionplace/contact/AboutPage.README.md +23 -0
  79. package/templates/app/components/orionplace/contact/AboutPage.vue +409 -0
  80. package/templates/app/components/orionplace/contact/ContactForm.README.md +29 -0
  81. package/templates/app/components/orionplace/contact/ContactForm.vue +289 -0
  82. package/templates/app/components/orionplace/contact/EmailUnsubscribe.README.md +27 -0
  83. package/templates/app/components/orionplace/contact/EmailUnsubscribe.vue +95 -0
  84. package/templates/app/components/orionplace/contact/StorefrontContact.README.md +18 -0
  85. package/templates/app/components/orionplace/contact/StorefrontContact.vue +89 -0
  86. package/templates/app/components/orionplace/contact/examples/ContactExample.vue +6 -0
  87. package/templates/app/components/orionplace/currencies/MainCurrencySwitcher.vue +80 -0
  88. package/templates/app/components/orionplace/currencies/examples/CurrencyExample.vue +6 -0
  89. package/templates/app/components/orionplace/events/EventEnrollmentDialog.README.md +58 -0
  90. package/templates/app/components/orionplace/events/EventEnrollmentDialog.vue +294 -0
  91. package/templates/app/components/orionplace/events/EventsBlock.vue +138 -0
  92. package/templates/app/components/orionplace/events/examples/EventsExample.vue +6 -0
  93. package/templates/app/components/orionplace/locale/MainLanguageSwitcher.vue +506 -0
  94. package/templates/app/components/orionplace/locale/examples/LocaleExample.vue +6 -0
  95. package/templates/app/components/orionplace/manufacturers/ManufacturerIndex.README.md +36 -0
  96. package/templates/app/components/orionplace/manufacturers/ManufacturerIndex.vue +495 -0
  97. package/templates/app/components/orionplace/manufacturers/StorefrontManufacturers.README.md +30 -0
  98. package/templates/app/components/orionplace/manufacturers/StorefrontManufacturers.vue +263 -0
  99. package/templates/app/components/orionplace/orders/OrderDetails.README.md +39 -0
  100. package/templates/app/components/orionplace/orders/OrderDetails.vue +1074 -0
  101. package/templates/app/components/orionplace/orders/OrderPaymentForm.README.md +59 -0
  102. package/templates/app/components/orionplace/orders/OrderPaymentForm.vue +73 -0
  103. package/templates/app/components/orionplace/orders/StorefrontOrders.README.md +39 -0
  104. package/templates/app/components/orionplace/orders/StorefrontOrders.vue +869 -0
  105. package/templates/app/components/orionplace/orders/orders.css +612 -0
  106. package/templates/app/components/orionplace/payments/PaymentPanel.README.md +76 -0
  107. package/templates/app/components/orionplace/payments/PaymentPanel.vue +108 -0
  108. package/templates/app/components/orionplace/products/HoverImageViewer.vue +190 -0
  109. package/templates/app/components/orionplace/products/ProductCard.README.md +63 -0
  110. package/templates/app/components/orionplace/products/ProductCard.vue +897 -0
  111. package/templates/app/components/orionplace/products/ProductCardActions.README.md +33 -0
  112. package/templates/app/components/orionplace/products/ProductCardActions.vue +412 -0
  113. package/templates/app/components/orionplace/products/ProductCardBadges.vue +83 -0
  114. package/templates/app/components/orionplace/products/ProductCardDescription.vue +46 -0
  115. package/templates/app/components/orionplace/products/ProductCardFavorite.vue +99 -0
  116. package/templates/app/components/orionplace/products/ProductCardPrice.vue +66 -0
  117. package/templates/app/components/orionplace/products/ProductCardRating.vue +65 -0
  118. package/templates/app/components/orionplace/products/ProductCardSeller.vue +66 -0
  119. package/templates/app/components/orionplace/products/ProductCardStockNotice.vue +43 -0
  120. package/templates/app/components/orionplace/products/ProductCardTitle.vue +46 -0
  121. package/templates/app/components/orionplace/products/ProductCardVariants.vue +388 -0
  122. package/templates/app/components/orionplace/products/ProductGroup.vue +257 -0
  123. package/templates/app/components/orionplace/products/ProductPreorderDialog.README.md +22 -0
  124. package/templates/app/components/orionplace/products/ProductPreorderDialog.vue +471 -0
  125. package/templates/app/components/orionplace/products/ProductReviewForm.README.md +39 -0
  126. package/templates/app/components/orionplace/products/ProductReviewForm.vue +312 -0
  127. package/templates/app/components/orionplace/products/ProductReviewGallery.README.md +28 -0
  128. package/templates/app/components/orionplace/products/ProductReviewGallery.vue +141 -0
  129. package/templates/app/components/orionplace/products/ProductReviewImageViewer.README.md +51 -0
  130. package/templates/app/components/orionplace/products/ProductReviewImageViewer.vue +351 -0
  131. package/templates/app/components/orionplace/products/ProductReviews.README.md +70 -0
  132. package/templates/app/components/orionplace/products/ProductReviews.vue +1025 -0
  133. package/templates/app/components/orionplace/products/ProductSecondaryVariantModal.vue +460 -0
  134. package/templates/app/components/orionplace/products/ProductSpecificationsDialog.README.md +65 -0
  135. package/templates/app/components/orionplace/products/ProductSpecificationsDialog.vue +174 -0
  136. package/templates/app/components/orionplace/products/StorefrontProduct.README.md +52 -0
  137. package/templates/app/components/orionplace/products/StorefrontProduct.vue +1466 -0
  138. package/templates/app/components/orionplace/products/StorefrontWishlist.README.md +33 -0
  139. package/templates/app/components/orionplace/products/StorefrontWishlist.vue +290 -0
  140. package/templates/app/components/orionplace/products/examples/FeaturedExample.vue +6 -0
  141. package/templates/app/components/orionplace/products/examples/FeaturedHoverImageViewerExample.vue +14 -0
  142. package/templates/app/components/orionplace/products/examples/FeaturedProductCardActionsExample.vue +14 -0
  143. package/templates/app/components/orionplace/products/examples/FeaturedProductCardBadgesExample.vue +14 -0
  144. package/templates/app/components/orionplace/products/examples/FeaturedProductCardDescriptionExample.vue +14 -0
  145. package/templates/app/components/orionplace/products/examples/FeaturedProductCardExample.vue +14 -0
  146. package/templates/app/components/orionplace/products/examples/FeaturedProductCardFavoriteExample.vue +14 -0
  147. package/templates/app/components/orionplace/products/examples/FeaturedProductCardPriceExample.vue +14 -0
  148. package/templates/app/components/orionplace/products/examples/FeaturedProductCardRatingExample.vue +14 -0
  149. package/templates/app/components/orionplace/products/examples/FeaturedProductCardSellerExample.vue +14 -0
  150. package/templates/app/components/orionplace/products/examples/FeaturedProductCardStockNoticeExample.vue +14 -0
  151. package/templates/app/components/orionplace/products/examples/FeaturedProductCardTitleExample.vue +14 -0
  152. package/templates/app/components/orionplace/products/examples/FeaturedProductCardVariantsExample.vue +14 -0
  153. package/templates/app/components/orionplace/products/examples/ProductsExample.vue +6 -0
  154. package/templates/app/components/orionplace/products/examples/ProductsHoverImageViewerExample.vue +13 -0
  155. package/templates/app/components/orionplace/products/examples/ProductsProductCardActionsExample.vue +13 -0
  156. package/templates/app/components/orionplace/products/examples/ProductsProductCardBadgesExample.vue +13 -0
  157. package/templates/app/components/orionplace/products/examples/ProductsProductCardDescriptionExample.vue +13 -0
  158. package/templates/app/components/orionplace/products/examples/ProductsProductCardExample.vue +13 -0
  159. package/templates/app/components/orionplace/products/examples/ProductsProductCardFavoriteExample.vue +13 -0
  160. package/templates/app/components/orionplace/products/examples/ProductsProductCardPriceExample.vue +13 -0
  161. package/templates/app/components/orionplace/products/examples/ProductsProductCardRatingExample.vue +13 -0
  162. package/templates/app/components/orionplace/products/examples/ProductsProductCardSellerExample.vue +13 -0
  163. package/templates/app/components/orionplace/products/examples/ProductsProductCardStockNoticeExample.vue +13 -0
  164. package/templates/app/components/orionplace/products/examples/ProductsProductCardTitleExample.vue +13 -0
  165. package/templates/app/components/orionplace/products/examples/ProductsProductCardVariantsExample.vue +13 -0
  166. package/templates/app/components/orionplace/promo/PromoProducts.README.md +45 -0
  167. package/templates/app/components/orionplace/promo/PromoProducts.vue +287 -0
  168. package/templates/app/components/orionplace/search/MainSearch.vue +342 -0
  169. package/templates/app/components/orionplace/search/ProductSearchResults.README.md +81 -0
  170. package/templates/app/components/orionplace/search/ProductSearchResults.vue +458 -0
  171. package/templates/app/components/orionplace/search/SearchFilters.vue +546 -0
  172. package/templates/app/components/orionplace/search/examples/MainSearchExample.vue +6 -0
  173. package/templates/app/components/orionplace/sellers/SellerFilters.README.md +32 -0
  174. package/templates/app/components/orionplace/sellers/SellerFilters.vue +317 -0
  175. package/templates/app/components/orionplace/sellers/SellerPhotoGallery.README.md +45 -0
  176. package/templates/app/components/orionplace/sellers/SellerPhotoGallery.vue +406 -0
  177. package/templates/app/components/orionplace/sellers/SellerSummary.README.md +33 -0
  178. package/templates/app/components/orionplace/sellers/SellerSummary.vue +162 -0
  179. package/templates/app/components/orionplace/sellers/StorefrontSellers.README.md +73 -0
  180. package/templates/app/components/orionplace/sellers/StorefrontSellers.vue +300 -0
  181. package/templates/app/components/orionplace/shared/OrionplaceAvatar.README.md +30 -0
  182. package/templates/app/components/orionplace/shared/OrionplaceAvatar.vue +83 -0
  183. package/templates/app/components/orionplace/shared/OrionplaceBreadcrumbs.README.md +65 -0
  184. package/templates/app/components/orionplace/shared/OrionplaceBreadcrumbs.vue +118 -0
  185. package/templates/app/components/orionplace/shared/OrionplaceEmptyState.README.md +38 -0
  186. package/templates/app/components/orionplace/shared/OrionplaceEmptyState.vue +143 -0
  187. package/templates/app/components/orionplace/shared/OrionplaceImage.vue +84 -0
  188. package/templates/app/components/orionplace/shared/OrionplaceInfoHint.README.md +32 -0
  189. package/templates/app/components/orionplace/shared/OrionplaceInfoHint.vue +158 -0
  190. package/templates/app/components/orionplace/shared/OrionplacePasswordInput.README.md +30 -0
  191. package/templates/app/components/orionplace/shared/OrionplacePasswordInput.vue +197 -0
  192. package/templates/app/components/orionplace/shared/OrionplaceSearchSelect.README.md +38 -0
  193. package/templates/app/components/orionplace/shared/OrionplaceSearchSelect.vue +411 -0
  194. package/templates/app/components/orionplace/shared/OrionplaceSelect.README.md +31 -0
  195. package/templates/app/components/orionplace/shared/OrionplaceSelect.vue +525 -0
  196. package/templates/app/components/orionplace/shared/StorefrontErrorPage.README.md +55 -0
  197. package/templates/app/components/orionplace/shared/StorefrontErrorPage.vue +151 -0
  198. package/templates/app/components/orionplace/shared/StorefrontPagination.README.md +45 -0
  199. package/templates/app/components/orionplace/shared/StorefrontPagination.vue +101 -0
  200. package/templates/app/components/orionplace/shared/dialogs.css +36 -0
  201. package/templates/app/components/orionplace/shared/features.css +364 -0
  202. package/templates/app/components/orionplace/social/SocialLinks.vue +72 -0
  203. package/templates/app/components/orionplace/social/examples/SocialLinksExample.vue +6 -0
  204. package/templates/app/components/orionplace/storefront/StorefrontAccount.README.md +47 -0
  205. package/templates/app/components/orionplace/storefront/StorefrontAccount.vue +332 -0
  206. package/templates/app/components/orionplace/storefront/StorefrontCartButton.vue +68 -0
  207. package/templates/app/components/orionplace/storefront/StorefrontFooter.README.md +26 -0
  208. package/templates/app/components/orionplace/storefront/StorefrontFooter.vue +222 -0
  209. package/templates/app/components/orionplace/storefront/StorefrontHeader.README.md +93 -0
  210. package/templates/app/components/orionplace/storefront/StorefrontHeader.vue +509 -0
  211. package/templates/app/components/orionplace/storefront/StorefrontHome.README.md +79 -0
  212. package/templates/app/components/orionplace/storefront/StorefrontHome.vue +315 -0
  213. package/templates/app/components/orionplace/storefront/StorefrontWishlistButton.vue +105 -0
  214. package/templates/app/components/orionplace/storefront/examples/StorefrontAccountExample.vue +7 -0
  215. package/templates/app/components/orionplace/stores/StorefrontStores.README.md +41 -0
  216. package/templates/app/components/orionplace/stores/StorefrontStores.vue +345 -0
  217. package/templates/app/components/orionplace/subscriptions/StorefrontSubscriptions.README.md +151 -0
  218. package/templates/app/components/orionplace/subscriptions/StorefrontSubscriptions.vue +851 -0
  219. package/templates/app/components/orionplace/subscriptions/StorefrontTariff.README.md +38 -0
  220. package/templates/app/components/orionplace/subscriptions/StorefrontTariff.vue +535 -0
  221. package/templates/app/components/orionplace/subscriptions/StorefrontTariffs.README.md +36 -0
  222. package/templates/app/components/orionplace/subscriptions/StorefrontTariffs.vue +395 -0
  223. package/templates/app/components/orionplace/subscriptions/SubscriptionCancelDialog.README.md +39 -0
  224. package/templates/app/components/orionplace/subscriptions/SubscriptionCancelDialog.vue +292 -0
  225. package/templates/app/components/orionplace/subscriptions/SubscriptionChangeDialog.README.md +85 -0
  226. package/templates/app/components/orionplace/subscriptions/SubscriptionChangeDialog.vue +874 -0
  227. package/templates/app/components/orionplace/subscriptions/SubscriptionExtendDialog.README.md +53 -0
  228. package/templates/app/components/orionplace/subscriptions/SubscriptionExtendDialog.vue +536 -0
  229. package/templates/app/components/orionplace/subscriptions/SubscriptionPlanSummary.README.md +101 -0
  230. package/templates/app/components/orionplace/subscriptions/SubscriptionPlanSummary.vue +286 -0
  231. package/templates/app/components/orionplace/subscriptions/SubscriptionRemoteDetails.README.md +138 -0
  232. package/templates/app/components/orionplace/subscriptions/SubscriptionRemoteDetails.vue +134 -0
  233. package/templates/app/components/orionplace/subscriptions/SubscriptionRenewalDialog.README.md +85 -0
  234. package/templates/app/components/orionplace/subscriptions/SubscriptionRenewalDialog.vue +364 -0
  235. package/templates/app/components/orionplace/support/StorefrontSupport.README.md +39 -0
  236. package/templates/app/components/orionplace/support/StorefrontSupport.vue +484 -0
  237. package/templates/app/components/orionplace/support/TicketConversation.README.md +38 -0
  238. package/templates/app/components/orionplace/support/TicketConversation.vue +524 -0
  239. package/templates/app/components/orionplace/support/TicketImage.README.md +27 -0
  240. package/templates/app/components/orionplace/support/TicketImage.vue +186 -0
  241. package/templates/app/components/orionplace/support/TicketItemCard.README.md +59 -0
  242. package/templates/app/components/orionplace/support/TicketItemCard.vue +177 -0
  243. package/templates/app/components/orionplace/support/TicketMessageForm.README.md +35 -0
  244. package/templates/app/components/orionplace/support/TicketMessageForm.vue +258 -0
  245. package/templates/app/components/orionplace/support/TicketSubscriptionCard.README.md +40 -0
  246. package/templates/app/components/orionplace/support/TicketSubscriptionCard.vue +154 -0
  247. package/templates/app/components/orionplace/tariffs/TariffCard.README.md +12 -0
  248. package/templates/app/components/orionplace/tariffs/TariffCard.vue +241 -0
  249. package/templates/app/components/orionplace/tariffs/TariffCardDescription.README.md +12 -0
  250. package/templates/app/components/orionplace/tariffs/TariffCardDescription.vue +97 -0
  251. package/templates/app/components/orionplace/tariffs/TariffCardFeatures.README.md +14 -0
  252. package/templates/app/components/orionplace/tariffs/TariffCardFeatures.vue +172 -0
  253. package/templates/app/components/orionplace/tariffs/TariffCardImage.README.md +12 -0
  254. package/templates/app/components/orionplace/tariffs/TariffCardImage.vue +33 -0
  255. package/templates/app/components/orionplace/tariffs/TariffCardPrices.README.md +12 -0
  256. package/templates/app/components/orionplace/tariffs/TariffCardPrices.vue +280 -0
  257. package/templates/app/components/orionplace/tariffs/TariffCardTitle.README.md +12 -0
  258. package/templates/app/components/orionplace/tariffs/TariffCardTitle.vue +30 -0
  259. package/templates/app/components/orionplace/tariffs/TariffCards.README.md +12 -0
  260. package/templates/app/components/orionplace/tariffs/TariffCards.vue +94 -0
  261. package/templates/app/components/orionplace/tariffs/TariffSubscriptionModal.README.md +31 -0
  262. package/templates/app/components/orionplace/tariffs/TariffSubscriptionModal.vue +411 -0
  263. package/templates/app/components/orionplace/tariffs/examples/TariffCardDescriptionExample.vue +13 -0
  264. package/templates/app/components/orionplace/tariffs/examples/TariffCardExample.vue +13 -0
  265. package/templates/app/components/orionplace/tariffs/examples/TariffCardFeaturesExample.vue +14 -0
  266. package/templates/app/components/orionplace/tariffs/examples/TariffCardImageExample.vue +13 -0
  267. package/templates/app/components/orionplace/tariffs/examples/TariffCardPricesExample.vue +13 -0
  268. package/templates/app/components/orionplace/tariffs/examples/TariffCardTitleExample.vue +13 -0
  269. package/templates/app/components/orionplace/tariffs/examples/TariffCardsExample.vue +6 -0
  270. package/templates/app/components/orionplace/theme/OrionplaceThemeProvider.vue +38 -0
  271. package/templates/app/components/orionplace/units/UnitSwitcher.vue +71 -0
  272. package/templates/app/components/orionplace/units/examples/LengthExample.vue +6 -0
  273. package/templates/app/components/orionplace/units/examples/WeightExample.vue +6 -0
  274. package/templates/app/components/orionplace/wallet/StorefrontWallet.README.md +117 -0
  275. package/templates/app/components/orionplace/wallet/StorefrontWallet.vue +863 -0
  276. package/templates/app/components/orionplace/wallet/WalletBalance.vue +47 -0
  277. package/templates/app/components/orionplace/wallet/WalletTopUpForm.README.md +32 -0
  278. package/templates/app/components/orionplace/wallet/WalletTopUpForm.vue +224 -0
  279. package/templates/app/components/orionplace/wallet/examples/WalletExample.vue +6 -0
  280. package/templates/app/composables/useOrionplaceActionMenu.ts +126 -0
  281. package/templates/app/composables/useOrionplaceAddressEditor.ts +343 -0
  282. package/templates/app/composables/useOrionplaceAddresses.ts +75 -0
  283. package/templates/app/composables/useOrionplaceApi.ts +174 -0
  284. package/templates/app/composables/useOrionplaceAppLoad.ts +74 -0
  285. package/templates/app/composables/useOrionplaceBlogComments.ts +325 -0
  286. package/templates/app/composables/useOrionplaceBlogReading.ts +270 -0
  287. package/templates/app/composables/useOrionplaceCart.ts +226 -0
  288. package/templates/app/composables/useOrionplaceCartPreview.ts +142 -0
  289. package/templates/app/composables/useOrionplaceCategoryLink.ts +24 -0
  290. package/templates/app/composables/useOrionplaceCategoryProducts.ts +16 -0
  291. package/templates/app/composables/useOrionplaceFeature.ts +100 -0
  292. package/templates/app/composables/useOrionplaceFeaturedProducts.ts +14 -0
  293. package/templates/app/composables/useOrionplaceGeolocation.ts +28 -0
  294. package/templates/app/composables/useOrionplaceHomeProducts.ts +90 -0
  295. package/templates/app/composables/useOrionplaceManufacturerIndex.ts +83 -0
  296. package/templates/app/composables/useOrionplaceMap.ts +240 -0
  297. package/templates/app/composables/useOrionplaceMediaFormat.ts +24 -0
  298. package/templates/app/composables/useOrionplaceMissingPage.ts +67 -0
  299. package/templates/app/composables/useOrionplaceOrders.ts +185 -0
  300. package/templates/app/composables/useOrionplacePageSeo.ts +38 -0
  301. package/templates/app/composables/useOrionplaceProductActions.ts +116 -0
  302. package/templates/app/composables/useOrionplaceProductLink.ts +24 -0
  303. package/templates/app/composables/useOrionplaceProductSearch.ts +259 -0
  304. package/templates/app/composables/useOrionplaceProductVariants.ts +176 -0
  305. package/templates/app/composables/useOrionplaceProfile.ts +309 -0
  306. package/templates/app/composables/useOrionplaceProgress.ts +89 -0
  307. package/templates/app/composables/useOrionplaceReviews.ts +242 -0
  308. package/templates/app/composables/useOrionplaceSearchHistory.ts +23 -0
  309. package/templates/app/composables/useOrionplaceSearchScopeNames.ts +99 -0
  310. package/templates/app/composables/useOrionplaceServerData.ts +72 -0
  311. package/templates/app/composables/useOrionplaceSignIn.ts +66 -0
  312. package/templates/app/composables/useOrionplaceStableHeight.ts +69 -0
  313. package/templates/app/composables/useOrionplaceStorefront.ts +29 -0
  314. package/templates/app/composables/useOrionplaceSubscriptions.ts +217 -0
  315. package/templates/app/composables/useOrionplaceTheme.ts +27 -0
  316. package/templates/app/composables/useOrionplaceTicketSubject.ts +180 -0
  317. package/templates/app/composables/useOrionplaceTickets.ts +335 -0
  318. package/templates/app/composables/useOrionplaceWallet.ts +166 -0
  319. package/templates/app/error.vue +108 -0
  320. package/templates/app/interfaces/orionplace/accounts/IContact.ts +21 -0
  321. package/templates/app/interfaces/orionplace/accounts/IEmailNotificationLocale.ts +17 -0
  322. package/templates/app/interfaces/orionplace/accounts/IEmailVerification.ts +59 -0
  323. package/templates/app/interfaces/orionplace/accounts/IProfileActions.ts +38 -0
  324. package/templates/app/interfaces/orionplace/accounts/IProfileData.ts +123 -0
  325. package/templates/app/interfaces/orionplace/accounts/IProfileMedia.ts +17 -0
  326. package/templates/app/interfaces/orionplace/accounts/IStorefrontProfile.ts +54 -0
  327. package/templates/app/interfaces/orionplace/address/IAddressCitySuggestion.ts +19 -0
  328. package/templates/app/interfaces/orionplace/address/IAddressEditor.ts +9 -0
  329. package/templates/app/interfaces/orionplace/address/IAddressLocationSuggestion.ts +22 -0
  330. package/templates/app/interfaces/orionplace/address/IAddressRegionSearch.ts +30 -0
  331. package/templates/app/interfaces/orionplace/address/IAddressSuggestion.ts +20 -0
  332. package/templates/app/interfaces/orionplace/address/IUserAddress.ts +87 -0
  333. package/templates/app/interfaces/orionplace/apiBase/TMethod.ts +1 -0
  334. package/templates/app/interfaces/orionplace/appBase/IAppLoad.ts +16 -0
  335. package/templates/app/interfaces/orionplace/appBase/IAppLoadCommon.ts +45 -0
  336. package/templates/app/interfaces/orionplace/appBase/IApploadUserProfile.ts +13 -0
  337. package/templates/app/interfaces/orionplace/appBase/IForm.ts +21 -0
  338. package/templates/app/interfaces/orionplace/appBase/ISEO.ts +21 -0
  339. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonBanner.ts +11 -0
  340. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonContact.ts +8 -0
  341. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonCurrency.ts +15 -0
  342. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonEvents.ts +18 -0
  343. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonLocale.ts +14 -0
  344. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonLogos.ts +6 -0
  345. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonPath.ts +22 -0
  346. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonSEO.ts +26 -0
  347. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonSocial.ts +15 -0
  348. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonTariff.ts +7 -0
  349. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonUnit.ts +12 -0
  350. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonVariables.ts +8 -0
  351. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonVisualSettings.ts +11 -0
  352. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonWalletValue.ts +3 -0
  353. package/templates/app/interfaces/orionplace/blog/IBlogApi.ts +247 -0
  354. package/templates/app/interfaces/orionplace/blog/IBlogPostPreview.ts +30 -0
  355. package/templates/app/interfaces/orionplace/cart/ICartActions.ts +67 -0
  356. package/templates/app/interfaces/orionplace/cart/ICartData.ts +382 -0
  357. package/templates/app/interfaces/orionplace/cart/ICartDeliveryActions.ts +68 -0
  358. package/templates/app/interfaces/orionplace/cart/ICartModal.ts +22 -0
  359. package/templates/app/interfaces/orionplace/cart/IDeliveryMap.ts +29 -0
  360. package/templates/app/interfaces/orionplace/catalog/ICatalogDirectory.ts +75 -0
  361. package/templates/app/interfaces/orionplace/category/ICategory.ts +41 -0
  362. package/templates/app/interfaces/orionplace/domains/IDomain.ts +13 -0
  363. package/templates/app/interfaces/orionplace/forms/ICustomerSubfilter.ts +19 -0
  364. package/templates/app/interfaces/orionplace/index.ts +57 -0
  365. package/templates/app/interfaces/orionplace/marketing/IPromoActions.ts +51 -0
  366. package/templates/app/interfaces/orionplace/orders/IOrderActions.ts +99 -0
  367. package/templates/app/interfaces/orionplace/orders/IOrderHistory.ts +259 -0
  368. package/templates/app/interfaces/orionplace/orders/IProductPreorder.ts +31 -0
  369. package/templates/app/interfaces/orionplace/payments/IInvoice.ts +147 -0
  370. package/templates/app/interfaces/orionplace/products/IProduct.ts +262 -0
  371. package/templates/app/interfaces/orionplace/products/IProductFeedbackApi.ts +218 -0
  372. package/templates/app/interfaces/orionplace/products/IProductSearchApi.ts +146 -0
  373. package/templates/app/interfaces/orionplace/products/IProductSearchFacets.ts +35 -0
  374. package/templates/app/interfaces/orionplace/products/IProductSecondaryVariantRequest.ts +15 -0
  375. package/templates/app/interfaces/orionplace/products/IProductSpecification.ts +14 -0
  376. package/templates/app/interfaces/orionplace/products/IWishlist.ts +22 -0
  377. package/templates/app/interfaces/orionplace/sellers/ISellerDirectory.ts +70 -0
  378. package/templates/app/interfaces/orionplace/shared/IBreadcrumb.ts +10 -0
  379. package/templates/app/interfaces/orionplace/shared/IGeoCoordinates.ts +4 -0
  380. package/templates/app/interfaces/orionplace/shared/IStorefrontControls.ts +13 -0
  381. package/templates/app/interfaces/orionplace/shared/ITransformValue.ts +3 -0
  382. package/templates/app/interfaces/orionplace/state.ts +4 -0
  383. package/templates/app/interfaces/orionplace/stores/IStoreDirectory.ts +63 -0
  384. package/templates/app/interfaces/orionplace/subscribeOptions/ISubscribeOption.ts +9 -0
  385. package/templates/app/interfaces/orionplace/subscribeTariff/ISubscribeTariff.ts +56 -0
  386. package/templates/app/interfaces/orionplace/subscribeTariff/ITariffSelection.ts +11 -0
  387. package/templates/app/interfaces/orionplace/subscribes/ISubscribe.ts +28 -0
  388. package/templates/app/interfaces/orionplace/subscribes/ISubscriptionApi.ts +125 -0
  389. package/templates/app/interfaces/orionplace/tickets/ICustomerTicketApi.ts +223 -0
  390. package/templates/app/interfaces/orionplace/transport.ts +34 -0
  391. package/templates/app/layouts/default.vue +376 -0
  392. package/templates/app/middleware/00.orionplace.global.ts +27 -0
  393. package/templates/app/middleware/01.orionplace-sellers.global.ts +15 -0
  394. package/templates/app/middleware/orionplace-account.ts +40 -0
  395. package/templates/app/pages/activity.vue +19 -0
  396. package/templates/app/pages/addresses.vue +23 -0
  397. package/templates/app/pages/browse.vue +246 -0
  398. package/templates/app/pages/cart.vue +20 -0
  399. package/templates/app/pages/catalog.vue +17 -0
  400. package/templates/app/pages/category/[id].vue +142 -0
  401. package/templates/app/pages/contact.vue +17 -0
  402. package/templates/app/pages/featured.vue +144 -0
  403. package/templates/app/pages/index.vue +194 -0
  404. package/templates/app/pages/journal/[id].vue +128 -0
  405. package/templates/app/pages/journal/index.vue +67 -0
  406. package/templates/app/pages/logout.vue +71 -0
  407. package/templates/app/pages/manufacturers.vue +33 -0
  408. package/templates/app/pages/orders.vue +40 -0
  409. package/templates/app/pages/product/[id].vue +126 -0
  410. package/templates/app/pages/profile.vue +118 -0
  411. package/templates/app/pages/promo/[id].vue +67 -0
  412. package/templates/app/pages/promocodes.vue +21 -0
  413. package/templates/app/pages/sellers.vue +203 -0
  414. package/templates/app/pages/stores.vue +36 -0
  415. package/templates/app/pages/subscriptions.vue +21 -0
  416. package/templates/app/pages/tariffs/[slug]/[id].vue +126 -0
  417. package/templates/app/pages/tariffs/index.vue +50 -0
  418. package/templates/app/pages/tickets.vue +56 -0
  419. package/templates/app/pages/unsubscribe.vue +32 -0
  420. package/templates/app/pages/wallet.vue +23 -0
  421. package/templates/app/pages/wishlist.vue +48 -0
  422. package/templates/app/stores/orionplace.ts +493 -0
  423. package/templates/app/stores/orionplaceBrowse.ts +79 -0
  424. package/templates/app/stores/orionplaceCatalog.ts +121 -0
  425. package/templates/app/stores/orionplaceDomainAccess.ts +55 -0
  426. package/templates/app/stores/orionplaceProducts.ts +249 -0
  427. package/templates/app/stores/orionplaceSelections.ts +132 -0
  428. package/templates/app/themes/orionplace.ts +108 -0
  429. package/templates/app/utils/orionplace/accountLabels.ts +22 -0
  430. package/templates/app/utils/orionplace/activityLabels.ts +65 -0
  431. package/templates/app/utils/orionplace/activityPresentation.ts +16 -0
  432. package/templates/app/utils/orionplace/addressChanges.ts +26 -0
  433. package/templates/app/utils/orionplace/addressRegions.ts +17 -0
  434. package/templates/app/utils/orionplace/api.ts +333 -0
  435. package/templates/app/utils/orionplace/blogArticleHtml.ts +318 -0
  436. package/templates/app/utils/orionplace/blogComments.ts +133 -0
  437. package/templates/app/utils/orionplace/blogLabels.ts +111 -0
  438. package/templates/app/utils/orionplace/blogLayout.ts +95 -0
  439. package/templates/app/utils/orionplace/breadcrumbLabels.ts +11 -0
  440. package/templates/app/utils/orionplace/browseLabels.ts +98 -0
  441. package/templates/app/utils/orionplace/cartAddress.ts +94 -0
  442. package/templates/app/utils/orionplace/cartLabels.ts +261 -0
  443. package/templates/app/utils/orionplace/cartOptions.ts +143 -0
  444. package/templates/app/utils/orionplace/cartPreview.ts +108 -0
  445. package/templates/app/utils/orionplace/cartPromo.ts +150 -0
  446. package/templates/app/utils/orionplace/cartShipment.ts +74 -0
  447. package/templates/app/utils/orionplace/cartSnapshot.ts +20 -0
  448. package/templates/app/utils/orionplace/catalog.ts +106 -0
  449. package/templates/app/utils/orionplace/category.ts +52 -0
  450. package/templates/app/utils/orionplace/categoryLabels.ts +31 -0
  451. package/templates/app/utils/orionplace/contactLabels.ts +102 -0
  452. package/templates/app/utils/orionplace/currency.ts +128 -0
  453. package/templates/app/utils/orionplace/deliveryMap.ts +89 -0
  454. package/templates/app/utils/orionplace/directoryLabels.ts +131 -0
  455. package/templates/app/utils/orionplace/emptyStateArt.ts +231 -0
  456. package/templates/app/utils/orionplace/errorPageLabels.ts +80 -0
  457. package/templates/app/utils/orionplace/featureData.ts +25 -0
  458. package/templates/app/utils/orionplace/featureLabels.ts +271 -0
  459. package/templates/app/utils/orionplace/featuredLabels.ts +28 -0
  460. package/templates/app/utils/orionplace/files.ts +71 -0
  461. package/templates/app/utils/orionplace/footerLabels.ts +35 -0
  462. package/templates/app/utils/orionplace/guestSession.ts +50 -0
  463. package/templates/app/utils/orionplace/headerLabels.ts +68 -0
  464. package/templates/app/utils/orionplace/homeContent.ts +129 -0
  465. package/templates/app/utils/orionplace/homeLabels.ts +52 -0
  466. package/templates/app/utils/orionplace/htmlText.ts +59 -0
  467. package/templates/app/utils/orionplace/links.ts +14 -0
  468. package/templates/app/utils/orionplace/manufacturerIndex.ts +91 -0
  469. package/templates/app/utils/orionplace/modalWindow.ts +109 -0
  470. package/templates/app/utils/orionplace/nativeApp.ts +361 -0
  471. package/templates/app/utils/orionplace/notice.ts +22 -0
  472. package/templates/app/utils/orionplace/orderLabels.ts +309 -0
  473. package/templates/app/utils/orionplace/orderPresentation.ts +586 -0
  474. package/templates/app/utils/orionplace/pageSeo.ts +274 -0
  475. package/templates/app/utils/orionplace/paginationScroll.ts +131 -0
  476. package/templates/app/utils/orionplace/phone.ts +22 -0
  477. package/templates/app/utils/orionplace/presentation.ts +72 -0
  478. package/templates/app/utils/orionplace/productActionLabels.ts +60 -0
  479. package/templates/app/utils/orionplace/productActions.ts +547 -0
  480. package/templates/app/utils/orionplace/productAvailability.ts +36 -0
  481. package/templates/app/utils/orionplace/productGallery.ts +72 -0
  482. package/templates/app/utils/orionplace/productLabels.ts +82 -0
  483. package/templates/app/utils/orionplace/productManufacturer.ts +30 -0
  484. package/templates/app/utils/orionplace/productPage.ts +46 -0
  485. package/templates/app/utils/orionplace/productPhotos.ts +67 -0
  486. package/templates/app/utils/orionplace/productSearchScope.ts +237 -0
  487. package/templates/app/utils/orionplace/productSeller.ts +51 -0
  488. package/templates/app/utils/orionplace/profile.ts +136 -0
  489. package/templates/app/utils/orionplace/profileLabels.ts +151 -0
  490. package/templates/app/utils/orionplace/promoLabels.ts +75 -0
  491. package/templates/app/utils/orionplace/promoPresentation.ts +381 -0
  492. package/templates/app/utils/orionplace/reviewLabels.ts +172 -0
  493. package/templates/app/utils/orionplace/reviewScope.ts +41 -0
  494. package/templates/app/utils/orionplace/richText.ts +13 -0
  495. package/templates/app/utils/orionplace/searchFilters.ts +99 -0
  496. package/templates/app/utils/orionplace/searchHistory.ts +144 -0
  497. package/templates/app/utils/orionplace/sellerDirectory.ts +134 -0
  498. package/templates/app/utils/orionplace/seo.ts +52 -0
  499. package/templates/app/utils/orionplace/serverCookies.ts +88 -0
  500. package/templates/app/utils/orionplace/sessionLabels.ts +27 -0
  501. package/templates/app/utils/orionplace/signInReturn.ts +89 -0
  502. package/templates/app/utils/orionplace/storeDirectory.ts +50 -0
  503. package/templates/app/utils/orionplace/subscriptionChanges.ts +167 -0
  504. package/templates/app/utils/orionplace/subscriptionLabels.ts +67 -0
  505. package/templates/app/utils/orionplace/subscriptionManageLabels.ts +307 -0
  506. package/templates/app/utils/orionplace/subscriptionPlans.ts +162 -0
  507. package/templates/app/utils/orionplace/subscriptionRemote.ts +110 -0
  508. package/templates/app/utils/orionplace/subscriptionUsage.ts +82 -0
  509. package/templates/app/utils/orionplace/tariffLabels.ts +130 -0
  510. package/templates/app/utils/orionplace/tariffPage.ts +77 -0
  511. package/templates/app/utils/orionplace/tariffVariables.ts +165 -0
  512. package/templates/app/utils/orionplace/tariffs.ts +284 -0
  513. package/templates/app/utils/orionplace/ticketItems.ts +87 -0
  514. package/templates/app/utils/orionplace/ticketLabels.ts +335 -0
  515. package/templates/app/utils/orionplace/ticketLocation.ts +79 -0
  516. package/templates/app/utils/orionplace/walletTransaction.ts +135 -0
  517. package/templates/app/utils/orionplaceAppLoad.ts +73 -0
  518. package/templates/orionplace/COMPONENT-DOWNLOAD.md +40 -0
  519. package/templates/orionplace/COMPONENTS.md +1983 -0
  520. package/templates/orionplace/THEMES.md +94 -0
package/src/setup.mjs CHANGED
@@ -6,7 +6,7 @@ import { backendUrl, frontendDomain } from './validation.mjs';
6
6
  import { projectReadme } from './project-readme.mjs';
7
7
 
8
8
  const metadata = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
9
- const hash = text => createHash('sha256').update(text).digest('hex');
9
+ const hash = text => createHash('sha256').update(text).digest('hex');
10
10
  async function read(path) {
11
11
  try { return await readFile(path, 'utf8'); }
12
12
  catch (error) { if (error.code === 'ENOENT') return null; throw error; }
@@ -14,7 +14,7 @@ async function read(path) {
14
14
  async function safePath(root, name) {
15
15
  const target = resolve(root, name);
16
16
  if (relative(root, target).startsWith('..') || target === root) throw new Error('Invalid generated path');
17
- let cursor = root;
17
+ let cursor = root;
18
18
  for (const piece of relative(root, target).split(sep)) {
19
19
  cursor = resolve(cursor, piece);
20
20
  try { if ((await lstat(cursor)).isSymbolicLink()) throw new Error(`Refusing symbolic link: ${name}`); }
@@ -24,10 +24,12 @@ async function safePath(root, name) {
24
24
  }
25
25
  function configureNuxt(source) {
26
26
  try {
27
- const module = parseModule(source);
28
- const options = module.exports.default.$type === 'function-call'
27
+ const module = parseModule(source);
28
+ const options = module.exports.default.$type === 'function-call'
29
29
  ? module.exports.default.$args[0] : module.exports.default;
30
30
  if (!options || options.$type !== 'object') throw new Error('Dynamic configuration');
31
+ // Pin the existing Nuxt fallback without changing a customer's chosen date.
32
+ if (options.compatibilityDate === undefined) options.compatibilityDate = '2025-07-15';
31
33
  if (options.nitro?.preset && options.nitro.preset !== 'node-server') throw new Error('Unsupported Nitro preset');
32
34
  if (options.srcDir || options.serverDir || options.extends) throw new Error('Custom directories or layers');
33
35
  for (const route of ['/api', '/api/**', '/api/*']) {
@@ -35,6 +37,11 @@ function configureNuxt(source) {
35
37
  }
36
38
  if (options.vite?.server?.proxy?.['/api']) throw new Error('Conflicting Vite proxy');
37
39
  options.modules ||= [];
40
+ if (!Array.from(options.modules).some(item => item === '@pinia/nuxt' || (Array.isArray(item) && item[0] === '@pinia/nuxt'))) {
41
+ options.modules.unshift('@pinia/nuxt');
42
+ }
43
+ if (options.pages === false) throw new Error('Route middleware requires Nuxt pages');
44
+ options.pages = true;
38
45
  if (!Array.from(options.modules).some(item => item === 'orionplace-nuxt' || (Array.isArray(item) && item[0] === 'orionplace-nuxt'))) {
39
46
  options.modules.push('orionplace-nuxt');
40
47
  }
@@ -44,8 +51,8 @@ function configureNuxt(source) {
44
51
  }
45
52
  }
46
53
  function updateEnvironment(source, domain) {
47
- const lines = (source || '').split(/\r?\n/);
48
- let updated = false;
54
+ const lines = (source || '').split(/\r?\n/);
55
+ let updated = false;
49
56
  const result = lines.flatMap(line => {
50
57
  if (!/^\s*(?:export\s+)?MIMIC_FRONT_DOMAIN\s*=/.test(line)) return [line];
51
58
  if (updated) return [];
@@ -57,27 +64,36 @@ function updateEnvironment(source, domain) {
57
64
  }
58
65
 
59
66
  export async function setupProject({ cwd = process.cwd(), action = 'set', field, value, dryRun = false } = {}) {
60
- if (!['set', 'add', 'remove'].includes(action) || (action !== 'set' && field !== 'frontend')) {
67
+ if (!['set', 'add', 'remove', 'update'].includes(action) ||
68
+ (['add', 'remove'].includes(action) && field !== 'frontend') || (action === 'update' && field)) {
61
69
  throw new Error('Use set backend, add frontend, remove frontend, set mimic, or set frontend.');
62
70
  }
63
- const root = resolve(cwd);
64
- const setting = field === 'backend' ? backendUrl(value) : ['frontend', 'mimic'].includes(field) ? frontendDomain(value) : null;
71
+ const root = resolve(cwd);
72
+ const setting = field === 'backend' ? backendUrl(value) : ['frontend', 'mimic'].includes(field) ? frontendDomain(value) : null;
65
73
  if (field && !setting) throw new Error('Choose backend, frontend, or mimic.');
66
- const names = ['package.json', 'nuxt.config.ts', 'nuxt.config.js', 'nuxt.config.mjs', 'orionplace/settings.json', 'orionplace/.generated.json', '.env', '.gitignore'];
67
- const current = {};
74
+ const names = ['package.json', 'nuxt.config.ts', 'nuxt.config.js', 'nuxt.config.mjs', 'orionplace/settings.json', 'orionplace/.generated.json', '.env', '.gitignore'];
75
+ const current = {};
68
76
  for (const name of names) current[name] = await read(await safePath(root, name));
69
- const pkg = current['package.json'] ? JSON.parse(current['package.json']) : { name: 'orionplace-storefront', private: true, type: 'module' };
70
- const dependencies = { ...pkg.devDependencies, ...pkg.dependencies };
77
+ const pkg = current['package.json'] ? JSON.parse(current['package.json']) : { name: 'orionplace-storefront', private: true, type: 'module' };
78
+ const dependencies = { ...pkg.devDependencies, ...pkg.dependencies };
79
+ for (const name of ['tailwindcss', '@tailwindcss/vite']) {
80
+ if (dependencies[name] && !/^(?:[~^]|>=)?4(?:\.|$)/.test(dependencies[name])) {
81
+ throw new Error(`Orionplace components require ${name} 4. Upgrade the existing dependency before setup. No files were changed.`);
82
+ }
83
+ }
84
+ if (action === 'update' && (!dependencies.nuxt || !current['orionplace/settings.json'] || !current['orionplace/.generated.json'])) {
85
+ throw new Error('Update requires an initialized Orionplace Nuxt project. Run init first.');
86
+ }
71
87
  if (!dependencies.nuxt && ['next', '@sveltejs/kit'].some(name => dependencies[name])) throw new Error('This package sets up Nuxt projects only.');
72
88
  if (dependencies.nuxt && !/^(?:[~^]|>=)?4(?:\.|$)/.test(dependencies.nuxt)) {
73
89
  throw new Error('This release supports Nuxt 4. Upgrade your Nuxt dependency before setup.');
74
90
  }
75
- const configs = ['nuxt.config.ts', 'nuxt.config.js', 'nuxt.config.mjs'].filter(name => current[name] !== null);
91
+ const configs = ['nuxt.config.ts', 'nuxt.config.js', 'nuxt.config.mjs'].filter(name => current[name] !== null);
76
92
  if (configs.length > 1) throw new Error('Multiple Nuxt configuration files found; keep one root config.');
77
- const configName = configs[0] || 'nuxt.config.ts';
78
- const config = configureNuxt(current[configName] || 'export default defineNuxtConfig({ modules: [] });\n');
93
+ const configName = configs[0] || 'nuxt.config.ts';
94
+ const config = configureNuxt(current[configName] || 'export default defineNuxtConfig({ modules: [] });\n');
79
95
  for (const directory of ['server/api', 'server/routes/api']) {
80
- const path = await safePath(root, directory);
96
+ const path = await safePath(root, directory);
81
97
  let entries = [];
82
98
  try { entries = await readdir(path); }
83
99
  catch (error) { if (error.code !== 'ENOENT') throw error; }
@@ -85,17 +101,17 @@ export async function setupProject({ cwd = process.cwd(), action = 'set', field,
85
101
  throw new Error(`Existing API catch-all in ${directory}. Resolve this route conflict first.`);
86
102
  }
87
103
  }
88
- const settings = current['orionplace/settings.json'] ? JSON.parse(current['orionplace/settings.json']) : {};
89
- const previous = current['orionplace/.generated.json'] ? JSON.parse(current['orionplace/.generated.json']) : {};
104
+ const settings = current['orionplace/settings.json'] ? JSON.parse(current['orionplace/settings.json']) : {};
105
+ const previous = current['orionplace/.generated.json'] ? JSON.parse(current['orionplace/.generated.json']) : {};
90
106
  if (settings.backend) settings.backend = backendUrl(settings.backend);
91
107
  if (settings.frontend) settings.frontend = frontendDomain(settings.frontend);
92
- const oldFrontend = settings.frontend;
108
+ const oldFrontend = settings.frontend;
93
109
  // Migrate the initial single-domain format, including its previously generated mappings.
94
- const legacyDomains = Object.keys(previous)
110
+ const legacyDomains = Object.keys(previous)
95
111
  .map(name => /^sitemaps\/([^/]+)\.cfg$/.exec(name)?.[1]).filter(Boolean);
96
- const frontends = settings.frontends ?? [settings.frontend, ...legacyDomains].filter(Boolean);
112
+ const frontends = settings.frontends ?? [settings.frontend, ...legacyDomains].filter(Boolean);
97
113
  if (!Array.isArray(frontends)) throw new Error('settings.frontends must be an array of domain names.');
98
- settings.frontends = [...new Set(frontends.map(frontendDomain))];
114
+ settings.frontends = [...new Set(frontends.map(frontendDomain))];
99
115
  if (settings.frontend && !settings.frontends.includes(settings.frontend)) settings.frontends.unshift(settings.frontend);
100
116
  if (field === 'backend') settings.backend = setting;
101
117
  if (field === 'mimic') {
@@ -115,13 +131,13 @@ export async function setupProject({ cwd = process.cwd(), action = 'set', field,
115
131
  if (action === 'set' || !settings.frontend) settings.frontend = setting;
116
132
  }
117
133
  }
118
- settings.frontend ||= settings.frontends[0];
134
+ settings.frontend ||= settings.frontends[0];
119
135
  if (!settings.frontend) delete settings.frontend;
120
- const manifest = { ...previous };
121
- const changes = new Map();
122
- const preserved = [];
136
+ const manifest = { ...previous };
137
+ const changes = new Map();
138
+ const preserved = [];
123
139
  async function plan(name, content, { managed = false, preserve = false } = {}) {
124
- const path = await safePath(root, name);
140
+ const path = await safePath(root, name);
125
141
  const existing = await read(path);
126
142
  if (managed && existing !== null && existing !== content && previous[name] !== hash(existing)) {
127
143
  if (preserve && previous[name]) { preserved.push(name); return; }
@@ -140,38 +156,71 @@ export async function setupProject({ cwd = process.cwd(), action = 'set', field,
140
156
  }
141
157
  // All checks and content generation happen before the first write.
142
158
  await plan(configName, config);
143
- const isNewNuxt = !dependencies.nuxt;
144
- pkg.scripts ||= {};
145
- pkg.scripts.dev ||= 'nuxt dev';
146
- pkg.scripts.build ||= 'nuxt build';
147
- pkg.scripts.preview ||= 'nuxt preview';
148
- pkg.scripts['orionplace:backend'] ||= 'orionplace-nuxt set backend';
149
- pkg.scripts['orionplace:frontend'] ||= 'orionplace-nuxt set frontend';
150
- pkg.scripts['orionplace:add-frontend'] ||= 'orionplace-nuxt add frontend';
159
+ const isNewNuxt = !dependencies.nuxt;
160
+ pkg.scripts ||= {};
161
+ pkg.scripts.dev ||= 'nuxt dev';
162
+ pkg.scripts.build ||= 'nuxt build';
163
+ pkg.scripts.preview ||= 'nuxt preview';
164
+ pkg.scripts['orionplace:backend'] ||= 'orionplace-nuxt set backend';
165
+ pkg.scripts['orionplace:frontend'] ||= 'orionplace-nuxt set frontend';
166
+ pkg.scripts['orionplace:add-frontend'] ||= 'orionplace-nuxt add frontend';
151
167
  pkg.scripts['orionplace:remove-frontend'] ||= 'orionplace-nuxt remove frontend';
152
- pkg.scripts['orionplace:mimic'] ||= 'orionplace-nuxt set mimic';
153
- pkg.scripts['orionplace:help'] ||= 'orionplace-nuxt help';
154
- pkg.dependencies ||= {};
155
- pkg.dependencies['orionplace-nuxt'] ||= dependencies['orionplace-nuxt'] || `^${metadata.version}`;
168
+ pkg.scripts['orionplace:mimic'] ||= 'orionplace-nuxt set mimic';
169
+ pkg.scripts['orionplace:help'] ||= 'orionplace-nuxt help';
170
+ pkg.scripts['orionplace:update'] ||= 'orionplace-nuxt update';
171
+ pkg.dependencies ||= {};
172
+ pkg.dependencies['libphonenumber-js'] ||= dependencies['libphonenumber-js'] || '^1.13.10';
173
+ pkg.dependencies['country-flag-icons'] ||= dependencies['country-flag-icons'] || '^1.6.20';
174
+ pkg.dependencies.dompurify ||= dependencies.dompurify || '^3.4.13';
175
+ pkg.dependencies.pinia ||= dependencies.pinia || '^4.0.2';
176
+ pkg.dependencies['@pinia/nuxt'] ||= dependencies['@pinia/nuxt'] || '^1.0.1';
177
+ pkg.dependencies['orionplace-nuxt'] ||= dependencies['orionplace-nuxt'] || `^${metadata.version}`;
178
+ if (action === 'update') {
179
+ pkg.dependencies['orionplace-nuxt'] = metadata.version;
180
+ if (pkg.devDependencies) delete pkg.devDependencies['orionplace-nuxt'];
181
+ }
156
182
  if (isNewNuxt) {
157
- pkg.dependencies.nuxt = '^4.5.0';
158
- pkg.dependencies.vue ||= '^3.5.0';
183
+ pkg.dependencies.nuxt = '^4.5.0';
184
+ pkg.dependencies.vue ||= '^3.5.0';
159
185
  pkg.dependencies['vue-router'] ||= '^5.0.0';
160
186
  }
187
+ // Install the complete editable AppLoad source. Never replace a customer's app.
188
+ const appPath = 'app/app.vue';
189
+ const existingApp = await read(await safePath(root, appPath));
190
+ const installApp = existingApp === null || Boolean(previous[appPath]);
191
+ const templateRoot = new URL('../templates/', import.meta.url);
192
+ async function planTemplates(directory = '') {
193
+ for (const entry of await readdir(new URL(directory, templateRoot), { withFileTypes: true })) {
194
+ const name = directory + entry.name;
195
+ if (entry.isDirectory()) { await planTemplates(name + '/'); continue; }
196
+ if (name === appPath && !installApp) continue;
197
+ // A customer's own home page and editor settings stay theirs.
198
+ if (['app/pages/index.vue', '.vscode/settings.json'].includes(name) && !previous[name] && await read(await safePath(root, name)) !== null) continue;
199
+ await plan(name, await readFile(new URL(name, templateRoot), 'utf8'), { managed: true, preserve: true });
200
+ }
201
+ }
202
+ await planTemplates();
203
+ pkg.devDependencies ||= {};
204
+ for (const name of ['tailwindcss', '@tailwindcss/vite']) {
205
+ if (!dependencies[name]) pkg.devDependencies[name] = '^4.3.3';
206
+ }
207
+ if (!await read(await safePath(root, 'tsconfig.json'))) {
208
+ await plan('tsconfig.json', JSON.stringify({ files: [], references: [
209
+ { path: './.nuxt/tsconfig.app.json' }, { path: './.nuxt/tsconfig.server.json' },
210
+ { path: './.nuxt/tsconfig.shared.json' }, { path: './.nuxt/tsconfig.node.json' },
211
+ ] }, null, 2) + '\n', { managed: true });
212
+ }
161
213
  await plan('package.json', JSON.stringify(pkg, null, 2) + '\n');
162
214
  for (const file of ['marketplace.mjs', 'api.mjs', 'domain.mjs']) {
163
215
  await plan(`orionplace/runtime/${file}`, await readFile(new URL(`../runtime/${file}`, import.meta.url), 'utf8'), { managed: true, preserve: true });
164
216
  }
165
217
  await plan('orionplace/README.md', projectReadme(settings), { managed: true, preserve: true });
166
- if (isNewNuxt && !(await read(await safePath(root, 'app/app.vue')))) {
167
- await plan('app/app.vue', '<template>\n <main>\n <h1>Your marketplace</h1>\n <p>Domain setup and API instructions are in orionplace/README.md.</p>\n </main>\n</template>\n', { managed: true });
168
- }
169
218
  // A new project starts explicitly empty; keep a pre-existing manual setting on init.
170
- const hasMimicSetting = /^\s*(?:export\s+)?MIMIC_FRONT_DOMAIN\s*=/m.test(current['.env'] || '');
171
- if (settings.frontend || oldFrontend || !hasMimicSetting) {
219
+ const hasMimicSetting = /^\s*(?:export\s+)?MIMIC_FRONT_DOMAIN\s*=/m.test(current['.env'] || '');
220
+ if (action !== 'update' && (settings.frontend || oldFrontend || !hasMimicSetting)) {
172
221
  await plan('.env', updateEnvironment(current['.env'], settings.frontend || ''));
173
222
  }
174
- if (settings.backend) {
223
+ if (settings.backend && action !== 'update') {
175
224
  const mappings = action === 'remove' || field === 'mimic' ? []
176
225
  : field === 'frontend' ? [setting] : settings.frontends;
177
226
  for (const domain of mappings) {
@@ -179,16 +228,16 @@ export async function setupProject({ cwd = process.cwd(), action = 'set', field,
179
228
  }
180
229
  }
181
230
  if (action === 'remove') await planRemoval(`sitemaps/${setting}.cfg`);
182
- let ignore = current['.gitignore'] || '';
231
+ let ignore = current['.gitignore'] || '';
183
232
  for (const entry of ['node_modules/', '.nuxt/', '.output/', '.env', '.env.*', '!.env.example']) {
184
233
  if (!ignore.split(/\r?\n/).includes(entry)) ignore = ignore.replace(/\n*$/, '\n') + entry + '\n';
185
234
  }
186
235
  await plan('.gitignore', ignore);
187
- await plan('orionplace/settings.json', JSON.stringify(settings, null, 2) + '\n');
236
+ if (action !== 'update') await plan('orionplace/settings.json', JSON.stringify(settings, null, 2) + '\n');
188
237
  await plan('orionplace/.generated.json', JSON.stringify(manifest, null, 2) + '\n');
189
238
  if (!dryRun) {
190
239
  for (const [name, content] of changes) {
191
- const target = await safePath(root, name);
240
+ const target = await safePath(root, name);
192
241
  if (content === null) { await unlink(target); continue; }
193
242
  await mkdir(dirname(target), { recursive: true });
194
243
  const temporary = `${target}.orionplace-${process.pid}.tmp`;
package/src/update.mjs ADDED
@@ -0,0 +1,36 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { resolve } from 'node:path';
3
+ import { setupProject } from './setup.mjs';
4
+
5
+ export function runNpm(args, cwd) {
6
+ const npmCli = process.env.npm_execpath;
7
+ const command = npmCli ? process.execPath : 'npm';
8
+ const commandArgs = npmCli ? [npmCli, ...args] : args;
9
+ return new Promise((resolve, reject) => {
10
+ const child = spawn(command, commandArgs, { cwd, stdio: 'inherit', shell: false });
11
+ child.once('error', reject);
12
+ child.once('exit', (code, signal) => code === 0 ? resolve() : reject(new Error(
13
+ `npm ${args[0]} failed (${signal || code}).`,
14
+ )));
15
+ });
16
+ }
17
+
18
+ export async function updateProject({ cwd = process.cwd(), dryRun = false, local = false, npm = runNpm } = {}) {
19
+ cwd = resolve(cwd);
20
+ // Validate before downloading or writing; the latest CLI repeats preflight with its own templates.
21
+ const preview = await setupProject({ cwd, action: 'update', dryRun: true });
22
+ if (!local) {
23
+ console.log('Checking the latest Orionplace Nuxt release…');
24
+ await npm(['exec', '--yes', '--prefer-online', '--package=orionplace-nuxt@latest', '--',
25
+ 'orionplace-nuxt', 'update', '--local', '--cwd', cwd, ...(dryRun ? ['--dry-run'] : [])], cwd);
26
+ return null; // The latest CLI reports its own changes.
27
+ }
28
+ if (dryRun) return preview;
29
+ const result = await setupProject({ cwd, action: 'update' });
30
+ try {
31
+ await npm(['install', '--no-audit', '--no-fund'], cwd);
32
+ } catch (error) {
33
+ throw new Error(`Source files were updated, but dependency installation failed. Run npm install in the project, then retry update. ${error.message}`);
34
+ }
35
+ return result;
36
+ }
@@ -25,3 +25,9 @@ export function backendUrl(value) {
25
25
  }
26
26
  return `${url.origin}/api`;
27
27
  }
28
+
29
+ // The Android app sends its API requests to this public storefront over HTTPS.
30
+ export function appOrigin(value) {
31
+ if (/^\s*http:/i.test(value)) throw new Error('ORIONPLACE_APP_ORIGIN must use HTTPS.');
32
+ return `https://${frontendDomain(value.trim())}`;
33
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ // The storefront styles use Tailwind's @apply, @reference and @theme, which
3
+ // the editor's CSS checker does not know; the build handles them.
4
+ "css.lint.unknownAtRules": "ignore"
5
+ }
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ import { watch } from 'vue';
3
+ import { useOrionplaceStore } from '@/stores/orionplace';
4
+ import { NuxtLayout, NuxtLoadingIndicator, NuxtPage } from '#components';
5
+ import { showError, useHead, useRoute } from '#imports';
6
+ import OrionplaceThemeProvider from '@/components/orionplace/theme/OrionplaceThemeProvider.vue';
7
+ import { useOrionplaceTheme } from '@/composables/useOrionplaceTheme';
8
+ import { storefrontPageError } from '@/composables/useOrionplaceMissingPage';
9
+
10
+ const store = useOrionplaceStore();
11
+ const route = useRoute();
12
+ const { mode } = useOrionplaceTheme();
13
+
14
+ useHead(() => ({
15
+ htmlAttrs: { lang: store.localeCode },
16
+ }));
17
+
18
+ // The middleware opens the 503 error page during navigation. A refresh that
19
+ // fails while a page is open, for example after sign-in, opens it too.
20
+ watch(
21
+ () => store.status,
22
+ (status) => {
23
+ const error = route.matched.length
24
+ ? storefrontPageError(status, false, '')
25
+ : undefined;
26
+
27
+ if (error) {
28
+ void showError(error);
29
+ }
30
+ },
31
+ );
32
+ </script>
33
+
34
+ <template>
35
+ <OrionplaceThemeProvider
36
+ :mode="mode"
37
+ class="min-h-screen"
38
+ >
39
+ <NuxtLoadingIndicator
40
+ :height="2"
41
+ color="var(--orionplace-inverse-text)"
42
+ error-color="var(--orionplace-danger)"
43
+ />
44
+ <NuxtLayout>
45
+ <NuxtPage />
46
+ </NuxtLayout>
47
+ </OrionplaceThemeProvider>
48
+ </template>
@@ -0,0 +1,21 @@
1
+ @theme inline {
2
+ --font-orionplace: "Inter", "Helvetica Neue", Helvetica, Arial, system-ui,
3
+ sans-serif;
4
+ --color-orionplace-background: var(--orionplace-background);
5
+ --color-orionplace-surface: var(--orionplace-surface);
6
+ --color-orionplace-muted-surface: var(--orionplace-muted-surface);
7
+ --color-orionplace-text: var(--orionplace-text);
8
+ --color-orionplace-muted: var(--orionplace-muted);
9
+ --color-orionplace-border: var(--orionplace-border);
10
+ --color-orionplace-accent: var(--orionplace-accent);
11
+ --color-orionplace-hover: var(--orionplace-hover);
12
+ --color-orionplace-inverse-surface: var(--orionplace-inverse-surface);
13
+ --color-orionplace-inverse-text: var(--orionplace-inverse-text);
14
+ --color-orionplace-inverse-muted: var(--orionplace-inverse-muted);
15
+ --color-orionplace-success: var(--orionplace-success);
16
+ --color-orionplace-success-surface: var(--orionplace-success-surface);
17
+ --color-orionplace-danger: var(--orionplace-danger);
18
+ --color-orionplace-danger-surface: var(--orionplace-danger-surface);
19
+ --color-orionplace-attention: var(--orionplace-attention);
20
+ --color-orionplace-attention-surface: var(--orionplace-attention-surface);
21
+ }
@@ -0,0 +1,28 @@
1
+ @layer theme, base, components, utilities;
2
+
3
+ @import "tailwindcss/theme.css" layer(theme);
4
+ @import "tailwindcss/utilities.css" layer(utilities);
5
+ @import "@/assets/css/orionplace-tokens.css";
6
+
7
+ @source "../../components/";
8
+ @source "../../pages/";
9
+ @source "../../layouts/";
10
+ @custom-variant dark (&:where(.dark, .dark *));
11
+
12
+ @layer base {
13
+ a {
14
+ text-decoration: none;
15
+ }
16
+
17
+ /*
18
+ * Tailwind's preflight is not loaded, so form controls would keep the
19
+ * browser's own font (system-ui) inside the storefront's theme font.
20
+ * Sizes stay with each component's classes.
21
+ */
22
+ button,
23
+ input,
24
+ select,
25
+ textarea {
26
+ font-family: inherit;
27
+ }
28
+ }
@@ -0,0 +1,31 @@
1
+ # AccountActivity · Nuxt
2
+
3
+ The user’s promo codes, reviews and sign-in history.
4
+
5
+ The supplied storefront uses this component at `/activity`.
6
+ [English guide](https://orionmarket.place/en/sandbox/components/nuxt/activity) ·
7
+ [Russian guide](https://orionmarket.place/ru/sandbox/components/nuxt/activity)
8
+
9
+ ## Contract and dependencies
10
+
11
+ Opening shows the promo codes. A `tab` in the address opens that section
12
+ instead, so `/activity?tab=logs` leads straight to the sign-in history; an
13
+ unknown value opens the promo codes. Switching sections creates the selected
14
+ component and loads its data. The parent `AccountSection` opens private
15
+ sections after sign-in.
16
+
17
+ The guide describes its inputs and events. Source is maintained in
18
+ `app/components/orionplace/account/AccountActivity.vue`; the primary interface is `app/interfaces/orionplace/accounts/IProfileData.ts`.
19
+
20
+ The configured Nuxt starter initializes Application Load and its named API client.
21
+ Component-source ZIPs contain imported children, types,
22
+ composables, labels and styles. The included `orionplace/COMPONENT-DOWNLOAD.md`
23
+ describes dependencies, theme and consumer configuration. Standalone file
24
+ copying requires the same dependencies. Links to storefront routes use the
25
+ pages supplied by the full starter.
26
+
27
+ ## Endpoint coverage
28
+
29
+ - `profile_get_logs`
30
+ - `profile_promocodes_get`
31
+ - `products_feedbacks_mine_get`
@@ -0,0 +1,61 @@
1
+ <script setup lang="ts">
2
+ import { computed, ref, watch } from 'vue';
3
+ import { useRoute } from '#imports';
4
+ import { useOrionplaceSelectionsStore } from '@/stores/orionplaceSelections';
5
+ import { activityLabels } from '@/utils/orionplace/activityLabels';
6
+ import SignInHistory from '@/components/orionplace/account/SignInHistory.vue';
7
+ import AccountPromocodes from '@/components/orionplace/account/AccountPromocodes.vue';
8
+ import ProductReviews from '@/components/orionplace/products/ProductReviews.vue';
9
+ import '@/components/orionplace/shared/features.css';
10
+ import '@/components/orionplace/account/account.css';
11
+
12
+ const route = useRoute();
13
+ const selectionStore = useOrionplaceSelectionsStore();
14
+ const labels = computed(() => activityLabels(selectionStore.localeCode));
15
+ const tabs = computed(() => ({
16
+ promocodes: labels.value.promocodesTab,
17
+ reviews: labels.value.reviewsTab,
18
+ logs: labels.value.logsTab,
19
+ }));
20
+
21
+ // A `tab` in the address opens that section, so a link can lead straight to
22
+ // the promo codes. Any other value opens the first section.
23
+ function requested() {
24
+ const value = String(route.query.tab ?? '');
25
+
26
+ return value in tabs.value ? value : 'promocodes';
27
+ }
28
+
29
+ const active = ref(requested());
30
+
31
+ watch(() => route.query.tab, () => {
32
+ active.value = requested();
33
+ });
34
+ </script>
35
+ <template>
36
+ <section
37
+ class="op-feature @container op-feature-stack op-account"
38
+ data-feature-part="AccountActivity"
39
+ >
40
+ <h1 class="op-feature-title">{{ labels.title }}</h1>
41
+ <div class="op-feature-actions op-account-tabs">
42
+ <button
43
+ class="op-feature-button"
44
+ v-for="[key, title] in Object.entries(tabs)"
45
+ :key="key"
46
+ type="button"
47
+ :data-activity-tab="key"
48
+ :aria-pressed="active === key"
49
+ @click="active = key"
50
+ >
51
+ {{ title }}
52
+ </button>
53
+ </div>
54
+ <AccountPromocodes v-if="active === 'promocodes'" />
55
+ <ProductReviews
56
+ v-else-if="active === 'reviews'"
57
+ own
58
+ />
59
+ <SignInHistory v-else />
60
+ </section>
61
+ </template>
@@ -0,0 +1,50 @@
1
+ # AccountPromocodes · Nuxt
2
+
3
+ Available promo codes and applying a selected code to the cart.
4
+
5
+ The supplied storefront uses this component at `/activity`.
6
+ [English guide](https://orionmarket.place/en/sandbox/components/nuxt/account-promocodes) ·
7
+ [Russian guide](https://orionmarket.place/ru/sandbox/components/nuxt/account-promocodes)
8
+
9
+ ## Contract and dependencies
10
+
11
+ `profile_promocodes_get` loads the codes issued to the user. Every code shows
12
+ its conditions in separate rows: the discount and, for a percentage code,
13
+ its maximum (`maximum_discount`), the products, categories or sellers the offer
14
+ covers, the minimum order (`minimum_order_amount`: what the covered products must cost
15
+ together, the whole cart when the offer names none;
16
+ a dollar amount, shown as “$ 544 ≈ 40 256 ₽” in another currency and “$ 544” in dollars), “Only for the first
17
+ purchase in the store” when `first_order_only` is `true`, whether items that
18
+ already have a discount count, the dates the offer runs between and how many
19
+ uses are left. A row whose field is missing is left out. A code without a use limit shows no counter.
20
+
21
+ The badge beside a code names the one reason it cannot be applied now: it is
22
+ already applied to the cart, it is not available, its offer has run out, or it
23
+ starts on a later date (a scheduled offer stays inactive until that day). Only
24
+ a code without such a reason shows Apply.
25
+
26
+ Applying sends `code_value` to `marketing_promo_promo_apply`. The
27
+ `applyed_to_cart` mark changes after confirmation, then the list refreshes. A
28
+ refused code shows the reason in its own card, under its buttons, where a
29
+ phone shows it; a list that fails to load shows its error above the list with
30
+ Retry. The
31
+ cart link opens the cart with its current totals. Each code also links to the
32
+ products its offer applies to, passing the code in that address so the path of
33
+ the products page can name it.
34
+
35
+ The guide describes its inputs and events. Source is maintained in
36
+ `app/components/orionplace/account/AccountPromocodes.vue`; the primary interface is `app/interfaces/orionplace/marketing/IPromoActions.ts`.
37
+ The component belongs to the `activity` composition; render it with that
38
+ parent's controller and context.
39
+
40
+ The configured Nuxt starter initializes Application Load and its named API client.
41
+ Component-source ZIPs contain imported children, types,
42
+ composables, labels and styles. The included `orionplace/COMPONENT-DOWNLOAD.md`
43
+ describes dependencies, theme and consumer configuration. Standalone file
44
+ copying requires the same dependencies. Links to storefront routes use the
45
+ pages supplied by the full starter.
46
+
47
+ ## Endpoint coverage
48
+
49
+ - `profile_promocodes_get`
50
+ - `marketing_promo_promo_apply`