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
@@ -7,9 +7,35 @@ This folder contains the integration source for your Nuxt 4 storefront.
7
7
  Your personal backend API is provided in your account at https://orionmarket.place.
8
8
  You can change that backend domain in your account, then update this project.
9
9
 
10
+ ## Quick start from zero
11
+
12
+ Install Node.js 22.12 or newer (including npm). Run these commands from the folder
13
+ where you want to create a new project; no existing Nuxt project is needed:
14
+
15
+ \`\`\`bash
16
+ npx --yes orionplace-nuxt init my-marketplace
17
+ cd my-marketplace
18
+ npm install
19
+ npx orionplace-nuxt set backend your-project.orionplace.app
20
+ npx orionplace-nuxt add frontend shop.example.com
21
+ npm run dev
22
+ \`\`\`
23
+
24
+ Replace \`your-project.orionplace.app\` with the personal backend domain shown in
25
+ your profile at [orionmarket.place](https://orionmarket.place), and
26
+ \`shop.example.com\` with your storefront domain. The first frontend also becomes
27
+ the local MIMIC domain.
28
+
29
+ Open the local URL printed by Nuxt (normally http://localhost:3000). The storefront
30
+ opens after Application Load succeeds. If initialization fails, check the domain
31
+ mapping and backend response.
32
+
33
+ This project is already generated. To configure or run it, use the following
34
+ sections from its root directory; do not create another project inside it.
35
+
10
36
  ## Current setup
11
37
 
12
- - Frontend domains: ${settings.frontends?.length ? settings.frontends.map(domain => '\`' + domain + '\`').join(', ') : 'not configured yet'}
38
+ - Frontend domains: ${settings.frontends?.length ? settings.frontends.map((domain) => '\`' + domain + '\`').join(', ') : 'not configured yet'}
13
39
  - Local MIMIC domain: \`${settings.frontend || 'empty'}\`
14
40
  - Personal API: \`${settings.backend || 'not configured yet'}\`
15
41
 
@@ -51,12 +77,74 @@ request; restart or reload the process environment when changing MIMIC. DNS, TLS
51
77
  and hosting-proxy settings must also cover each public frontend domain.
52
78
  Existing unrelated environment variables and Nuxt configuration are preserved.
53
79
 
80
+ ## Personal profile, footer and stable layout
81
+
82
+ The supplied Nuxt storefront includes \`/profile\` with personal details, avatar,
83
+ verified email, optional email-notification and email-language preferences, password management,
84
+ phone sign-in/registration and navigation to \`/logout\`. Account requests use the
85
+ shared named API client; avatar upload uses multipart. Data changes only after
86
+ confirmation. See the [profile guide](https://orionmarket.place/en/sandbox/components/nuxt/profile)
87
+ and its [Russian version](https://orionmarket.place/ru/sandbox/components/nuxt/profile).
88
+
89
+ The sign-in and registration form (\`ProfileSignIn\`) appears only on the
90
+ \`/profile\` page. Header Login links there. A guest's click on an action that
91
+ needs an account (a review, reaction or reply, a blog comment, the wishlist
92
+ heart, an availability notification, Checkout in the cart, a plan's Subscribe
93
+ or Try, an event) opens \`/profile?locale=<locale>&redirect=<current page>\` at
94
+ once through \`useOrionplaceSignIn().requireSignIn()\` in
95
+ \`app/composables/useOrionplaceSignIn.ts\`, with no separate sign-in notice.
96
+ Background requests and an ended session never navigate.
97
+ Account pages (\`/orders\`, \`/wallet\`, \`/addresses\`, \`/subscriptions\`, \`/tickets\`,
98
+ \`/activity\`, \`/wishlist\`) declare the \`orionplace-account\` route middleware in
99
+ \`app/middleware/orionplace-account.ts\`: after Application Load confirms a guest
100
+ session, it replaces the page with that sign-in address. A pending or failed
101
+ Application Load keeps the page, and no dialog opens automatically.
102
+
103
+ After the final sign-in step, a ring spinner and a moving progress line replace
104
+ the form while Application Load refreshes; the top loading bar runs and screen
105
+ readers receive “Signing in…”. With reduced motion, both indicators stay still.
106
+ The profile page then opens the \`redirect\` page, or the home page when it is
107
+ missing, and keeps the indicator until that page opens.
108
+ \`app/utils/orionplace/signInReturn.ts\` accepts only paths on the same storefront
109
+ that start with a single \`/\`; \`/profile\`, \`/logout\` and external addresses open
110
+ the home page instead. If the refresh fails, the form shows an error with Retry,
111
+ which refreshes Application Load without resending credentials.
112
+
113
+ Messages share one square pattern from \`components/orionplace/shared/features.css\`:
114
+ \`op-notice op-notice-error\` uses the danger colors, an error icon and
115
+ \`role="alert"\`; \`op-notice op-notice-success\` uses the success colors, a check
116
+ icon and \`role="status"\`; \`op-notice op-notice-attention\` uses the attention
117
+ colors and a warning icon for a step still to complete, such as choosing a
118
+ delivery method; plain \`op-notice\` is neutral information. Pending work shows
119
+ the top loading bar from \`app/app.vue\` and a visually hidden \`role="status"\`
120
+ message instead of a status strip. Field errors stay as red text beside their inputs. Required fields show a
121
+ red \`*\` directly after the label text.
122
+
123
+ The default layout renders the [footer](https://orionmarket.place/en/sandbox/components/nuxt/footer)
124
+ with real store categories, home-section anchors, profile/journal navigation,
125
+ a \`/contact\` link, social links and the company name in its copyright line.
126
+ Company contact and registration details appear beside the message form on
127
+ \`/contact\`. The home banner spans the available viewport
128
+ width without a frame. Its media area keeps the same proportions at every width; the image fills the
129
+ area without distortion and crops its edges when needed. Event media keeps its
130
+ own reserved proportions, which differ on a narrow screen.
131
+
132
+ Search/category filtering keeps current cards during requests and reserves the
133
+ results area's height when a response is shorter. Product variant replacement
134
+ retains card height. Width changes release these reserves for responsive layout;
135
+ a new search scope resets its reserve. Stable scrollbar space avoids horizontal
136
+ shifts. Initial search loading uses 12 skeletons. The wishlist heart appears
137
+ for every visitor, including compact catalog representatives; a guest's click
138
+ opens the sign-in page.
139
+
140
+ The React and Svelte packages supply the corresponding storefront and account UI.
141
+
54
142
  ## Files you can read and customize
55
143
 
56
144
  | File | Purpose |
57
145
  | --- | --- |
58
146
  | \`runtime/marketplace.mjs\` | Domain lookup, configuration validation, API transport and cookies. |
59
- | \`runtime/api.mjs\` | The Nuxt/Nitro HTTP handler for \`/api/**\`. |
147
+ | \`runtime/api.mjs\` | The Nuxt/Nitro HTTP handler for \`/api/**\` and blog media under \`/ps3/blog/**\`. |
60
148
  | \`runtime/domain.mjs\` | Resolves the frontend domain into the request context. |
61
149
  | \`settings.json\` | The CLI's frontend list, local MIMIC domain and personal backend; not a secret store. |
62
150
  | \`../sitemaps/${frontend}.cfg\` | The backend URL used for this frontend domain. |
@@ -67,6 +155,12 @@ The module registers these local source files with Nitro. You can edit them;
67
155
  subsequent setup runs preserve customized runtime files and this README.
68
156
  The CLI refuses to overwrite an unknown or manually changed domain mapping.
69
157
 
158
+ ## Import aliases
159
+
160
+ Use \`@/\` for application imports. Nuxt resolves it to \`app/\`, so an import such
161
+ as \`@/stores/orionplace\` works from any page, composable or component folder.
162
+ Framework imports such as \`#imports\` keep their own names.
163
+
70
164
  ## How requests reach your personal API
71
165
 
72
166
  The trusted hosting proxy supplies the public domain through \`X-Front-Domain\`,
@@ -84,6 +178,23 @@ directory. Set \`SITEMAPS_DIR\` only if you store it elsewhere. Runtime configur
84
178
  does not set a fixed public site URL. The middleware exposes the active domain
85
179
  as \`event.context.marketplaceDomain\`; use it when implementing your page metadata.
86
180
 
181
+ ## Nuxt compatibility date
182
+
183
+ Setup adds \`compatibilityDate: '2025-07-15'\` to \`nuxt.config.ts\` when the setting
184
+ is missing. This pins the existing fallback and prevents warning \`NUXT_B5001\`.
185
+ An existing date is preserved during setup and updates.
186
+
187
+ For an older generated project, add this property inside its existing
188
+ \`defineNuxtConfig({ ... })\` object, keeping the other settings:
189
+
190
+ \`\`\`typescript
191
+ compatibilityDate: '2025-07-15',
192
+ \`\`\`
193
+
194
+ Restart the development server afterward. The date controls compatibility
195
+ behavior; it does not need to match today's date. See the
196
+ [Nuxt configuration reference](https://nuxt.com/docs/4.x/api/nuxt-config#compatibilitydate).
197
+
87
198
  ## Start and verify
88
199
 
89
200
  Use Node.js 22.12 or newer. After scaffolding a new project, install dependencies:
@@ -98,53 +209,307 @@ In another terminal:
98
209
  \`\`\`bash
99
210
  curl -i http://localhost:3000/api/appload \\
100
211
  -H 'Content-Type: application/json' \\
101
- --data '{"ignore_cache":true,"detalize_mode":"full"}'
212
+ --data '{"ignore_cache":false,"detalize_mode":"light"}'
102
213
  \`\`\`
103
214
 
104
215
  Check both the HTTP status and \`form_errors\`. Successful initialization returns
105
216
  \`page_data\`; HTTP 200 by itself is insufficient. Documentation and public requests
106
217
  do not require a login prompt. Protected actions still require backend permission.
107
218
 
108
- Browser requests use the storefront's own API path:
109
-
110
- \`\`\`javascript
111
- const response = await fetch('/api/appload', {
112
- method: 'POST',
113
- credentials: 'same-origin',
114
- headers: { 'Content-Type': 'application/json' },
115
- body: JSON.stringify({ ignore_cache: true, detalize_mode: 'full' }),
116
- });
117
- const result = await response.json();
118
- console.log(response.status, result);
119
- \`\`\`
120
-
121
- For SSR, use Nuxt's \`useRequestFetch()\` so the request's domain, cookie and
122
- authorization headers reach the same gateway. For example, in \`app/app.vue\`:
219
+ ## Application Load architecture
220
+
221
+ Global route middleware initializes the marketplace before page setup. The
222
+ request uses \`POST /api/appload\` with
223
+ \`ignore_cache: false\`. Tenant settings may override these options.
224
+
225
+ The CLI registers \`@pinia/nuxt\`, installs Pinia and enables Nuxt pages.
226
+ \`app/app.vue\` wraps \`NuxtLayout\` and \`NuxtPage\` in the shared theme provider and
227
+ renders \`NuxtLoadingIndicator\`: a thin bar in the header text color
228
+ (\`inverseText\`) at the top of the window during navigation and storefront
229
+ requests (\`useOrionplaceProgress()\`).
230
+ \`app/layouts/default.vue\` renders the storefront header, cart preview, product
231
+ action feedback, preorder dialog and footer on every route; the initial
232
+ \`app/pages/index.vue\` renders categories, product collections, banners and events.
233
+ Initialization failures offer an explicit retry.
234
+ \`app/error.vue\` renders \`StorefrontErrorPage\` for unknown addresses and unhandled
235
+ errors, keeping the HTTP status: 404 shows “Page not found” with Home and
236
+ Catalog, other statuses show “Something went wrong” with Retry and Home. Error
237
+ pages use \`noindex, nofollow\` and never show error messages or stack traces.
238
+ The not-found page keeps the header and footer when Application Load succeeded;
239
+ otherwise, and for failures, it renders without the layout.
240
+ \`/product/:id\`, \`/category/:id\`, \`/browse\`, \`/featured\`, \`/journal\` and
241
+ \`/journal/:id\` load their first data while the server renders the page, with
242
+ the visitor's cookies, so the HTML contains product names, prices, article
243
+ links and article text; the browser reuses that data without repeating the
244
+ request. An ID that is not a positive integer, or a record that
245
+ \`products_search\` or \`blog_posts_get\` does not return, answers 404 from the
246
+ server. A \`/product/:id?key=<preview key>\` address uses \`products_preview\`
247
+ and lets anyone with the complete seller or staff preview address view the key
248
+ owner's product without signing in. Unpublished and option-only products show a
249
+ preview notice, and the page uses \`noindex, nofollow\`. A failed request keeps the page with its Retry
250
+ button.
251
+ Existing custom apps and index pages are preserved; render \`NuxtPage\` in your own app to display route pages.
252
+
253
+ | Project file | Responsibility |
254
+ | --- | --- |
255
+ | \`app/middleware/00.orionplace.global.ts\` | Awaits initialization before pages and later route middleware. |
256
+ | \`app/stores/orionplace.ts\` | Loads Application Load, handles session changes and keeps the \`useOrionplaceStore()\` API for components. |
257
+ | \`app/stores/orionplaceSelections.ts\` | Holds the selected language, currency and units. |
258
+ | \`app/stores/orionplaceCatalog.ts\` | Holds the catalog and tariff lists, including later replacements. |
259
+ | \`app/stores/orionplaceProducts.ts\` | Holds product updates, variants, home groups and cart/wishlist counters. |
260
+ | \`app/stores/orionplaceBrowse.ts\` | Holds the search query, filters, facets and journal posts. |
261
+ | \`app/composables/useOrionplaceAppLoad.ts\` | Request-aware transport and explicit initialize, refresh and reset actions. |
262
+ | \`app/utils/orionplaceAppLoad.ts\` | HTTP, form-error and bootstrap-envelope checks. |
263
+ | \`app/interfaces/orionplace/index.ts\` | Response envelope and all nested models. |
264
+
265
+ ### Application Load components
266
+
267
+ [COMPONENTS.md](COMPONENTS.md) maps initialization fields to their consumers and
268
+ lists the installed components and source files. Configuration, session flags
269
+ and shared counters have data references linked to the relevant features.
270
+ Components are grouped by feature under
271
+ \`app/components/orionplace/\`. Components read the initialized store directly;
272
+ no additional Application Load request is needed.
273
+
274
+ The [field sandboxes](https://orionmarket.place/en/sandbox/appload/nuxt) display
275
+ these same source files and interfaces. Selections emit events for your
276
+ application to handle; they do not perform account, cart or subscription requests.
277
+
278
+ ### Language selector
279
+
280
+ \`app/components/orionplace/locale/MainLanguageSwitcher.vue\` reads
281
+ \`store.locales\` and displays the available languages with their flags.
282
+ Selection updates the shared language and its default currency and units.
283
+ The selector uses Tailwind utilities and needs no translation plugin.
284
+
285
+ Setup installs Tailwind CSS 4 and its Vite plugin. Existing Tailwind 3 installations
286
+ must be upgraded first; setup rejects incompatible versions before writing files.
287
+ The Orionplace module registers
288
+ \`app/assets/css/orionplace.css\` for the generated components and pages, reusing an
289
+ existing Tailwind Vite plugin. It supplies utilities without replacing your CSS
290
+ reset or theme. The selector uses utility classes and needs no Sass. Keyboard
291
+ focus uses its existing border and background, without outlines.
292
+
293
+ The optional \`label\` defaults to Language; \`disabled\` defaults to false.
294
+ The store starts with its first available language. Selection calls
295
+ \`store.setLocale(code)\`, updating \`store.localeCode\` and that language's default
296
+ currency and units, then emits \`change\` with the locale object. Navigation and
297
+ translation plugin integration remain your application's responsibility.
298
+ Empty data disables selection. Missing names use another translation, the human
299
+ name or the language code.
300
+
301
+ Flags from \`flag_img\` appear beside the selected language and its dropdown options.
302
+ Missing or failed images leave the names readable. Use arrow keys or type a name
303
+ or code to find a language; Enter, Space or Tab confirms it. Escape or an outside
304
+ click closes the list without applying the highlighted option.
305
+ Options stay on one line. The dropdown expands within the viewport; longer names
306
+ use an ellipsis, with the full name available on hover.
307
+
308
+ ### Themes
309
+
310
+ Define your themes in \`app/themes/orionplace.ts\`. Add as many entries as your
311
+ storefront needs; components inherit the active palette automatically.
312
+ The shared [theme guide](./THEMES.md) explains configuration and selection.
313
+
314
+ ### Read data in a page or component
315
+
316
+ Middleware loads the data; reading the store does not send another request.
317
+ Use \`storeToRefs\` when destructuring reactive properties:
123
318
 
124
319
  \`\`\`vue
125
- <script setup>
126
- const requestFetch = useRequestFetch();
127
- const { data, error } = await useAsyncData('marketplace-initialization', () =>
128
- requestFetch('/api/appload', {
129
- method: 'POST',
130
- body: { ignore_cache: true, detalize_mode: 'full' },
131
- }),
132
- );
320
+ <script setup lang="ts">
321
+ import { usePinia } from '#imports';
322
+ import { storeToRefs } from 'pinia';
323
+ import { useOrionplaceStore } from '@/stores/orionplace';
324
+
325
+ const marketplace = useOrionplaceStore(usePinia());
326
+ const { isReady, status, failure, products, currencies } = storeToRefs(marketplace);
133
327
  </script>
134
328
 
135
329
  <template>
136
330
  <main>
137
- <p v-if="error">The marketplace API is currently unavailable.</p>
138
- <pre v-else>{{ data }}</pre>
331
+ <p v-if="failure" role="alert">Marketplace initialization failed.</p>
332
+ <p v-else-if="!isReady" role="status">Application Load: {{ status }}</p>
333
+ <p v-else>{{ products.length }} products; {{ Object.keys(currencies).length }} currencies.</p>
139
334
  </main>
140
335
  </template>
141
336
  \`\`\`
142
337
 
143
- Keep private data out of shared caches. This SSR example forwards incoming cookies;
144
- it does not relay new upstream cookies to the browser. Make session-changing calls
145
- from the browser, or explicitly append each returned Set-Cookie header to the SSR
146
- response in your server integration.
338
+ The \`@/\` alias resolves to \`app/\`, so these imports also work from nested
339
+ page and component folders.
340
+
341
+ | Store property | Available data |
342
+ | --- | --- |
343
+ | \`result\` | Response envelope, HTTP status and load time. |
344
+ | \`data\` | Complete \`page_data\`, including optional sections. |
345
+ | \`init\` | All initialization settings, banners, events, contacts, SEO, units and other sections. |
346
+ | \`profile\`, \`isAuthenticated\` | Current profile and session state. |
347
+ | \`locales\`, \`currencies\`, \`catalog\`, \`products\`, \`tariffs\` | Reactive access to common initial collections. |
348
+ | \`publicEndpoints\`, \`authenticatedEndpoints\`, \`endpoints\` | Current discovery groups and their combined view. |
349
+ | \`isReady\`, \`status\`, \`failure\` | Readiness, loading/success/error state and sanitized failure details. |
350
+
351
+ Use \`marketplace.getEndpoint(section, name)\` with section and endpoint keys
352
+ from the current response. It returns the endpoint's target, methods and forms,
353
+ or \`undefined\` when unavailable. Some endpoint descriptions may be omitted.
354
+ Discovery describes availability; the backend checks permissions on every call.
355
+
356
+ ### Refresh after a session change
357
+
358
+ Capture actions during setup and invoke them from your explicit login/logout or
359
+ reload flow. Reading the composable does not initialize Application Load:
360
+
361
+ \`\`\`typescript
362
+ import { useOrionplaceAppLoad } from '@/composables/useOrionplaceAppLoad';
363
+
364
+ const { reset, refresh } = useOrionplaceAppLoad();
365
+ async function afterSessionChanged() {
366
+ reset();
367
+ await refresh();
368
+ }
369
+ \`\`\`
370
+
371
+ Call this after the session-changing API request has completed. Reset clears the
372
+ profile, initialization and discovery, aborts pending initialization and prevents
373
+ late responses restoring the old session. Refresh replaces the whole snapshot.
374
+ On failure, stale data and permissions remain cleared; the store exposes the error.
375
+
376
+ ### Session and CSRF cookies
377
+
378
+ Session and CSRF cookies travel in HTTP headers, not in the initialization JSON.
379
+ Keep the signed HttpOnly \`sessionid\` opaque: the browser sends it automatically.
380
+ Never log, decode, rewrite or put cookie values in Pinia or localStorage.
381
+ Read the current \`csrftoken\` for each protected browser action and send it as
382
+ \`X-CSRFToken\` through the same-origin \`/api/\` gateway with credentials enabled.
383
+ Login can rotate the token. The shared \`OrionplaceApi\` client owns initialization and discovered browser
384
+ requests. \`useOrionplaceApi()\` creates one instance per Nuxt application. It
385
+ resolves current discovery and handles CSRF renewal; components send discovered
386
+ requests in the browser. Page data for the server render uses
387
+ \`useOrionplaceServerApi()\`, the same class and transport, through
388
+ \`useOrionplaceServerData()\`; the browser hydrates that result without a
389
+ second request.
390
+
391
+ The global route middleware passes \`to.query.locale\` to the first Application
392
+ Load request. Later requests use the selected locale held by the store.
393
+
394
+ During SSR the transport sends the incoming cookies plus every cookie the
395
+ backend set earlier in the same render, and relays each raw \`Set-Cookie\`
396
+ separately. That cookie list belongs to one render; never share it across
397
+ visitors.
398
+
399
+ Renew CSRF using \`POST /api/csrf_renew\` with \`{}\`, then re-read the cookie.
400
+ HTTP \`419\`, or HTTP \`403\` with \`page_data.csrf: false\`, means CSRF
401
+ rejection; a \`403\` without that flag can mean permissions or origin rejection. Offer explicit retries for
402
+ mutations. After confirmed login/logout, reset and refresh Application Load; these actions
403
+ change application data and do not log in/out or delete cookies.
404
+
405
+ HTTP \`401\` means the request has no signed-in session. When it arrives while
406
+ \`store.isAuthenticated\` is \`true\`, the client calls the store's \`endSession()\`
407
+ once: the profile, wallet, authenticated discovery, cart/wishlist counters and
408
+ account values of known products are removed at once, then Application Load
409
+ reloads for the guest session. The failed request is not repeated and no
410
+ sign-in dialog opens; a guest \`401\`, \`403\`, CSRF rejection or network failure
411
+ stays an ordinary request error.
412
+
413
+ [Cookie lifecycle and browser request example](https://orionmarket.place/en/sandbox/appload/nuxt#session-cookies)
414
+
415
+ ### SSR, navigation and failures
416
+
417
+ Each SSR request gets its own Pinia instance. The loader forwards the incoming
418
+ domain and session and relays new response cookies to the browser. Pinia hydrates
419
+ the result, so hydration and later client navigation do not repeat initialization.
420
+ Concurrent initialization calls share one request within that instance.
421
+
422
+ Failures also survive hydration and navigation. They never open a login modal or
423
+ trigger an automatic retry on every route. Show the error and offer explicit
424
+ reload. Feature components should check \`isReady\` before using required data.
425
+
426
+ Page responses use \`private, no-store\`. Do not put personalized HTML in shared
427
+ caches or persist the snapshot in localStorage. The storefront page displays
428
+ public content and the account menu. Raw initialization payloads, keys and
429
+ backend exception stacks are not rendered there.
430
+
431
+ Interfaces cover initialization, discovery/forms, profile and nested models.
432
+ Plugin-defined configuration uses JSON types; interfaces are not full runtime
433
+ validation of every nested field. Existing edited generated source is preserved;
434
+ review and merge newer templates manually where the CLI reports preserved files.
435
+
436
+ ## Storefront header
437
+
438
+ Browse [Components](https://orionmarket.place/en/sandbox/components/nuxt) for the
439
+ Header composition and its search, language, currency, profile, wallet and catalog
440
+ children, with live previews and source downloads. Russian guides are available too.
441
+
442
+ The default layout renders \`StorefrontHeader\` above every page, including the
443
+ StorefrontHome sections. It combines catalog navigation with Manufacturers and
444
+ Journal links, search, language/currency selection, the account menu and
445
+ wishlist/cart buttons. English and Russian labels
446
+ follow the shared storefront locale.
447
+ \`StorefrontAccount\` adds guest sign-in and an authenticated profile/wallet menu.
448
+ The generated layout opens \`/profile\` for sign-in and profile selection;
449
+ after sign-in, the user returns to the page passed in \`redirect\`,
450
+ \`/wallet\` for wallet selection and \`/logout\` for sign-out. No credentials or
451
+ payments are submitted by these presentation components. The balance follows
452
+ the selected currency, preserves zero and uses a dash for missing amounts.
453
+ After confirmed authentication changes, refresh Application Load to replace the
454
+ session, profile, wallet and discovery. See the [account guide and source downloads](https://orionmarket.place/en/sandbox/appload/nuxt/init/is_authenticated).
455
+ The wishlist and cart buttons display \`store.counters\`: initial Application Load
456
+ counts, updated by confirmed product actions. The wishlist button opens
457
+ \`/wishlist\`; the cart button opens the cart preview, whose product and full-cart
458
+ selections open \`/product/:id\` and \`/cart\`. Search opens
459
+ \`/browse?q=...\`; the Manufacturers and Journal links open /manufacturers and
460
+ /journal; catalog selections open /category/:id, product selections open
461
+ /product/:id and seller selections open /sellers?seller=<id>. Variant selection replaces the
462
+ whole representative card; missing products and secondary choices are loaded
463
+ through the shared API client. Purchase, wishlist, notification and preorder
464
+ events run the shared product action controller. The header's \`actions\` and \`catalog\` slots support those
465
+ integrations. See [the header contract](./COMPONENTS.md#storefront-header).
466
+
467
+ ## Storefront home
468
+
469
+ The initial page renders banners and categories, then ordinary products, discounts,
470
+ new products, events and non-empty featured recommendations through
471
+ \`StorefrontHome\`. Category tiles follow the storefront's count and ordering
472
+ settings. Each product section shows its first records; More
473
+ expands that section independently, except in Featured, where it opens
474
+ /featured. Discounted, new and featured IDs are excluded
475
+ from the ordinary section. New products may also belong to Discounts. If AppLoad
476
+ has no new products and products_search is available, a browser request loads up
477
+ to 20 with the only_new filter. Banners and layout events use the selected locale and responsive image formats. Both display full-width carousels
478
+ with manual slide controls. Empty sections stay hidden.
479
+ Category tiles, catalog actions and linked banners open /category/:id.
480
+ The /featured route lists the signed-in customer's featured products with the
481
+ same filters and pagination, using the fixed only_featured search filter; guests
482
+ see a short note that recommendations appear after sign-in.
483
+ The category route includes public descendants, filters and paged products,
484
+ with a vertical mobile grid. The shared default layout keeps the header and
485
+ purchase feedback available across routes. Product selections open /product/:id
486
+ and seller selections open /sellers?seller=<id>. Selecting an event with a promotion
487
+ opens the enrollment dialog; enrollment is sent only after its explicit
488
+ confirmation. Existing product controllers handle variants and purchase actions.
489
+
490
+ See [the home composition](./COMPONENTS.md#storefront-home-sections) and the
491
+ [Components guide](https://orionmarket.place/en/sandbox/components/nuxt/home)
492
+ for child contracts, settings, events, slots and physical source.
493
+
494
+ ## Update the package and components
495
+
496
+ Run this from your project root whenever you want the latest release:
147
497
 
498
+ \`\`\`bash
499
+ npx orionplace-nuxt update
500
+ \`\`\`
501
+
502
+ The command fetches the latest CLI, adds new template files, refreshes unchanged
503
+ generated source, updates the package dependency, and runs \`npm install\`.
504
+ It preserves edited files and lists them for manual review. Find their incoming
505
+ versions under \`node_modules/orionplace-nuxt/templates\` or \`runtime\`.
506
+ Domain mappings, domain settings and \`.env\` are preserved. Upstream file removals
507
+ do not delete local source. Restart development or rebuild and redeploy afterward.
508
+
509
+ Use \`npx orionplace-nuxt update --dry-run\` to review changes without modifying
510
+ project files or installed dependencies; downloading the CLI may update npm's
511
+ cache. The alias \`npm run orionplace:update\` performs the same normal update.
512
+ If installation fails after source generation, run \`npm install\` and retry.
148
513
 
149
514
  ## Deploy on your VPS
150
515
 
@@ -181,10 +546,117 @@ remote personal API from the domain file. The proxy must overwrite those headers
181
546
  An unknown domain never falls back to another tenant. This setup does not generate
182
547
  sitemap XML or add analytics.
183
548
 
549
+ ## Android app
550
+
551
+ Deploy the website first, then build the app with Capacitor 8. With
552
+ \`ORIONPLACE_APP_ORIGIN\` set to your public storefront (HTTPS) the build is
553
+ client-only and sends every API request to that storefront through Capacitor's
554
+ native HTTP (\`app/utils/orionplace/nativeApp.ts\`). Without the variable the
555
+ website build is unchanged. Steps:
556
+ [Android app guide](https://orionmarket.place/en/sandbox/android-app).
557
+
558
+ \`\`\`bash
559
+ ORIONPLACE_APP_ORIGIN=https://shop.example.com npx nuxt generate
560
+ npx cap sync android
561
+ \`\`\`
562
+
184
563
  ## More documentation
185
564
 
186
- - [Nuxt project setup](https://orionmarket.place/sandbox/new-project/nuxt)
187
- - [Domain setup and direct Nginx alternative](https://orionmarket.place/sandbox/backend-domain/nuxt)
188
- - [AppLoad](https://orionmarket.place/sandbox)
565
+ - [Nuxt package installation and domain setup](https://orionmarket.place/en/sandbox/new-project/nuxt)
566
+ - [Application Load](https://orionmarket.place/en/sandbox)
567
+
568
+ ## Representative product actions
569
+
570
+ The Nuxt header forwards cart, wishlist, availability-notification and preorder
571
+ intents. The generated layout binds \`useOrionplaceProductActions\` to the shared API
572
+ client; confirmed responses update the product and \`store.counters\`. Controls
573
+ stay visible while disabled, and the catalog stays open. At quantity one the
574
+ trash control removes the confirmed cart item. Secondary variants must be
575
+ selected before confirming an addition, subscription or preorder in the picker.
576
+ Guest preorder collects contact details; wishlist/notifications report the need
577
+ for sign-in, and subscription requires profile email. The generated storefront
578
+ supplies sign-in and personal details at \`/profile\`. Failed mutations retain confirmed
579
+ data; a failed follow-up refresh retries only that read. Components previews
580
+ record actions without changing the reader's cart or session.
581
+
582
+ ### Visual settings, search filters and blog previews
583
+
584
+ [Visual settings](https://orionmarket.place/en/sandbox/appload/nuxt/init/visual_settings)
585
+ are consumed by the supplied Nuxt components:
586
+
587
+ - [CatalogHeader](https://orionmarket.place/en/sandbox/components/nuxt/catalog)
588
+ uses \`menu_image\` for shortcut thumbnails and \`catalog_menu_image\` inside its catalog panel.
589
+ - [ProductGroup](https://orionmarket.place/en/sandbox/components/nuxt/product-group)
590
+ becomes a swipeable row on a narrow screen. \`mobile_show_arrows\` controls its previous/next
591
+ buttons when the row overflows. Desktop grids and promotion carousels are unaffected.
592
+ Optional \`productIds\` resolves an ordered set through \`store.getProduct\`; an omitted
593
+ value uses the AppLoad collection, and an empty array displays no cards.
594
+ - [Search results](https://orionmarket.place/en/sandbox/components/nuxt/search-results)
595
+ retain initial selector choices, support currency price ranges and color filters,
596
+ and display loading, empty and failure states.
597
+ - [Preorder dialog](https://orionmarket.place/en/sandbox/components/nuxt/preorder-dialog)
598
+ is shared by storefront and documentation product previews.
599
+ - [Sign-out page](https://orionmarket.place/en/sandbox/components/nuxt/logout)
600
+ calls profile_logout at /logout, then refreshes guest AppLoad and returns home.
601
+ - [Category page](https://orionmarket.place/en/sandbox/components/nuxt/category-page)
602
+ - [SearchFilters](https://orionmarket.place/en/sandbox/components/nuxt/search-filters)
603
+ uses \`show_filter_counters\` for counts supplied in \`selects\` and \`variants\`.
604
+ \`store.preserveSearchFacets(page_data)\` retains the initial options and price
605
+ bounds from \`products_search\`; \`store.setSearchFacets\` explicitly replaces them
606
+ for a new scope or editor. Selection updates \`store.searchFilters\` before
607
+ \`change\` emits copied ID arrays and scalar fields. Subsequent narrowed responses
608
+ update products, leaving the original selectors available. \`disabled\` prevents
609
+ selection; there are no slots.
610
+ - \`single_seller_mode\` hides
611
+ [ProductCardSeller](https://orionmarket.place/en/sandbox/components/nuxt/productCardSeller)
612
+ and seller filters; manufacturer options remain visible. The backend currently returns false.
613
+ - [BlogPostGroup](https://orionmarket.place/en/sandbox/components/nuxt/blog) uses
614
+ \`blog_view_type\`: \`EBlogViewType.PORTRAIT\` is a grid, \`EBlogViewType.LIST\` is a list,
615
+ and \`EBlogViewType.CUSTOM\` starts with a lead card, followed by groups of up to
616
+ three posts. Unknown values fall back to portrait; numeric strings are accepted.
617
+ \`store.setBlogPosts(page_data.posts.data)\` supplies previews from \`blog_posts_get\`.
618
+ [BlogPostCard](https://orionmarket.place/en/sandbox/components/nuxt/blog-post) takes
619
+ \`postId\` and \`layout\` (portrait by default, list or hero), reads the post from
620
+ the store, and shows its localized title, plain-text preview, first ordered image
621
+ and reading time. The group forwards its \`select\` event with \`IBlogPostPreview\`.
622
+ The application opens the article; neither component loads content or changes access.
623
+ The group has no props; neither component has slots. Empty collections show an empty state.
624
+
625
+ AppLoad refresh and reset clear search facets, selected filters and blog posts.
626
+ The generated \`/browse?q=...\` and \`/browse?view=blog\` pages load public responses
627
+ through endpoint discovery, handle pending/error/retry states and pagination.
628
+ Text search requires at least three characters. A seller, manufacturer or store
629
+ selection can define the product scope without a text query. Product links open
630
+ /product/:id and journal entries open /journal/:id. Search uses the shared
631
+ purchase handlers.
632
+ The component guides include editable settings, real components and their maintained
633
+ source/downloads in English and Russian. Blog previews start empty when the backend
634
+ has no posts; the JSON editor accepts \`IBlogPostPreview[]\`.
635
+
636
+ ## Customer account and shopping flows
637
+
638
+ The generated application supplies cart/checkout, order history and attachments,
639
+ support conversations, saved addresses, wallet, wishlist/availability alerts,
640
+ search history, sign-in history, promotion codes, product reviews, journal
641
+ comments, contact form, email unsubscribe, event enrollment and public
642
+ manufacturer/seller/store/catalog directories. \`/tariffs\` lists subscription
643
+ plans with their periods, trials, named plan parameters and options, and
644
+ \`/tariffs/:slug/:id\` shows one plan in the product-detail layout. Guests sign in
645
+ through links that return to the chosen plan; signed-in customers confirm the
646
+ purchase in a dialog that links to \`/subscriptions\` afterwards. The subscription
647
+ account lists dates and can disable automatic renewal. Choosing a new renewal period is not yet supplied.
648
+
649
+ [COMPONENTS.md](COMPONENTS.md) maps these routes to maintained components and
650
+ endpoint names. API requests use the discovered method and URL, the current
651
+ session, CSRF and confirmed response handling. Account sections mount after
652
+ sign-in. Failed reads preserve existing content; form errors preserve drafts.
653
+ Physical components, their composables, styles and English/Russian labels are
654
+ installed from this package. Source ZIPs include their imported dependencies;
655
+ see [COMPONENT-DOWNLOAD.md](COMPONENT-DOWNLOAD.md) for consumer configuration.
656
+
657
+ Catalog refresh replaces the current catalog through store.setCatalogTree().
658
+ Tariff search replaces the current plan list through store.setTariffs(). A new
659
+ Application Load clears those overrides. Confirmed cart and wishlist changes
660
+ update already-loaded product cards, including featured and secondary variants.
189
661
  `;
190
662
  }