@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.
Files changed (287) hide show
  1. package/apps/storefront/dev-plugins/tenant-hot-reload.mjs +1 -1
  2. package/apps/storefront/env.d.ts +2 -2
  3. package/apps/storefront/perf/README.md +1 -1
  4. package/apps/storefront/public/shared/commerce-chrome.css +1 -1
  5. package/apps/storefront/public/shared/commerce-marketing.css +1 -1
  6. package/apps/storefront/src/components/{CollectionCard.astro → catalog/storefront/CollectionCard.astro} +1 -1
  7. package/apps/storefront/src/components/{ProductCard.astro → catalog/storefront/ProductCard.astro} +7 -7
  8. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/BrandGrid.astro +1 -1
  9. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/PriceDisplay.astro +3 -3
  10. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ProductCarousel.astro +3 -3
  11. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ProductGrid.astro +4 -4
  12. package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ReviewList.astro +1 -1
  13. package/apps/storefront/src/components/{islands → catalog/storefront/islands}/ImageGallery.tsx +1 -1
  14. package/apps/storefront/src/components/{islands → catalog/storefront/islands}/QuickView.tsx +2 -2
  15. package/apps/storefront/src/components/{islands → catalog/storefront/islands}/RecentlyViewed.tsx +2 -2
  16. package/apps/storefront/src/components/{islands → catalog/storefront/islands}/SearchTypeahead.tsx +3 -3
  17. package/apps/storefront/src/components/{islands → catalog/storefront/islands}/VariantSelector.tsx +2 -2
  18. package/apps/storefront/src/components/{plp → catalog/storefront/plp}/FacetSidebar.astro +1 -1
  19. package/apps/storefront/src/components/compliance/{NicotineWarning.astro → storefront/compliance/NicotineWarning.astro} +1 -1
  20. package/apps/storefront/src/components/{islands → compliance/storefront/islands}/AgeGate.tsx +2 -2
  21. package/apps/storefront/src/components/{islands → compliance/storefront/islands}/CheckoutComplianceGate.tsx +1 -1
  22. package/apps/storefront/src/components/{islands → compliance/storefront/islands}/IsolatedAgeGate.tsx +1 -1
  23. package/apps/storefront/src/components/{AsyncStylesheet.astro → content/storefront/AsyncStylesheet.astro} +2 -2
  24. package/apps/storefront/src/components/{Breadcrumbs.astro → content/storefront/Breadcrumbs.astro} +3 -3
  25. package/apps/storefront/src/components/{Seo.astro → content/storefront/Seo.astro} +5 -5
  26. package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogIndexView.astro +6 -6
  27. package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogPaywall.astro +1 -1
  28. package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogPostArticle.astro +7 -7
  29. package/apps/storefront/src/components/{blog → content/storefront/blog}/PostAccessBadge.astro +1 -1
  30. package/apps/storefront/src/components/{blog → content/storefront/blog}/PostGrid.astro +3 -3
  31. package/apps/storefront/src/components/{blog → content/storefront/blog}/ReactionBar.astro +1 -1
  32. package/apps/storefront/src/components/{blog → content/storefront/blog}/ShareRow.astro +1 -1
  33. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/MegaMenu.astro +3 -3
  34. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/NavDropdown.astro +2 -2
  35. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/SiteFooter.astro +5 -5
  36. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/SiteHeader.astro +9 -9
  37. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/UtilityNav.astro +2 -2
  38. package/apps/storefront/src/components/content/{Callout.astro → storefront/content/Callout.astro} +1 -1
  39. package/apps/storefront/src/components/content/{PromoTiles.astro → storefront/content/PromoTiles.astro} +3 -3
  40. package/apps/storefront/src/components/content/{ProseSections.astro → storefront/content/ProseSections.astro} +3 -3
  41. package/apps/storefront/src/components/{home → content/storefront/home}/Hero.astro +4 -4
  42. package/apps/storefront/src/components/{islands → content/storefront/islands}/MobileNav.tsx +2 -2
  43. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CardGrid.astro +2 -2
  44. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CodeSample.astro +1 -1
  45. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CtaBand.astro +2 -2
  46. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Faq.astro +5 -5
  47. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Integrations.astro +3 -3
  48. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingBlocks.astro +11 -11
  49. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingCtas.astro +1 -1
  50. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingHero.astro +2 -2
  51. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/ProofStrip.astro +1 -1
  52. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/SplitCompare.astro +2 -2
  53. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Steps.astro +2 -2
  54. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Testimonials.astro +2 -2
  55. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/TrustBar.astro +1 -1
  56. package/apps/storefront/src/components/{style-guide → content/storefront/style-guide}/StyleGuideNav.astro +1 -1
  57. package/apps/storefront/src/components/{the-build → content/storefront/the-build}/TheBuildIndexView.astro +5 -5
  58. package/apps/storefront/src/components/customers/storefront/islands/SavedList.tsx +2 -2
  59. package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/HowItWorksSteps.astro +1 -1
  60. package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/ManageSubscriptionEntry.astro +1 -1
  61. package/apps/storefront/src/components/{subscription → subscriptions/storefront/subscription}/SavingsExplainer.astro +2 -2
  62. package/apps/storefront/src/layouts/Layout.astro +32 -32
  63. package/apps/storefront/src/lib/activity/alerts.ts +1 -1
  64. package/apps/storefront/src/lib/activity/candidateSubmitLease.ts +1 -1
  65. package/apps/storefront/src/lib/activity/fixtures/evidence.ts +2 -2
  66. package/apps/storefront/src/lib/activity/query.ts +2 -2
  67. package/apps/storefront/src/lib/activity/store.ts +1 -1
  68. package/apps/storefront/src/lib/admin/services/mock/index.ts +5 -5
  69. package/apps/storefront/src/lib/assets/shared/imageAttrs.ts +1 -1
  70. package/apps/storefront/src/lib/basePath.ts +1 -1
  71. package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsClient.ts +2 -2
  72. package/apps/storefront/src/lib/{admin → catalog/admin}/services/catalogProducts.ts +2 -2
  73. package/apps/storefront/src/lib/{d1 → catalog/d1}/catalog.ts +1 -1
  74. package/apps/storefront/src/lib/{admin/services/mock → catalog/fixtures}/products.ts +5 -5
  75. package/apps/storefront/src/lib/{search → catalog/search}/index.ts +1 -1
  76. package/apps/storefront/src/lib/{featuredProductsPresentation.ts → catalog/shared/featuredProductsPresentation.ts} +1 -1
  77. package/apps/storefront/src/lib/{priceBuckets.ts → catalog/shared/priceBuckets.ts} +1 -1
  78. package/apps/storefront/src/lib/{tot → catalog/tot}/ToTClient.ts +3 -3
  79. package/apps/storefront/src/lib/{tot → catalog/tot}/query.ts +1 -1
  80. package/apps/storefront/src/lib/{tot → catalog/tot}/syncState.ts +1 -1
  81. package/apps/storefront/src/lib/{tot → catalog/tot}/tenantCatalog.ts +1 -1
  82. package/apps/storefront/src/lib/{admin/services/mock → checkout/fixtures}/checkoutSettings.ts +2 -2
  83. package/apps/storefront/src/lib/{blog → content/blog}/collection.ts +9 -9
  84. package/apps/storefront/src/lib/{blog → content/blog}/postView.ts +3 -3
  85. package/apps/storefront/src/lib/{blog → content/blog}/provider.ts +7 -7
  86. package/apps/storefront/src/lib/{chrome → content/chrome}/footerLegal.ts +2 -2
  87. package/apps/storefront/src/lib/{chrome → content/chrome}/trackingPlacements.ts +1 -1
  88. package/apps/storefront/src/lib/content/index.ts +1 -1
  89. package/apps/storefront/src/lib/{seo → content/seo}/faqItems.ts +1 -1
  90. package/apps/storefront/src/lib/{seo → content/seo}/structuredData.ts +1 -1
  91. package/apps/storefront/src/lib/{breadcrumbs.ts → content/shared/breadcrumbs.ts} +1 -1
  92. package/apps/storefront/src/lib/{heroSlideshow.ts → content/shared/heroSlideshow.ts} +1 -1
  93. package/apps/storefront/src/lib/{homeVisualParity.ts → content/shared/homeVisualParity.ts} +1 -1
  94. package/apps/storefront/src/lib/{jsonld.ts → content/shared/jsonld.ts} +1 -1
  95. package/apps/storefront/src/lib/{rawChrome.ts → content/shared/rawChrome.ts} +14 -14
  96. package/apps/storefront/src/lib/{rawMarketingHtml.ts → content/shared/rawMarketingHtml.ts} +3 -3
  97. package/apps/storefront/src/lib/{sections.ts → content/shared/sections.ts} +2 -2
  98. package/apps/storefront/src/lib/{styleGuideThemes.ts → content/shared/styleGuideThemes.ts} +3 -3
  99. package/apps/storefront/src/lib/{storyblok → content/storyblok}/content-model.ts +1 -1
  100. package/apps/storefront/src/lib/{storyblok → content/storyblok}/provider.ts +26 -26
  101. package/apps/storefront/src/lib/{the-build → content/the-build}/provider.ts +1 -1
  102. package/apps/storefront/src/lib/{the-build → content/the-build}/toc.ts +1 -1
  103. package/apps/storefront/src/lib/d1/schema-apps.ts +2 -2
  104. package/apps/storefront/src/lib/email/candidateConflictEmail.ts +1 -1
  105. package/apps/storefront/src/lib/email/magicLinkInviteEmail.ts +1 -1
  106. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/digest.ts +2 -2
  107. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/resendClient.ts +1 -1
  108. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/send.ts +2 -2
  109. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/subscribers.ts +1 -1
  110. package/apps/storefront/src/lib/{social → engagement/social}/golive.ts +2 -2
  111. package/apps/storefront/src/lib/{social → engagement/social}/notify.ts +1 -1
  112. package/apps/storefront/src/lib/{social → engagement/social}/tokenStore.ts +3 -3
  113. package/apps/storefront/src/lib/env.ts +1 -1
  114. package/apps/storefront/src/lib/fulfillment/store.ts +1 -1
  115. package/apps/storefront/src/lib/integrations/apps/appVersionStore.ts +1 -1
  116. package/apps/storefront/src/lib/integrations/apps/credentials.ts +1 -1
  117. package/apps/storefront/src/lib/integrations/apps/orders/idempotency.ts +1 -1
  118. package/apps/storefront/src/lib/integrations/apps/registryAccess.ts +1 -1
  119. package/apps/storefront/src/lib/integrations/apps/registryService.ts +1 -1
  120. package/apps/storefront/src/lib/integrations/integration/managedInstallDeclarations.ts +1 -1
  121. package/apps/storefront/src/lib/integrations/webhooks/deliveryEngine.ts +1 -1
  122. package/apps/storefront/src/lib/integrations/webhooks/deliveryStore.ts +1 -1
  123. package/apps/storefront/src/lib/integrations/webhooks/emit.ts +1 -1
  124. package/apps/storefront/src/lib/integrations/webhooks/getDispatcher.ts +1 -1
  125. package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/attributionService.ts +2 -2
  126. package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/orderConversionD1.ts +2 -2
  127. package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/verifiedProviderMeasurement.ts +2 -2
  128. package/apps/storefront/src/lib/{apps → measurement/consent}/consentConfigRead.ts +1 -1
  129. package/apps/storefront/src/lib/{tracking → measurement/tracking}/d1Control.ts +2 -2
  130. package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionCollector.ts +2 -2
  131. package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionStore.ts +0 -0
  132. package/apps/storefront/src/lib/{tracking → measurement/tracking}/pruneRollup.ts +2 -2
  133. package/apps/storefront/src/lib/{tracking → measurement/tracking}/publishSafetyNet.ts +1 -1
  134. package/apps/storefront/src/lib/{tracking → measurement/tracking}/tenantD1Registry.ts +2 -2
  135. package/apps/storefront/src/lib/monitoring/manifest.ts +1 -1
  136. package/apps/storefront/src/lib/{apps/orders → orders/data}/orderForwardReceiver.ts +1 -1
  137. package/apps/storefront/src/lib/{apps/orders → orders/data}/orderMapper.ts +1 -1
  138. package/apps/storefront/src/lib/{apps/orders → orders/data}/ordersStore.ts +1 -1
  139. package/apps/storefront/src/lib/{admin/services/mock → orders/fixtures}/orders.ts +5 -5
  140. package/apps/storefront/src/lib/previewReload.ts +1 -1
  141. package/apps/storefront/src/lib/publication/contentProvider.ts +7 -7
  142. package/apps/storefront/src/lib/publication/mountedDiscovery.ts +1 -1
  143. package/apps/storefront/src/lib/publication/rootDiscovery.ts +4 -4
  144. package/apps/storefront/src/lib/{admin/services/mock → subscriptions/fixtures}/subscriptions.ts +8 -8
  145. package/apps/storefront/src/lib/url.ts +1 -1
  146. package/apps/storefront/src/middleware/controlPlane.ts +2 -2
  147. package/apps/storefront/src/middleware/index.ts +2 -2
  148. package/apps/storefront/src/middleware/renderChain.ts +3 -3
  149. package/apps/storefront/src/pages/404.astro +1 -1
  150. package/apps/storefront/src/pages/[...slug].astro +13 -13
  151. package/apps/storefront/src/pages/api/activity.ts +1 -1
  152. package/apps/storefront/src/pages/api/admin/activity-alerts.ts +1 -1
  153. package/apps/storefront/src/pages/api/admin/interaction-insights.ts +4 -4
  154. package/apps/storefront/src/pages/api/admin/orders/[id].ts +2 -2
  155. package/apps/storefront/src/pages/api/admin/orders.ts +2 -2
  156. package/apps/storefront/src/pages/api/blog/[collection]/[slug]/react.ts +1 -1
  157. package/apps/storefront/src/pages/api/commerce/checkout-handoff.ts +2 -2
  158. package/apps/storefront/src/pages/api/commerce/final-cart-authorization.ts +2 -2
  159. package/apps/storefront/src/pages/api/compliance/preflight.ts +1 -1
  160. package/apps/storefront/src/pages/api/newsletter/[collection]/subscribe.ts +4 -4
  161. package/apps/storefront/src/pages/api/newsletter/confirm.ts +2 -2
  162. package/apps/storefront/src/pages/api/newsletter/unsubscribe.ts +2 -2
  163. package/apps/storefront/src/pages/api/rum/vitals.ts +1 -1
  164. package/apps/storefront/src/pages/api/tracking/interaction.ts +6 -6
  165. package/apps/storefront/src/pages/blog/[slug].astro +2 -2
  166. package/apps/storefront/src/pages/blog/author/[author].astro +8 -8
  167. package/apps/storefront/src/pages/blog/category/[category].astro +8 -8
  168. package/apps/storefront/src/pages/blog/index.astro +4 -4
  169. package/apps/storefront/src/pages/blog/page/[n].astro +4 -4
  170. package/apps/storefront/src/pages/blog/tag/[tag].astro +8 -8
  171. package/apps/storefront/src/pages/cart.ts +1 -1
  172. package/apps/storefront/src/pages/collections/[handle].astro +12 -12
  173. package/apps/storefront/src/pages/collections/index.astro +6 -6
  174. package/apps/storefront/src/pages/index.astro +14 -14
  175. package/apps/storefront/src/pages/llms.txt.ts +3 -3
  176. package/apps/storefront/src/pages/products/[handle].astro +22 -22
  177. package/apps/storefront/src/pages/saved.astro +2 -2
  178. package/apps/storefront/src/pages/search.astro +7 -7
  179. package/apps/storefront/src/pages/sitemap.xml.ts +9 -9
  180. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +58 -58
  181. package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +2 -2
  182. package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +3 -3
  183. package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +3 -3
  184. package/apps/storefront/src/pages/style-guide/index.astro +1 -1
  185. package/apps/storefront/src/pages/the-build/[slug].astro +10 -10
  186. package/apps/storefront/src/pages/the-build/index.astro +5 -5
  187. package/apps/storefront/src/pages/the-build/page/[n].astro +5 -5
  188. package/apps/storefront/src/pages/the-build/rss.xml.ts +4 -4
  189. package/docs/widget-library-guide.md +71 -71
  190. package/package.json +1 -1
  191. package/packages/public-runtime/src/chrome.ts +5 -5
  192. package/packages/public-runtime/src/tracking-id-derivation.ts +1 -1
  193. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/RatingStars.astro +0 -0
  194. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/ReviewSummary.astro +0 -0
  195. /package/apps/storefront/src/components/{commerce → catalog/storefront/commerce}/TagFilterCloud.astro +0 -0
  196. /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/ActiveFilters.astro +0 -0
  197. /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/Pagination.astro +0 -0
  198. /package/apps/storefront/src/components/{plp → catalog/storefront/plp}/SortSelect.astro +0 -0
  199. /package/apps/storefront/src/components/{commerce → checkout/storefront/commerce}/CartDrawerStyles.astro +0 -0
  200. /package/apps/storefront/src/components/{commerce → checkout/storefront/commerce}/CheckoutLoader.astro +0 -0
  201. /package/apps/storefront/src/components/compliance/{AdultSignatureNotice.astro → storefront/compliance/AdultSignatureNotice.astro} +0 -0
  202. /package/apps/storefront/src/components/compliance/{ComplianceNotice.astro → storefront/compliance/ComplianceNotice.astro} +0 -0
  203. /package/apps/storefront/src/components/compliance/{ExciseTaxNotice.astro → storefront/compliance/ExciseTaxNotice.astro} +0 -0
  204. /package/apps/storefront/src/components/compliance/{PactActNotice.astro → storefront/compliance/PactActNotice.astro} +0 -0
  205. /package/apps/storefront/src/components/compliance/{Prop65Warning.astro → storefront/compliance/Prop65Warning.astro} +0 -0
  206. /package/apps/storefront/src/components/compliance/{PurchaseLimitNotice.astro → storefront/compliance/PurchaseLimitNotice.astro} +0 -0
  207. /package/apps/storefront/src/components/compliance/{ShippingRestrictionNotice.astro → storefront/compliance/ShippingRestrictionNotice.astro} +0 -0
  208. /package/apps/storefront/src/components/compliance/{StateEligibilityNotice.astro → storefront/compliance/StateEligibilityNotice.astro} +0 -0
  209. /package/apps/storefront/src/components/{Badge.astro → content/storefront/Badge.astro} +0 -0
  210. /package/apps/storefront/src/components/{EmptyState.astro → content/storefront/EmptyState.astro} +0 -0
  211. /package/apps/storefront/src/components/{Section.astro → content/storefront/Section.astro} +0 -0
  212. /package/apps/storefront/src/components/{chrome → content/storefront/chrome}/AnnouncementBar.astro +0 -0
  213. /package/apps/storefront/src/components/{commerce → content/storefront/commerce}/ArticleCard.astro +0 -0
  214. /package/apps/storefront/src/components/content/{NeedsReviewCallout.astro → storefront/content/NeedsReviewCallout.astro} +0 -0
  215. /package/apps/storefront/src/components/content/{ProseToc.astro → storefront/content/ProseToc.astro} +0 -0
  216. /package/apps/storefront/src/components/content/{RichText.astro → storefront/content/RichText.astro} +0 -0
  217. /package/apps/storefront/src/components/content/{TrustStrip.astro → storefront/content/TrustStrip.astro} +0 -0
  218. /package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsPreview.ts +0 -0
  219. /package/apps/storefront/src/lib/{admin → catalog/admin}/catalogSettingsState.ts +0 -0
  220. /package/apps/storefront/src/lib/{admin → catalog/admin}/productSetupPhoto.ts +0 -0
  221. /package/apps/storefront/src/lib/{admin → catalog/admin}/productsTabClient.ts +0 -0
  222. /package/apps/storefront/src/lib/{admin → catalog/admin}/viewmodels/catalogProducts.ts +0 -0
  223. /package/apps/storefront/src/lib/{admin → catalog/admin}/viewmodels/products.ts +0 -0
  224. /package/apps/storefront/src/lib/{fixtures → catalog/fixtures}/sampleProducts.ts +0 -0
  225. /package/apps/storefront/src/lib/{tot → catalog/tot}/d1Client.ts +0 -0
  226. /package/apps/storefront/src/lib/{tot → catalog/tot}/totClientInterface.ts +0 -0
  227. /package/apps/storefront/src/lib/{admin → checkout/admin}/checkoutStyleInput.ts +0 -0
  228. /package/apps/storefront/src/lib/{admin → checkout/admin}/checkoutStyleTarget.ts +0 -0
  229. /package/apps/storefront/src/{components/islands → lib/checkout/browser}/useCheckoutHandoffCorrelation.ts +0 -0
  230. /package/apps/storefront/src/lib/{commerce → checkout/commerce}/checkoutHandoffCorrelation.ts +0 -0
  231. /package/apps/storefront/src/lib/{commerce → checkout/commerce}/checkoutSettings.ts +0 -0
  232. /package/apps/storefront/src/lib/{commerce → checkout/commerce}/finalCartAuthorization.ts +0 -0
  233. /package/apps/storefront/src/lib/{checkoutCommerce.ts → checkout/shared/checkoutCommerce.ts} +0 -0
  234. /package/apps/storefront/src/{components/islands → lib/compliance/browser}/checkoutVerificationFlow.ts +0 -0
  235. /package/apps/storefront/src/lib/{visitorRegionCookie.ts → compliance/shared/visitorRegionCookie.ts} +0 -0
  236. /package/apps/storefront/src/lib/{verification → compliance/verification}/totVerificationClient.ts +0 -0
  237. /package/apps/storefront/src/lib/{blog → content/blog}/access.ts +0 -0
  238. /package/apps/storefront/src/lib/{blog → content/blog}/collectionPaths.ts +0 -0
  239. /package/apps/storefront/src/lib/{blog → content/blog}/markdown.ts +0 -0
  240. /package/apps/storefront/src/lib/{blog → content/blog}/pagination.ts +0 -0
  241. /package/apps/storefront/src/lib/{blog → content/blog}/presentation.ts +0 -0
  242. /package/apps/storefront/src/lib/{blog → content/blog}/reactions.ts +0 -0
  243. /package/apps/storefront/src/lib/{blog → content/blog}/rss.ts +0 -0
  244. /package/apps/storefront/src/lib/{blog → content/blog}/teaser.ts +0 -0
  245. /package/apps/storefront/src/lib/{blog → content/blog}/types.ts +0 -0
  246. /package/apps/storefront/src/lib/{blog → content/blog}/viewCounts.ts +0 -0
  247. /package/apps/storefront/src/lib/{chrome → content/chrome}/ctaIdentity.ts +0 -0
  248. /package/apps/storefront/src/lib/{chrome → content/chrome}/examples/tokenoftrust.chrome-assignments.example.json +0 -0
  249. /package/apps/storefront/src/lib/{chrome → content/chrome}/examples/tokenoftrust.chrome.example.json +0 -0
  250. /package/apps/storefront/src/lib/{chrome → content/chrome}/managedCart.ts +0 -0
  251. /package/apps/storefront/src/lib/{chrome → content/chrome}/model.ts +0 -0
  252. /package/apps/storefront/src/lib/{chrome → content/chrome}/navCurrent.ts +0 -0
  253. /package/apps/storefront/src/lib/{chrome → content/chrome}/newsletterAgeAttestation.ts +0 -0
  254. /package/apps/storefront/src/lib/{chrome → content/chrome}/parseConfig.ts +0 -0
  255. /package/apps/storefront/src/lib/{chrome → content/chrome}/variant.ts +0 -0
  256. /package/apps/storefront/src/lib/{commerce → content/policies}/shippingPolicy.ts +0 -0
  257. /package/apps/storefront/src/lib/{seo → content/seo}/alternates.ts +0 -0
  258. /package/apps/storefront/src/lib/{seo → content/seo}/documentTitle.ts +0 -0
  259. /package/apps/storefront/src/lib/{seo → content/seo}/meta.ts +0 -0
  260. /package/apps/storefront/src/lib/{seo → content/seo}/urlForm.ts +0 -0
  261. /package/apps/storefront/src/lib/{asyncCss.ts → content/shared/asyncCss.ts} +0 -0
  262. /package/apps/storefront/src/lib/{colors.ts → content/shared/colors.ts} +0 -0
  263. /package/apps/storefront/src/lib/{format.ts → content/shared/format.ts} +0 -0
  264. /package/apps/storefront/src/lib/{i18n.ts → content/shared/i18n.ts} +0 -0
  265. /package/apps/storefront/src/lib/{jsonScript.ts → content/shared/jsonScript.ts} +0 -0
  266. /package/apps/storefront/src/lib/{placeholder.ts → content/shared/placeholder.ts} +0 -0
  267. /package/apps/storefront/src/lib/{styleGuidePaths.ts → content/shared/styleGuidePaths.ts} +0 -0
  268. /package/apps/storefront/src/lib/{the-build → content/the-build}/pagination.ts +0 -0
  269. /package/apps/storefront/src/lib/{the-build → content/the-build}/readingTime.ts +0 -0
  270. /package/apps/storefront/src/lib/{messaging → engagement/messaging}/messagesClient.ts +0 -0
  271. /package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/confirmationEmail.ts +0 -0
  272. /package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/consent.ts +0 -0
  273. /package/apps/storefront/src/lib/{admin → measurement/admin}/consentSettingsClient.ts +0 -0
  274. /package/apps/storefront/src/lib/{analytics → measurement/analytics}/index.ts +0 -0
  275. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/collectorAllowlist.ts +0 -0
  276. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/collectorIngest.ts +0 -0
  277. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionHealth.ts +0 -0
  278. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionSchema.ts +0 -0
  279. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/tenantReadAccess.ts +0 -0
  280. /package/apps/storefront/src/lib/{tracking-writeback → measurement/tracking-writeback}/rewriteTrackingIds.ts +0 -0
  281. /package/apps/storefront/src/lib/{tracking-writeback → measurement/tracking-writeback}/writebackCandidate.ts +0 -0
  282. /package/apps/storefront/src/lib/{admin → orders/admin}/orderClient.ts +0 -0
  283. /package/apps/storefront/src/lib/{admin → orders/admin}/services/orders.ts +0 -0
  284. /package/apps/storefront/src/lib/{admin → orders/admin}/viewmodels/orders.ts +0 -0
  285. /package/apps/storefront/src/lib/{apps/orders → orders/providers}/foxyOrderClient.ts +0 -0
  286. /package/apps/storefront/src/lib/{admin → subscriptions/admin}/viewmodels/subscriptions.ts +0 -0
  287. /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.86",
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