@tokenoftrust/storefront-runner 2.4.86 → 2.4.88
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/apps/storefront/dev-plugins/tenant-hot-reload.mjs +1 -1
- package/apps/storefront/env.d.ts +2 -2
- package/apps/storefront/perf/README.md +1 -1
- package/apps/storefront/public/shared/commerce-chrome.css +1 -1
- package/apps/storefront/public/shared/commerce-marketing.css +1 -1
- package/apps/storefront/src/components/{CollectionCard.astro → catalog/storefront/CollectionCard.astro} +1 -1
- package/apps/storefront/src/components/{ProductCard.astro → catalog/storefront/ProductCard.astro} +7 -7
- package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/BrandGrid.astro +1 -1
- package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/PriceDisplay.astro +3 -3
- package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ProductCarousel.astro +3 -3
- package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ProductGrid.astro +4 -4
- package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ReviewList.astro +1 -1
- package/apps/storefront/src/components/{islands → catalog/storefront/islands}/ImageGallery.tsx +1 -1
- package/apps/storefront/src/components/{islands → catalog/storefront/islands}/QuickView.tsx +2 -2
- package/apps/storefront/src/components/{islands → catalog/storefront/islands}/RecentlyViewed.tsx +2 -2
- package/apps/storefront/src/components/{islands → catalog/storefront/islands}/SearchTypeahead.tsx +3 -3
- package/apps/storefront/src/components/{islands → catalog/storefront/islands}/VariantSelector.tsx +2 -2
- package/apps/storefront/src/components/{plp → catalog/storefront/plp}/FacetSidebar.astro +1 -1
- package/apps/storefront/src/components/compliance/{NicotineWarning.astro → storefront/compliance/NicotineWarning.astro} +1 -1
- package/apps/storefront/src/components/{islands → compliance/storefront/islands}/AgeGate.tsx +2 -2
- package/apps/storefront/src/components/{islands → compliance/storefront/islands}/CheckoutComplianceGate.tsx +1 -1
- package/apps/storefront/src/components/{islands → compliance/storefront/islands}/IsolatedAgeGate.tsx +1 -1
- package/apps/storefront/src/components/{AsyncStylesheet.astro → content/storefront/AsyncStylesheet.astro} +2 -2
- package/apps/storefront/src/components/{Breadcrumbs.astro → content/storefront/Breadcrumbs.astro} +3 -3
- package/apps/storefront/src/components/{Seo.astro → content/storefront/Seo.astro} +5 -5
- package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogIndexView.astro +6 -6
- package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogPaywall.astro +1 -1
- package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogPostArticle.astro +7 -7
- package/apps/storefront/src/components/{blog → content/storefront/blog}/PostAccessBadge.astro +1 -1
- package/apps/storefront/src/components/{blog → content/storefront/blog}/PostGrid.astro +3 -3
- package/apps/storefront/src/components/{blog → content/storefront/blog}/ReactionBar.astro +1 -1
- package/apps/storefront/src/components/{blog → content/storefront/blog}/ShareRow.astro +1 -1
- package/apps/storefront/src/components/{chrome → content/storefront/chrome}/MegaMenu.astro +3 -3
- package/apps/storefront/src/components/{chrome → content/storefront/chrome}/NavDropdown.astro +2 -2
- package/apps/storefront/src/components/{chrome → content/storefront/chrome}/SiteFooter.astro +5 -5
- package/apps/storefront/src/components/{chrome → content/storefront/chrome}/SiteHeader.astro +9 -9
- package/apps/storefront/src/components/{chrome → content/storefront/chrome}/UtilityNav.astro +2 -2
- package/apps/storefront/src/components/content/{Callout.astro → storefront/content/Callout.astro} +1 -1
- package/apps/storefront/src/components/content/{PromoTiles.astro → storefront/content/PromoTiles.astro} +3 -3
- package/apps/storefront/src/components/content/{ProseSections.astro → storefront/content/ProseSections.astro} +3 -3
- package/apps/storefront/src/components/{home → content/storefront/home}/Hero.astro +4 -4
- package/apps/storefront/src/components/{islands → content/storefront/islands}/MobileNav.tsx +2 -2
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CardGrid.astro +2 -2
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CodeSample.astro +1 -1
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CtaBand.astro +2 -2
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Faq.astro +5 -5
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Integrations.astro +3 -3
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingBlocks.astro +11 -11
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingCtas.astro +1 -1
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingHero.astro +2 -2
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/ProofStrip.astro +1 -1
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/SplitCompare.astro +2 -2
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Steps.astro +2 -2
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Testimonials.astro +2 -2
- package/apps/storefront/src/components/{marketing → content/storefront/marketing}/TrustBar.astro +1 -1
- package/apps/storefront/src/components/{style-guide → content/storefront/style-guide}/StyleGuideNav.astro +1 -1
- package/apps/storefront/src/components/{the-build → content/storefront/the-build}/TheBuildIndexView.astro +5 -5
- package/apps/storefront/src/components/customers/storefront/islands/SavedList.tsx +2 -2
- package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/HowItWorksSteps.astro +1 -1
- package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/ManageSubscriptionEntry.astro +1 -1
- package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/SavingsExplainer.astro +2 -2
- package/apps/storefront/src/layouts/Layout.astro +32 -32
- package/apps/storefront/src/lib/activity/alerts.ts +1 -1
- package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +1 -1
- package/apps/storefront/src/lib/activity/fixtures/evidence.ts +2 -2
- package/apps/storefront/src/lib/activity/query.ts +2 -2
- package/apps/storefront/src/lib/activity/store.ts +1 -1
- package/apps/storefront/src/lib/admin/services/mock/index.ts +5 -5
- package/apps/storefront/src/lib/assets/shared/imageAttrs.ts +1 -1
- package/apps/storefront/src/lib/basePath.ts +1 -1
- package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsClient.ts +2 -2
- package/apps/storefront/src/lib/{admin → catalog/admin}/services/catalogProducts.ts +2 -2
- package/apps/storefront/src/lib/{d1 → catalog/d1}/catalog.ts +1 -1
- package/apps/storefront/src/lib/{admin/services/mock → catalog/fixtures}/products.ts +5 -5
- package/apps/storefront/src/lib/{search → catalog/search}/index.ts +1 -1
- package/apps/storefront/src/lib/{featuredProductsPresentation.ts → catalog/shared/featuredProductsPresentation.ts} +1 -1
- package/apps/storefront/src/lib/{priceBuckets.ts → catalog/shared/priceBuckets.ts} +1 -1
- package/apps/storefront/src/lib/{tot → catalog/tot}/ToTClient.ts +3 -3
- package/apps/storefront/src/lib/{tot → catalog/tot}/query.ts +1 -1
- package/apps/storefront/src/lib/{tot → catalog/tot}/syncState.ts +1 -1
- package/apps/storefront/src/lib/{tot → catalog/tot}/tenantCatalog.ts +1 -1
- package/apps/storefront/src/lib/{admin/services/mock → checkout/fixtures}/checkoutSettings.ts +2 -2
- package/apps/storefront/src/lib/{blog → content/blog}/collection.ts +9 -9
- package/apps/storefront/src/lib/{blog → content/blog}/postView.ts +3 -3
- package/apps/storefront/src/lib/{blog → content/blog}/provider.ts +7 -7
- package/apps/storefront/src/lib/{chrome → content/chrome}/footerLegal.ts +2 -2
- package/apps/storefront/src/lib/{chrome → content/chrome}/trackingPlacements.ts +1 -1
- package/apps/storefront/src/lib/content/index.ts +1 -1
- package/apps/storefront/src/lib/{seo → content/seo}/faqItems.ts +1 -1
- package/apps/storefront/src/lib/{seo → content/seo}/structuredData.ts +1 -1
- package/apps/storefront/src/lib/{breadcrumbs.ts → content/shared/breadcrumbs.ts} +1 -1
- package/apps/storefront/src/lib/{heroSlideshow.ts → content/shared/heroSlideshow.ts} +1 -1
- package/apps/storefront/src/lib/{homeVisualParity.ts → content/shared/homeVisualParity.ts} +1 -1
- package/apps/storefront/src/lib/{jsonld.ts → content/shared/jsonld.ts} +1 -1
- package/apps/storefront/src/lib/{rawChrome.ts → content/shared/rawChrome.ts} +14 -14
- package/apps/storefront/src/lib/{rawMarketingHtml.ts → content/shared/rawMarketingHtml.ts} +3 -3
- package/apps/storefront/src/lib/{sections.ts → content/shared/sections.ts} +2 -2
- package/apps/storefront/src/lib/{styleGuideThemes.ts → content/shared/styleGuideThemes.ts} +3 -3
- package/apps/storefront/src/lib/{storyblok → content/storyblok}/content-model.ts +1 -1
- package/apps/storefront/src/lib/{storyblok → content/storyblok}/provider.ts +26 -26
- package/apps/storefront/src/lib/{the-build → content/the-build}/provider.ts +1 -1
- package/apps/storefront/src/lib/{the-build → content/the-build}/toc.ts +1 -1
- package/apps/storefront/src/lib/d1/schema-apps.ts +2 -2
- package/apps/storefront/src/lib/email/candidateConflictEmail.ts +1 -1
- package/apps/storefront/src/lib/email/magicLinkInviteEmail.ts +1 -1
- package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/digest.ts +2 -2
- package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/resendClient.ts +1 -1
- package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/send.ts +2 -2
- package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/subscribers.ts +1 -1
- package/apps/storefront/src/lib/{social → engagement/social}/golive.ts +2 -2
- package/apps/storefront/src/lib/{social → engagement/social}/notify.ts +1 -1
- package/apps/storefront/src/lib/{social → engagement/social}/tokenStore.ts +3 -3
- package/apps/storefront/src/lib/env.ts +1 -1
- package/apps/storefront/src/lib/fulfillment/store.ts +1 -1
- package/apps/storefront/src/lib/integrations/apps/appVersionStore.ts +1 -1
- package/apps/storefront/src/lib/integrations/apps/credentials.ts +1 -1
- package/apps/storefront/src/lib/integrations/apps/orders/idempotency.ts +1 -1
- package/apps/storefront/src/lib/integrations/apps/registryAccess.ts +1 -1
- package/apps/storefront/src/lib/integrations/apps/registryService.ts +1 -1
- package/apps/storefront/src/lib/integrations/integration/managedInstallDeclarations.ts +1 -1
- package/apps/storefront/src/lib/integrations/webhooks/deliveryEngine.ts +1 -1
- package/apps/storefront/src/lib/integrations/webhooks/deliveryStore.ts +1 -1
- package/apps/storefront/src/lib/integrations/webhooks/emit.ts +1 -1
- package/apps/storefront/src/lib/integrations/webhooks/getDispatcher.ts +1 -1
- package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/attributionService.ts +2 -2
- package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/orderConversionD1.ts +2 -2
- package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/verifiedProviderMeasurement.ts +2 -2
- package/apps/storefront/src/lib/{apps → measurement/consent}/consentConfigRead.ts +1 -1
- package/apps/storefront/src/lib/{tracking → measurement/tracking}/d1Control.ts +2 -2
- package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionCollector.ts +2 -2
- package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionStore.ts +0 -0
- package/apps/storefront/src/lib/{tracking → measurement/tracking}/pruneRollup.ts +2 -2
- package/apps/storefront/src/lib/{tracking → measurement/tracking}/publishSafetyNet.ts +1 -1
- package/apps/storefront/src/lib/{tracking → measurement/tracking}/tenantD1Registry.ts +2 -2
- package/apps/storefront/src/lib/monitoring/manifest.ts +1 -1
- package/apps/storefront/src/lib/{apps/orders → orders/data}/orderForwardReceiver.ts +1 -1
- package/apps/storefront/src/lib/{apps/orders → orders/data}/orderMapper.ts +1 -1
- package/apps/storefront/src/lib/{apps/orders → orders/data}/ordersStore.ts +1 -1
- package/apps/storefront/src/lib/{admin/services/mock → orders/fixtures}/orders.ts +5 -5
- package/apps/storefront/src/lib/previewReload.ts +1 -1
- package/apps/storefront/src/lib/publication/contentProvider.ts +7 -7
- package/apps/storefront/src/lib/publication/mountedDiscovery.ts +1 -1
- package/apps/storefront/src/lib/publication/rootDiscovery.ts +4 -4
- package/apps/storefront/src/lib/{admin/services/mock → subscriptions/fixtures}/subscriptions.ts +8 -8
- package/apps/storefront/src/lib/url.ts +1 -1
- package/apps/storefront/src/middleware/controlPlane.ts +2 -2
- package/apps/storefront/src/middleware/index.ts +2 -2
- package/apps/storefront/src/middleware/renderChain.ts +3 -3
- package/apps/storefront/src/pages/404.astro +1 -1
- package/apps/storefront/src/pages/[...slug].astro +13 -13
- package/apps/storefront/src/pages/api/activity.ts +1 -1
- package/apps/storefront/src/pages/api/admin/activity-alerts.ts +1 -1
- package/apps/storefront/src/pages/api/admin/interaction-insights.ts +4 -4
- package/apps/storefront/src/pages/api/admin/orders/[id].ts +2 -2
- package/apps/storefront/src/pages/api/admin/orders.ts +2 -2
- package/apps/storefront/src/pages/api/blog/[collection]/[slug]/react.ts +1 -1
- package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +2 -2
- package/apps/storefront/src/pages/api/commerce/final-cart-authorization.ts +2 -2
- package/apps/storefront/src/pages/api/compliance/preflight.ts +1 -1
- package/apps/storefront/src/pages/api/newsletter/[collection]/subscribe.ts +4 -4
- package/apps/storefront/src/pages/api/newsletter/confirm.ts +2 -2
- package/apps/storefront/src/pages/api/newsletter/unsubscribe.ts +2 -2
- package/apps/storefront/src/pages/api/rum/vitals.ts +1 -1
- package/apps/storefront/src/pages/api/tracking/interaction.ts +6 -6
- package/apps/storefront/src/pages/blog/[slug].astro +2 -2
- package/apps/storefront/src/pages/blog/author/[author].astro +8 -8
- package/apps/storefront/src/pages/blog/category/[category].astro +8 -8
- package/apps/storefront/src/pages/blog/index.astro +4 -4
- package/apps/storefront/src/pages/blog/page/[n].astro +4 -4
- package/apps/storefront/src/pages/blog/tag/[tag].astro +8 -8
- package/apps/storefront/src/pages/cart.ts +1 -1
- package/apps/storefront/src/pages/collections/[handle].astro +12 -12
- package/apps/storefront/src/pages/collections/index.astro +6 -6
- package/apps/storefront/src/pages/index.astro +14 -14
- package/apps/storefront/src/pages/llms.txt.ts +3 -3
- package/apps/storefront/src/pages/products/[handle].astro +22 -22
- package/apps/storefront/src/pages/saved.astro +2 -2
- package/apps/storefront/src/pages/search.astro +7 -7
- package/apps/storefront/src/pages/sitemap.xml.ts +9 -9
- package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +58 -58
- package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +2 -2
- package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +3 -3
- package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +3 -3
- package/apps/storefront/src/pages/style-guide/index.astro +1 -1
- package/apps/storefront/src/pages/the-build/[slug].astro +10 -10
- package/apps/storefront/src/pages/the-build/index.astro +5 -5
- package/apps/storefront/src/pages/the-build/page/[n].astro +5 -5
- package/apps/storefront/src/pages/the-build/rss.xml.ts +4 -4
- package/docs/widget-library-guide.md +71 -71
- package/package.json +1 -1
- package/packages/public-runtime/src/chrome.ts +5 -5
- package/packages/public-runtime/src/tracking-id-derivation.ts +1 -1
- /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/RatingStars.astro +0 -0
- /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ReviewSummary.astro +0 -0
- /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/TagFilterCloud.astro +0 -0
- /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/ActiveFilters.astro +0 -0
- /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/Pagination.astro +0 -0
- /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/SortSelect.astro +0 -0
- /package/apps/storefront/src/components/{commerce → checkout/storefront/commerce}/CartDrawerStyles.astro +0 -0
- /package/apps/storefront/src/components/{commerce → checkout/storefront/commerce}/CheckoutLoader.astro +0 -0
- /package/apps/storefront/src/components/compliance/{AdultSignatureNotice.astro → storefront/compliance/AdultSignatureNotice.astro} +0 -0
- /package/apps/storefront/src/components/compliance/{ComplianceNotice.astro → storefront/compliance/ComplianceNotice.astro} +0 -0
- /package/apps/storefront/src/components/compliance/{ExciseTaxNotice.astro → storefront/compliance/ExciseTaxNotice.astro} +0 -0
- /package/apps/storefront/src/components/compliance/{PactActNotice.astro → storefront/compliance/PactActNotice.astro} +0 -0
- /package/apps/storefront/src/components/compliance/{Prop65Warning.astro → storefront/compliance/Prop65Warning.astro} +0 -0
- /package/apps/storefront/src/components/compliance/{PurchaseLimitNotice.astro → storefront/compliance/PurchaseLimitNotice.astro} +0 -0
- /package/apps/storefront/src/components/compliance/{ShippingRestrictionNotice.astro → storefront/compliance/ShippingRestrictionNotice.astro} +0 -0
- /package/apps/storefront/src/components/compliance/{StateEligibilityNotice.astro → storefront/compliance/StateEligibilityNotice.astro} +0 -0
- /package/apps/storefront/src/components/{Badge.astro → content/storefront/Badge.astro} +0 -0
- /package/apps/storefront/src/components/{EmptyState.astro → content/storefront/EmptyState.astro} +0 -0
- /package/apps/storefront/src/components/{Section.astro → content/storefront/Section.astro} +0 -0
- /package/apps/storefront/src/components/{chrome → content/storefront/chrome}/AnnouncementBar.astro +0 -0
- /package/apps/storefront/src/components/{commerce → content/storefront/commerce}/ArticleCard.astro +0 -0
- /package/apps/storefront/src/components/content/{NeedsReviewCallout.astro → storefront/content/NeedsReviewCallout.astro} +0 -0
- /package/apps/storefront/src/components/content/{ProseToc.astro → storefront/content/ProseToc.astro} +0 -0
- /package/apps/storefront/src/components/content/{RichText.astro → storefront/content/RichText.astro} +0 -0
- /package/apps/storefront/src/components/content/{TrustStrip.astro → storefront/content/TrustStrip.astro} +0 -0
- /package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsPreview.ts +0 -0
- /package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsState.ts +0 -0
- /package/apps/storefront/src/lib/{admin → catalog/admin}/productSetupPhoto.ts +0 -0
- /package/apps/storefront/src/lib/{admin → catalog/admin}/productsTabClient.ts +0 -0
- /package/apps/storefront/src/lib/{admin → catalog/admin}/viewmodels/catalogProducts.ts +0 -0
- /package/apps/storefront/src/lib/{admin → catalog/admin}/viewmodels/products.ts +0 -0
- /package/apps/storefront/src/lib/{fixtures → catalog/fixtures}/sampleProducts.ts +0 -0
- /package/apps/storefront/src/lib/{tot → catalog/tot}/d1Client.ts +0 -0
- /package/apps/storefront/src/lib/{tot → catalog/tot}/totClientInterface.ts +0 -0
- /package/apps/storefront/src/lib/{admin → checkout/admin}/checkoutStyleInput.ts +0 -0
- /package/apps/storefront/src/lib/{admin → checkout/admin}/checkoutStyleTarget.ts +0 -0
- /package/apps/storefront/src/{components/islands → lib/checkout/browser}/useCheckoutHandoffCorrelation.ts +0 -0
- /package/apps/storefront/src/lib/{commerce → checkout/commerce}/checkoutHandoffCorrelation.ts +0 -0
- /package/apps/storefront/src/lib/{commerce → checkout/commerce}/checkoutSettings.ts +0 -0
- /package/apps/storefront/src/lib/{commerce → checkout/commerce}/finalCartAuthorization.ts +0 -0
- /package/apps/storefront/src/lib/{checkoutCommerce.ts → checkout/shared/checkoutCommerce.ts} +0 -0
- /package/apps/storefront/src/{components/islands → lib/compliance/browser}/checkoutVerificationFlow.ts +0 -0
- /package/apps/storefront/src/lib/{visitorRegionCookie.ts → compliance/shared/visitorRegionCookie.ts} +0 -0
- /package/apps/storefront/src/lib/{verification → compliance/verification}/totVerificationClient.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/access.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/collectionPaths.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/markdown.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/pagination.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/presentation.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/reactions.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/rss.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/teaser.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/types.ts +0 -0
- /package/apps/storefront/src/lib/{blog → content/blog}/viewCounts.ts +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/ctaIdentity.ts +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/examples/tokenoftrust.chrome-assignments.example.json +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/examples/tokenoftrust.chrome.example.json +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/managedCart.ts +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/model.ts +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/navCurrent.ts +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/newsletterAgeAttestation.ts +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/parseConfig.ts +0 -0
- /package/apps/storefront/src/lib/{chrome → content/chrome}/variant.ts +0 -0
- /package/apps/storefront/src/lib/{commerce → content/policies}/shippingPolicy.ts +0 -0
- /package/apps/storefront/src/lib/{seo → content/seo}/alternates.ts +0 -0
- /package/apps/storefront/src/lib/{seo → content/seo}/documentTitle.ts +0 -0
- /package/apps/storefront/src/lib/{seo → content/seo}/meta.ts +0 -0
- /package/apps/storefront/src/lib/{seo → content/seo}/urlForm.ts +0 -0
- /package/apps/storefront/src/lib/{asyncCss.ts → content/shared/asyncCss.ts} +0 -0
- /package/apps/storefront/src/lib/{colors.ts → content/shared/colors.ts} +0 -0
- /package/apps/storefront/src/lib/{format.ts → content/shared/format.ts} +0 -0
- /package/apps/storefront/src/lib/{i18n.ts → content/shared/i18n.ts} +0 -0
- /package/apps/storefront/src/lib/{jsonScript.ts → content/shared/jsonScript.ts} +0 -0
- /package/apps/storefront/src/lib/{placeholder.ts → content/shared/placeholder.ts} +0 -0
- /package/apps/storefront/src/lib/{styleGuidePaths.ts → content/shared/styleGuidePaths.ts} +0 -0
- /package/apps/storefront/src/lib/{the-build → content/the-build}/pagination.ts +0 -0
- /package/apps/storefront/src/lib/{the-build → content/the-build}/readingTime.ts +0 -0
- /package/apps/storefront/src/lib/{messaging → engagement/messaging}/messagesClient.ts +0 -0
- /package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/confirmationEmail.ts +0 -0
- /package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/consent.ts +0 -0
- /package/apps/storefront/src/lib/{admin → measurement/admin}/consentSettingsClient.ts +0 -0
- /package/apps/storefront/src/lib/{analytics → measurement/analytics}/index.ts +0 -0
- /package/apps/storefront/src/lib/{tracking → measurement/tracking}/collectorAllowlist.ts +0 -0
- /package/apps/storefront/src/lib/{tracking → measurement/tracking}/collectorIngest.ts +0 -0
- /package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionHealth.ts +0 -0
- /package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionSchema.ts +0 -0
- /package/apps/storefront/src/lib/{tracking → measurement/tracking}/tenantReadAccess.ts +0 -0
- /package/apps/storefront/src/lib/{tracking-writeback → measurement/tracking-writeback}/rewriteTrackingIds.ts +0 -0
- /package/apps/storefront/src/lib/{tracking-writeback → measurement/tracking-writeback}/writebackCandidate.ts +0 -0
- /package/apps/storefront/src/lib/{admin → orders/admin}/orderClient.ts +0 -0
- /package/apps/storefront/src/lib/{admin → orders/admin}/services/orders.ts +0 -0
- /package/apps/storefront/src/lib/{admin → orders/admin}/viewmodels/orders.ts +0 -0
- /package/apps/storefront/src/lib/{apps/orders → orders/providers}/foxyOrderClient.ts +0 -0
- /package/apps/storefront/src/lib/{admin → subscriptions/admin}/viewmodels/subscriptions.ts +0 -0
- /package/apps/storefront/src/lib/{subscription → subscriptions/subscription}/model.ts +0 -0
|
@@ -62,7 +62,7 @@ CSS (decision `raw-chrome-single-stylesheet` / `materialization-compat`):
|
|
|
62
62
|
- **Shared raw-chrome CSS** — one platform stylesheet, `public/shared/commerce-chrome.css`
|
|
63
63
|
(linked as `/shared/commerce-chrome.css`), whose class vocabulary (`.site-header`, `.announce`,
|
|
64
64
|
`.primary-nav`/`.mega`, `.site-footer`, `.compliance-strip`, `.age-gate`, …) mirrors the
|
|
65
|
-
component DOM. The server-side generator `lib/rawChrome.ts` emits that DOM from a tenant's typed
|
|
65
|
+
component DOM. The server-side generator `lib/content/shared/rawChrome.ts` emits that DOM from a tenant's typed
|
|
66
66
|
`chrome.json`, links exactly that one stylesheet, and emits **no inline chrome CSS**. See §11.
|
|
67
67
|
|
|
68
68
|
Where a component has a raw-chrome twin, its entry notes the matching selectors.
|
|
@@ -106,9 +106,9 @@ libs, and any tenant config/locals it reads), **Tokens consumed**, **Delivery**
|
|
|
106
106
|
- §8 PLP controls — `components/plp/`
|
|
107
107
|
- §9 Islands — `components/islands/`
|
|
108
108
|
- §10 Foundational atoms + home — `components/*` + `components/home/`
|
|
109
|
-
- §11 Shared raw-chrome library — `lib/rawChrome.ts`, `lib/chrome/`, `public/shared/commerce-chrome.css`
|
|
109
|
+
- §11 Shared raw-chrome library — `lib/content/shared/rawChrome.ts`, `lib/chrome/`, `public/shared/commerce-chrome.css`
|
|
110
110
|
|
|
111
|
-
Shared chrome model (`lib/chrome/model.ts`), referenced throughout §2:
|
|
111
|
+
Shared chrome model (`lib/content/chrome/model.ts`), referenced throughout §2:
|
|
112
112
|
|
|
113
113
|
- `ChromeLink` — `{ label: string; href: string; external?: boolean; badge?: string }`
|
|
114
114
|
- `MegaColumn` — `{ title?: string; links: ChromeLink[] }`
|
|
@@ -127,7 +127,7 @@ The site frame: announcement, utility bar, header, primary/mega nav, footer. All
|
|
|
127
127
|
raw-chrome twin in `public/shared/commerce-chrome.css`. Every href-emitting chrome component reads
|
|
128
128
|
`Astro.locals.basePath` via `withBase` (`@/lib/basePath`) for path-prefix tenant routing.
|
|
129
129
|
|
|
130
|
-
### AnnouncementBar (`components/chrome/AnnouncementBar.astro`)
|
|
130
|
+
### AnnouncementBar (`components/content/storefront/chrome/AnnouncementBar.astro`)
|
|
131
131
|
|
|
132
132
|
- **Purpose:** Top promo strip — `static` centered single line or `marquee` continuously-scrolling
|
|
133
133
|
track (duplicated for a seamless loop). Reduced-motion-safe (freezes to static copy).
|
|
@@ -145,7 +145,7 @@ raw-chrome twin in `public/shared/commerce-chrome.css`. Every href-emitting chro
|
|
|
145
145
|
<AnnouncementBar text="Free US shipping on orders over $100!" variant="marquee" tone="sale" />
|
|
146
146
|
```
|
|
147
147
|
|
|
148
|
-
### UtilityNav (`components/chrome/UtilityNav.astro`)
|
|
148
|
+
### UtilityNav (`components/content/storefront/chrome/UtilityNav.astro`)
|
|
149
149
|
|
|
150
150
|
- **Purpose:** Thin secondary bar above the header — minor links, locale/currency indicator, social
|
|
151
151
|
icons. Hidden below `md` (the mobile menu carries the links).
|
|
@@ -166,7 +166,7 @@ raw-chrome twin in `public/shared/commerce-chrome.css`. Every href-emitting chro
|
|
|
166
166
|
/>
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
-
### SiteHeader (`components/chrome/SiteHeader.astro`)
|
|
169
|
+
### SiteHeader (`components/content/storefront/chrome/SiteHeader.astro`)
|
|
170
170
|
|
|
171
171
|
- **Purpose:** Canonical site header — logo/wordmark + search typeahead island + saved / marketing
|
|
172
172
|
CTA / auth / account / cart affordances, with `<MegaMenu>` below and a `<MobileNav>` drawer.
|
|
@@ -195,7 +195,7 @@ raw-chrome twin in `public/shared/commerce-chrome.css`. Every href-emitting chro
|
|
|
195
195
|
/>
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
-
### MegaMenu (`components/chrome/MegaMenu.astro`)
|
|
198
|
+
### MegaMenu (`components/content/storefront/chrome/MegaMenu.astro`)
|
|
199
199
|
|
|
200
200
|
- **Purpose:** Primary desktop nav bar — a horizontal `<ul>` of items, each rendered by
|
|
201
201
|
`<NavDropdown>`. Hidden below `md`.
|
|
@@ -210,7 +210,7 @@ raw-chrome twin in `public/shared/commerce-chrome.css`. Every href-emitting chro
|
|
|
210
210
|
<MegaMenu items={nav} />
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
### NavDropdown (`components/chrome/NavDropdown.astro`)
|
|
213
|
+
### NavDropdown (`components/content/storefront/chrome/NavDropdown.astro`)
|
|
214
214
|
|
|
215
215
|
- **Purpose:** One primary-nav item in two modes. `mode="bar"` (default) = desktop item with a
|
|
216
216
|
CSS-only hover/focus single-column dropdown (`children`) or multi-column mega panel (`columns`),
|
|
@@ -228,7 +228,7 @@ raw-chrome twin in `public/shared/commerce-chrome.css`. Every href-emitting chro
|
|
|
228
228
|
<NavDropdown item={item} mode="accordion" />
|
|
229
229
|
```
|
|
230
230
|
|
|
231
|
-
### SiteFooter (`components/chrome/SiteFooter.astro`)
|
|
231
|
+
### SiteFooter (`components/content/storefront/chrome/SiteFooter.astro`)
|
|
232
232
|
|
|
233
233
|
- **Purpose:** Brand block + link columns + newsletter POST form + payment-badge chip row +
|
|
234
234
|
trust/compliance line + legal bottom bar. Payment badges are text chips (CSP-clean, no external
|
|
@@ -265,7 +265,7 @@ Product cards, merchandising rows, price/rating atoms, blog cards, and checkout
|
|
|
265
265
|
class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.brand-grid`/`.brand-tile`,
|
|
266
266
|
`.tag-cloud`/`.tag-chip`) — keep the two visually equal.
|
|
267
267
|
|
|
268
|
-
### PriceDisplay (`components/commerce/PriceDisplay.astro`)
|
|
268
|
+
### PriceDisplay (`components/catalog/storefront/commerce/PriceDisplay.astro`)
|
|
269
269
|
|
|
270
270
|
- **Purpose:** Price atom — struck compare-at when on sale, "From $X" prefix for variant ranges,
|
|
271
271
|
optional sale-percent badge. Accepts a `product` (derives everything) or raw primitives.
|
|
@@ -282,7 +282,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
282
282
|
<PriceDisplay amount={42} from currency="USD" />
|
|
283
283
|
```
|
|
284
284
|
|
|
285
|
-
### RatingStars (`components/commerce/RatingStars.astro`)
|
|
285
|
+
### RatingStars (`components/catalog/storefront/commerce/RatingStars.astro`)
|
|
286
286
|
|
|
287
287
|
- **Purpose:** 0–5 star rating with fractional fill (single clipped overlay) + accessible label;
|
|
288
288
|
optional numeric review count. Presentation only.
|
|
@@ -297,7 +297,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
297
297
|
<RatingStars rating={4.5} count={128} />
|
|
298
298
|
```
|
|
299
299
|
|
|
300
|
-
### ProductCarousel (`components/commerce/ProductCarousel.astro`)
|
|
300
|
+
### ProductCarousel (`components/catalog/storefront/commerce/ProductCarousel.astro`)
|
|
301
301
|
|
|
302
302
|
- **Purpose:** Horizontal-scroll row of `<ProductCard>`s bound to a `SectionSource`, with optional
|
|
303
303
|
CSS-only tabs (each tab its own source; radio + adjacent-sibling reveal, zero JS). Presets
|
|
@@ -319,7 +319,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
319
319
|
<ProductCarousel title="Featured" tabs={[{ label: "New", products: newest }, { label: "On Sale", products: onSale }]} />
|
|
320
320
|
```
|
|
321
321
|
|
|
322
|
-
### ProductGrid (`components/commerce/ProductGrid.astro`)
|
|
322
|
+
### ProductGrid (`components/catalog/storefront/commerce/ProductGrid.astro`)
|
|
323
323
|
|
|
324
324
|
- **Purpose:** Non-scrolling paginated-look grid of `<ProductCard>`s bound to a `SectionSource`.
|
|
325
325
|
Thin sibling of `ProductCarousel`; `columns` tunes density; hides itself when empty.
|
|
@@ -337,7 +337,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
337
337
|
<ProductGrid title="All Products" products={products} columns={3} />
|
|
338
338
|
```
|
|
339
339
|
|
|
340
|
-
### BrandGrid (`components/commerce/BrandGrid.astro`)
|
|
340
|
+
### BrandGrid (`components/catalog/storefront/commerce/BrandGrid.astro`)
|
|
341
341
|
|
|
342
342
|
- **Purpose:** "Shop by Brands" logo wall — grid of tiles linking to brand collections; each tile is
|
|
343
343
|
a rehosted logo image OR a text-wordmark fallback. Optional "View all brands" CTA.
|
|
@@ -354,7 +354,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
354
354
|
<BrandGrid title="Shop by Brands" eyebrow="Find your fav" brands={brands} viewAllHref="/brands" tone="surface" />
|
|
355
355
|
```
|
|
356
356
|
|
|
357
|
-
### ArticleCard (`components/commerce/ArticleCard.astro`)
|
|
357
|
+
### ArticleCard (`components/content/storefront/commerce/ArticleCard.astro`)
|
|
358
358
|
|
|
359
359
|
- **Purpose:** One blog/article card — featured image + category tag chip + title + excerpt + meta
|
|
360
360
|
(author · date · read-time). Presentational; omits any absent field's row, never fabricates
|
|
@@ -373,7 +373,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
373
373
|
<ArticleCard article={article} />
|
|
374
374
|
```
|
|
375
375
|
|
|
376
|
-
### TagFilterCloud (`components/commerce/TagFilterCloud.astro`)
|
|
376
|
+
### TagFilterCloud (`components/catalog/storefront/commerce/TagFilterCloud.astro`)
|
|
377
377
|
|
|
378
378
|
- **Purpose:** Cloud of tag/category chips for a blog/article index, each a plain link to its
|
|
379
379
|
filtered view (URL-addressable, zero-JS). Active tag filled + `aria-current`; optional leading
|
|
@@ -391,7 +391,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
391
391
|
<TagFilterCloud title="Browse by topic" tags={tags} allHref="/blog" allActive={false} />
|
|
392
392
|
```
|
|
393
393
|
|
|
394
|
-
### CheckoutLoader (`components/commerce/CheckoutLoader.astro`)
|
|
394
|
+
### CheckoutLoader (`components/checkout/storefront/commerce/CheckoutLoader.astro`)
|
|
395
395
|
|
|
396
396
|
- **Purpose:** Injects the managed checkout loader near end of `<body>` to enable the cart drawer +
|
|
397
397
|
hosted checkout. Rendered only for commerce tenants; marketing tenants ship nothing.
|
|
@@ -404,7 +404,7 @@ class-only block in `public/shared/commerce-chrome.css` (`.article-card`, `.bran
|
|
|
404
404
|
<CheckoutLoader />
|
|
405
405
|
```
|
|
406
406
|
|
|
407
|
-
### CartDrawerStyles (`components/commerce/CartDrawerStyles.astro`)
|
|
407
|
+
### CartDrawerStyles (`components/checkout/storefront/commerce/CartDrawerStyles.astro`)
|
|
408
408
|
|
|
409
409
|
- **Purpose:** Emits a nonce'd `<style>` mapping the in-page cart drawer (`#fc` light DOM)
|
|
410
410
|
selectors to the tenant's theme tokens so the cart is brand-matched. Baseline layer plus optional
|
|
@@ -432,7 +432,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
432
432
|
`pactAct`, `adultSignature` are `boolean`; `shippingRestriction` is `string`; `minAge` is `number`;
|
|
433
433
|
`prop65`/`purchaseLimit`/`stateEligibility`/`exciseTax` are the config objects below.
|
|
434
434
|
|
|
435
|
-
### ComplianceNotice (`components/compliance/ComplianceNotice.astro`)
|
|
435
|
+
### ComplianceNotice (`components/compliance/storefront/compliance/ComplianceNotice.astro`)
|
|
436
436
|
|
|
437
437
|
- **Purpose:** Shared presentational shell for the compliance widgets. Owns only the visual
|
|
438
438
|
treatment; the fixed legal text is supplied by each sibling via `<slot />`. Adds no copy of its own.
|
|
@@ -448,7 +448,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
448
448
|
`.topbar-warning` (top FDA band), `.footer-warning` (footer band).
|
|
449
449
|
- **Usage:** consumed by the siblings below (not used directly).
|
|
450
450
|
|
|
451
|
-
### NicotineWarning (`components/compliance/NicotineWarning.astro`)
|
|
451
|
+
### NicotineWarning (`components/compliance/storefront/compliance/NicotineWarning.astro`)
|
|
452
452
|
|
|
453
453
|
- **Purpose:** FDA-mandated nicotine warning (21 CFR 1143.3). Wording fixed by law, verbatim.
|
|
454
454
|
Self-contained (does not use `ComplianceNotice`).
|
|
@@ -464,7 +464,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
464
464
|
<NicotineWarning variant="block" />
|
|
465
465
|
```
|
|
466
466
|
|
|
467
|
-
### PactActNotice (`components/compliance/PactActNotice.astro`)
|
|
467
|
+
### PactActNotice (`components/compliance/storefront/compliance/PactActNotice.astro`)
|
|
468
468
|
|
|
469
469
|
- **Purpose:** PACT Act compliance notice (ENDS/vapor). Federal-requirement wording fixed here; only
|
|
470
470
|
on/off + age come from config.
|
|
@@ -481,7 +481,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
481
481
|
<PactActNotice enabled minAge={21} variant="footer" />
|
|
482
482
|
```
|
|
483
483
|
|
|
484
|
-
### AdultSignatureNotice (`components/compliance/AdultSignatureNotice.astro`)
|
|
484
|
+
### AdultSignatureNotice (`components/compliance/storefront/compliance/AdultSignatureNotice.astro`)
|
|
485
485
|
|
|
486
486
|
- **Purpose:** Adult-signature-on-delivery notice. Fixed wording; age reflects `minAge`.
|
|
487
487
|
- **Props:** `enabled?: boolean` (default `false`; from `tenant.compliance.adultSignature`); `minAge?:
|
|
@@ -496,7 +496,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
496
496
|
<AdultSignatureNotice enabled minAge={21} variant="inline" />
|
|
497
497
|
```
|
|
498
498
|
|
|
499
|
-
### Prop65Warning (`components/compliance/Prop65Warning.astro`)
|
|
499
|
+
### Prop65Warning (`components/compliance/storefront/compliance/Prop65Warning.astro`)
|
|
500
500
|
|
|
501
501
|
- **Purpose:** California Prop 65 safe-harbor warning. Owns the mandated skeleton, the `⚠` symbol,
|
|
502
502
|
and the official warnings URL. Only harm endpoint(s) + chemical name(s) come from config. Short
|
|
@@ -516,7 +516,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
516
516
|
<Prop65Warning config={{ harm: "reproductive", chemicals: ["nicotine"] }} variant="block" />
|
|
517
517
|
```
|
|
518
518
|
|
|
519
|
-
### PurchaseLimitNotice (`components/compliance/PurchaseLimitNotice.astro`)
|
|
519
|
+
### PurchaseLimitNotice (`components/compliance/storefront/compliance/PurchaseLimitNotice.astro`)
|
|
520
520
|
|
|
521
521
|
- **Purpose:** Purchase-quantity-limit **display** (state/PACT order caps). Display surface only —
|
|
522
522
|
enforcement stays product/commerce-owned.
|
|
@@ -532,7 +532,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
532
532
|
<PurchaseLimitNotice config={{ text: "2 units per order", reason: "per state law" }} variant="inline" />
|
|
533
533
|
```
|
|
534
534
|
|
|
535
|
-
### StateEligibilityNotice (`components/compliance/StateEligibilityNotice.astro`)
|
|
535
|
+
### StateEligibilityNotice (`components/compliance/storefront/compliance/StateEligibilityNotice.astro`)
|
|
536
536
|
|
|
537
537
|
- **Purpose:** State/jurisdiction sale-eligibility **display**. Shows tenant-configured messaging;
|
|
538
538
|
does **not** decide eligibility for a cart/address. Precedence: explicit `note` wins, else composes
|
|
@@ -550,7 +550,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
550
550
|
<StateEligibilityNotice config={{ restrictedStates: ["UT", "AR", "VT"] }} variant="block" />
|
|
551
551
|
```
|
|
552
552
|
|
|
553
|
-
### ShippingRestrictionNotice (`components/compliance/ShippingRestrictionNotice.astro`)
|
|
553
|
+
### ShippingRestrictionNotice (`components/compliance/storefront/compliance/ShippingRestrictionNotice.astro`)
|
|
554
554
|
|
|
555
555
|
- **Purpose:** Shipping-restriction **display** (PACT no-ship states, adult signature, carrier
|
|
556
556
|
limits). Renders the tenant's configured text; the ship/no-ship decision stays product-owned. This
|
|
@@ -567,7 +567,7 @@ types live in `packages/public-runtime/src/tenant.ts` (`ComplianceConfig`): `nic
|
|
|
567
567
|
<ShippingRestrictionNotice text="Adult signature (21+) required on delivery. Not shipped via USPS." variant="footer" />
|
|
568
568
|
```
|
|
569
569
|
|
|
570
|
-
### ExciseTaxNotice (`components/compliance/ExciseTaxNotice.astro`)
|
|
570
|
+
### ExciseTaxNotice (`components/compliance/storefront/compliance/ExciseTaxNotice.astro`)
|
|
571
571
|
|
|
572
572
|
- **Purpose:** Excise-tax **display** cue. Surfaces that excise taxes apply (+ optional
|
|
573
573
|
per-jurisdiction breakdown); **never computes tax** — calculation is product/commerce-owned.
|
|
@@ -661,9 +661,9 @@ Model types (`lib/membership/model.ts`):
|
|
|
661
661
|
Presentational + **education-only**: explain recurring/Autopilot ordering and hand off to the
|
|
662
662
|
tenant's product-owned subscribe/manage flow; **no scheduling/billing/cancellation mechanics**. The
|
|
663
663
|
savings figure is illustrative by default (same discipline as §5). Model in
|
|
664
|
-
`lib/subscription/model.ts`. All emit `data-widget="…"`.
|
|
664
|
+
`lib/subscriptions/subscription/model.ts`. All emit `data-widget="…"`.
|
|
665
665
|
|
|
666
|
-
Model types (`lib/subscription/model.ts`):
|
|
666
|
+
Model types (`lib/subscriptions/subscription/model.ts`):
|
|
667
667
|
|
|
668
668
|
- `SubscriptionStep` — `{ title: string; description: string }`.
|
|
669
669
|
- `SubscriptionFigure` — `{ value: string; caption?: string; real?: boolean }` (`value` is display
|
|
@@ -671,7 +671,7 @@ Model types (`lib/subscription/model.ts`):
|
|
|
671
671
|
- `SubscriptionManageEntry` — `{ label: string; description?: string; href: string }` (handoff URL).
|
|
672
672
|
- `isIllustrative(figure: Pick<SubscriptionFigure, "real">): boolean` → `figure.real !== true`.
|
|
673
673
|
|
|
674
|
-
### HowItWorksSteps (`components/subscription/HowItWorksSteps.astro`)
|
|
674
|
+
### HowItWorksSteps (`components/subscriptions/storefront/subscription/HowItWorksSteps.astro`)
|
|
675
675
|
|
|
676
676
|
- **Purpose:** Autopilot/subscription "how it works" explainer (numbered steps). Ships no
|
|
677
677
|
scheduling/billing mechanics.
|
|
@@ -687,7 +687,7 @@ Model types (`lib/subscription/model.ts`):
|
|
|
687
687
|
<HowItWorksSteps eyebrow="Autopilot" heading="How Autopilot works" subhead="Set it up once — we handle the rest." steps={steps} />
|
|
688
688
|
```
|
|
689
689
|
|
|
690
|
-
### SavingsExplainer (`components/subscription/SavingsExplainer.astro`)
|
|
690
|
+
### SavingsExplainer (`components/subscriptions/storefront/subscription/SavingsExplainer.astro`)
|
|
691
691
|
|
|
692
692
|
- **Purpose:** Autopilot/subscription savings headline (e.g. "Save 15% — vs. one-time purchase") +
|
|
693
693
|
supporting bullets + plain handoff CTA. Figure illustrative by default → "e.g." affordance +
|
|
@@ -707,7 +707,7 @@ Model types (`lib/subscription/model.ts`):
|
|
|
707
707
|
<SavingsExplainer eyebrow="Autopilot savings" heading="Save on every order" figure={{ value: "Save 15%", caption: "vs. one-time purchase" }} bullets={["Free shipping on every Autopilot order", "Pause or cancel anytime"]} cta={{ label: "How Autopilot works", href: "/autopilot" }} />
|
|
708
708
|
```
|
|
709
709
|
|
|
710
|
-
### ManageSubscriptionEntry (`components/subscription/ManageSubscriptionEntry.astro`)
|
|
710
|
+
### ManageSubscriptionEntry (`components/subscriptions/storefront/subscription/ManageSubscriptionEntry.astro`)
|
|
711
711
|
|
|
712
712
|
- **Purpose:** Set of manage-subscription entry points (e.g. "Update delivery date", "Pause or
|
|
713
713
|
cancel"), each a plain link into the tenant's product-owned manage flow. Renders no controls of its
|
|
@@ -730,11 +730,11 @@ Model types (`lib/subscription/model.ts`):
|
|
|
730
730
|
|
|
731
731
|
The block library a `siteType: "marketing"` tenant composes pages from — token-driven, distinct from
|
|
732
732
|
the ported `mkt.css` composition layer. Every block takes a discriminated-union `block` view-model
|
|
733
|
-
from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where it emits links,
|
|
733
|
+
from `lib/content/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where it emits links,
|
|
734
734
|
`basePath: string`. `MarketingCta = { label: string; href: string; variant?: "primary" |
|
|
735
735
|
"secondary" | "ghost" }`.
|
|
736
736
|
|
|
737
|
-
### MarketingBlocks (`components/marketing/MarketingBlocks.astro`)
|
|
737
|
+
### MarketingBlocks (`components/content/storefront/marketing/MarketingBlocks.astro`)
|
|
738
738
|
|
|
739
739
|
- **Purpose:** The marketing page renderer — dispatches a `MarketingBlock[]` discriminated union to
|
|
740
740
|
its block components by `block.component`. Tenant-agnostic; reused by homepage + future marketing
|
|
@@ -752,7 +752,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
752
752
|
<MarketingBlocks blocks={blocks} basePath={basePath} />
|
|
753
753
|
```
|
|
754
754
|
|
|
755
|
-
### MarketingHero (`components/marketing/MarketingHero.astro`)
|
|
755
|
+
### MarketingHero (`components/content/storefront/marketing/MarketingHero.astro`)
|
|
756
756
|
|
|
757
757
|
- **Purpose:** Signature top-of-page hero for marketing tenants — eyebrow + oversized headline +
|
|
758
758
|
subhead/body + CTAs + trust chips; optional right-hand "product moment" panel of mono log lines.
|
|
@@ -769,7 +769,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
769
769
|
<MarketingHero block={block} basePath={basePath} />
|
|
770
770
|
```
|
|
771
771
|
|
|
772
|
-
### MarketingCtas (`components/marketing/MarketingCtas.astro`)
|
|
772
|
+
### MarketingCtas (`components/content/storefront/marketing/MarketingCtas.astro`)
|
|
773
773
|
|
|
774
774
|
- **Purpose:** Row of CTA buttons for marketing blocks. External `http[s]` hrefs open a new tab with
|
|
775
775
|
`rel="noopener noreferrer"`; root-absolute same-origin hrefs get the base-path prefix. Three variant
|
|
@@ -785,7 +785,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
785
785
|
<MarketingCtas ctas={block.ctas} basePath={basePath} class="mt-8" />
|
|
786
786
|
```
|
|
787
787
|
|
|
788
|
-
### TrustBar (`components/marketing/TrustBar.astro`)
|
|
788
|
+
### TrustBar (`components/content/storefront/marketing/TrustBar.astro`)
|
|
789
789
|
|
|
790
790
|
- **Purpose:** Quiet horizontal strip of proof tokens (countries, standards, ratings). Plain text,
|
|
791
791
|
mono, dot-separated.
|
|
@@ -798,7 +798,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
798
798
|
<TrustBar block={{ component: "trust_bar", items: ["200+ countries", "SOC 2 Type II"] }} />
|
|
799
799
|
```
|
|
800
800
|
|
|
801
|
-
### SplitCompare (`components/marketing/SplitCompare.astro`)
|
|
801
|
+
### SplitCompare (`components/content/storefront/marketing/SplitCompare.astro`)
|
|
802
802
|
|
|
803
803
|
- **Purpose:** Before/after two-column comparison — `before` reads as the problem (muted, struck
|
|
804
804
|
items), `after` as the solution (accent border, ✓).
|
|
@@ -814,7 +814,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
814
814
|
<SplitCompare block={block} />
|
|
815
815
|
```
|
|
816
816
|
|
|
817
|
-
### Steps (`components/marketing/Steps.astro`)
|
|
817
|
+
### Steps (`components/content/storefront/marketing/Steps.astro`)
|
|
818
818
|
|
|
819
819
|
- **Purpose:** Numbered/emoji journey (e.g. a checkout verification flow) — a grid of step cards, each
|
|
820
820
|
with a circular number/icon badge + label + optional detail.
|
|
@@ -829,7 +829,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
829
829
|
<Steps block={block} />
|
|
830
830
|
```
|
|
831
831
|
|
|
832
|
-
### CardGrid (`components/marketing/CardGrid.astro`)
|
|
832
|
+
### CardGrid (`components/content/storefront/marketing/CardGrid.astro`)
|
|
833
833
|
|
|
834
834
|
- **Purpose:** Responsive grid of capability/industry/feature cards (one component, three variants
|
|
835
835
|
tuning density/columns). Cards optionally link internally (base-path) or externally.
|
|
@@ -846,7 +846,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
846
846
|
<CardGrid block={block} basePath={basePath} />
|
|
847
847
|
```
|
|
848
848
|
|
|
849
|
-
### Integrations (`components/marketing/Integrations.astro`)
|
|
849
|
+
### Integrations (`components/content/storefront/marketing/Integrations.astro`)
|
|
850
850
|
|
|
851
851
|
- **Purpose:** "Fits the store you already run" section — a strip of platform name/link chips,
|
|
852
852
|
optional implementation points (✓ list), and an optional safe code sample.
|
|
@@ -862,7 +862,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
862
862
|
<Integrations block={block} basePath={basePath} />
|
|
863
863
|
```
|
|
864
864
|
|
|
865
|
-
### CodeSample (`components/marketing/CodeSample.astro`)
|
|
865
|
+
### CodeSample (`components/content/storefront/marketing/CodeSample.astro`)
|
|
866
866
|
|
|
867
867
|
- **Purpose:** Display-only fenced code block; code rendered as **escaped** text inside `<pre><code>`
|
|
868
868
|
(never `set:html`). Never embed secrets. Caption + language label.
|
|
@@ -877,7 +877,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
877
877
|
<CodeSample sample={{ language: "js", caption: "Client-side embed", code: "await verify({ minAge: 21 });" }} />
|
|
878
878
|
```
|
|
879
879
|
|
|
880
|
-
### ProofStrip (`components/marketing/ProofStrip.astro`)
|
|
880
|
+
### ProofStrip (`components/content/storefront/marketing/ProofStrip.astro`)
|
|
881
881
|
|
|
882
882
|
- **Purpose:** Privacy/trust proof band painted in the primary color (a single strong moment) — bold
|
|
883
883
|
statement + supporting copy + grid of proof bullets.
|
|
@@ -892,7 +892,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
892
892
|
<ProofStrip block={block} />
|
|
893
893
|
```
|
|
894
894
|
|
|
895
|
-
### Testimonials (`components/marketing/Testimonials.astro`)
|
|
895
|
+
### Testimonials (`components/content/storefront/marketing/Testimonials.astro`)
|
|
896
896
|
|
|
897
897
|
- **Purpose:** Outcome/quote cards with optional stat lead-in + attribution, plus an optional row of
|
|
898
898
|
rating tokens.
|
|
@@ -907,7 +907,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
907
907
|
<Testimonials block={block} />
|
|
908
908
|
```
|
|
909
909
|
|
|
910
|
-
### Faq (`components/marketing/Faq.astro`)
|
|
910
|
+
### Faq (`components/content/storefront/marketing/Faq.astro`)
|
|
911
911
|
|
|
912
912
|
- **Purpose:** No-JS accordion of Q/A pairs using native `<details>`/`<summary>`; emits FAQPage
|
|
913
913
|
JSON-LD for rich results. Answers plain text (auto-escaped).
|
|
@@ -922,7 +922,7 @@ from `lib/storyblok/content-model.ts` (the `MarketingBlock` union) plus, where i
|
|
|
922
922
|
<Faq block={block} />
|
|
923
923
|
```
|
|
924
924
|
|
|
925
|
-
### CtaBand (`components/marketing/CtaBand.astro`)
|
|
925
|
+
### CtaBand (`components/content/storefront/marketing/CtaBand.astro`)
|
|
926
926
|
|
|
927
927
|
- **Purpose:** Final conversion band on the surface tone — headline + optional subhead + centered CTA
|
|
928
928
|
row.
|
|
@@ -946,7 +946,7 @@ form carrying the query, so filtering needs no JS and is back-button safe. All t
|
|
|
946
946
|
ListProductsQuery` + `basePath: string` (from `@tot/public-runtime`) and share `@/lib/url`
|
|
947
947
|
(`toggleFacet`, `buildQueryString`). None have a raw-chrome twin (PLP-body, not site chrome).
|
|
948
948
|
|
|
949
|
-
### FacetSidebar (`components/plp/FacetSidebar.astro`)
|
|
949
|
+
### FacetSidebar (`components/catalog/storefront/plp/FacetSidebar.astro`)
|
|
950
950
|
|
|
951
951
|
- **Purpose:** Faceted filtering UI — each facet value is a real link toggling a querystring param;
|
|
952
952
|
price range is a GET form preserving other params via hidden inputs. Facets ordered: options, then
|
|
@@ -963,7 +963,7 @@ ListProductsQuery` + `basePath: string` (from `@tot/public-runtime`) and share `
|
|
|
963
963
|
<FacetSidebar facets={facets} query={query} basePath="/collections/bestsellers" />
|
|
964
964
|
```
|
|
965
965
|
|
|
966
|
-
### ActiveFilters (`components/plp/ActiveFilters.astro`)
|
|
966
|
+
### ActiveFilters (`components/catalog/storefront/plp/ActiveFilters.astro`)
|
|
967
967
|
|
|
968
968
|
- **Purpose:** Removable filter chips above the grid; each chip is a link that drops exactly one
|
|
969
969
|
filter, plus a "Clear all" link.
|
|
@@ -978,7 +978,7 @@ ListProductsQuery` + `basePath: string` (from `@tot/public-runtime`) and share `
|
|
|
978
978
|
<ActiveFilters query={query} basePath="/collections/bestsellers" />
|
|
979
979
|
```
|
|
980
980
|
|
|
981
|
-
### SortSelect (`components/plp/SortSelect.astro`)
|
|
981
|
+
### SortSelect (`components/catalog/storefront/plp/SortSelect.astro`)
|
|
982
982
|
|
|
983
983
|
- **Purpose:** Sort control — a plain GET `<form>` `<select>` that auto-submits on change (nonce'd
|
|
984
984
|
`is:inline` script; `<noscript>` Apply fallback). Other query params ride along as hidden inputs.
|
|
@@ -993,7 +993,7 @@ ListProductsQuery` + `basePath: string` (from `@tot/public-runtime`) and share `
|
|
|
993
993
|
<SortSelect query={query} basePath="/collections/bestsellers" />
|
|
994
994
|
```
|
|
995
995
|
|
|
996
|
-
### Pagination (`components/plp/Pagination.astro`)
|
|
996
|
+
### Pagination (`components/catalog/storefront/plp/Pagination.astro`)
|
|
997
997
|
|
|
998
998
|
- **Purpose:** SEO-friendly numbered pagination (compact 5-page window with first/last + ellipses) +
|
|
999
999
|
a "Load more" next-page link. All plain anchors carrying the full query — crawlable, back-button
|
|
@@ -1019,7 +1019,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1019
1019
|
`/search` endpoint). Cross-island wiring uses `window` CustomEvents; `localStorage` keys in play:
|
|
1020
1020
|
`"tot:age-affirmed"`, `"tot:recently-viewed"`, `"tot:wishlist"`.
|
|
1021
1021
|
|
|
1022
|
-
### AgeGate (`components/islands/AgeGate.tsx`)
|
|
1022
|
+
### AgeGate (`components/compliance/storefront/islands/AgeGate.tsx`)
|
|
1023
1023
|
|
|
1024
1024
|
- **Purpose:** Soft `minAge`+ affirmation overlay, shown once per device for regulated tenants.
|
|
1025
1025
|
Front-door affirmation only — real ToT identity/age verification is a later phase (the "Yes" path is
|
|
@@ -1033,13 +1033,13 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1033
1033
|
classes `eyebrow eyebrow--tick`, `display-md`, `link-accent`.
|
|
1034
1034
|
- **Delivery:** platform island + raw-chrome twin `.age-gate` / `.age-gate__panel` / `__mark` /
|
|
1035
1035
|
`__actions` / `__deny` / `__fine` / `.is-open` / `.is-denied` (same `localStorage` key + closed
|
|
1036
|
-
shadow-DOM tamper pattern, produced server-side by `lib/rawChrome.ts`).
|
|
1036
|
+
shadow-DOM tamper pattern, produced server-side by `lib/content/shared/rawChrome.ts`).
|
|
1037
1037
|
- **Usage:**
|
|
1038
1038
|
```astro
|
|
1039
1039
|
<AgeGate client:load minAge={21} brand={tenant.brandName} />
|
|
1040
1040
|
```
|
|
1041
1041
|
|
|
1042
|
-
### IsolatedAgeGate (`components/islands/IsolatedAgeGate.tsx`)
|
|
1042
|
+
### IsolatedAgeGate (`components/compliance/storefront/islands/IsolatedAgeGate.tsx`)
|
|
1043
1043
|
|
|
1044
1044
|
- **Purpose:** Tamper-resistant wrapper that mounts `<AgeGate>` inside a **closed shadow root** so no
|
|
1045
1045
|
tenant CSS/JS can select, restyle, or hide it. A light-DOM host `<div data-tot-compliance>` is
|
|
@@ -1059,7 +1059,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1059
1059
|
<IsolatedAgeGate client:load minAge={21} brand={tenant.brandName} />
|
|
1060
1060
|
```
|
|
1061
1061
|
|
|
1062
|
-
### VariantSelector (`components/islands/VariantSelector.tsx`)
|
|
1062
|
+
### VariantSelector (`components/catalog/storefront/islands/VariantSelector.tsx`)
|
|
1063
1063
|
|
|
1064
1064
|
- **Purpose:** PDP variant picker (the centerpiece interaction) — one radiogroup per product option;
|
|
1065
1065
|
resolves the matching variant, disables unbuyable combinations, updates a polite live region
|
|
@@ -1082,7 +1082,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1082
1082
|
<VariantSelector client:load variants={product.variants} options={product.options} currency={product.price_range.currency} locale="en-US" />
|
|
1083
1083
|
```
|
|
1084
1084
|
|
|
1085
|
-
### ImageGallery (`components/islands/ImageGallery.tsx`)
|
|
1085
|
+
### ImageGallery (`components/catalog/storefront/islands/ImageGallery.tsx`)
|
|
1086
1086
|
|
|
1087
1087
|
- **Purpose:** PDP image gallery — main image + thumbnail strip; thumbnails swap the main image, main
|
|
1088
1088
|
image has click-to-toggle zoom (reduced-motion safe). First image is the LCP candidate until first
|
|
@@ -1102,7 +1102,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1102
1102
|
<ImageGallery client:load images={product.images} title={product.title} productHandle={product.handle} />
|
|
1103
1103
|
```
|
|
1104
1104
|
|
|
1105
|
-
### QuickView (`components/islands/QuickView.tsx`)
|
|
1105
|
+
### QuickView (`components/catalog/storefront/islands/QuickView.tsx`)
|
|
1106
1106
|
|
|
1107
1107
|
- **Purpose:** One global native `<dialog>` any product card opens via a `[data-quickview]` button
|
|
1108
1108
|
(event-delegated, so cards stay zero-JS). Shows a peek — image, price, colors, short description —
|
|
@@ -1122,7 +1122,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1122
1122
|
<QuickView client:idle locale="en-US" />
|
|
1123
1123
|
```
|
|
1124
1124
|
|
|
1125
|
-
### SearchTypeahead (`components/islands/SearchTypeahead.tsx`)
|
|
1125
|
+
### SearchTypeahead (`components/catalog/storefront/islands/SearchTypeahead.tsx`)
|
|
1126
1126
|
|
|
1127
1127
|
- **Purpose:** Compact header search with debounced typeahead dropdown. Fetches `GET
|
|
1128
1128
|
{action}?q=<q>&format=json` and renders up to 6 results as an ARIA combobox/listbox; submitting
|
|
@@ -1143,7 +1143,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1143
1143
|
<SearchTypeahead client:idle />
|
|
1144
1144
|
```
|
|
1145
1145
|
|
|
1146
|
-
### MobileNav (`components/islands/MobileNav.tsx`)
|
|
1146
|
+
### MobileNav (`components/content/storefront/islands/MobileNav.tsx`)
|
|
1147
1147
|
|
|
1148
1148
|
- **Purpose:** Hamburger button + slide-in drawer for small screens (`md:hidden`). WCAG 2.2 AA:
|
|
1149
1149
|
`aria-expanded`/`aria-controls`, focus trap, Escape + backdrop close, body-scroll lock, focus
|
|
@@ -1162,7 +1162,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1162
1162
|
<MobileNav client:idle nav={nav} announcement="Free US shipping on orders over $100" />
|
|
1163
1163
|
```
|
|
1164
1164
|
|
|
1165
|
-
### RecentlyViewed (`components/islands/RecentlyViewed.tsx`)
|
|
1165
|
+
### RecentlyViewed (`components/catalog/storefront/islands/RecentlyViewed.tsx`)
|
|
1166
1166
|
|
|
1167
1167
|
- **Purpose:** "Recently viewed" discovery rail. On a PDP it records the current product to
|
|
1168
1168
|
localStorage and renders the rest as a quiet strip. Renders nothing until it has something to show
|
|
@@ -1210,7 +1210,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
|
|
|
1210
1210
|
|
|
1211
1211
|
Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
1212
1212
|
|
|
1213
|
-
### Badge (`components/Badge.astro`)
|
|
1213
|
+
### Badge (`components/content/storefront/Badge.astro`)
|
|
1214
1214
|
|
|
1215
1215
|
- **Purpose:** Tiny mono-uppercase pill used over product imagery and inline (sale %, New, low-stock,
|
|
1216
1216
|
sold-out, compliance-verified).
|
|
@@ -1225,7 +1225,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1225
1225
|
<Badge variant="compliant" label="Compliant" />
|
|
1226
1226
|
```
|
|
1227
1227
|
|
|
1228
|
-
### Breadcrumbs (`components/Breadcrumbs.astro`)
|
|
1228
|
+
### Breadcrumbs (`components/content/storefront/Breadcrumbs.astro`)
|
|
1229
1229
|
|
|
1230
1230
|
- **Purpose:** Semantic breadcrumb trail; last crumb is the current page (`aria-current`, not a link).
|
|
1231
1231
|
- **Props:** `crumbs: { label: string; href: string }[]`.
|
|
@@ -1238,7 +1238,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1238
1238
|
<Breadcrumbs crumbs={[{ label: "Home", href: "/" }, { label: "Bestsellers", href: "/collections/bestsellers" }]} />
|
|
1239
1239
|
```
|
|
1240
1240
|
|
|
1241
|
-
### ProductCard (`components/ProductCard.astro`)
|
|
1241
|
+
### ProductCard (`components/catalog/storefront/ProductCard.astro`)
|
|
1242
1242
|
|
|
1243
1243
|
- **Purpose:** PLP/grid card using the stretched-link pattern (title is the link; an `::after` overlay
|
|
1244
1244
|
makes the whole card clickable so wishlist/quick-view controls sit above it). Image hover-zoom +
|
|
@@ -1259,7 +1259,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1259
1259
|
<ProductCard product={p} rating={4.5} reviewCount={128} />
|
|
1260
1260
|
```
|
|
1261
1261
|
|
|
1262
|
-
### CollectionCard (`components/CollectionCard.astro`)
|
|
1262
|
+
### CollectionCard (`components/catalog/storefront/CollectionCard.astro`)
|
|
1263
1263
|
|
|
1264
1264
|
- **Purpose:** Editorial collection tile with a dark gradient scrim so the overlaid title (+ optional
|
|
1265
1265
|
piece count) reads on any image. `data-reveal` scroll-in.
|
|
@@ -1273,7 +1273,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1273
1273
|
<CollectionCard collection={collection} productCount={24} />
|
|
1274
1274
|
```
|
|
1275
1275
|
|
|
1276
|
-
### Section (`components/Section.astro`)
|
|
1276
|
+
### Section (`components/content/storefront/Section.astro`)
|
|
1277
1277
|
|
|
1278
1278
|
- **Purpose:** Section wrapper with consistent vertical rhythm + optional eyebrow/title header +
|
|
1279
1279
|
alternating band background.
|
|
@@ -1288,7 +1288,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1288
1288
|
<Section eyebrow="Shop" title="Best Sellers" tone="surface"> … </Section>
|
|
1289
1289
|
```
|
|
1290
1290
|
|
|
1291
|
-
### EmptyState (`components/EmptyState.astro`)
|
|
1291
|
+
### EmptyState (`components/content/storefront/EmptyState.astro`)
|
|
1292
1292
|
|
|
1293
1293
|
- **Purpose:** Intentional empty result (search/PLP). Copy passed in by the parent; optional CTA.
|
|
1294
1294
|
- **Props:** `title: string`; `body?: string`; `ctaLabel?: string`; `ctaHref?: string`.
|
|
@@ -1333,7 +1333,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1333
1333
|
<WidgetFrame src="/widgets/tenant-abc/reviews.html" title="Customer reviews" height="480px" />
|
|
1334
1334
|
```
|
|
1335
1335
|
|
|
1336
|
-
### Seo (`components/Seo.astro`)
|
|
1336
|
+
### Seo (`components/content/storefront/Seo.astro`)
|
|
1337
1337
|
|
|
1338
1338
|
- **Purpose:** Per-page `<title>`/meta, Open Graph, Twitter card, canonical, JSON-LD. Tenant-aware —
|
|
1339
1339
|
OG image + site name from the resolved tenant. Head-only (renders no styled markup).
|
|
@@ -1349,7 +1349,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1349
1349
|
<Seo title="Merino Zip Hoodie" description="Soft, warm, everyday." path="/products/merino-zip-hoodie" ogType="product" jsonLd={productSchema} />
|
|
1350
1350
|
```
|
|
1351
1351
|
|
|
1352
|
-
### Hero (`components/home/Hero.astro`)
|
|
1352
|
+
### Hero (`components/content/storefront/home/Hero.astro`)
|
|
1353
1353
|
|
|
1354
1354
|
- **Purpose:** The signature homepage moment ("hero is a thesis"). Treatments: `"bold"` (default —
|
|
1355
1355
|
full-bleed primary background, contrast text), `"light"` (page background, brand color as
|
|
@@ -1380,12 +1380,12 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
|
|
|
1380
1380
|
|
|
1381
1381
|
---
|
|
1382
1382
|
|
|
1383
|
-
## 11. Shared raw-chrome library — `lib/rawChrome.ts`, `lib/chrome/`, `public/shared/commerce-chrome.css`
|
|
1383
|
+
## 11. Shared raw-chrome library — `lib/content/shared/rawChrome.ts`, `lib/chrome/`, `public/shared/commerce-chrome.css`
|
|
1384
1384
|
|
|
1385
1385
|
The raw-chrome path exists so a tenant that ships **hand-authored raw marketing HTML** still gets the
|
|
1386
1386
|
platform chrome look without copying CSS. It is the second delivery path referenced throughout §2–§4.
|
|
1387
1387
|
|
|
1388
|
-
### `lib/rawChrome.ts` — the canonical raw-chrome generator
|
|
1388
|
+
### `lib/content/shared/rawChrome.ts` — the canonical raw-chrome generator
|
|
1389
1389
|
|
|
1390
1390
|
Replaces the three divergent hand-authored `content/<tenant>/chrome.html` documents with **one
|
|
1391
1391
|
deterministic server-side generator** driven entirely by a tenant's `chrome.json` (typed
|
|
@@ -1417,7 +1417,7 @@ Exports:
|
|
|
1417
1417
|
tamper-resistance pattern as `IsolatedAgeGate.tsx`, keyed on `tot:age-affirmed`.
|
|
1418
1418
|
- `SHARED_CHROME_STYLESHEET: string` = `"/shared/commerce-chrome.css"`.
|
|
1419
1419
|
|
|
1420
|
-
### `lib/chrome/model.ts` — typed chrome config
|
|
1420
|
+
### `lib/content/chrome/model.ts` — typed chrome config
|
|
1421
1421
|
|
|
1422
1422
|
Re-exports `@tot/public-runtime`'s `ChromeConfig` (`packages/public-runtime/src/chrome.ts`) — the
|
|
1423
1423
|
ONE schema for a tenant's site chrome, content-only, skinned by tokens. `header` and `footer` are
|
|
@@ -1430,7 +1430,7 @@ lede?; yesLabel?; noLabel?; denyText?; fineText?; mark?; showNo?; eyebrow?: stri
|
|
|
1430
1430
|
helpLink?: { label; href } }`), `ChromeFooterBrand`, `ChromeTrustMark`,
|
|
1431
1431
|
`ChromeHead`, `ChromeCta`, `ChromeNavItem`, and `ChromeConfig` itself.
|
|
1432
1432
|
|
|
1433
|
-
### `lib/chrome/parseConfig.ts` — the validation gate
|
|
1433
|
+
### `lib/content/chrome/parseConfig.ts` — the validation gate
|
|
1434
1434
|
|
|
1435
1435
|
Re-exports `@tot/public-runtime`'s `validateChromeConfig`/`parseChromeConfig`. `parseChromeConfig(raw:
|
|
1436
1436
|
unknown): ChromeConfig | null` returns a config only when `raw.header` and `raw.footer` both validate
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tokenoftrust/storefront-runner",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.88",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"description": "World-shareable storefront runner: multi-tenant renderer on Astro/Cloudflare. No control plane.",
|
|
6
6
|
"packageManager": "pnpm@11.9.0",
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* plus its fail-closed validator.
|
|
4
4
|
*
|
|
5
5
|
* Consolidates what used to be two competing, undocumented shapes:
|
|
6
|
-
* - a lean `SiteChrome` (lib/storyblok/content-model.ts), consumed by the
|
|
6
|
+
* - a lean `SiteChrome` (lib/content/storyblok/content-model.ts), consumed by the
|
|
7
7
|
* token-styled <SiteHeader>/<SiteFooter> components via
|
|
8
8
|
* Astro.locals.content.getChrome();
|
|
9
9
|
* - a superset `TenantChrome`, consumed by the raw `chrome.html` splice
|
|
10
|
-
* wrapper (lib/rawChrome.ts) via lib/chrome/parseConfig.ts, gated on an
|
|
10
|
+
* wrapper (lib/content/shared/rawChrome.ts) via lib/content/chrome/parseConfig.ts, gated on an
|
|
11
11
|
* explicit `sharedChrome: true` flag.
|
|
12
12
|
* Both read the same `tenants/<id>/content/chrome.json` file; neither was the
|
|
13
13
|
* complete picture. This file is now the single source of truth for that
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* control-plane package — the `renderer-no-controlplane` fence
|
|
25
25
|
* (apps/storefront/.dependency-cruiser.cjs) runs the other way: packages may
|
|
26
26
|
* depend on `@tot/public-runtime`, but the renderer must never import
|
|
27
|
-
* `@tot/private-controlplane`. `apps/storefront/src/lib/chrome/model.ts` and
|
|
27
|
+
* `@tot/private-controlplane`. `apps/storefront/src/lib/content/chrome/model.ts` and
|
|
28
28
|
* `parseConfig.ts` re-export from here so every existing renderer import
|
|
29
29
|
* keeps resolving unchanged.
|
|
30
30
|
*/
|
|
@@ -206,7 +206,7 @@ export interface ChromeAnnouncement {
|
|
|
206
206
|
* 21+ age-gate interstitial config (regulated tenants). The raw-chrome renderer
|
|
207
207
|
* (rawChrome.ts) embeds this as JSON; the shared behavior JS mounts the gate inside
|
|
208
208
|
* a closed shadow root — the same tamper-resistance pattern
|
|
209
|
-
* components/islands/IsolatedAgeGate.tsx uses for component pages — so tenant
|
|
209
|
+
* components/compliance/storefront/islands/IsolatedAgeGate.tsx uses for component pages — so tenant
|
|
210
210
|
* CSS/JS can't reach the dialog.
|
|
211
211
|
*/
|
|
212
212
|
export const CHROME_AGE_GATE_VARIANTS = ["default", "compact-modal"] as const;
|
|
@@ -302,7 +302,7 @@ export function isFooterVariant(v: unknown): v is FooterVariant {
|
|
|
302
302
|
|
|
303
303
|
/**
|
|
304
304
|
* Thrown by the renderer's `assertHeaderVariant` / `assertFooterVariant`
|
|
305
|
-
* (apps/storefront/src/lib/chrome/variant.ts) when a page passes an unknown
|
|
305
|
+
* (apps/storefront/src/lib/content/chrome/variant.ts) when a page passes an unknown
|
|
306
306
|
* variant. Fails closed
|
|
307
307
|
* at validation time with an actionable message rather than silently falling
|
|
308
308
|
* back to a default — an unrecognized variant is a bug in the caller, not a
|