@tokenoftrust/storefront-runner 2.4.85 → 2.4.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/apps/storefront/env.d.ts +1 -1
  2. package/apps/storefront/package.json +1 -1
  3. package/apps/storefront/src/components/{ProductCard.astro → catalog/storefront/ProductCard.astro} +3 -3
  4. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/PriceDisplay.astro +1 -1
  5. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ProductCarousel.astro +1 -1
  6. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ProductGrid.astro +1 -1
  7. package/apps/storefront/src/components/{islands → catalog/storefront/islands}/SearchTypeahead.tsx +1 -1
  8. package/apps/storefront/src/components/{islands → catalog/storefront/islands}/VariantSelector.tsx +1 -1
  9. package/apps/storefront/src/components/{plp → catalog/storefront/plp}/FacetSidebar.astro +1 -1
  10. package/apps/storefront/src/components/chrome/SiteHeader.astro +1 -1
  11. package/apps/storefront/src/components/compliance/{NicotineWarning.astro → storefront/compliance/NicotineWarning.astro} +1 -1
  12. package/apps/storefront/src/components/{islands → compliance/storefront/islands}/CheckoutComplianceGate.tsx +1 -1
  13. package/apps/storefront/src/components/{apps → integrations/storefront/apps}/AppWidgetFrame.astro +1 -1
  14. package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/HowItWorksSteps.astro +1 -1
  15. package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/ManageSubscriptionEntry.astro +1 -1
  16. package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/SavingsExplainer.astro +2 -2
  17. package/apps/storefront/src/config/devTenantSeed.ts +1 -1
  18. package/apps/storefront/src/layouts/Layout.astro +11 -11
  19. package/apps/storefront/src/lib/activity/alerts.ts +1 -1
  20. package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +1 -1
  21. package/apps/storefront/src/lib/activity/fixtures/evidence.ts +2 -2
  22. package/apps/storefront/src/lib/activity/query.ts +2 -2
  23. package/apps/storefront/src/lib/activity/store.ts +1 -1
  24. package/apps/storefront/src/lib/admin/services/mock/index.ts +5 -5
  25. package/apps/storefront/src/lib/apps/consentConfigRead.ts +1 -1
  26. package/apps/storefront/src/lib/apps/orders/attributionService.ts +2 -2
  27. package/apps/storefront/src/lib/apps/orders/orderConversionD1.ts +2 -2
  28. package/apps/storefront/src/lib/apps/orders/verifiedProviderMeasurement.ts +2 -2
  29. package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsClient.ts +2 -2
  30. package/apps/storefront/src/lib/{admin → catalog/admin}/services/catalogProducts.ts +2 -2
  31. package/apps/storefront/src/lib/{d1 → catalog/d1}/catalog.ts +1 -1
  32. package/apps/storefront/src/lib/{admin/services/mock → catalog/fixtures}/products.ts +5 -5
  33. package/apps/storefront/src/lib/{search → catalog/search}/index.ts +1 -1
  34. package/apps/storefront/src/lib/{priceBuckets.ts → catalog/shared/priceBuckets.ts} +1 -1
  35. package/apps/storefront/src/lib/{tot → catalog/tot}/ToTClient.ts +3 -3
  36. package/apps/storefront/src/lib/{tot → catalog/tot}/query.ts +1 -1
  37. package/apps/storefront/src/lib/{tot → catalog/tot}/syncState.ts +1 -1
  38. package/apps/storefront/src/lib/{tot → catalog/tot}/tenantCatalog.ts +1 -1
  39. package/apps/storefront/src/lib/{admin/services/mock → checkout/fixtures}/checkoutSettings.ts +2 -2
  40. package/apps/storefront/src/lib/content/index.ts +1 -1
  41. package/apps/storefront/src/lib/env.ts +1 -1
  42. package/apps/storefront/src/lib/fulfillment/store.ts +1 -1
  43. package/apps/storefront/src/lib/{apps → integrations/apps}/appVersionStore.ts +1 -1
  44. package/apps/storefront/src/lib/{apps → integrations/apps}/credentials.ts +1 -1
  45. package/apps/storefront/src/lib/{apps → integrations/apps}/orders/idempotency.ts +1 -1
  46. package/apps/storefront/src/lib/{apps → integrations/apps}/registryAccess.ts +2 -2
  47. package/apps/storefront/src/lib/{apps → integrations/apps}/registryService.ts +1 -1
  48. package/apps/storefront/src/lib/{integration → integrations/integration}/browserEnvironment.ts +1 -1
  49. package/apps/storefront/src/lib/{integration → integrations/integration}/managedInstallDeclarations.ts +1 -1
  50. package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/deliveryEngine.ts +1 -1
  51. package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/deliveryStore.ts +1 -1
  52. package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/emit.ts +2 -2
  53. package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/getDispatcher.ts +2 -2
  54. package/apps/storefront/src/lib/jsonld.ts +1 -1
  55. package/apps/storefront/src/lib/monitoring/manifest.ts +1 -1
  56. package/apps/storefront/src/lib/newsletter/send.ts +1 -1
  57. package/apps/storefront/src/lib/newsletter/subscribers.ts +1 -1
  58. package/apps/storefront/src/lib/{apps/orders → orders/data}/orderForwardReceiver.ts +3 -3
  59. package/apps/storefront/src/lib/{apps/orders → orders/data}/orderMapper.ts +2 -2
  60. package/apps/storefront/src/lib/{apps/orders → orders/data}/ordersStore.ts +1 -1
  61. package/apps/storefront/src/lib/{admin/services/mock → orders/fixtures}/orders.ts +5 -5
  62. package/apps/storefront/src/lib/rawChrome.ts +2 -2
  63. package/apps/storefront/src/lib/sections.ts +2 -2
  64. package/apps/storefront/src/lib/social/tokenStore.ts +2 -2
  65. package/apps/storefront/src/lib/{admin/services/mock → subscriptions/fixtures}/subscriptions.ts +8 -8
  66. package/apps/storefront/src/lib/tracking/d1Control.ts +1 -1
  67. package/apps/storefront/src/lib/tracking/interactionStore.ts +0 -0
  68. package/apps/storefront/src/lib/tracking/pruneRollup.ts +1 -1
  69. package/apps/storefront/src/lib/tracking/tenantD1Registry.ts +1 -1
  70. package/apps/storefront/src/lib/url.ts +1 -1
  71. package/apps/storefront/src/middleware/controlPlane.ts +2 -2
  72. package/apps/storefront/src/middleware/index.ts +2 -2
  73. package/apps/storefront/src/middleware/renderChain.ts +7 -7
  74. package/apps/storefront/src/pages/404.astro +1 -1
  75. package/apps/storefront/src/pages/api/activity.ts +1 -1
  76. package/apps/storefront/src/pages/api/admin/activity-alerts.ts +1 -1
  77. package/apps/storefront/src/pages/api/admin/interaction-insights.ts +1 -1
  78. package/apps/storefront/src/pages/api/admin/orders/[id].ts +2 -2
  79. package/apps/storefront/src/pages/api/admin/orders.ts +2 -2
  80. package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +2 -2
  81. package/apps/storefront/src/pages/api/commerce/final-cart-authorization.ts +2 -2
  82. package/apps/storefront/src/pages/api/compliance/preflight.ts +1 -1
  83. package/apps/storefront/src/pages/api/newsletter/[collection]/subscribe.ts +1 -1
  84. package/apps/storefront/src/pages/api/newsletter/confirm.ts +1 -1
  85. package/apps/storefront/src/pages/api/newsletter/unsubscribe.ts +1 -1
  86. package/apps/storefront/src/pages/api/tracking/interaction.ts +1 -1
  87. package/apps/storefront/src/pages/collections/[handle].astro +5 -5
  88. package/apps/storefront/src/pages/collections/index.astro +2 -2
  89. package/apps/storefront/src/pages/index.astro +7 -7
  90. package/apps/storefront/src/pages/llms.txt.ts +1 -1
  91. package/apps/storefront/src/pages/products/[handle].astro +14 -14
  92. package/apps/storefront/src/pages/search.astro +2 -2
  93. package/apps/storefront/src/pages/sitemap.xml.ts +1 -1
  94. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +34 -34
  95. package/docs/widget-library-guide.md +36 -36
  96. package/package.json +1 -1
  97. package/packages/public-runtime/src/chrome.ts +1 -1
  98. package/packages/public-runtime/src/customization-scripts.ts +1 -1
  99. /package/apps/storefront/src/components/{CollectionCard.astro → catalog/storefront/CollectionCard.astro} +0 -0
  100. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/BrandGrid.astro +0 -0
  101. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/RatingStars.astro +0 -0
  102. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ReviewList.astro +0 -0
  103. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ReviewSummary.astro +0 -0
  104. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/TagFilterCloud.astro +0 -0
  105. /package/apps/storefront/src/components/{islands → catalog/storefront/islands}/ImageGallery.tsx +0 -0
  106. /package/apps/storefront/src/components/{islands → catalog/storefront/islands}/QuickView.tsx +0 -0
  107. /package/apps/storefront/src/components/{islands → catalog/storefront/islands}/RecentlyViewed.tsx +0 -0
  108. /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/ActiveFilters.astro +0 -0
  109. /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/Pagination.astro +0 -0
  110. /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/SortSelect.astro +0 -0
  111. /package/apps/storefront/src/components/{commerce → checkout/storefront/commerce}/CartDrawerStyles.astro +0 -0
  112. /package/apps/storefront/src/components/{commerce → checkout/storefront/commerce}/CheckoutLoader.astro +0 -0
  113. /package/apps/storefront/src/components/compliance/{AdultSignatureNotice.astro → storefront/compliance/AdultSignatureNotice.astro} +0 -0
  114. /package/apps/storefront/src/components/compliance/{ComplianceNotice.astro → storefront/compliance/ComplianceNotice.astro} +0 -0
  115. /package/apps/storefront/src/components/compliance/{ExciseTaxNotice.astro → storefront/compliance/ExciseTaxNotice.astro} +0 -0
  116. /package/apps/storefront/src/components/compliance/{PactActNotice.astro → storefront/compliance/PactActNotice.astro} +0 -0
  117. /package/apps/storefront/src/components/compliance/{Prop65Warning.astro → storefront/compliance/Prop65Warning.astro} +0 -0
  118. /package/apps/storefront/src/components/compliance/{PurchaseLimitNotice.astro → storefront/compliance/PurchaseLimitNotice.astro} +0 -0
  119. /package/apps/storefront/src/components/compliance/{ShippingRestrictionNotice.astro → storefront/compliance/ShippingRestrictionNotice.astro} +0 -0
  120. /package/apps/storefront/src/components/compliance/{StateEligibilityNotice.astro → storefront/compliance/StateEligibilityNotice.astro} +0 -0
  121. /package/apps/storefront/src/components/{islands → compliance/storefront/islands}/AgeGate.tsx +0 -0
  122. /package/apps/storefront/src/components/{islands → compliance/storefront/islands}/IsolatedAgeGate.tsx +0 -0
  123. /package/apps/storefront/src/components/{WidgetFrame.astro → integrations/storefront/WidgetFrame.astro} +0 -0
  124. /package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsPreview.ts +0 -0
  125. /package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsState.ts +0 -0
  126. /package/apps/storefront/src/lib/{admin → catalog/admin}/productSetupPhoto.ts +0 -0
  127. /package/apps/storefront/src/lib/{admin → catalog/admin}/productsTabClient.ts +0 -0
  128. /package/apps/storefront/src/lib/{admin → catalog/admin}/viewmodels/catalogProducts.ts +0 -0
  129. /package/apps/storefront/src/lib/{admin → catalog/admin}/viewmodels/products.ts +0 -0
  130. /package/apps/storefront/src/lib/{fixtures → catalog/fixtures}/sampleProducts.ts +0 -0
  131. /package/apps/storefront/src/lib/{featuredProductsPresentation.ts → catalog/shared/featuredProductsPresentation.ts} +0 -0
  132. /package/apps/storefront/src/lib/{tot → catalog/tot}/d1Client.ts +0 -0
  133. /package/apps/storefront/src/lib/{tot → catalog/tot}/totClientInterface.ts +0 -0
  134. /package/apps/storefront/src/lib/{admin → checkout/admin}/checkoutStyleInput.ts +0 -0
  135. /package/apps/storefront/src/lib/{admin → checkout/admin}/checkoutStyleTarget.ts +0 -0
  136. /package/apps/storefront/src/{components/islands → lib/checkout/browser}/useCheckoutHandoffCorrelation.ts +0 -0
  137. /package/apps/storefront/src/lib/{commerce → checkout/commerce}/checkoutHandoffCorrelation.ts +0 -0
  138. /package/apps/storefront/src/lib/{commerce → checkout/commerce}/checkoutSettings.ts +0 -0
  139. /package/apps/storefront/src/lib/{commerce → checkout/commerce}/finalCartAuthorization.ts +0 -0
  140. /package/apps/storefront/src/lib/{checkoutCommerce.ts → checkout/shared/checkoutCommerce.ts} +0 -0
  141. /package/apps/storefront/src/{components/islands → lib/compliance/browser}/checkoutVerificationFlow.ts +0 -0
  142. /package/apps/storefront/src/lib/{visitorRegionCookie.ts → compliance/shared/visitorRegionCookie.ts} +0 -0
  143. /package/apps/storefront/src/lib/{verification → compliance/verification}/totVerificationClient.ts +0 -0
  144. /package/apps/storefront/src/lib/{apps → integrations/apps}/gatewayKeys.ts +0 -0
  145. /package/apps/storefront/src/lib/{apps → integrations/apps}/gtmMigrationDraft.ts +0 -0
  146. /package/apps/storefront/src/lib/{apps → integrations/apps}/orders/customerHash.ts +0 -0
  147. /package/apps/storefront/src/lib/{apps → integrations/apps}/routeParams.ts +0 -0
  148. /package/apps/storefront/src/lib/{apps → integrations/apps}/scopes.ts +0 -0
  149. /package/apps/storefront/src/lib/{apps → integrations/apps}/widgets/eligibility.ts +0 -0
  150. /package/apps/storefront/src/lib/{apps → integrations/apps}/widgets/frameProps.ts +0 -0
  151. /package/apps/storefront/src/lib/{apps → integrations/apps}/widgets/launchToken.ts +0 -0
  152. /package/apps/storefront/src/lib/{apps → integrations/apps}/widgets/placements.ts +0 -0
  153. /package/apps/storefront/src/lib/{apps → integrations/apps}/widgets/renderSlot.ts +0 -0
  154. /package/apps/storefront/src/lib/{integration → integrations/integration}/bakedManagedInstalls.ts +0 -0
  155. /package/apps/storefront/src/lib/{integration → integrations/integration}/nonceStamp.ts +0 -0
  156. /package/apps/storefront/src/lib/{integration → integrations/integration}/renderIntegrationState.ts +0 -0
  157. /package/apps/storefront/src/lib/{integration → integrations/integration}/stageDestinationIds.ts +0 -0
  158. /package/apps/storefront/src/lib/{integration → integrations/integration}/tenantAnalyticsDeclarations.ts +0 -0
  159. /package/apps/storefront/src/lib/{integration → integrations/integration}/tenantDeclarations.ts +0 -0
  160. /package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/cloudflareQueueDispatcher.ts +0 -0
  161. /package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/deliveryMapper.ts +0 -0
  162. /package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/dispatcher.ts +0 -0
  163. /package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/endpointGuard.ts +0 -0
  164. /package/apps/storefront/src/lib/{webhooks → integrations/webhooks}/events.ts +0 -0
  165. /package/apps/storefront/src/lib/{admin → orders/admin}/orderClient.ts +0 -0
  166. /package/apps/storefront/src/lib/{admin → orders/admin}/services/orders.ts +0 -0
  167. /package/apps/storefront/src/lib/{admin → orders/admin}/viewmodels/orders.ts +0 -0
  168. /package/apps/storefront/src/lib/{apps/orders → orders/providers}/foxyOrderClient.ts +0 -0
  169. /package/apps/storefront/src/lib/{admin → subscriptions/admin}/viewmodels/subscriptions.ts +0 -0
  170. /package/apps/storefront/src/lib/{subscription → subscriptions/subscription}/model.ts +0 -0
