orionplace-nuxt 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +866 -29
  2. package/bin/orionplace-nuxt.mjs +16 -3
  3. package/package.json +25 -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 +484 -47
  10. package/src/setup.mjs +71 -52
  11. package/src/update.mjs +2 -2
  12. package/src/validation.mjs +6 -0
  13. package/templates/.vscode/settings.json +5 -0
  14. package/templates/app/app.vue +42 -84
  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 +69 -46
  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/appBase/IAppLoad.ts +4 -3
  334. package/templates/app/interfaces/orionplace/appBase/IAppLoadCommon.ts +22 -31
  335. package/templates/app/interfaces/orionplace/appBase/IApploadUserProfile.ts +1 -1
  336. package/templates/app/interfaces/orionplace/appBase/IForm.ts +1 -1
  337. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonBanner.ts +7 -7
  338. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonPath.ts +2 -2
  339. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonSEO.ts +20 -7
  340. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonTariff.ts +4 -4
  341. package/templates/app/interfaces/orionplace/appBase/appLoadCommon/IAppLoadCommonVariables.ts +1 -0
  342. package/templates/app/interfaces/orionplace/blog/IBlogApi.ts +247 -0
  343. package/templates/app/interfaces/orionplace/blog/IBlogPostPreview.ts +30 -0
  344. package/templates/app/interfaces/orionplace/cart/ICartActions.ts +67 -0
  345. package/templates/app/interfaces/orionplace/cart/ICartData.ts +382 -0
  346. package/templates/app/interfaces/orionplace/cart/ICartDeliveryActions.ts +68 -0
  347. package/templates/app/interfaces/orionplace/cart/ICartModal.ts +22 -0
  348. package/templates/app/interfaces/orionplace/cart/IDeliveryMap.ts +29 -0
  349. package/templates/app/interfaces/orionplace/catalog/ICatalogDirectory.ts +75 -0
  350. package/templates/app/interfaces/orionplace/category/ICategory.ts +2 -1
  351. package/templates/app/interfaces/orionplace/domains/IDomain.ts +2 -2
  352. package/templates/app/interfaces/orionplace/forms/ICustomerSubfilter.ts +19 -0
  353. package/templates/app/interfaces/orionplace/index.ts +57 -29
  354. package/templates/app/interfaces/orionplace/marketing/IPromoActions.ts +51 -0
  355. package/templates/app/interfaces/orionplace/orders/IOrderActions.ts +99 -0
  356. package/templates/app/interfaces/orionplace/orders/IOrderHistory.ts +259 -0
  357. package/templates/app/interfaces/orionplace/orders/IProductPreorder.ts +31 -0
  358. package/templates/app/interfaces/orionplace/payments/IInvoice.ts +147 -0
  359. package/templates/app/interfaces/orionplace/products/IProduct.ts +178 -151
  360. package/templates/app/interfaces/orionplace/products/IProductFeedbackApi.ts +218 -0
  361. package/templates/app/interfaces/orionplace/products/IProductSearchApi.ts +146 -0
  362. package/templates/app/interfaces/orionplace/products/IProductSearchFacets.ts +35 -0
  363. package/templates/app/interfaces/orionplace/products/IProductSecondaryVariantRequest.ts +15 -0
  364. package/templates/app/interfaces/orionplace/products/IProductSpecification.ts +14 -0
  365. package/templates/app/interfaces/orionplace/products/IWishlist.ts +22 -0
  366. package/templates/app/interfaces/orionplace/sellers/ISellerDirectory.ts +70 -0
  367. package/templates/app/interfaces/orionplace/shared/IBreadcrumb.ts +10 -0
  368. package/templates/app/interfaces/orionplace/shared/IStorefrontControls.ts +13 -0
  369. package/templates/app/interfaces/orionplace/state.ts +4 -0
  370. package/templates/app/interfaces/orionplace/stores/IStoreDirectory.ts +63 -0
  371. package/templates/app/interfaces/orionplace/subscribeTariff/ISubscribeTariff.ts +41 -31
  372. package/templates/app/interfaces/orionplace/subscribeTariff/ITariffSelection.ts +11 -0
  373. package/templates/app/interfaces/orionplace/subscribes/ISubscribe.ts +1 -1
  374. package/templates/app/interfaces/orionplace/subscribes/ISubscriptionApi.ts +125 -0
  375. package/templates/app/interfaces/orionplace/tickets/ICustomerTicketApi.ts +223 -0
  376. package/templates/app/interfaces/orionplace/transport.ts +7 -3
  377. package/templates/app/layouts/default.vue +376 -0
  378. package/templates/app/middleware/00.orionplace.global.ts +27 -0
  379. package/templates/app/middleware/01.orionplace-sellers.global.ts +15 -0
  380. package/templates/app/middleware/orionplace-account.ts +40 -0
  381. package/templates/app/pages/activity.vue +19 -0
  382. package/templates/app/pages/addresses.vue +23 -0
  383. package/templates/app/pages/browse.vue +246 -0
  384. package/templates/app/pages/cart.vue +20 -0
  385. package/templates/app/pages/catalog.vue +17 -0
  386. package/templates/app/pages/category/[id].vue +142 -0
  387. package/templates/app/pages/contact.vue +17 -0
  388. package/templates/app/pages/featured.vue +144 -0
  389. package/templates/app/pages/index.vue +194 -0
  390. package/templates/app/pages/journal/[id].vue +128 -0
  391. package/templates/app/pages/journal/index.vue +67 -0
  392. package/templates/app/pages/logout.vue +71 -0
  393. package/templates/app/pages/manufacturers.vue +33 -0
  394. package/templates/app/pages/orders.vue +40 -0
  395. package/templates/app/pages/product/[id].vue +126 -0
  396. package/templates/app/pages/profile.vue +118 -0
  397. package/templates/app/pages/promo/[id].vue +67 -0
  398. package/templates/app/pages/promocodes.vue +21 -0
  399. package/templates/app/pages/sellers.vue +203 -0
  400. package/templates/app/pages/stores.vue +36 -0
  401. package/templates/app/pages/subscriptions.vue +21 -0
  402. package/templates/app/pages/tariffs/[slug]/[id].vue +126 -0
  403. package/templates/app/pages/tariffs/index.vue +50 -0
  404. package/templates/app/pages/tickets.vue +56 -0
  405. package/templates/app/pages/unsubscribe.vue +32 -0
  406. package/templates/app/pages/wallet.vue +23 -0
  407. package/templates/app/pages/wishlist.vue +48 -0
  408. package/templates/app/stores/orionplace.ts +493 -0
  409. package/templates/app/stores/orionplaceBrowse.ts +79 -0
  410. package/templates/app/stores/orionplaceCatalog.ts +121 -0
  411. package/templates/app/stores/orionplaceDomainAccess.ts +55 -0
  412. package/templates/app/stores/orionplaceProducts.ts +249 -0
  413. package/templates/app/stores/orionplaceSelections.ts +132 -0
  414. package/templates/app/themes/orionplace.ts +108 -0
  415. package/templates/app/utils/orionplace/accountLabels.ts +22 -0
  416. package/templates/app/utils/orionplace/activityLabels.ts +65 -0
  417. package/templates/app/utils/orionplace/activityPresentation.ts +16 -0
  418. package/templates/app/utils/orionplace/addressChanges.ts +26 -0
  419. package/templates/app/utils/orionplace/addressRegions.ts +17 -0
  420. package/templates/app/utils/orionplace/api.ts +333 -0
  421. package/templates/app/utils/orionplace/blogArticleHtml.ts +318 -0
  422. package/templates/app/utils/orionplace/blogComments.ts +133 -0
  423. package/templates/app/utils/orionplace/blogLabels.ts +111 -0
  424. package/templates/app/utils/orionplace/blogLayout.ts +95 -0
  425. package/templates/app/utils/orionplace/breadcrumbLabels.ts +11 -0
  426. package/templates/app/utils/orionplace/browseLabels.ts +98 -0
  427. package/templates/app/utils/orionplace/cartAddress.ts +94 -0
  428. package/templates/app/utils/orionplace/cartLabels.ts +261 -0
  429. package/templates/app/utils/orionplace/cartOptions.ts +143 -0
  430. package/templates/app/utils/orionplace/cartPreview.ts +108 -0
  431. package/templates/app/utils/orionplace/cartPromo.ts +150 -0
  432. package/templates/app/utils/orionplace/cartShipment.ts +74 -0
  433. package/templates/app/utils/orionplace/cartSnapshot.ts +20 -0
  434. package/templates/app/utils/orionplace/catalog.ts +106 -0
  435. package/templates/app/utils/orionplace/category.ts +52 -0
  436. package/templates/app/utils/orionplace/categoryLabels.ts +31 -0
  437. package/templates/app/utils/orionplace/contactLabels.ts +102 -0
  438. package/templates/app/utils/orionplace/currency.ts +128 -0
  439. package/templates/app/utils/orionplace/deliveryMap.ts +89 -0
  440. package/templates/app/utils/orionplace/directoryLabels.ts +131 -0
  441. package/templates/app/utils/orionplace/emptyStateArt.ts +231 -0
  442. package/templates/app/utils/orionplace/errorPageLabels.ts +80 -0
  443. package/templates/app/utils/orionplace/featureData.ts +25 -0
  444. package/templates/app/utils/orionplace/featureLabels.ts +271 -0
  445. package/templates/app/utils/orionplace/featuredLabels.ts +28 -0
  446. package/templates/app/utils/orionplace/files.ts +71 -0
  447. package/templates/app/utils/orionplace/footerLabels.ts +35 -0
  448. package/templates/app/utils/orionplace/guestSession.ts +50 -0
  449. package/templates/app/utils/orionplace/headerLabels.ts +68 -0
  450. package/templates/app/utils/orionplace/homeContent.ts +129 -0
  451. package/templates/app/utils/orionplace/homeLabels.ts +52 -0
  452. package/templates/app/utils/orionplace/htmlText.ts +59 -0
  453. package/templates/app/utils/orionplace/links.ts +14 -0
  454. package/templates/app/utils/orionplace/manufacturerIndex.ts +91 -0
  455. package/templates/app/utils/orionplace/modalWindow.ts +109 -0
  456. package/templates/app/utils/orionplace/nativeApp.ts +361 -0
  457. package/templates/app/utils/orionplace/notice.ts +22 -0
  458. package/templates/app/utils/orionplace/orderLabels.ts +309 -0
  459. package/templates/app/utils/orionplace/orderPresentation.ts +586 -0
  460. package/templates/app/utils/orionplace/pageSeo.ts +274 -0
  461. package/templates/app/utils/orionplace/paginationScroll.ts +131 -0
  462. package/templates/app/utils/orionplace/phone.ts +22 -0
  463. package/templates/app/utils/orionplace/presentation.ts +72 -0
  464. package/templates/app/utils/orionplace/productActionLabels.ts +60 -0
  465. package/templates/app/utils/orionplace/productActions.ts +547 -0
  466. package/templates/app/utils/orionplace/productAvailability.ts +36 -0
  467. package/templates/app/utils/orionplace/productGallery.ts +72 -0
  468. package/templates/app/utils/orionplace/productLabels.ts +82 -0
  469. package/templates/app/utils/orionplace/productManufacturer.ts +30 -0
  470. package/templates/app/utils/orionplace/productPage.ts +46 -0
  471. package/templates/app/utils/orionplace/productPhotos.ts +67 -0
  472. package/templates/app/utils/orionplace/productSearchScope.ts +237 -0
  473. package/templates/app/utils/orionplace/productSeller.ts +51 -0
  474. package/templates/app/utils/orionplace/profile.ts +136 -0
  475. package/templates/app/utils/orionplace/profileLabels.ts +151 -0
  476. package/templates/app/utils/orionplace/promoLabels.ts +75 -0
  477. package/templates/app/utils/orionplace/promoPresentation.ts +381 -0
  478. package/templates/app/utils/orionplace/reviewLabels.ts +172 -0
  479. package/templates/app/utils/orionplace/reviewScope.ts +41 -0
  480. package/templates/app/utils/orionplace/richText.ts +13 -0
  481. package/templates/app/utils/orionplace/searchFilters.ts +99 -0
  482. package/templates/app/utils/orionplace/searchHistory.ts +144 -0
  483. package/templates/app/utils/orionplace/sellerDirectory.ts +134 -0
  484. package/templates/app/utils/orionplace/seo.ts +52 -0
  485. package/templates/app/utils/orionplace/serverCookies.ts +88 -0
  486. package/templates/app/utils/orionplace/sessionLabels.ts +27 -0
  487. package/templates/app/utils/orionplace/signInReturn.ts +89 -0
  488. package/templates/app/utils/orionplace/storeDirectory.ts +50 -0
  489. package/templates/app/utils/orionplace/subscriptionChanges.ts +167 -0
  490. package/templates/app/utils/orionplace/subscriptionLabels.ts +67 -0
  491. package/templates/app/utils/orionplace/subscriptionManageLabels.ts +307 -0
  492. package/templates/app/utils/orionplace/subscriptionPlans.ts +162 -0
  493. package/templates/app/utils/orionplace/subscriptionRemote.ts +110 -0
  494. package/templates/app/utils/orionplace/subscriptionUsage.ts +82 -0
  495. package/templates/app/utils/orionplace/tariffLabels.ts +130 -0
  496. package/templates/app/utils/orionplace/tariffPage.ts +77 -0
  497. package/templates/app/utils/orionplace/tariffVariables.ts +165 -0
  498. package/templates/app/utils/orionplace/tariffs.ts +284 -0
  499. package/templates/app/utils/orionplace/ticketItems.ts +87 -0
  500. package/templates/app/utils/orionplace/ticketLabels.ts +335 -0
  501. package/templates/app/utils/orionplace/ticketLocation.ts +79 -0
  502. package/templates/app/utils/orionplace/walletTransaction.ts +135 -0
  503. package/templates/app/utils/orionplaceAppLoad.ts +55 -15
  504. package/templates/orionplace/COMPONENT-DOWNLOAD.md +40 -0
  505. package/templates/orionplace/COMPONENTS.md +1983 -0
  506. package/templates/orionplace/THEMES.md +94 -0
