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