@@ -9,17 +9,17 @@ import Layout from "@/layouts/Layout.astro";
9
9
  import Breadcrumbs from "@/components/Breadcrumbs.astro";
10
10
  import { homeCrumbLabel, siteTrail } from "@/lib/breadcrumbs";
11
11
  import Badge from "@/components/Badge.astro";
12
- import ProductCard from "@/components/ProductCard.astro";
12
+ import ProductCard from "@/components/catalog/storefront/ProductCard.astro";
13
13
  import Section from "@/components/Section.astro";
14
- import ImageGallery from "@/components/islands/ImageGallery.tsx";
15
- import VariantSelector, { publicSelectorVariants } from "@/components/islands/VariantSelector.tsx";
16
- import CheckoutComplianceGate from "@/components/islands/CheckoutComplianceGate.tsx";
17
- import RecentlyViewed from "@/components/islands/RecentlyViewed.tsx";
18
- import NicotineWarning from "@/components/compliance/NicotineWarning.astro";
19
- import Prop65Warning from "@/components/compliance/Prop65Warning.astro";
20
- import ReviewSummary from "@/components/commerce/ReviewSummary.astro";
21
- import ReviewList from "@/components/commerce/ReviewList.astro";
22
- import { isOnSale, isNew, isAvailable, fromPrice } from "@/lib/tot/query";
14
+ import ImageGallery from "@/components/catalog/storefront/islands/ImageGallery.tsx";
15
+ import VariantSelector, { publicSelectorVariants } from "@/components/catalog/storefront/islands/VariantSelector.tsx";
16
+ import CheckoutComplianceGate from "@/components/compliance/storefront/islands/CheckoutComplianceGate.tsx";
17
+ import RecentlyViewed from "@/components/catalog/storefront/islands/RecentlyViewed.tsx";
18
+ import NicotineWarning from "@/components/compliance/storefront/compliance/NicotineWarning.astro";
19
+ import Prop65Warning from "@/components/compliance/storefront/compliance/Prop65Warning.astro";
20
+ import ReviewSummary from "@/components/catalog/storefront/commerce/ReviewSummary.astro";
21
+ import ReviewList from "@/components/catalog/storefront/commerce/ReviewList.astro";
22
+ import { isOnSale, isNew, isAvailable, fromPrice } from "@/lib/catalog/tot/query";
23
23
  import {
24
24
  buildMemberSignedCartPayload,
25
25
  workerCartApiPath,
@@ -38,7 +38,7 @@ import type {
38
38
  MembershipStackingPolicy,
39
39
  PurchaseOptionPricingContext,
40
40
  } from "@tot/public-runtime";
41
- import { resolveCartSigning, shopperCheckoutUnavailableHtml } from "@/lib/checkoutCommerce";
41
+ import { resolveCartSigning, shopperCheckoutUnavailableHtml } from "@/lib/checkout/shared/checkoutCommerce";
42
42
  import { isRegulatedTenant } from "@/lib/compliance/enforcement";
43
43
  import { resolveMemberContext } from "@/lib/membership/eligibility";
44
44
  import { truncate } from "@/lib/format";
@@ -49,9 +49,9 @@ import { productPageType, structuredDataProfile } from "@/lib/seo/structuredData
49
49
  import { pageUrlForm } from "@/lib/seo/urlForm";
50
50
  import { sourceSeoTitle } from "@/lib/seo/documentTitle";
51
51
  import { shippingPolicyPath } from "@/lib/commerce/shippingPolicy";
52
- import AppWidgetFrame from "@/components/apps/AppWidgetFrame.astro";
53
- import { getRegistryService } from "@/lib/apps/registryAccess.js";
54
- import { renderWidgetSlot } from "@/lib/apps/widgets/renderSlot.js";
52
+ import AppWidgetFrame from "@/components/integrations/storefront/apps/AppWidgetFrame.astro";
53
+ import { getRegistryService } from "@/lib/integrations/apps/registryAccess.js";
54
+ import { renderWidgetSlot } from "@/lib/integrations/apps/widgets/renderSlot.js";
55
55
 
56
56
  const { handle } = Astro.params;
57
57
  const { tenant, tot, canonicalBase, basePath, apiBasePath, commerce } = Astro.locals;
@@ -12,10 +12,10 @@
12
12
  import Layout from "@/layouts/Layout.astro";
13
13
  import Breadcrumbs from "@/components/Breadcrumbs.astro";
14
14
  import { homeCrumbLabel, siteTrail } from "@/lib/breadcrumbs";
15
- import ProductCard from "@/components/ProductCard.astro";
15
+ import ProductCard from "@/components/catalog/storefront/ProductCard.astro";
16
16
  import EmptyState from "@/components/EmptyState.astro";
17
17
  import Section from "@/components/Section.astro";
18
- import { toTypeaheadDoc } from "@/lib/search";
18
+ import { toTypeaheadDoc } from "@/lib/catalog/search/index";
19
19
  import { breadcrumbLd } from "@/lib/jsonld";
20
20
  import { withBase } from "@/lib/basePath";
21
21
 
@@ -9,7 +9,7 @@
9
9
  * loc is prefix-correct without special-casing here.
10
10
  */
11
11
  import type { APIContext } from "astro";
12
- import { nonEmptyCollections } from "@/lib/tot/query.js";
12
+ import { nonEmptyCollections } from "@/lib/catalog/tot/query.js";
13
13
  import { getBlogSettings, listBlogPosts } from "@/lib/blog/provider.js";
14
14
  import { authorSlug, categorySlug } from "@/lib/blog/collection.js";
15
15
  import { resolveBlogIndexCopy } from "@/lib/blog/pagination.js";
@@ -24,21 +24,21 @@ import { loadStyleGuideThemes, styleGuideCompositionSheets } from "@/lib/styleGu
24
24
  import { styleGuideHref } from "@/lib/styleGuidePaths";
25
25
  import { derivedTokenDeclarations } from "@/themes/derivedTokens";
26
26
  import "@/styles/global.css";
27
- import PriceDisplay from "@/components/commerce/PriceDisplay.astro";
28
- import RatingStars from "@/components/commerce/RatingStars.astro";
29
- import ReviewSummary from "@/components/commerce/ReviewSummary.astro";
30
- import ReviewList from "@/components/commerce/ReviewList.astro";
27
+ import PriceDisplay from "@/components/catalog/storefront/commerce/PriceDisplay.astro";
28
+ import RatingStars from "@/components/catalog/storefront/commerce/RatingStars.astro";
29
+ import ReviewSummary from "@/components/catalog/storefront/commerce/ReviewSummary.astro";
30
+ import ReviewList from "@/components/catalog/storefront/commerce/ReviewList.astro";
31
31
  import type { Review } from "@tot/public-runtime";
32
32
  import Badge from "@/components/Badge.astro";
33
- import ProductCard from "@/components/ProductCard.astro";
34
- import ProductCarousel from "@/components/commerce/ProductCarousel.astro";
35
- import ProductGrid from "@/components/commerce/ProductGrid.astro";
36
- import BrandGrid from "@/components/commerce/BrandGrid.astro";
37
- import type { Brand } from "@/components/commerce/BrandGrid.astro";
33
+ import ProductCard from "@/components/catalog/storefront/ProductCard.astro";
34
+ import ProductCarousel from "@/components/catalog/storefront/commerce/ProductCarousel.astro";
35
+ import ProductGrid from "@/components/catalog/storefront/commerce/ProductGrid.astro";
36
+ import BrandGrid from "@/components/catalog/storefront/commerce/BrandGrid.astro";
37
+ import type { Brand } from "@/components/catalog/storefront/commerce/BrandGrid.astro";
38
38
  import ArticleCard from "@/components/commerce/ArticleCard.astro";
39
39
  import type { Article } from "@/components/commerce/ArticleCard.astro";
40
- import TagFilterCloud from "@/components/commerce/TagFilterCloud.astro";
41
- import type { TagItem } from "@/components/commerce/TagFilterCloud.astro";
40
+ import TagFilterCloud from "@/components/catalog/storefront/commerce/TagFilterCloud.astro";
41
+ import type { TagItem } from "@/components/catalog/storefront/commerce/TagFilterCloud.astro";
42
42
  import AnnouncementBar from "@/components/chrome/AnnouncementBar.astro";
43
43
  import UtilityNav from "@/components/chrome/UtilityNav.astro";
44
44
  import SiteHeader from "@/components/chrome/SiteHeader.astro";
@@ -46,15 +46,15 @@ import MegaMenu from "@/components/chrome/MegaMenu.astro";
46
46
  import NavDropdown from "@/components/chrome/NavDropdown.astro";
47
47
  import SiteFooter from "@/components/chrome/SiteFooter.astro";
48
48
  import { CHROME_PLACEMENT } from "@/lib/chrome/trackingPlacements";
49
- import NicotineWarning from "@/components/compliance/NicotineWarning.astro";
49
+ import NicotineWarning from "@/components/compliance/storefront/compliance/NicotineWarning.astro";
50
50
  import { NICOTINE_WARNING_PRESETS } from "../../../../../../packages/cli/src/declared-config.mjs";
51
- import PactActNotice from "@/components/compliance/PactActNotice.astro";
52
- import AdultSignatureNotice from "@/components/compliance/AdultSignatureNotice.astro";
53
- import Prop65Warning from "@/components/compliance/Prop65Warning.astro";
54
- import PurchaseLimitNotice from "@/components/compliance/PurchaseLimitNotice.astro";
55
- import StateEligibilityNotice from "@/components/compliance/StateEligibilityNotice.astro";
56
- import ShippingRestrictionNotice from "@/components/compliance/ShippingRestrictionNotice.astro";
57
- import ExciseTaxNotice from "@/components/compliance/ExciseTaxNotice.astro";
51
+ import PactActNotice from "@/components/compliance/storefront/compliance/PactActNotice.astro";
52
+ import AdultSignatureNotice from "@/components/compliance/storefront/compliance/AdultSignatureNotice.astro";
53
+ import Prop65Warning from "@/components/compliance/storefront/compliance/Prop65Warning.astro";
54
+ import PurchaseLimitNotice from "@/components/compliance/storefront/compliance/PurchaseLimitNotice.astro";
55
+ import StateEligibilityNotice from "@/components/compliance/storefront/compliance/StateEligibilityNotice.astro";
56
+ import ShippingRestrictionNotice from "@/components/compliance/storefront/compliance/ShippingRestrictionNotice.astro";
57
+ import ExciseTaxNotice from "@/components/compliance/storefront/compliance/ExciseTaxNotice.astro";
58
58
  import TierCards from "@/components/membership/storefront/membership/TierCards.astro";
59
59
  import TierComparisonTable from "@/components/membership/storefront/membership/TierComparisonTable.astro";
60
60
  import ProseSections from "@/components/content/ProseSections.astro";
@@ -64,27 +64,27 @@ import NeedsReviewCallout from "@/components/content/NeedsReviewCallout.astro";
64
64
  import TrustStrip from "@/components/content/TrustStrip.astro";
65
65
  import type { ProseSection } from "@/lib/content/prose";
66
66
  import type { TrustStripItem } from "@/lib/content/trustStrip";
67
- import HowItWorksSteps from "@/components/subscription/HowItWorksSteps.astro";
68
- import SavingsExplainer from "@/components/subscription/SavingsExplainer.astro";
69
- import ManageSubscriptionEntry from "@/components/subscription/ManageSubscriptionEntry.astro";
70
- import AgeGate from "@/components/islands/AgeGate.tsx";
71
- import VariantSelector, { publicSelectorVariants } from "@/components/islands/VariantSelector.tsx";
72
- import QuickView from "@/components/islands/QuickView.tsx";
73
- import SearchTypeahead from "@/components/islands/SearchTypeahead.tsx";
67
+ import HowItWorksSteps from "@/components/subscriptions/storefront/subscription/HowItWorksSteps.astro";
68
+ import SavingsExplainer from "@/components/subscriptions/storefront/subscription/SavingsExplainer.astro";
69
+ import ManageSubscriptionEntry from "@/components/subscriptions/storefront/subscription/ManageSubscriptionEntry.astro";
70
+ import AgeGate from "@/components/compliance/storefront/islands/AgeGate.tsx";
71
+ import VariantSelector, { publicSelectorVariants } from "@/components/catalog/storefront/islands/VariantSelector.tsx";
72
+ import QuickView from "@/components/catalog/storefront/islands/QuickView.tsx";
73
+ import SearchTypeahead from "@/components/catalog/storefront/islands/SearchTypeahead.tsx";
74
74
  import MobileNav from "@/components/islands/MobileNav.tsx";
75
- import RecentlyViewed from "@/components/islands/RecentlyViewed.tsx";
76
- import type { RVItem } from "@/components/islands/RecentlyViewed.tsx";
75
+ import RecentlyViewed from "@/components/catalog/storefront/islands/RecentlyViewed.tsx";
76
+ import type { RVItem } from "@/components/catalog/storefront/islands/RecentlyViewed.tsx";
77
77
  import SavedList from "@/components/customers/storefront/islands/SavedList.tsx";
78
- import FacetSidebar from "@/components/plp/FacetSidebar.astro";
79
- import ActiveFilters from "@/components/plp/ActiveFilters.astro";
80
- import SortSelect from "@/components/plp/SortSelect.astro";
81
- import Pagination from "@/components/plp/Pagination.astro";
78
+ import FacetSidebar from "@/components/catalog/storefront/plp/FacetSidebar.astro";
79
+ import ActiveFilters from "@/components/catalog/storefront/plp/ActiveFilters.astro";
80
+ import SortSelect from "@/components/catalog/storefront/plp/SortSelect.astro";
81
+ import Pagination from "@/components/catalog/storefront/plp/Pagination.astro";
82
82
  import Hero from "@/components/home/Hero.astro";
83
83
  import MarketingBlocks from "@/components/marketing/MarketingBlocks.astro";
84
- import { sampleProducts, sampleRatings } from "@/lib/fixtures/sampleProducts";
84
+ import { sampleProducts, sampleRatings } from "@/lib/catalog/fixtures/sampleProducts";
85
85
  import type { ChromeNavItem } from "@/lib/chrome/model";
86
86
  import type { Tier, ComparisonRow } from "@/lib/membership/model";
87
- import type { SubscriptionStep, SubscriptionManageEntry } from "@/lib/subscription/model";
87
+ import type { SubscriptionStep, SubscriptionManageEntry } from "@/lib/subscriptions/subscription/model";
88
88
  import type { Facet, ListProductsQuery } from "@tot/public-runtime";
89
89
  import type { HeroBlock, MarketingBlock } from "@/lib/storyblok/content-model";
90
90
 
@@ -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.
@@ -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
@@ -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
@@ -1039,7 +1039,7 @@ Client-hydrated Preact `.tsx`. Every island is tenant-agnostic and reads only fi
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
@@ -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
@@ -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.
@@ -1317,7 +1317,7 @@ Shared primitives composed by the higher-level widgets, plus the homepage hero.
1317
1317
  <Img src={image?.url} rehosted={image?.rehosted} seed={image?.id ?? handle} alt={title} width={800} height={1000} sizes="(min-width:1024px) 25vw, 100vw" priority />
1318
1318
  ```
1319
1319
 
1320
- ### WidgetFrame (`components/WidgetFrame.astro`)
1320
+ ### WidgetFrame (`components/integrations/storefront/WidgetFrame.astro`)
1321
1321
 
1322
1322
  - **Purpose:** Renders a tenant-registered widget (`isolation: "sandbox"`) in a sandboxed iframe —
1323
1323
  `allow-scripts` without `allow-same-origin` puts it in an opaque origin (can't read page
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokenoftrust/storefront-runner",
3
- "version": "2.4.85",
3
+ "version": "2.4.87",
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",
@@ -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;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Tenant browser-script vocabulary the renderer needs: the slot / strategy /
3
3
  * isolation constants, the CSP hash helper, and the sandboxed widget iframe
4
- * attributes the renderer draws (`components/WidgetFrame.astro`).
4
+ * attributes the renderer draws (`components/integrations/storefront/WidgetFrame.astro`).
5
5
  *
6
6
  * Dependency-free + Workers-portable (Web Crypto, btoa).
7
7
  */