package/README.md CHANGED
@@ -1,37 +1,71 @@
1
1
  # orionplace-nuxt
2
2
 
3
- Set up a Nuxt 4 storefront for your personal Orionplace marketplace API.
4
- The package includes a Nuxt module, a setup CLI, and commented server source
5
- that is copied into your project alongside an integration README.
3
+ **A complete Nuxt 4 storefront for your Orionplace marketplace, set up with one command.**
4
+
5
+ `orionplace-nuxt` creates a server-rendered shop connected to your personal
6
+ marketplace API: catalog and search, product pages, cart and checkout, customer
7
+ account, journal and support, in English and Russian. The package includes a Nuxt module, a
8
+ setup CLI and the full storefront source, so every page and component in your
9
+ project is yours to change.
10
+
11
+ - **Setup CLI:** `init`, `set backend`, `add frontend`, `set mimic` and `update`.
12
+ - **API gateway:** the browser calls `/api/...` on your own domain; the server
13
+ forwards it to your marketplace backend with cookies bound to the storefront.
14
+ - **Typed store:** one Application Load request fills it before the first render.
15
+ - **124 storefront components**, each with an English and Russian README
16
+ ([list](#components)).
17
+ - **Several storefront domains** on one backend, each with its own mapping.
18
+ - **Android app** from the same project with Capacitor 8.
19
+
20
+ **Contents:** [Quick start](#quick-start-from-zero) ·
21
+ [Existing project](#existing-nuxt-4-project) · [Components](#components) ·
22
+ [Commands](#commands) · [Android app](#android-app) ·
23
+ [Update](#update-an-existing-project)
6
24
 
7
25
  Requires Node.js 22.12+ and a Node server deployment. Static-only and edge
8
26
  hosting are not supported by this filesystem-based integration.
9
27
 
10
- ## New project
28
+ ## Android app
11
29
 
12
- Your personal backend domain is already provided in your account at
13
- [orionmarket.place](https://orionmarket.place). You can change it there.
14
- Use that domain below and the public domain of your own storefront.
30
+ The same project builds as an Android app with Capacitor 8. Set
31
+ `ORIONPLACE_APP_ORIGIN` to your deployed public storefront (HTTPS) for that
32
+ build: the module then makes a client-only build, and every API request goes to
33
+ `<origin>/api/...` through Capacitor's native HTTP with the storefront Origin,
34
+ so your storefront gateway answers it as for the website. With the
35
+ `@capacitor/app` plugin installed, the Android back button closes an open
36
+ dialog, opens the previous page, or leaves the app on the first page. With
37
+ `@capacitor/filesystem` and `@capacitor/share`, a purchased file is saved in
38
+ the app and opened from the Android share sheet. Without
39
+ the variable nothing changes. Setup, build and release steps:
40
+ [Android app guide](https://orionmarket.place/en/sandbox/android-app).
15
41
 
16
42
  ```bash
17
- mkdir my-marketplace
18
- cd my-marketplace
19
- npm install orionplace-nuxt
20
- npx orionplace-nuxt set backend your-project.orionplace.app
21
- npx orionplace-nuxt add frontend shop.example.com
22
- npm install
23
- npm run dev
43
+ ORIONPLACE_APP_ORIGIN=https://shop.example.com npx nuxt generate
44
+ npx cap sync android
24
45
  ```
25
46
 
26
- The first setup command creates the Nuxt configuration and app if needed.
27
- The final `npm install` installs the dependencies added to `package.json`.
28
- The backend command accepts either a hostname or its full HTTPS `/api` URL.
29
- The frontend command accepts a public hostname or its root HTTPS URL.
47
+ ## Asset loading
48
+
49
+ The starter preloads only the current route's module graph. Navigation assets
50
+ start loading after pointer or keyboard interaction. Closed dialogs and catalog
51
+ content load when opened, while product rows and events below the first screen
52
+ hydrate as they approach the viewport.
53
+
54
+ Storefront image components emit intrinsic dimensions or a stable aspect ratio
55
+ to reserve layout space. Product cards include the primary image in the initial
56
+ page and add secondary images after hover or keyboard focus.
57
+
58
+ ## Quick start from zero
30
59
 
31
- You can also scaffold before installing:
60
+ Your personal backend domain is already provided in your account at
61
+ [orionmarket.place](https://orionmarket.place). You can change it there.
62
+ Replace `your-project.orionplace.app` below with that domain and
63
+ `shop.example.com` with the public domain of your own storefront.
64
+ With Node.js 22.12+ and npm installed, run this from the parent folder;
65
+ no existing Nuxt project is needed:
32
66
 
33
67
  ```bash
34
- npx orionplace-nuxt init my-marketplace
68
+ npx --yes orionplace-nuxt init my-marketplace
35
69
  cd my-marketplace
36
70
  npm install
37
71
  npx orionplace-nuxt set backend your-project.orionplace.app
@@ -39,6 +73,13 @@ npx orionplace-nuxt add frontend shop.example.com
39
73
  npm run dev
40
74
  ```
41
75
 
76
+ The first command creates the Nuxt configuration, app and integration README.
77
+ The first frontend becomes the local MIMIC domain. Open the local URL printed
78
+ by Nuxt (normally http://localhost:3000). The storefront opens after Application Load
79
+ succeeds. If initialization fails, check your domain mapping and backend response.
80
+ The backend command accepts either a hostname or its full HTTPS `/api` URL.
81
+ The frontend command accepts a public hostname or its root HTTPS URL.
82
+
42
83
  ## Existing Nuxt 4 project
43
84
 
44
85
  ```bash
@@ -46,6 +87,8 @@ npm install orionplace-nuxt
46
87
  npx orionplace-nuxt init --dry-run
47
88
  npx orionplace-nuxt set backend your-project.orionplace.app
48
89
  npx orionplace-nuxt add frontend shop.example.com
90
+ npm install
91
+ npm run dev
49
92
  ```
50
93
 
51
94
  The CLI preserves unrelated Nuxt settings, scripts, and environment variables.
@@ -58,6 +101,211 @@ No install or postinstall hook changes your application. Only explicitly running
58
101
  the CLI writes files. Use `--cwd <directory>` to select a project and `--dry-run`
59
102
  to inspect planned changes without writing them.
60
103
 
104
+ ## Nuxt compatibility date
105
+
106
+ The local setup implementation adds `compatibilityDate: '2025-07-15'` when it is
107
+ missing from `nuxt.config.ts`, including during updates. Existing dates are
108
+ preserved. This retains Nuxt's fallback behavior and prevents `NUXT_B5001`.
109
+ This fix will be available on npm after the next publication.
110
+
111
+ For an already generated project, add this property inside the existing
112
+ `defineNuxtConfig({ ... })` object and restart development:
113
+
114
+ ```typescript
115
+ compatibilityDate: '2025-07-15',
116
+ ```
117
+
118
+ Keep the other settings. The date controls compatibility behavior, rather than
119
+ tracking today's date; see the [Nuxt configuration reference](https://nuxt.com/docs/4.x/api/nuxt-config#compatibilitydate).
120
+
121
+ ## Import aliases
122
+
123
+ Use `@/` for application imports. Nuxt resolves it to `app/`, so an import such
124
+ as `@/stores/orionplace` works from any page, composable or component folder.
125
+ Framework imports such as `#imports` keep their own names.
126
+
127
+ <!-- components:start (generated by scripts/generate-package-readme-components.mjs) -->
128
+ ## Components
129
+
130
+ The starter includes **124 storefront components**, copied into
131
+ `app/components/orionplace/` of your project. Each one has a README in English and Russian
132
+ next to its source that describes its inputs, data and actions.
133
+
134
+ ### Storefront structure
135
+
136
+ Main pages and the shared storefront frame.
137
+
138
+ | Component | Name | What it does |
139
+ | --- | --- | --- |
140
+ | **Header** | `StorefrontHeader` | The storefront header and its search, catalog, manufacturer and journal links, locale, currency, account, wishlist and cart controls. |
141
+ | **Storefront logo** | `BrandLogos` | Displays one logo from store.init.logos. |
142
+ | **Product search** | `MainSearch` | A search input with suggestions in the storefront language. |
143
+ | **Language selector** | `MainLanguageSwitcher` | Selects the storefront language and its associated currency and measurement units. |
144
+ | **Currency selector** | `MainCurrencySwitcher` | Selects the current storefront currency from the available options. |
145
+ | **Storefront account** | `StorefrontAccount` | Guest sign-in button and signed-in account menu with profile and wallet actions. |
146
+ | **Wallet balance** | `WalletBalance` | Displays the wallet balance in the selected storefront currency. |
147
+ | **Sign-out page** | `StorefrontLogout` | Session sign-out, failure retry and return to the storefront. |
148
+ | **Wishlist button** | `StorefrontWishlistButton` | Displays the wishlist count and links to the wishlist page. |
149
+ | **Cart button** | `StorefrontCartButton` | Displays the cart count and emits a request to open the cart page. |
150
+ | **Cart preview** | `CartPreview` | A compact dropdown under the header's cart button with cart products, quantities and amounts in the selected currency. |
151
+ | **Catalog menu** | `CatalogHeader` | Category navigation with nested sections and representative product cards. |
152
+ | **Catalog representative** | `CatalogRepresentative` | A compact product card used in the catalog menu, with the same navigation, variant, wishlist and purchase actions. |
153
+ | **Storefront home** | `StorefrontHome` | Banners, the optional Popular categories block, product sections, storefront events and recommendations. |
154
+ | **Storefront banners** | `MainBanner` | A carousel of banner images for the current storefront language, with responsive image formats. |
155
+ | **Popular categories block** | `CategoryGroup` | Optional home-page block of public category tiles. |
156
+ | **Product group** | `ProductGroup` | Displays a collection of product cards with images, prices, variant selection and purchase controls. |
157
+ | **Product card** | `ProductCard` | Combines a product’s image, name, price, variants, wishlist button and purchase controls in one card. |
158
+ | **Product photo viewer** | `HoverImageViewer` | A separate product photo viewer with dot buttons: it switches photos with the pointer, with a swipe and from the keyboard, and a click passes the chosen photo's address to the application. |
159
+ | **Product card title** | `ProductCardTitle` | Displays the localized product name in the card. |
160
+ | **Product card description** | `ProductCardDescription` | Displays the localized short product description as plain text, with HTML tags removed. |
161
+ | **Product card badges** | `ProductCardBadges` | Marks new, popular, good-deal and low-stock products with badges in the card. |
162
+ | **Product card wishlist button** | `ProductCardFavorite` | Requests adding or removing the product from the wishlist; the supplied storefront sends guests to sign-in. |
163
+ | **Seller in the product card** | `ProductCardSeller` | Displays the product seller’s name and rating in the card. |
164
+ | **Product card rating** | `ProductCardRating` | Displays the product’s average rating and review count in the card. |
165
+ | **Product card variants** | `ProductCardVariants` | Selects a primary or secondary product variant. |
166
+ | **Secondary variant selector** | `ProductSecondaryVariantModal` | Shows primary and secondary product choices in a modal and can continue the selected purchase action. |
167
+ | **Product card price** | `ProductCardPrice` | Displays the price in the selected currency and the original price when the product is discounted. |
168
+ | **Low-stock notice** | `ProductCardStockNotice` | Warns that the product will soon run out of stock. |
169
+ | **Product card purchase controls** | `ProductCardActions` | Product-card controls for the cart, quantity, availability notifications and preorder when available. |
170
+ | **Preorder dialog** | `ProductPreorderDialog` | The selected product and contact details for a preorder request. |
171
+ | **Storefront events** | `EventsBlock` | A full-width carousel of layout-event images for the current storefront language, with responsive image formats. |
172
+ | **Event block and promotion enrollment** | `EventEnrollmentDialog` | Displaying the event block and opening promotion enrollment from the selected event. |
173
+ | **Footer** | `StorefrontFooter` | Store identity, navigation, a contact-page link and social links. |
174
+ | **Social links** | `SocialLinks` | Display the store’s published social links and icons. |
175
+ | **Error page** | `StorefrontErrorPage` | Page-not-found (404) and failure (500) page with Home, Catalog and Retry actions. |
176
+ | **Storefront theme** | `OrionplaceThemeProvider` | Applies the selected light or dark storefront theme and optional color overrides to its content. |
177
+
178
+ ### Catalog and discovery
179
+
180
+ Browse categories, search results and product sources.
181
+
182
+ | Component | Name | What it does |
183
+ | --- | --- | --- |
184
+ | **Catalog component** | `StorefrontCatalog` | The component shows store categories, subcategories and product links. |
185
+ | **Category page** | `StorefrontCategory` | A category with its breadcrumb path, subcategories, filters and paginated product cards. |
186
+ | **Search results** | `ProductSearchResults` | Filters, products, loading and empty states for search, category, seller and recommendation results. |
187
+ | **Search filters** | `SearchFilters` | Price, discount, rating, review, category, seller, manufacturer and variant facets with selectable values and optional result counts. |
188
+ | **Sellers** | `StorefrontSellers` | Seller directory with filters and sorting, and a seller profile with its products. |
189
+ | **Seller filters** | `SellerFilters` | Seller name, minimum rating and category filters for the seller directory. |
190
+ | **Seller summary** | `SellerSummary` | Seller logo, name, rating, selling-since badge, product count and description. |
191
+ | **Seller photos** | `SellerPhotoGallery` | The seller’s approved photos as a square grid with a photo viewer. |
192
+ | **Stores** | `StorefrontStores` | Store addresses, map, phone numbers, opening hours and products. |
193
+ | **Manufacturers and their products** | `StorefrontManufacturers` | Alphabetical index, letter-based lists and manufacturer details. |
194
+ | **Manufacturer index** | `ManufacturerIndex` | Manufacturer logos and letter groups. |
195
+
196
+ ### Products and shopping
197
+
198
+ Product details, saved items and the cart.
199
+
200
+ | Component | Name | What it does |
201
+ | --- | --- | --- |
202
+ | **Product details** | `StorefrontProduct` | Loads and displays a published product or a secret-key preview with images, purchase choices, details and reviews. |
203
+ | **Page path** | `OrionplaceBreadcrumbs` | Linked path from the storefront home page through parent categories to the current page. |
204
+ | **Product characteristics** | `ProductSpecificationsDialog` | Every characteristic of the product in a dialog over the page. |
205
+ | **Product reviews** | `ProductReviews` | Reviews, replies, ratings and the user’s submissions. |
206
+ | **Review form** | `ProductReviewForm` | Rating, text and photos for a review or reply. |
207
+ | **Customer review photos** | `ProductReviewGallery` | Review photos for the selected product. |
208
+ | **Review photo viewer** | `ProductReviewImageViewer` | The photos of one review, shown large on the same page. |
209
+ | **Promo code products** | `PromoProducts` | The products a promo code offer applies to, with the offer’s conditions. |
210
+ | **Wishlist and availability notices** | `StorefrontWishlist` | Saved products and products with availability notifications, shown as standard product cards. |
211
+ | **Cart and checkout** | `StorefrontCart` | Cart items, promo codes, delivery, payment and order creation. |
212
+ | **Cart item** | `CartLineItem` | Item name, image, price, quantity and removal. |
213
+ | **Cart item options** | `CartItemOptions` | Option products as product cards, with text and file attachment for an item. |
214
+ | **Checkout details** | `CartCheckoutDetails` | Delivery address, payment method, recipient and comment. |
215
+ | **Shipment delivery selection** | `CartDeliverySelector` | Delivery methods with icons, pickup points and their map for one shipment. |
216
+ | **Delivery map** | `DeliveryMap` | Selectable locations on Yandex Maps for delivery pickup and the store directory. |
217
+
218
+ ### Customer account
219
+
220
+ Profile, orders, addresses and account activity.
221
+
222
+ | Component | Name | What it does |
223
+ | --- | --- | --- |
224
+ | **Account sections** | `AccountSection` | Account navigation and sign-in for private storefront sections. |
225
+ | **Personal profile** | `StorefrontProfile` | Account overview and forms for personal details, verified email, notification preferences, avatar, password and account deletion. |
226
+ | **Profile photo** | `ProfileAvatar` | Upload or remove the current account’s avatar. |
227
+ | **Personal details** | `ProfileDetailsForm` | Edit the account holder’s name and date of birth. |
228
+ | **Email and notifications** | `ProfileEmailSettings` | Verify an email address and choose optional email-notification and email-language preferences. |
229
+ | **Account password** | `ProfilePasswordForm` | Create or change the account password. |
230
+ | **Password field** | `OrionplacePasswordInput` | Password input with a button that shows or hides the entered password. |
231
+ | **Delete account** | `ProfileDeleteAccount` | Delete the signed-in customer's own account. |
232
+ | **Account sign-in** | `ProfileSignIn` | Phone-based account sign-in and registration. |
233
+ | **User promo codes** | `AccountPromocodes` | Available promo codes and applying a selected code to the cart. |
234
+ | **My activity** | `AccountActivity` | The user’s promo codes, reviews and sign-in history. |
235
+ | **Sign-in history** | `SignInHistory` | The user’s sign-in dates, devices, browsers and IP addresses. |
236
+ | **User orders** | `StorefrontOrders` | Order history, purchased items, payment, cancellation and repeat. |
237
+ | **Order details** | `OrderDetails` | Order items, shipments, tracking, purchased content and attachments. |
238
+ | **Order payment selection** | `OrderPaymentForm` | Available payment-method selection for an existing order. |
239
+ | **User addresses** | `StorefrontAddresses` | Saved addresses, address editing and default delivery selection. |
240
+ | **Address form** | `AddressForm` | Address creation and editing with country selection, region search, text suggestions and location lookup. |
241
+ | **Value selector** | `OrionplaceSelect` | Selects one value from a labeled list, with keyboard controls, country flags and option icons. |
242
+ | **Search selector** | `OrionplaceSearchSelect` | Selects one value from options searched as the user types, with a loading spinner and retry. |
243
+ | **Wallet and payments** | `StorefrontWallet` | Payment history, balance top-ups and cancellation of unpaid invoices. |
244
+ | **Wallet top-up form** | `WalletTopUpForm` | Amount, currency and payment-method selection for a wallet top-up. |
245
+ | **Payment panel** | `PaymentPanel` | Opens the payment link and lets the user refresh its status. |
246
+ | **Pagination** | `StorefrontPagination` | Previous and next controls with the current page for a returned list. |
247
+
248
+ ### Subscriptions and support
249
+
250
+ Plans, active subscriptions and support requests.
251
+
252
+ | Component | Name | What it does |
253
+ | --- | --- | --- |
254
+ | **Subscription plans** | `StorefrontTariffs` | Plans grouped by subscription, with search, sign-in for guests and subscription purchase. |
255
+ | **Subscription plan details** | `StorefrontTariff` | One public plan with its media, description, features, periods, options and subscription purchase. |
256
+ | **Subscription plans** | `TariffCards` | Plan cards in a responsive grid. |
257
+ | **Subscription plan card** | `TariffCard` | A plan card with its image, trial badge, name, description, the modules and limits of the plan, the option chooser, period prices and subscribe actions. |
258
+ | **Plan image** | `TariffCardImage` | The first small plan image. |
259
+ | **Plan name** | `TariffCardTitle` | The tariff name in its card, in the selected language. |
260
+ | **Plan description** | `TariffCardDescription` | The short plan description without HTML tags, and the full description under Details. |
261
+ | **Plan modules, limits and options** | `TariffCardFeatures` | The modules and limits of a plan from `tariff_variables_json`, each with its explanation, and the chooser of the plan options. |
262
+ | **Information hint** | `OrionplaceInfoHint` | Small information button that explains the term beside it. |
263
+ | **Plan prices** | `TariffCardPrices` | The period switcher, the price for the chosen period and the Subscribe and Try actions. |
264
+ | **Plan purchase** | `TariffSubscriptionModal` | Select an option, enter a promotion code and confirm a subscription purchase. |
265
+ | **My subscriptions** | `StorefrontSubscriptions` | Subscription dates, plan, usage, service details, automatic renewal, renewal payment and support. |
266
+ | **Renewal payment** | `SubscriptionExtendDialog` | The period, the promo code and the amount for extending a subscription. |
267
+ | **Automatic renewal** | `SubscriptionRenewalDialog` | The period that is paid automatically, or turning it off. |
268
+ | **Plan and option change** | `SubscriptionChangeDialog` | The new plan or service option, its period and the amount that is charged. |
269
+ | **Subscription cancellation** | `SubscriptionCancelDialog` | The confirmation that stops automatic renewal and keeps the paid period. |
270
+ | **Plan and usage** | `SubscriptionPlanSummary` | The plan picture, description and parameters with the usage the subscription service reported. |
271
+ | **Subscription service details** | `SubscriptionRemoteDetails` | The identifier, confirmation time and host a subscription service returned. |
272
+ | **Support conversations** | `StorefrontSupport` | Customer support conversations for general questions, sellers, order items and subscriptions. |
273
+ | **Conversation messages** | `TicketConversation` | Messages, attachments, conversation closing and support rating. |
274
+ | **Conversation item** | `TicketItemCard` | The purchased item a conversation is about, with its image, variant or option, quantity and paid amount. |
275
+ | **Subscription of a conversation** | `TicketSubscriptionCard` | The subscription a support conversation is about: plan, number, state, paid-until date and automatic renewal. |
276
+ | **Conversation image** | `TicketImage` | Loading and viewing an image from the user’s conversation. |
277
+ | **Support message form** | `TicketMessageForm` | Message text and images for a new conversation or reply. |
278
+
279
+ ### Content and contact
280
+
281
+ Journal content and customer contact flows.
282
+
283
+ | Component | Name | What it does |
284
+ | --- | --- | --- |
285
+ | **Journal** | `StorefrontJournal` | Paged journal of store articles with category and author filters. |
286
+ | **Journal article** | `BlogArticle` | An article, subscription access and its discussion. |
287
+ | **Article comments** | `BlogComments` | Discussion, replies and the user’s own comments. |
288
+ | **Comment form** | `BlogCommentForm` | Text for a new comment, reply or edit. |
289
+ | **Blog posts** | `BlogPostGroup` | Publication previews in a grid, list or layout with a lead card. |
290
+ | **Blog post card** | `BlogPostCard` | Publication image, localized title, plain-text preview and reading time. |
291
+ | **Contact page** | `StorefrontContact` | Company contact and registration details, with a form for messaging the store. |
292
+ | **Contact details** | `AboutPage` | Display the store’s published company and contact information. |
293
+ | **Contact form** | `ContactForm` | Sending a question to the store. |
294
+ | **Unsubscribe from emails** | `EmailUnsubscribe` | Confirming an unsubscribe request from an email link. |
295
+
296
+ ### Shared interface
297
+
298
+ Small reusable states and identity elements.
299
+
300
+ | Component | Name | What it does |
301
+ | --- | --- | --- |
302
+ | **Empty state** | `OrionplaceEmptyState` | Line drawing and message shown when a list, history or search result has no items. |
303
+ | **Avatar** | `OrionplaceAvatar` | Round user photo with initials when no photo is available. |
304
+ | **Storefront image** | `OrionplaceImage` | Loads a safe public image lazily and shows an accessible placeholder when the image is missing or fails. |
305
+ | **Measurement unit selector** | `UnitSwitcher` | Selects a weight or length unit from those available in the storefront. |
306
+
307
+ <!-- components:end -->
308
+
61
309
  ## Commands
62
310
 
63
311
  ```bash
@@ -93,13 +341,14 @@ change your account, create DNS records, configure TLS, or deploy a VPS.
93
341
  | --- | --- |
94
342
  | `nuxt.config.ts` | Registers the module; an existing supported config keeps its filename. |
95
343
  | `orionplace/runtime/marketplace.mjs` | Commented domain lookup and HTTP transport. |
96
- | `orionplace/runtime/api.mjs` | Nitro handler registered for `/api/**`. |
344
+ | `orionplace/runtime/api.mjs` | Nitro handler registered for `/api/**` and blog media under `/ps3/blog/**`. |
97
345
  | `orionplace/runtime/domain.mjs` | Domain resolution middleware. |
98
346
  | `orionplace/README.md` | Your settings, API examples, file explanations, verification and VPS deployment. |
99
347
  | `orionplace/settings.json` | Domain values selected by the CLI. |
100
348
  | `orionplace/.generated.json` | File hashes used to preserve your edits on subsequent setup. |
101
349
  | `sitemaps/shop.example.com.cfg` | One line: `https://your-project.orionplace.app/api`. |
102
350
  | `.env` | `MIMIC_FRONT_DOMAIN="shop.example.com"` for localhost. |
351
+ | `.vscode/settings.json` | Tells the editor's CSS checker to accept Tailwind's `@apply`, `@reference` and `@theme`. An existing file is kept. |
103
352
 
104
353
  The module executes the generated local runtime files. You can read and customize
105
354
  them. Later setup runs preserve edited runtime files and the project README,
@@ -161,14 +410,33 @@ Deploy `sitemaps` with the production server, or set an absolute `SITEMAPS_DIR`.
161
410
  The production process reads `MIMIC_FRONT_DOMAIN` without rebuilding. Run the
162
411
  server from the project root or explicitly point it at the configuration directory.
163
412
 
413
+ ## Page metadata
414
+
415
+ Every supplied page sets its title, description and keywords through
416
+ `app/composables/useOrionplacePageSeo.ts` and Nuxt's `useSeoMeta()`.
417
+ The homepage prefers `init.seo`, and category pages prefer their localized SEO
418
+ fields. Empty values fall back to page-specific Russian or English copy in
419
+ `app/utils/orionplace/pageSeo.ts`. Metadata updates with the current locale and
420
+ route data. The homepage retains additional backend Open Graph and Twitter tags
421
+ through `useHead()`. Profile and logout pages remain excluded from indexing;
422
+ search results retain their `noindex, follow` policy.
423
+
164
424
  ## Documentation
165
425
 
166
- - [Create a Nuxt frontend](https://orionmarket.place/sandbox/new-project/nuxt)
167
- - [Connect your personal backend](https://orionmarket.place/sandbox/backend-domain/nuxt)
168
- - [Marketplace API documentation](https://orionmarket.place/sandbox/)
426
+ - [Create a Nuxt frontend](https://orionmarket.place/en/sandbox/new-project/nuxt)
427
+ - [Install the Nuxt package and connect your personal backend](https://orionmarket.place/en/sandbox/new-project/nuxt)
428
+ - [Marketplace API documentation](https://orionmarket.place/en/sandbox/)
429
+ - [Android app for your Nuxt storefront](https://orionmarket.place/en/sandbox/android-app)
169
430
 
170
431
  ## Development
171
432
 
433
+ In this repository checkout, the package demo uses its own
434
+ `packages/orionplace-nuxt/.env` and
435
+ `packages/orionplace-nuxt/sitemaps/<storefront-domain>.cfg`.
436
+ Set the storefront's `MIMIC_FRONT_DOMAIN` and personal backend mapping there.
437
+ See [local demo configuration](DEVELOPMENT.md#local-demo-configuration).
438
+
439
+
172
440
  ```bash
173
441
  npm install
174
442
  npm test
@@ -178,15 +446,193 @@ npm pack --dry-run
178
446
  The published tarball includes only the CLI, module, runtime source, README,
179
447
  license, starter templates, and package metadata.
180
448
 
181
- ## AppLoad starter
449
+ ## Application Load starter
182
450
 
183
- The CLI generates an AppLoad debug `app/app.vue`, an SSR-aware
184
- `useOrionplaceAppLoad()` composable, validation helpers and the full nested
185
- TypeScript contract under `app/interfaces/orionplace/`. The first page loads
186
- `POST /api/appload`, shows request state and section counts, and supports reload.
451
+ The CLI generates global route middleware, a shared Pinia store and the full
452
+ nested TypeScript contract under `app/interfaces/orionplace/`. Middleware awaits
453
+ `POST /api/appload` before page setup. `useOrionplaceStore()` exposes
454
+ initialization, profile and live endpoint discovery to pages and components.
455
+ `useOrionplaceAppLoad()` provides explicit initialize, refresh and reset actions.
456
+ `app.vue` wraps `NuxtLayout` and `NuxtPage` in the shared theme provider and
457
+ renders `NuxtLoadingIndicator`: a thin bar in the header text color
458
+ (`inverseText`) at the top of the window during navigation and storefront
459
+ requests (`useOrionplaceProgress()`).
460
+ `app/layouts/default.vue` renders the storefront header, cart preview, product
461
+ action feedback, preorder dialog and footer on every route; `pages/index.vue`
462
+ displays the home sections. A failed Application Load replaces every page with
463
+ the error page (HTTP 503, Retry reloads the page); unknown addresses keep 404.
464
+ `app/error.vue` renders `StorefrontErrorPage` for unknown addresses and unhandled
465
+ errors, keeping the HTTP status: 404 shows “Page not found” with Home and
466
+ Catalog, other statuses show “Something went wrong” with Retry and Home. Pages
467
+ use `noindex, nofollow`; customers never see error messages or stack traces.
468
+ The not-found page keeps the header and footer when Application Load succeeded;
469
+ otherwise, and for failures, it renders without the layout. See the
470
+ [error page guide](https://orionmarket.place/en/sandbox/components/nuxt/error-page).
471
+ `/product/:id`, `/tariffs/:slug/:id`, `/category/:id`, `/browse`, `/featured`,
472
+ `/journal` and `/journal/:id` load their first data while the server renders
473
+ the page, with
474
+ the visitor's cookies, so the HTML contains product names, prices, article
475
+ links and article text; the browser reuses that data without repeating the
476
+ request (`useOrionplaceServerData()`). An ID that is not a positive integer, or
477
+ a record that `products_search` or `blog_posts_get` does not return, answers 404
478
+ from the server. A failed request keeps the page with its Retry button, and a
479
+ failed server request is loaded again in the browser. Product cards link to
480
+ `/product/:id` through `provideOrionplaceProductLink()` in the default layout,
481
+ while `/product/:id?key=<preview key>` uses `products_preview` and lets anyone
482
+ with the complete seller or staff preview address view the key owner's product
483
+ without signing in.
484
+ Unpublished and option-only products show a preview notice, and the page uses
485
+ `noindex, nofollow`. Category tiles, banners and the category path link to `/category/:id`
486
+ through `provideOrionplaceCategoryLink()`. Products
487
+ attached to a journal article are shown as standard product cards with variants
488
+ and purchase controls.
489
+ The dark header bar combines catalog navigation with Manufacturers and Journal
490
+ links, search hints and borderless currency/language selectors.
491
+ Currency labels and amounts use `symbol_left` and `symbol_right` from Application
492
+ Load. If both are empty, amounts use the uppercase currency code. This formatting
493
+ is shared by selectors, product prices, wallet balances, cart totals and tariffs;
494
+ it does not convert or round amounts.
495
+ Its home link uses `BrandLogos` with `store.init.logos.medium`; contact data is
496
+ not a header dependency. Missing or failed logo images use the shared placeholder.
497
+ Its labels follow the storefront locale (English/Russian). `StorefrontAccount`
498
+ shows guest sign-in or an authenticated profile menu with the selected currency
499
+ wallet balance. Its `signIn`, `signOut`, `selectProfile` and `selectWallet` events are handled
500
+ by the host; the generated layout opens `/profile` for sign-in (with the current
501
+ page in `redirect`, where the user returns after sign-in) and profile
502
+ selection, `/logout` for sign-out and `/wallet` for wallet selection. The component does not
503
+ submit credentials or create payments. Its [EN/RU preview and source downloads](https://orionmarket.place/en/sandbox/appload/nuxt/init/is_authenticated)
504
+ share the maintained package component. `StorefrontWishlistButton` and
505
+ `StorefrontCartButton` display counts from `store.counters`. Their clicks emit
506
+ `selectWishlist` and `selectCart` through the header without changing data;
507
+ the generated layout opens `/wishlist` for the wishlist button and `CartPreview` for
508
+ the cart button. The starter opens `CartPreview` through
509
+ `useOrionplaceCartPreview` and the discovered `cart_guest_modal_get` endpoint.
510
+ The dialog shows product images, translated names, quantities and cart-item
511
+ totals in the selected currency, with loading, empty and retry states. Closing
512
+ it cancels a pending request. Selecting a product in the preview closes it and
513
+ opens `/product/<id>`; selecting the full cart closes it and opens `/cart`.
514
+ Search opens `/browse?q=<query>`, category selection opens `/category/<id>`,
515
+ product selection opens `/product/<id>` and seller selection opens
516
+ `/sellers?seller=<id>`. Variant selection
517
+ replaces the full representative card and loads missing products or secondary choices through the
518
+ shared API client. Cart, wishlist, availability-notification and preorder events
519
+ run the product action controller described below.
520
+ See [the header contract](templates/orionplace/COMPONENTS.md#storefront-header)
521
+ for the supplied slots and integration boundaries.
187
522
  It preserves custom apps and edited generated files. Generated instructions in
188
523
  `orionplace/README.md` explain how to integrate the composable in an existing app.
189
524
 
525
+ ### Application Load component library
526
+
527
+ The starter also supplies `ManufacturerIndex` and its
528
+ `useOrionplaceManufacturerIndex` controller. `/manufacturers` loads the discovered
529
+ manufacturer-index endpoint and renders logo previews and letter groups, with
530
+ alphabet switching, loading, empty and retry states. The home page links to this
531
+ index beside the journal. The page renders `StorefrontManufacturers`, which loads
532
+ the index itself. Letter and manufacturer selections are `ManufacturerIndex`
533
+ events; `StorefrontManufacturers` handles them by loading that letter's or that
534
+ manufacturer's records through `manufactures_manufactures_get`. See the
535
+ [component reference](https://orionmarket.place/en/sandbox/components/nuxt/manufacturer-index)
536
+ for its contract, live preview and source downloads.
537
+
538
+ The website [Components section](https://orionmarket.place/en/sandbox/components/nuxt)
539
+ sits beside Application Load and documents Header with its child components,
540
+ plus ProductGroup, ProductCard and its parts. Both English and Russian guides provide live
541
+ previews, contracts and physical source downloads.
542
+
543
+ Storefront components live under `app/components/orionplace/`, grouped by feature.
544
+ The [field and component catalog](templates/orionplace/COMPONENTS.md) maps each
545
+ initialization field to its consumers. Configuration, session flags and shared
546
+ counters have data references with links to the features that use them.
547
+ The catalog is also installed as `orionplace/COMPONENTS.md`.
548
+
549
+ The [Application Load sandbox](https://orionmarket.place/en/sandbox/appload/nuxt) renders
550
+ these physical components and lets you edit their input locally. Component
551
+ selections emit events; account, cart and subscription requests remain the host
552
+ application's responsibility.
553
+
554
+ ### Locale selector
555
+
556
+ `app/components/orionplace/locale/MainLanguageSwitcher.vue` renders the language record
557
+ from `store.locales` directly. Import it without a data prop. It accepts a
558
+ `label` (default `Language`), `disabled` (default `false`) and `codeOnly`
559
+ (default `false`). Missing names
560
+ fall back to another translation, then the human name or code. Empty data
561
+ disables the selector. The store initially selects its first available language.
562
+
563
+ Flags from `flag_img` appear beside the selected language and in every dropdown
564
+ option that has an available image. Missing or failed images leave the language
565
+ name readable. The dropdown uses the shared theme, supports arrow keys and typing
566
+ to find a language, and closes on Escape or an outside click. Press Enter, Space
567
+ or Tab to confirm the highlighted option.
568
+ Options stay on one line. The dropdown expands within the viewport; longer names
569
+ use an ellipsis, with the full name available on hover.
570
+
571
+ The component gets `selectionStore` from `useOrionplaceSelectionsStore()`.
572
+ Selection calls `selectionStore.setLocale(code)`, updating `selectionStore.localeCode` and the
573
+ language’s default currency and units. It then emits `change` with the locale object. The component does not navigate or change your translation settings;
574
+ connect these events to your application's language handling as needed.
575
+
576
+ Setup installs Tailwind CSS 4 and its Vite plugin. Upgrade an existing Tailwind 3
577
+ installation first; setup rejects incompatible versions before writing files.
578
+ The module registers
579
+ `app/assets/css/orionplace.css`, which scans the generated components and pages.
580
+ It includes theme variables and utilities without a global CSS reset, preserving
581
+ your application's base styles. An existing Tailwind Vite plugin is reused.
582
+ It requires no Sass or translation plugin. Keyboard focus changes the existing border and background;
583
+ controls do not use outlines. The
584
+ [locale sandbox](https://orionmarket.place/en/sandbox/appload/nuxt/init/locale)
585
+ previews the same component and provides its source and locale types.
586
+
587
+ ### Themes
588
+
589
+ Define any number of named themes in `app/themes/orionplace.ts`. Components inherit
590
+ semantic colors from the active theme. Setup includes the shared
591
+ [theme guide](templates/orionplace/THEMES.md) as `orionplace/THEMES.md` in the
592
+ customer project; it covers adding themes, selecting the default and applying them.
593
+
594
+ ### Session and CSRF cookies
595
+
596
+ Application Load establishes the guest/customer session and CSRF cookie through HTTP
597
+ `Set-Cookie` headers, not through `page_data.init`. The browser handles the signed
598
+ HttpOnly `sessionid` cookie; never parse, rewrite, log or store its value in Pinia
599
+ or localStorage. The readable `csrftoken` supplies `X-CSRFToken` for later protected
600
+ requests through the same-origin `/api/` gateway with credentials enabled. Read
601
+ the CSRF cookie again for every action because login can rotate it.
602
+
603
+ `useOrionplaceApi()` supplies the per-application `OrionplaceApi` client used by
604
+ Application Load and browser requests. It resolves later endpoints from
605
+ current discovery, reads CSRF per request and renews a missing token. A
606
+ CSRF rejection (HTTP 419, or HTTP 403 with `page_data.csrf: false`) renews the
607
+ token for the next action and returns the failed request. The customer must
608
+ submit again; the client never repeats a failed request automatically. Components send discovered requests in the browser. Page data
609
+ that the server render needs goes through `useOrionplaceServerApi()`, the same
610
+ class with the same transport, usually through `useOrionplaceServerData()`.
611
+ The global route middleware passes `to.query.locale` to the first Application
612
+ Load request. Later requests use the selected locale held by the store.
613
+ During SSR the transport sends the incoming cookies plus every cookie the
614
+ backend set earlier in the same render (`app/utils/orionplace/serverCookies.ts`),
615
+ and relays each raw response `Set-Cookie` separately to the browser. That
616
+ cookie list belongs to one render and is never shared between visitors.
617
+
618
+ Use `POST /api/csrf_renew` with `{}` to renew CSRF, then re-read the cookie.
619
+ The backend signals CSRF rejection with HTTP `419` from Django views, or with
620
+ HTTP `403` and `page_data.csrf: false` from API endpoints; a `403` without that
621
+ flag may mean permissions or origin rejection. Do not automatically
622
+ replay mutations. After confirmed login/logout, reset and refresh Application Load.
623
+ Those store actions update data; they do not authenticate or delete cookies.
624
+
625
+ HTTP `401` means the request has no signed-in session. When it arrives while
626
+ `store.isAuthenticated` is `true`, the client calls the store's `endSession()`
627
+ once: the profile, wallet, authenticated discovery, cart/wishlist counters and
628
+ account values of known products are removed at once, then Application Load
629
+ reloads for the guest session. The failed request is not repeated and no
630
+ sign-in dialog opens; a guest `401`, `403`, CSRF rejection or network failure
631
+ stays an ordinary request error.
632
+
633
+ See the [cookie lifecycle and browser example](https://orionmarket.place/en/sandbox/appload/nuxt#session-cookies)
634
+ for exact source references and a copyable component.
635
+
190
636
  ## Update an existing project
191
637
 
192
638
  After the initial setup, use one command to get the latest package and components:
@@ -225,3 +671,394 @@ npx --yes orionplace-nuxt@latest update
225
671
  Updates require the existing `orionplace/settings.json` and `.generated.json`.
226
672
  Conflicting untracked files stop the source update before any writes. If dependency
227
673
  installation fails after source generation, run `npm install` and retry `update`.
674
+
675
+
676
+ ## Representative product actions
677
+
678
+ The Nuxt header forwards cart, wishlist, availability-notification and preorder
679
+ intents. The generated layout binds `useOrionplaceProductActions` to the shared API
680
+ client; confirmed responses update the product and `store.counters`. Controls
681
+ stay visible while disabled, and the catalog stays open. At quantity one the
682
+ trash control removes the confirmed cart item. Secondary variants must be
683
+ selected before confirming an addition, subscription or preorder in the picker.
684
+ Guest preorder collects contact details. Wishlist controls require authentication;
685
+ notifications can request sign-in, and subscription requires profile email. The
686
+ generated storefront supplies sign-in and personal details at `/profile`. Failed mutations retain confirmed
687
+ data; a failed follow-up refresh retries only that read. Components previews
688
+ record actions without changing the reader's cart or session.
689
+
690
+ ### Component compositions and source
691
+
692
+ The Components overview renders the maintained Header and StorefrontHome.
693
+ Dashed outlines identify children; child guides retain their real parent context.
694
+ Home links to its categories, banners, events and ProductGroup children.
695
+ ProductGroup links to ProductCard and its parts. Component guides finish with a
696
+ Related pages section: links to the parent composition, related controls and
697
+ Application Load fields, each with a short description. This is the last entry
698
+ in the right-hand outline; parent links are not repeated below the page title.
699
+ Links preserve the selected language and framework. AppLoad selector previews
700
+ remain standalone. Source lists contain the selected `.vue` and its primary
701
+ physical interface when one exists; imports remain supplied by the package.
702
+
703
+ MainSearch owns its input/button styling. Locale and currency `codeOnly`
704
+ controls own their compact layout and hidden accessible labels; Header supplies
705
+ layout and defaults. `OrionplaceSelect.compact` defaults to false.
706
+
707
+ Header slots `logo`, `search`, `locale`, `currency`, `account`, `wishlist`, `cart`
708
+ and `catalog` preserve surrounding layout. Logo receives the localized home
709
+ `label`. Search receives `label`, `buttonLabel`, `disabled`; selectors receive
710
+ `label`, `codeOnly: true`, `disabled`; account receives `disabled`; wishlist/cart
711
+ receive `disabled` and `compact: true`; catalog receives no props. Slot replacements
712
+ must bind their own events. Replacing `actions` replaces its account, wishlist and
713
+ cart slots.
714
+ Account's `balance` slot receives `label` and `compact: true` at both wallet
715
+ locations, preserving the surrounding wallet action.
716
+
717
+ ## Storefront home sections
718
+
719
+ `StorefrontHome` follows the header with `MainBanner`, `CategoryGroup`, ordinary
720
+ products, discounts, new products, `EventsBlock` and featured products. Empty sections are
721
+ omitted. Category tiles use public catalog records, localized names and logo
722
+ images. Category count and ordering follow `visual_settings.front_categories_*`:
723
+ `order` sorts public roots by `ordering`, `views` includes public descendants and
724
+ sorts by `c_views`, and `do_not_show` hides the section. Non-shortcut roots are
725
+ preferred; when every public root is a shortcut, all public roots are included.
726
+ Equal values preserve response order; zero count includes all candidates.
727
+
728
+ `store.homeProductSections` derives four independent blocks. Ordinary products
729
+ exclude discounted, new and featured IDs. Discounts use `discount < 1`; New uses
730
+ `flags.flag_is_new`. A product may appear in both Discounts and New. Featured uses
731
+ only `store.featured` and follows events. Empty blocks are hidden, and source
732
+ order is preserved. Each section passes its own `productIds` to the same cards.
733
+
734
+ If AppLoad has no new products, the generated home page uses
735
+ `useOrionplaceHomeProducts()` after mounting to call the available `products_search` endpoint with
736
+ `filters: { only_new: true }` and `paginate: { page: 1, pp_items: 20 }`.
737
+ `store.setHomeNewProducts(products, sellers)` stores the confirmed products and IDs.
738
+ A failed request can be retried explicitly. AppLoad refresh/reset clears the
739
+ supplemental IDs and cancels stale results. The home component itself does not
740
+ request products. The [Home guide](https://orionmarket.place/en/sandbox/components/nuxt/home#groups)
741
+ documents the rules and lets readers edit existing products in its preview.
742
+
743
+ `productLimit` defaults to 12 per section. More reveals the rest of the
744
+ loaded section without a request. Refresh and prop changes restore the
745
+ limit. In the Featured section, More is a link to `/featured`: an ordinary
746
+ click emits `selectFeatured` and the generated page opens that route. `ProductGroup.limit` defaults to 0 (all records). Variant and purchase
747
+ controls remain the supplied ProductCard controls. Home forwards their typed
748
+ events and the generated page binds the existing product controllers. Product
749
+ selection opens `/product/<id>` and seller selection opens `/sellers?seller=<id>`.
750
+ Category tiles, catalog actions and linked banners open `/category/<id>`;
751
+ the category view loads products through the discovered `products_search` endpoint.
752
+ Selecting an event with a `promo` opens `EventEnrollmentDialog`; enrollment is
753
+ sent with `profile_event_subscribe` only after its explicit confirmation. Events
754
+ without `promo` do nothing in the generated page. A guest's selection opens the
755
+ sign-in page at once; it returns to `/?event=<id>`, and the home page then opens
756
+ the dialog for that event.
757
+
758
+ Banners and events use `format: 'auto'` by default, which follows the window
759
+ width and picks the mobile, tablet, wide or desktop image. An explicit format
760
+ stays fixed.
761
+ MainBanner includes every image in response order, with manual wraparound arrows
762
+ and no autoplay. A missing format falls back to the first non-empty desktop,
763
+ wide, tablet or mobile set. Language, data and format changes reset the slide.
764
+ A null or omitted `category` renders an inert image with a normal cursor. A
765
+ category ID enables the pointer cursor and emits the banner through `select`;
766
+ the host handles the category navigation. Arrow controls only change slides.
767
+ EventsBlock uses the same full-width image frame as MainBanner and keeps the
768
+ image proportions inside its reserved height. One event is visible at a time, in response
769
+ order. Multiple events show a counter and manual wraparound arrows; there is no
770
+ autoplay. Language, format and event-data changes reset to the first event. Arrow
771
+ buttons only change the visible event; clicking its image emits that event object.
772
+ Event images fall back through desktop, wide, tablet, mobile and account.
773
+ Other languages and modal-only events are not substituted into layout sections.
774
+
775
+ Home slots are `banners`, `categories`, `products` and `events`. The products
776
+ slot receives `section`, `productIds`, `collection`, `disabled` and the current
777
+ `limit`; preserve `productIds` to retain each section’s grouping. The other slots
778
+ receive no props. Slots render only when their section has data. Replacement
779
+ content owns its event bindings. Source and child guides are under
780
+ [Storefront home](https://orionmarket.place/en/sandbox/components/nuxt/home),
781
+ [Categories](https://orionmarket.place/en/sandbox/components/nuxt/categories),
782
+ [Banners](https://orionmarket.place/en/sandbox/components/nuxt/banners) and
783
+ [Events](https://orionmarket.place/en/sandbox/components/nuxt/events), with matching
784
+ Russian routes. They show the physical components in their parent with dashed
785
+ highlights and link back to Application Load.
786
+
787
+ ### Visual settings, search filters and blog previews
788
+
789
+ [Visual settings](https://orionmarket.place/en/sandbox/appload/nuxt/init/visual_settings)
790
+ are consumed by the supplied Nuxt components:
791
+
792
+ - [CatalogHeader](https://orionmarket.place/en/sandbox/components/nuxt/catalog)
793
+ uses `menu_image` for shortcut thumbnails and `catalog_menu_image` inside its catalog panel.
794
+ - [ProductGroup](https://orionmarket.place/en/sandbox/components/nuxt/product-group)
795
+ becomes a swipeable row on a narrow screen. `mobile_show_arrows` controls its previous/next
796
+ buttons when the row overflows. Desktop grids and promotion carousels are unaffected.
797
+ Optional `productIds` resolves an ordered set through `productStore.getProduct`; an omitted
798
+ value uses the AppLoad collection, and an empty array displays no cards.
799
+ - [SearchFilters](https://orionmarket.place/en/sandbox/components/nuxt/search-filters)
800
+ uses `show_filter_counters` for counts supplied in `selects` and `variants`.
801
+ `browseStore.preserveSearchFacets(page_data)` retains the initial options and price
802
+ bounds from `products_search`; `browseStore.setSearchFacets` explicitly replaces them
803
+ for a new scope or editor. Selection updates `browseStore.searchFilters` before
804
+ `change` emits copied ID arrays and scalar fields. Subsequent narrowed responses
805
+ update products, leaving the original selectors available. `disabled` prevents
806
+ selection; there are no slots.
807
+ - `single_seller_mode` hides
808
+ [ProductCardSeller](https://orionmarket.place/en/sandbox/components/nuxt/productCardSeller)
809
+ and seller filters; manufacturer options remain visible.
810
+ - [BlogPostGroup](https://orionmarket.place/en/sandbox/components/nuxt/blog) uses
811
+ `blog_view_type`: `EBlogViewType.PORTRAIT` is a grid, `EBlogViewType.LIST` is a list,
812
+ and `EBlogViewType.CUSTOM` starts with a lead card, followed by groups of up to
813
+ three posts. Unknown values fall back to portrait; numeric strings are accepted.
814
+ `store.setBlogPosts(page_data.posts.data)` supplies previews from `blog_posts_get`.
815
+ [BlogPostCard](https://orionmarket.place/en/sandbox/components/nuxt/blog-post) takes
816
+ `postId` and `layout` (portrait by default, list or hero), reads the post from
817
+ the store, and shows its localized title, plain-text preview, first ordered image
818
+ and reading time. The group forwards its `select` event with `IBlogPostPreview`.
819
+ The application opens the article; neither component loads content or changes access.
820
+ The group has no props; neither component has slots. Empty collections show an empty state.
821
+
822
+ AppLoad refresh and reset clear search facets, selected filters and blog posts.
823
+ The generated `/browse?q=...` and `/browse?view=blog` pages load public responses
824
+ through endpoint discovery, handle pending/error/retry states and pagination.
825
+ Search requires at least three characters. Search connects the shared product action and variant handlers; article and
826
+ product-detail navigation remain host responsibilities.
827
+ The component guides include editable settings, real components and their maintained
828
+ source/downloads in English and Russian. Blog previews start empty when the backend
829
+ has no posts; the JSON editor accepts `IBlogPostPreview[]`.
830
+
831
+ ## Category page
832
+
833
+ `app/components/orionplace/categories/StorefrontCategory.vue` renders a public
834
+ category resolved by `categoryId`, its breadcrumb path, immediate public children,
835
+ search filters and the supplied result IDs. Names and plain-text descriptions use
836
+ localized catalog fields; a missing/private category shows the not-found state.
837
+
838
+ `app/pages/category/[id].vue` binds it to `/category/:id`. Home tiles, catalog
839
+ category actions and linked banners open that route. The shared
840
+ `app/layouts/default.vue` retains the header and purchase feedback across routes;
841
+ `useOrionplaceStorefront()` supplies its product-action and variant controllers.
842
+ A missing/private category opens the storefront error page (`app/error.vue`)
843
+ with HTTP 404; a failed Application Load opens it with HTTP 503 and Retry.
844
+
845
+ The category page loads the first result page during the server render with
846
+ `loadProductSearchSnapshot()` and passes it to `useOrionplaceCategoryProducts()`,
847
+ which shows it without another request. Later pages and filters call
848
+ `products_search` in the browser, with `filters.categories` fixed to the
849
+ selected category and its public descendants. Category changes, filter reset and AppLoad refresh
850
+ clear filters and restart page 1. Filter changes also restart page 1. Defined
851
+ pagination fields merge with the previous result; omitted metadata is retained.
852
+ Pagination scrolls to the top. Requests are cancelled on replacement/unmount, and
853
+ late responses cannot replace current results. Errors expose an explicit retry.
854
+ Search products are cached with `setProduct`; AppLoad collections stay unchanged.
855
+
856
+ The component accepts `categoryId`, `productIds` (empty by default), `page` (1),
857
+ optional `pages` and `total`, plus `hasNext`, `pending`, `failed`, `loaded` and
858
+ `productActionsDisabled` (all false by default). It does not issue requests or
859
+ replace missing search results with home products. It emits `selectHome`,
860
+ `selectCategory`, `changeFilters`, `clearFilters`, `changePage`, `retry` and the
861
+ same typed product events as the home composition. There are no slots.
862
+
863
+ `CategoryGroup.parentId` shows immediate public children in catalog order;
864
+ omitting it preserves the home category settings. `SearchFilters.hideCategories`
865
+ is false by default and hides the category facet for a fixed category scope.
866
+ `ProductGroup.layout` defaults to `responsive` (desktop grid/mobile swipe row).
867
+ The category uses `grid`, which stays a vertical grid on a narrow screen and
868
+ shows no horizontal scroll arrows. Filters collapse behind a button in a narrow
869
+ result container; category navigation remains available while products load.
870
+
871
+ The [Category page guide](https://orionmarket.place/en/sandbox/components/nuxt/category-page)
872
+ contains the physical composition, dashed child boundaries, local preview
873
+ controls, field/input/event contracts and exact component/interface downloads.
874
+ The matching Russian guide uses `/ru/sandbox/components/nuxt/category-page`.
875
+
876
+
877
+ ## Search, logout and preorder flows
878
+
879
+ The [search results component](https://orionmarket.place/en/sandbox/components/nuxt/search-results)
880
+ serves `/browse?q=...` and the category result area. It renders initial loading
881
+ placeholders, a recoverable empty result, error/retry, totals and pagination.
882
+ Changing the URL query starts a fresh search, including changes on an already
883
+ open browse page. Product actions and variant replacement use the same handlers
884
+ as home and category cards. Search requires at least three characters. The blog
885
+ alias `/browse?view=blog` redirects to `/journal`.
886
+
887
+ The generated `/featured` page renders the same results with
888
+ `useOrionplaceFeaturedProducts()` from
889
+ `app/composables/useOrionplaceFeaturedProducts.ts`. It adds the fixed
890
+ `only_featured: true` filter to every `products_search` request. The filter
891
+ panel does not show it; selected filters narrow the featured products, while
892
+ Clear and pagination keep it. The backend returns featured products only to a
893
+ signed-in customer, so a guest sees a short note that recommendations appear
894
+ after sign-in; the header's Login returns to `/featured`.
895
+ `ProductSearchResults.emptyDescription` replaces the
896
+ empty-result hint on that page. Application Load `init.featured` remains the
897
+ short home selection; the page loads the full list a page at a time.
898
+
899
+ `useOrionplaceProductSearch()` in `app/composables/useOrionplaceProductSearch.ts`
900
+ calls `products_search`. Components read each domain through its store hook:
901
+ `useOrionplaceSelectionsStore()`, `useOrionplaceCatalogStore()`,
902
+ `useOrionplaceProductsStore()` or `useOrionplaceBrowseStore()`.
903
+ `app/stores/orionplace.ts` owns Application Load and session changes and retains
904
+ a compatibility API for existing integrations. Smaller Pinia stores own the data: `orionplaceSelections.ts`
905
+ (language, currency and units), `orionplaceCatalog.ts` (catalog and tariffs),
906
+ `orionplaceProducts.ts` (products, variants and counters), and
907
+ `orionplaceBrowse.ts` (search and journal state). Each file is under
908
+ `app/stores/` in the generated project. The stores share the current Pinia
909
+ instance and preview scope, so separate server requests and documentation
910
+ previews have separate data. Application Load refresh clears dependent results
911
+ while preserving available selections; reset clears them all.
912
+
913
+ The search flow fills these values in the browse and product stores:
914
+
915
+ | Store value | How it is filled |
916
+ | --- | --- |
917
+ | `browseStore.searchFacets` | `preserveSearchFacets()` retains `page_data.selects` and `page_data.variants` from a successful search response. |
918
+ | `browseStore.searchFilters` | `SearchFilters` writes selected conditions before emitting `change`. |
919
+ | `productStore.productUpdates.products` | `setProduct()` saves each item from `page_data.products.data` by ID. Cards read it through `getProduct()`. |
920
+
921
+ The pages pass result IDs, pagination and loading state from the composable to
922
+ `ProductSearchResults` as inputs.
923
+
924
+ The optional second argument of `useOrionplaceProductSearch()` accepts a
925
+ `request(body, signal)` callback for an existing API client. It must return the
926
+ validated `products_search` page data and reject failed requests. Without it,
927
+ the supplied API client resolves `products_search` from Application Load. Set
928
+ `scrollToTop: false` when the results are a section further down the page, then
929
+ call `scrollToPaginatedList()` from `app/utils/orionplace/paginationScroll.ts`
930
+ with that section after a page change. The seller page does this for its
931
+ products, so pagination returns to the products heading.
932
+
933
+ `useOrionplaceProductSearch` preserves the first confirmed selector set for the
934
+ current query/category. Further filters, empty results and pagination do not
935
+ replace options, colors, counts or price bounds with narrowed responses. New
936
+ queries, categories and AppLoad refreshes reset that scope; Clear keeps
937
+ its original selectors. Superseded requests are cancelled and ignored.
938
+
939
+ `SearchFilters` supplies cumulative ID arrays and scalar price, discount and
940
+ rating fields. Currency-keyed `selects.measures.min_price` and `max_price` supply
941
+ the price range; Apply or a committed slider change emits `price_from`,
942
+ `price_to` and `price_currency`. Selecting the full range removes the price
943
+ constraint. Currency changes clear only price constraints. Color values render
944
+ beside variant labels. Minimum discount uses `price_discount_from`; product/seller
945
+ ratings and review availability use the corresponding API filters. Original
946
+ counts describe the initial scope, not the narrowed result. Product grids use
947
+ fewer columns as the container narrows. Mobile home
948
+ rows retain their existing swipe behavior.
949
+
950
+ The [preorder dialog](https://orionmarket.place/en/sandbox/components/nuxt/preorder-dialog)
951
+ is `app/components/orionplace/products/ProductPreorderDialog.vue`, nested under
952
+ Product actions in Components. The default layout opens it for the card's
953
+ `preorder` event. It shows the product and price; guests provide email or phone.
954
+ `submit` emits `{ product, email, phone }`, with trimmed contact strings. The host
955
+ checks eligibility, calls `preorders_create`, and closes only after success.
956
+ Pending requests disable resubmission and dismissal. Errors remain by the form.
957
+ `modal` defaults to true; false renders the same dialog within its container.
958
+ Both storefront and documentation product previews use this physical component.
959
+
960
+ The [sign-out component](https://orionmarket.place/en/sandbox/components/nuxt/logout)
961
+ is `app/components/orionplace/account/StorefrontLogout.vue`, under Profile menu.
962
+ The default layout opens `/logout` after `signOut`. The route shows progress,
963
+ uses `profile_logout` through the shared API client after mounting, refreshes
964
+ AppLoad after confirmation and replaces the route with the localized home page.
965
+ Failed logout leaves confirmed account data intact. Failed guest initialization
966
+ after successful logout retries only AppLoad, without repeating the mutation.
967
+ The presentation component emits `retry` and `selectHome`; its documentation
968
+ preview never signs out the reader.
969
+
970
+ These components' Russian guides use the matching `/ru/sandbox/components/nuxt/`
971
+ URLs. They include real composition previews, dashed child boundaries, state
972
+ controls, event contracts, related references and physical source downloads.
973
+
974
+ ## Personal profile, footer and stable layout
975
+
976
+ The supplied Nuxt storefront includes `/profile` with personal details, avatar,
977
+ verified email, optional email-notification and email-language preferences, password management,
978
+ phone sign-in/registration and navigation to `/logout`. Account requests use the
979
+ shared named API client, which sends the selected storefront language as `lang`;
980
+ registration saves it as the account's initial email-notification language.
981
+ Avatar upload uses multipart. Data changes only after confirmation. See the
982
+ [profile guide](https://orionmarket.place/en/sandbox/components/nuxt/profile)
983
+ and its [Russian version](https://orionmarket.place/ru/sandbox/components/nuxt/profile).
984
+
985
+ The sign-in and registration form (`ProfileSignIn`) appears only on the
986
+ `/profile` page. Header Login links there. A guest's click on an action that
987
+ needs an account (a review, reaction or reply, a blog comment, the wishlist
988
+ heart, an availability notification, Checkout in the cart, a plan's Subscribe
989
+ or Try, an event) opens `/profile?locale=<locale>&redirect=<current page>` at
990
+ once through `useOrionplaceSignIn().requireSignIn()` in
991
+ `app/composables/useOrionplaceSignIn.ts`, with no separate sign-in notice.
992
+ Background requests and an ended session never navigate.
993
+ Account pages (`/orders`, `/wallet`, `/addresses`, `/subscriptions`, `/tickets`,
994
+ `/activity`, `/wishlist`) declare the `orionplace-account` route middleware in
995
+ `app/middleware/orionplace-account.ts`: after Application Load confirms a guest
996
+ session, it replaces the page with that sign-in address. A pending or failed
997
+ Application Load keeps the page, and no dialog opens automatically.
998
+
999
+ After the final sign-in step, a ring spinner and a moving progress line replace
1000
+ the form while Application Load refreshes; the top loading bar runs and screen
1001
+ readers receive “Signing in…”. With reduced motion, both indicators stay still.
1002
+ The profile page then opens the `redirect` page, or the home page when it is
1003
+ missing, and keeps the indicator until that page opens.
1004
+ `app/utils/orionplace/signInReturn.ts` accepts only paths on the same storefront
1005
+ that start with a single `/`; `/profile`, `/logout` and external addresses open
1006
+ the home page instead. If the refresh fails, the form shows an error with Retry,
1007
+ which refreshes Application Load without resending credentials.
1008
+ Returned field errors stay beside their inputs and `form_errors.__all__` stays
1009
+ in the general error notice, including after a development module reload. The
1010
+ generic retry message appears only when no structured API error reaches the
1011
+ form.
1012
+
1013
+ Messages share one square pattern from `components/orionplace/shared/features.css`:
1014
+ `op-notice op-notice-error` uses the danger colors, an error icon and
1015
+ `role="alert"`; `op-notice op-notice-success` uses the success colors, a check
1016
+ icon and `role="status"`; `op-notice op-notice-attention` uses the attention
1017
+ colors and a warning icon for a step still to complete, such as choosing a
1018
+ delivery method; plain `op-notice` is neutral information. Pending work shows
1019
+ the top loading bar from `app/app.vue` and a visually hidden `role="status"`
1020
+ message instead of a status strip. Field errors stay as red text beside their inputs. Required fields show a
1021
+ red `*` directly after the label text.
1022
+
1023
+ The default layout renders the [footer](https://orionmarket.place/en/sandbox/components/nuxt/footer)
1024
+ with real store categories, home-section anchors, profile/journal navigation,
1025
+ a contact-page link and social links. On `/contact`, `StorefrontContact` places
1026
+ company details (address, `tel:` phone link, registration numbers with copy
1027
+ buttons and social links) in a column beside the bordered message-form panel;
1028
+ the columns stack on narrow screens and empty details are hidden.
1029
+ The home banner spans the available viewport
1030
+ width without a frame. Its media area keeps the same proportions at every width; the image fills the
1031
+ area without distortion and crops its edges when needed. Event media keeps its
1032
+ own reserved proportions, which differ on a narrow screen.
1033
+
1034
+ Search/category filtering keeps current cards during requests and reserves the
1035
+ results area's height when a response is shorter. Product variant replacement
1036
+ retains card height. Width changes release these reserves for responsive layout;
1037
+ a new search scope resets its reserve. Stable scrollbar space avoids horizontal
1038
+ shifts. Initial search loading uses 12 skeletons. The wishlist heart appears
1039
+ for every visitor, including compact catalog representatives; a guest's click
1040
+ opens the sign-in page.
1041
+
1042
+ The React and Svelte packages supply the corresponding storefront and account UI.
1043
+
1044
+ ## Customer API storefront sections
1045
+
1046
+ The Nuxt starter includes native product details/reviews, cart and checkout,
1047
+ orders and downloads, support conversations, account addresses, wallet,
1048
+ search history, sign-in history, promotion codes, wishlist/availability alerts,
1049
+ journal/comments, contact form, email unsubscribe, event enrollment and
1050
+ manufacturer/seller/store/catalog directories. A seller page shows the seller's
1051
+ photos, products and the reviews of all their products. `/tariffs` lists subscription
1052
+ plans with their periods, trials, explained plan modules and limits, and a
1053
+ chooser for the plans that offer more than one option, and
1054
+ `/tariffs?ids=3,7` narrows the page to the listed plans, as a journal article
1055
+ that needs a plan links to it. `/tariffs/:slug/:id` shows one plan with its
1056
+ media, description, features and purchase choices. Guests sign in
1057
+ through links that return to the chosen plan; signed-in customers confirm the
1058
+ purchase in a dialog that links to `/subscriptions` afterwards. The account shows
1059
+ purchased subscriptions and disabling automatic renewal. Choosing a new renewal period is not yet supplied.
1060
+
1061
+ See [`templates/orionplace/COMPONENTS.md`](templates/orionplace/COMPONENTS.md)
1062
+ for the maintained route/component/endpoint table. Components use the named
1063
+ API client, confirmed mutation results and English/Russian labels. Customer
1064
+ source bundles include transitive dependencies and installation guidance.