orionplace-nuxt 0.1.2 → 0.2.0

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