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/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
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
The
|
|
29
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- [
|
|
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.
|