@tokenoftrust/storefront-runner 2.4.87 → 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 (195) hide show
  1. package/apps/storefront/dev-plugins/tenant-hot-reload.mjs +1 -1
  2. package/apps/storefront/env.d.ts +1 -1
  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/catalog/storefront/CollectionCard.astro +1 -1
  7. package/apps/storefront/src/components/catalog/storefront/ProductCard.astro +4 -4
  8. package/apps/storefront/src/components/catalog/storefront/commerce/BrandGrid.astro +1 -1
  9. package/apps/storefront/src/components/catalog/storefront/commerce/PriceDisplay.astro +2 -2
  10. package/apps/storefront/src/components/catalog/storefront/commerce/ProductCarousel.astro +2 -2
  11. package/apps/storefront/src/components/catalog/storefront/commerce/ProductGrid.astro +3 -3
  12. package/apps/storefront/src/components/catalog/storefront/commerce/ReviewList.astro +1 -1
  13. package/apps/storefront/src/components/catalog/storefront/islands/ImageGallery.tsx +1 -1
  14. package/apps/storefront/src/components/catalog/storefront/islands/QuickView.tsx +2 -2
  15. package/apps/storefront/src/components/catalog/storefront/islands/RecentlyViewed.tsx +2 -2
  16. package/apps/storefront/src/components/catalog/storefront/islands/SearchTypeahead.tsx +2 -2
  17. package/apps/storefront/src/components/catalog/storefront/islands/VariantSelector.tsx +1 -1
  18. package/apps/storefront/src/components/compliance/storefront/islands/AgeGate.tsx +2 -2
  19. package/apps/storefront/src/components/compliance/storefront/islands/IsolatedAgeGate.tsx +1 -1
  20. package/apps/storefront/src/components/{AsyncStylesheet.astro → content/storefront/AsyncStylesheet.astro} +2 -2
  21. package/apps/storefront/src/components/{Breadcrumbs.astro → content/storefront/Breadcrumbs.astro} +3 -3
  22. package/apps/storefront/src/components/{Seo.astro → content/storefront/Seo.astro} +5 -5
  23. package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogIndexView.astro +6 -6
  24. package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogPaywall.astro +1 -1
  25. package/apps/storefront/src/components/{blog → content/storefront/blog}/BlogPostArticle.astro +7 -7
  26. package/apps/storefront/src/components/{blog → content/storefront/blog}/PostAccessBadge.astro +1 -1
  27. package/apps/storefront/src/components/{blog → content/storefront/blog}/PostGrid.astro +3 -3
  28. package/apps/storefront/src/components/{blog → content/storefront/blog}/ReactionBar.astro +1 -1
  29. package/apps/storefront/src/components/{blog → content/storefront/blog}/ShareRow.astro +1 -1
  30. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/MegaMenu.astro +3 -3
  31. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/NavDropdown.astro +2 -2
  32. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/SiteFooter.astro +5 -5
  33. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/SiteHeader.astro +8 -8
  34. package/apps/storefront/src/components/{chrome → content/storefront/chrome}/UtilityNav.astro +2 -2
  35. package/apps/storefront/src/components/content/{Callout.astro → storefront/content/Callout.astro} +1 -1
  36. package/apps/storefront/src/components/content/{PromoTiles.astro → storefront/content/PromoTiles.astro} +3 -3
  37. package/apps/storefront/src/components/content/{ProseSections.astro → storefront/content/ProseSections.astro} +3 -3
  38. package/apps/storefront/src/components/{home → content/storefront/home}/Hero.astro +4 -4
  39. package/apps/storefront/src/components/{islands → content/storefront/islands}/MobileNav.tsx +2 -2
  40. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CardGrid.astro +2 -2
  41. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CodeSample.astro +1 -1
  42. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/CtaBand.astro +2 -2
  43. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Faq.astro +5 -5
  44. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Integrations.astro +3 -3
  45. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingBlocks.astro +11 -11
  46. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingCtas.astro +1 -1
  47. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/MarketingHero.astro +2 -2
  48. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/ProofStrip.astro +1 -1
  49. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/SplitCompare.astro +2 -2
  50. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Steps.astro +2 -2
  51. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/Testimonials.astro +2 -2
  52. package/apps/storefront/src/components/{marketing → content/storefront/marketing}/TrustBar.astro +1 -1
  53. package/apps/storefront/src/components/{style-guide → content/storefront/style-guide}/StyleGuideNav.astro +1 -1
  54. package/apps/storefront/src/components/{the-build → content/storefront/the-build}/TheBuildIndexView.astro +5 -5
  55. package/apps/storefront/src/components/customers/storefront/islands/SavedList.tsx +2 -2
  56. package/apps/storefront/src/layouts/Layout.astro +24 -24
  57. package/apps/storefront/src/lib/assets/shared/imageAttrs.ts +1 -1
  58. package/apps/storefront/src/lib/basePath.ts +1 -1
  59. package/apps/storefront/src/lib/catalog/shared/featuredProductsPresentation.ts +1 -1
  60. package/apps/storefront/src/lib/catalog/tot/tenantCatalog.ts +1 -1
  61. package/apps/storefront/src/lib/{blog → content/blog}/collection.ts +9 -9
  62. package/apps/storefront/src/lib/{blog → content/blog}/postView.ts +3 -3
  63. package/apps/storefront/src/lib/{blog → content/blog}/provider.ts +7 -7
  64. package/apps/storefront/src/lib/{chrome → content/chrome}/footerLegal.ts +2 -2
  65. package/apps/storefront/src/lib/{chrome → content/chrome}/trackingPlacements.ts +1 -1
  66. package/apps/storefront/src/lib/{seo → content/seo}/faqItems.ts +1 -1
  67. package/apps/storefront/src/lib/{seo → content/seo}/structuredData.ts +1 -1
  68. package/apps/storefront/src/lib/{breadcrumbs.ts → content/shared/breadcrumbs.ts} +1 -1
  69. package/apps/storefront/src/lib/{heroSlideshow.ts → content/shared/heroSlideshow.ts} +1 -1
  70. package/apps/storefront/src/lib/{homeVisualParity.ts → content/shared/homeVisualParity.ts} +1 -1
  71. package/apps/storefront/src/lib/{jsonld.ts → content/shared/jsonld.ts} +1 -1
  72. package/apps/storefront/src/lib/{rawChrome.ts → content/shared/rawChrome.ts} +12 -12
  73. package/apps/storefront/src/lib/{rawMarketingHtml.ts → content/shared/rawMarketingHtml.ts} +3 -3
  74. package/apps/storefront/src/lib/{styleGuideThemes.ts → content/shared/styleGuideThemes.ts} +3 -3
  75. package/apps/storefront/src/lib/{storyblok → content/storyblok}/content-model.ts +1 -1
  76. package/apps/storefront/src/lib/{storyblok → content/storyblok}/provider.ts +26 -26
  77. package/apps/storefront/src/lib/{the-build → content/the-build}/provider.ts +1 -1
  78. package/apps/storefront/src/lib/{the-build → content/the-build}/toc.ts +1 -1
  79. package/apps/storefront/src/lib/d1/schema-apps.ts +2 -2
  80. package/apps/storefront/src/lib/email/candidateConflictEmail.ts +1 -1
  81. package/apps/storefront/src/lib/email/magicLinkInviteEmail.ts +1 -1
  82. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/digest.ts +2 -2
  83. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/resendClient.ts +1 -1
  84. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/send.ts +2 -2
  85. package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/subscribers.ts +1 -1
  86. package/apps/storefront/src/lib/{social → engagement/social}/golive.ts +2 -2
  87. package/apps/storefront/src/lib/{social → engagement/social}/notify.ts +1 -1
  88. package/apps/storefront/src/lib/{social → engagement/social}/tokenStore.ts +3 -3
  89. package/apps/storefront/src/lib/{apps → measurement/consent}/consentConfigRead.ts +1 -1
  90. package/apps/storefront/src/lib/{tracking → measurement/tracking}/d1Control.ts +2 -2
  91. package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionCollector.ts +2 -2
  92. package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionStore.ts +0 -0
  93. package/apps/storefront/src/lib/{tracking → measurement/tracking}/pruneRollup.ts +2 -2
  94. package/apps/storefront/src/lib/{tracking → measurement/tracking}/publishSafetyNet.ts +1 -1
  95. package/apps/storefront/src/lib/{tracking → measurement/tracking}/tenantD1Registry.ts +2 -2
  96. package/apps/storefront/src/lib/previewReload.ts +1 -1
  97. package/apps/storefront/src/lib/publication/contentProvider.ts +7 -7
  98. package/apps/storefront/src/lib/publication/mountedDiscovery.ts +1 -1
  99. package/apps/storefront/src/lib/publication/rootDiscovery.ts +4 -4
  100. package/apps/storefront/src/middleware/controlPlane.ts +1 -1
  101. package/apps/storefront/src/middleware/renderChain.ts +1 -1
  102. package/apps/storefront/src/pages/[...slug].astro +13 -13
  103. package/apps/storefront/src/pages/api/admin/interaction-insights.ts +3 -3
  104. package/apps/storefront/src/pages/api/blog/[collection]/[slug]/react.ts +1 -1
  105. package/apps/storefront/src/pages/api/newsletter/[collection]/subscribe.ts +3 -3
  106. package/apps/storefront/src/pages/api/newsletter/confirm.ts +1 -1
  107. package/apps/storefront/src/pages/api/newsletter/unsubscribe.ts +1 -1
  108. package/apps/storefront/src/pages/api/rum/vitals.ts +1 -1
  109. package/apps/storefront/src/pages/api/tracking/interaction.ts +5 -5
  110. package/apps/storefront/src/pages/blog/[slug].astro +2 -2
  111. package/apps/storefront/src/pages/blog/author/[author].astro +8 -8
  112. package/apps/storefront/src/pages/blog/category/[category].astro +8 -8
  113. package/apps/storefront/src/pages/blog/index.astro +4 -4
  114. package/apps/storefront/src/pages/blog/page/[n].astro +4 -4
  115. package/apps/storefront/src/pages/blog/tag/[tag].astro +8 -8
  116. package/apps/storefront/src/pages/cart.ts +1 -1
  117. package/apps/storefront/src/pages/collections/[handle].astro +7 -7
  118. package/apps/storefront/src/pages/collections/index.astro +4 -4
  119. package/apps/storefront/src/pages/index.astro +10 -10
  120. package/apps/storefront/src/pages/llms.txt.ts +2 -2
  121. package/apps/storefront/src/pages/products/[handle].astro +11 -11
  122. package/apps/storefront/src/pages/saved.astro +2 -2
  123. package/apps/storefront/src/pages/search.astro +5 -5
  124. package/apps/storefront/src/pages/sitemap.xml.ts +8 -8
  125. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +24 -24
  126. package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +2 -2
  127. package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +3 -3
  128. package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +3 -3
  129. package/apps/storefront/src/pages/style-guide/index.astro +1 -1
  130. package/apps/storefront/src/pages/the-build/[slug].astro +10 -10
  131. package/apps/storefront/src/pages/the-build/index.astro +5 -5
  132. package/apps/storefront/src/pages/the-build/page/[n].astro +5 -5
  133. package/apps/storefront/src/pages/the-build/rss.xml.ts +4 -4
  134. package/docs/widget-library-guide.md +36 -36
  135. package/package.json +1 -1
  136. package/packages/public-runtime/src/chrome.ts +4 -4
  137. package/packages/public-runtime/src/tracking-id-derivation.ts +1 -1
  138. /package/apps/storefront/src/components/{Badge.astro → content/storefront/Badge.astro} +0 -0
  139. /package/apps/storefront/src/components/{EmptyState.astro → content/storefront/EmptyState.astro} +0 -0
  140. /package/apps/storefront/src/components/{Section.astro → content/storefront/Section.astro} +0 -0
  141. /package/apps/storefront/src/components/{chrome → content/storefront/chrome}/AnnouncementBar.astro +0 -0
  142. /package/apps/storefront/src/components/{commerce → content/storefront/commerce}/ArticleCard.astro +0 -0
  143. /package/apps/storefront/src/components/content/{NeedsReviewCallout.astro → storefront/content/NeedsReviewCallout.astro} +0 -0
  144. /package/apps/storefront/src/components/content/{ProseToc.astro → storefront/content/ProseToc.astro} +0 -0
  145. /package/apps/storefront/src/components/content/{RichText.astro → storefront/content/RichText.astro} +0 -0
  146. /package/apps/storefront/src/components/content/{TrustStrip.astro → storefront/content/TrustStrip.astro} +0 -0
  147. /package/apps/storefront/src/lib/{blog → content/blog}/access.ts +0 -0
  148. /package/apps/storefront/src/lib/{blog → content/blog}/collectionPaths.ts +0 -0
  149. /package/apps/storefront/src/lib/{blog → content/blog}/markdown.ts +0 -0
  150. /package/apps/storefront/src/lib/{blog → content/blog}/pagination.ts +0 -0
  151. /package/apps/storefront/src/lib/{blog → content/blog}/presentation.ts +0 -0
  152. /package/apps/storefront/src/lib/{blog → content/blog}/reactions.ts +0 -0
  153. /package/apps/storefront/src/lib/{blog → content/blog}/rss.ts +0 -0
  154. /package/apps/storefront/src/lib/{blog → content/blog}/teaser.ts +0 -0
  155. /package/apps/storefront/src/lib/{blog → content/blog}/types.ts +0 -0
  156. /package/apps/storefront/src/lib/{blog → content/blog}/viewCounts.ts +0 -0
  157. /package/apps/storefront/src/lib/{chrome → content/chrome}/ctaIdentity.ts +0 -0
  158. /package/apps/storefront/src/lib/{chrome → content/chrome}/examples/tokenoftrust.chrome-assignments.example.json +0 -0
  159. /package/apps/storefront/src/lib/{chrome → content/chrome}/examples/tokenoftrust.chrome.example.json +0 -0
  160. /package/apps/storefront/src/lib/{chrome → content/chrome}/managedCart.ts +0 -0
  161. /package/apps/storefront/src/lib/{chrome → content/chrome}/model.ts +0 -0
  162. /package/apps/storefront/src/lib/{chrome → content/chrome}/navCurrent.ts +0 -0
  163. /package/apps/storefront/src/lib/{chrome → content/chrome}/newsletterAgeAttestation.ts +0 -0
  164. /package/apps/storefront/src/lib/{chrome → content/chrome}/parseConfig.ts +0 -0
  165. /package/apps/storefront/src/lib/{chrome → content/chrome}/variant.ts +0 -0
  166. /package/apps/storefront/src/lib/{commerce → content/policies}/shippingPolicy.ts +0 -0
  167. /package/apps/storefront/src/lib/{seo → content/seo}/alternates.ts +0 -0
  168. /package/apps/storefront/src/lib/{seo → content/seo}/documentTitle.ts +0 -0
  169. /package/apps/storefront/src/lib/{seo → content/seo}/meta.ts +0 -0
  170. /package/apps/storefront/src/lib/{seo → content/seo}/urlForm.ts +0 -0
  171. /package/apps/storefront/src/lib/{asyncCss.ts → content/shared/asyncCss.ts} +0 -0
  172. /package/apps/storefront/src/lib/{colors.ts → content/shared/colors.ts} +0 -0
  173. /package/apps/storefront/src/lib/{format.ts → content/shared/format.ts} +0 -0
  174. /package/apps/storefront/src/lib/{i18n.ts → content/shared/i18n.ts} +0 -0
  175. /package/apps/storefront/src/lib/{jsonScript.ts → content/shared/jsonScript.ts} +0 -0
  176. /package/apps/storefront/src/lib/{placeholder.ts → content/shared/placeholder.ts} +0 -0
  177. /package/apps/storefront/src/lib/{sections.ts → content/shared/sections.ts} +0 -0
  178. /package/apps/storefront/src/lib/{styleGuidePaths.ts → content/shared/styleGuidePaths.ts} +0 -0
  179. /package/apps/storefront/src/lib/{the-build → content/the-build}/pagination.ts +0 -0
  180. /package/apps/storefront/src/lib/{the-build → content/the-build}/readingTime.ts +0 -0
  181. /package/apps/storefront/src/lib/{messaging → engagement/messaging}/messagesClient.ts +0 -0
  182. /package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/confirmationEmail.ts +0 -0
  183. /package/apps/storefront/src/lib/{newsletter → engagement/newsletter}/consent.ts +0 -0
  184. /package/apps/storefront/src/lib/{admin → measurement/admin}/consentSettingsClient.ts +0 -0
  185. /package/apps/storefront/src/lib/{analytics → measurement/analytics}/index.ts +0 -0
  186. /package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/attributionService.ts +0 -0
  187. /package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/orderConversionD1.ts +0 -0
  188. /package/apps/storefront/src/lib/{apps/orders → measurement/attribution}/verifiedProviderMeasurement.ts +0 -0
  189. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/collectorAllowlist.ts +0 -0
  190. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/collectorIngest.ts +0 -0
  191. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionHealth.ts +0 -0
  192. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/interactionSchema.ts +0 -0
  193. /package/apps/storefront/src/lib/{tracking → measurement/tracking}/tenantReadAccess.ts +0 -0
  194. /package/apps/storefront/src/lib/{tracking-writeback → measurement/tracking-writeback}/rewriteTrackingIds.ts +0 -0
  195. /package/apps/storefront/src/lib/{tracking-writeback → measurement/tracking-writeback}/writebackCandidate.ts +0 -0
@@ -3,13 +3,13 @@
3
3
  * <Faq> — a no-JS accordion of question/answer pairs using native
4
4
  * <details>/<summary>. Emits FAQPage JSON-LD so answers are eligible for rich
5
5
  * results — unless the tenant declares a structured-data profile, which owns every
6
- * JSON-LD node on the page (lib/seo/structuredData.ts). Answers are plain text
6
+ * JSON-LD node on the page (lib/content/seo/structuredData.ts). Answers are plain text
7
7
  * (auto-escaped).
8
8
  */
9
- import Section from "@/components/Section.astro";
10
- import type { FaqBlock } from "@/lib/storyblok/content-model";
11
- import { safeJsonScriptContent } from "@/lib/jsonScript";
12
- import { structuredDataProfile } from "@/lib/seo/structuredData";
9
+ import Section from "@/components/content/storefront/Section.astro";
10
+ import type { FaqBlock } from "@/lib/content/storyblok/content-model";
11
+ import { safeJsonScriptContent } from "@/lib/content/shared/jsonScript";
12
+ import { structuredDataProfile } from "@/lib/content/seo/structuredData";
13
13
  interface Props {
14
14
  block: FaqBlock;
15
15
  }
@@ -4,9 +4,9 @@
4
4
  * platform names/links, optional implementation points, and an optional safe
5
5
  * code sample. Platform links open externally when they carry an http href.
6
6
  */
7
- import Section from "@/components/Section.astro";
8
- import CodeSample from "@/components/marketing/CodeSample.astro";
9
- import type { IntegrationsBlock } from "@/lib/storyblok/content-model";
7
+ import Section from "@/components/content/storefront/Section.astro";
8
+ import CodeSample from "@/components/content/storefront/marketing/CodeSample.astro";
9
+ import type { IntegrationsBlock } from "@/lib/content/storyblok/content-model";
10
10
  import { withBase } from "@/lib/basePath";
11
11
 
12
12
  interface Props {
@@ -5,17 +5,17 @@
5
5
  * block is styled through theme tokens and reads its copy from tenant content.
6
6
  * Reused by the homepage and (future) marketing content pages.
7
7
  */
8
- import type { MarketingBlock } from "@/lib/storyblok/content-model";
9
- import MarketingHero from "@/components/marketing/MarketingHero.astro";
10
- import TrustBar from "@/components/marketing/TrustBar.astro";
11
- import SplitCompare from "@/components/marketing/SplitCompare.astro";
12
- import Steps from "@/components/marketing/Steps.astro";
13
- import CardGrid from "@/components/marketing/CardGrid.astro";
14
- import Integrations from "@/components/marketing/Integrations.astro";
15
- import ProofStrip from "@/components/marketing/ProofStrip.astro";
16
- import Testimonials from "@/components/marketing/Testimonials.astro";
17
- import Faq from "@/components/marketing/Faq.astro";
18
- import CtaBand from "@/components/marketing/CtaBand.astro";
8
+ import type { MarketingBlock } from "@/lib/content/storyblok/content-model";
9
+ import MarketingHero from "@/components/content/storefront/marketing/MarketingHero.astro";
10
+ import TrustBar from "@/components/content/storefront/marketing/TrustBar.astro";
11
+ import SplitCompare from "@/components/content/storefront/marketing/SplitCompare.astro";
12
+ import Steps from "@/components/content/storefront/marketing/Steps.astro";
13
+ import CardGrid from "@/components/content/storefront/marketing/CardGrid.astro";
14
+ import Integrations from "@/components/content/storefront/marketing/Integrations.astro";
15
+ import ProofStrip from "@/components/content/storefront/marketing/ProofStrip.astro";
16
+ import Testimonials from "@/components/content/storefront/marketing/Testimonials.astro";
17
+ import Faq from "@/components/content/storefront/marketing/Faq.astro";
18
+ import CtaBand from "@/components/content/storefront/marketing/CtaBand.astro";
19
19
 
20
20
  interface Props {
21
21
  blocks: MarketingBlock[];
@@ -5,7 +5,7 @@
5
5
  * a new tab with rel="noopener"; same-origin root-absolute hrefs get the tenant
6
6
  * base-path prefix so path-routed tenants stay in-tenant.
7
7
  */
8
- import type { MarketingCta } from "@/lib/storyblok/content-model";
8
+ import type { MarketingCta } from "@/lib/content/storyblok/content-model";
9
9
  import { withBase } from "@/lib/basePath";
10
10
 
11
11
  interface Props {
@@ -5,8 +5,8 @@
5
5
  * Right (optional): a "product moment" panel of demo/evidence log lines.
6
6
  * All copy is plain text (auto-escaped); no raw HTML is rendered.
7
7
  */
8
- import type { MarketingHeroBlock } from "@/lib/storyblok/content-model";
9
- import MarketingCtas from "@/components/marketing/MarketingCtas.astro";
8
+ import type { MarketingHeroBlock } from "@/lib/content/storyblok/content-model";
9
+ import MarketingCtas from "@/components/content/storefront/marketing/MarketingCtas.astro";
10
10
 
11
11
  interface Props {
12
12
  block: MarketingHeroBlock;
@@ -4,7 +4,7 @@
4
4
  * data"). A bold statement + supporting copy + a grid of proof bullets. Painted
5
5
  * in the primary color for a single strong moment. Plain text only.
6
6
  */
7
- import type { ProofStripBlock } from "@/lib/storyblok/content-model";
7
+ import type { ProofStripBlock } from "@/lib/content/storyblok/content-model";
8
8
  interface Props {
9
9
  block: ProofStripBlock;
10
10
  }
@@ -4,8 +4,8 @@
4
4
  * patchwork" vs "one platform"). The `before` column reads as the problem
5
5
  * (muted, ⚠) and `after` as the solution (accent, ✓).
6
6
  */
7
- import Section from "@/components/Section.astro";
8
- import type { SplitCompareBlock } from "@/lib/storyblok/content-model";
7
+ import Section from "@/components/content/storefront/Section.astro";
8
+ import type { SplitCompareBlock } from "@/lib/content/storyblok/content-model";
9
9
  interface Props {
10
10
  block: SplitCompareBlock;
11
11
  }
@@ -3,8 +3,8 @@
3
3
  * <Steps> — a numbered/emoji journey (e.g. the checkout verification flow).
4
4
  * Renders as a horizontal-scrolling rail on small screens, a wrapped row above.
5
5
  */
6
- import Section from "@/components/Section.astro";
7
- import type { StepsBlock } from "@/lib/storyblok/content-model";
6
+ import Section from "@/components/content/storefront/Section.astro";
7
+ import type { StepsBlock } from "@/lib/content/storyblok/content-model";
8
8
  interface Props {
9
9
  block: StepsBlock;
10
10
  }
@@ -3,8 +3,8 @@
3
3
  * <Testimonials> — outcome/quote cards with an optional stat lead-in and
4
4
  * attribution, plus an optional row of rating tokens. Plain text only.
5
5
  */
6
- import Section from "@/components/Section.astro";
7
- import type { TestimonialsBlock } from "@/lib/storyblok/content-model";
6
+ import Section from "@/components/content/storefront/Section.astro";
7
+ import type { TestimonialsBlock } from "@/lib/content/storyblok/content-model";
8
8
  interface Props {
9
9
  block: TestimonialsBlock;
10
10
  }
@@ -3,7 +3,7 @@
3
3
  * <TrustBar> — a quiet horizontal strip of proof tokens (countries, standards,
4
4
  * platform names, ratings). Plain text, dot-separated on small screens.
5
5
  */
6
- import type { TrustBarBlock } from "@/lib/storyblok/content-model";
6
+ import type { TrustBarBlock } from "@/lib/content/storyblok/content-model";
7
7
  interface Props {
8
8
  block: TrustBarBlock;
9
9
  }
@@ -14,7 +14,7 @@
14
14
  * aria-current="page". When `headings` is supplied (the guide's H2 outline) a
15
15
  * nested table of contents is rendered as in-page anchor links.
16
16
  */
17
- import { styleGuideHref } from "@/lib/styleGuidePaths";
17
+ import { styleGuideHref } from "@/lib/content/shared/styleGuidePaths";
18
18
 
19
19
  type Active = "index" | "tenant" | "components" | "chrome" | "guide";
20
20
 
@@ -5,11 +5,11 @@
5
5
  // implements, can't drift between the two routes (the-build sibling of fb-1791301493691-brzl6f —
6
6
  // mirrors @/components/blog/BlogIndexView.astro).
7
7
  import Layout from "@/layouts/Layout.astro";
8
- import PostAccessBadge from "@/components/blog/PostAccessBadge.astro";
9
- import type { BlogPostSummary } from "@/lib/blog/types.js";
10
- import type { TheBuildIndexCopy } from "@/lib/the-build/pagination.js";
11
- import type { BlogPresentation } from "@/lib/blog/presentation.js";
12
- import { collectionPathsV1 } from "@/lib/blog/collectionPaths.js";
8
+ import PostAccessBadge from "@/components/content/storefront/blog/PostAccessBadge.astro";
9
+ import type { BlogPostSummary } from "@/lib/content/blog/types.js";
10
+ import type { TheBuildIndexCopy } from "@/lib/content/the-build/pagination.js";
11
+ import type { BlogPresentation } from "@/lib/content/blog/presentation.js";
12
+ import { collectionPathsV1 } from "@/lib/content/blog/collectionPaths.js";
13
13
 
14
14
  interface Props {
15
15
  basePath: string;
@@ -11,8 +11,8 @@ import {
11
11
  WISHLIST_EVENT,
12
12
  type SavedItem,
13
13
  } from "@/lib/customers/shared/wishlist";
14
- import { formatPrice } from "@/lib/format";
15
- import { placeholderDataUri, isUsableImageUrl } from "@/lib/placeholder";
14
+ import { formatPrice } from "@/lib/content/shared/format";
15
+ import { placeholderDataUri, isUsableImageUrl } from "@/lib/content/shared/placeholder";
16
16
  import { withClientBase } from "@/lib/basePath";
17
17
 
18
18
  interface Props {
@@ -8,10 +8,10 @@ import "@/styles/global.css";
8
8
  // Self-hosted web fonts (audit finding 6) — replaces the render-blocking
9
9
  // fonts.googleapis.com stylesheet. Bundled by Vite, served same-origin.
10
10
  import "@/styles/fonts.css";
11
- import Seo from "@/components/Seo.astro";
12
- import AnnouncementBar from "@/components/chrome/AnnouncementBar.astro";
13
- import SiteHeader from "@/components/chrome/SiteHeader.astro";
14
- import SiteFooter from "@/components/chrome/SiteFooter.astro";
11
+ import Seo from "@/components/content/storefront/Seo.astro";
12
+ import AnnouncementBar from "@/components/content/storefront/chrome/AnnouncementBar.astro";
13
+ import SiteHeader from "@/components/content/storefront/chrome/SiteHeader.astro";
14
+ import SiteFooter from "@/components/content/storefront/chrome/SiteFooter.astro";
15
15
  import QuickView from "@/components/catalog/storefront/islands/QuickView.tsx";
16
16
  import CheckoutLoader from "@/components/checkout/storefront/commerce/CheckoutLoader.astro";
17
17
  import CartDrawerStyles from "@/components/checkout/storefront/commerce/CartDrawerStyles.astro";
@@ -24,18 +24,18 @@ import IsolatedAgeGate from "@/components/compliance/storefront/islands/Isolated
24
24
  import AuthBadge from "@/components/auth/AuthBadge.astro";
25
25
  import { referenceTheme } from "@/themes/reference";
26
26
  import { mergeTheme } from "@/themes/schema";
27
- import { organizationLd, websiteLd } from "@/lib/jsonld";
28
- import { composeStructuredData, structuredDataProfile, type StructuredDataPage } from "@/lib/seo/structuredData";
29
- import { canonicalUrl } from "@/lib/seo/urlForm";
30
- import { documentTitle } from "@/lib/seo/documentTitle";
31
- import { nonceInlineTags, prefixApiFormActions, CHROME_BODY_MARKER } from "@/lib/rawMarketingHtml";
32
- import { CHROME_BEHAVIOR_JS, CHROME_HEAD_JS, sanitizeSharedChromeFragment } from "@/lib/rawChrome";
33
- import { ASYNC_CSS_SWAP_JS } from "@/lib/asyncCss";
34
- import { reportTrackingChainHealth } from "@/lib/tracking/interactionHealth";
35
- import { resolveHeaderVariant, resolveFooterVariant } from "@/lib/chrome/variant";
36
- import { splitFooterLegal } from "@/lib/chrome/footerLegal";
37
- import { bindManagedCartAnchors, managedCartHref } from "@/lib/chrome/managedCart";
38
- import type { HeaderVariant, FooterVariant } from "@/lib/chrome/model";
27
+ import { organizationLd, websiteLd } from "@/lib/content/shared/jsonld";
28
+ import { composeStructuredData, structuredDataProfile, type StructuredDataPage } from "@/lib/content/seo/structuredData";
29
+ import { canonicalUrl } from "@/lib/content/seo/urlForm";
30
+ import { documentTitle } from "@/lib/content/seo/documentTitle";
31
+ import { nonceInlineTags, prefixApiFormActions, CHROME_BODY_MARKER } from "@/lib/content/shared/rawMarketingHtml";
32
+ import { CHROME_BEHAVIOR_JS, CHROME_HEAD_JS, sanitizeSharedChromeFragment } from "@/lib/content/shared/rawChrome";
33
+ import { ASYNC_CSS_SWAP_JS } from "@/lib/content/shared/asyncCss";
34
+ import { reportTrackingChainHealth } from "@/lib/measurement/tracking/interactionHealth";
35
+ import { resolveHeaderVariant, resolveFooterVariant } from "@/lib/content/chrome/variant";
36
+ import { splitFooterLegal } from "@/lib/content/chrome/footerLegal";
37
+ import { bindManagedCartAnchors, managedCartHref } from "@/lib/content/chrome/managedCart";
38
+ import type { HeaderVariant, FooterVariant } from "@/lib/content/chrome/model";
39
39
  import { renderIntegrationPhases, INTERACTION_TRACKING_BOOT_JS } from "@tot/public-runtime";
40
40
  import { readViewerSession } from "@/lib/auth/route";
41
41
  import AppWidgetFrame from "@/components/integrations/storefront/apps/AppWidgetFrame.astro";
@@ -54,7 +54,7 @@ interface Props {
54
54
  jsonLd?: Record<string, unknown> | Record<string, unknown>[];
55
55
  /**
56
56
  * What the page knows about itself for the tenant's declared structured-data profile
57
- * (lib/seo/structuredData.ts). When the profile declares a graph for `pageType`, that graph
57
+ * (lib/content/seo/structuredData.ts). When the profile declares a graph for `pageType`, that graph
58
58
  * is the page's ONLY JSON-LD and `jsonLd` is not emitted.
59
59
  */
60
60
  structuredData?: StructuredDataPage;
@@ -66,7 +66,7 @@ interface Props {
66
66
  fullBleed?: boolean;
67
67
  /**
68
68
  * Explicit per-page header/footer content-variant override (see
69
- * lib/chrome/model.ts HeaderVariant/FooterVariant). NEVER inferred from the
69
+ * lib/content/chrome/model.ts HeaderVariant/FooterVariant). NEVER inferred from the
70
70
  * route/CSS/title — a page that wants e.g. a minimal checkout header sets
71
71
  * this prop. Absent ⇒ the tenant's chrome-config default
72
72
  * (chrome.header.variant / chrome.footer.variant). An unrecognized value
@@ -76,7 +76,7 @@ interface Props {
76
76
  headerVariant?: HeaderVariant;
77
77
  footerVariant?: FooterVariant;
78
78
  // --- Article SEO hardening: pass-through to <Seo> (all additive) ---
79
- article?: import("@/lib/seo/meta.js").ArticleMeta;
79
+ article?: import("@/lib/content/seo/meta.js").ArticleMeta;
80
80
  imageAlt?: string;
81
81
  imageWidth?: number;
82
82
  imageHeight?: number;
@@ -86,7 +86,7 @@ interface Props {
86
86
  // --- hreflang / <html lang> (additive) ---
87
87
  /** Per-variant `hreflang` alternates for a translated article; threaded to
88
88
  * <Seo>. Absent/empty ⇒ no alternate links (singleton unchanged). */
89
- alternates?: import("@/lib/seo/alternates.js").Alternate[];
89
+ alternates?: import("@/lib/content/seo/alternates.js").Alternate[];
90
90
  /** Overrides `<html lang>` (e.g. a translated article's `inLanguage`). Absent ⇒
91
91
  * the tenant-locale default, so non-translated pages are unchanged. */
92
92
  lang?: string;
@@ -156,7 +156,7 @@ const chrome = await Astro.locals.content.getChrome();
156
156
 
157
157
  // Explicit variant resolution (fail-closed): the page's override wins over
158
158
  // the tenant's chrome-config default; an unrecognized value throws with an
159
- // actionable message rather than silently falling back (lib/chrome/variant.ts).
159
+ // actionable message rather than silently falling back (lib/content/chrome/variant.ts).
160
160
  const resolvedHeaderVariant = resolveHeaderVariant(headerVariant, chrome.header.variant);
161
161
  const resolvedFooterVariant = resolveFooterVariant(footerVariant, chrome.footer.variant);
162
162
  const footerCompliance = [chrome.footer.warning, chrome.complianceStrip]
@@ -256,7 +256,7 @@ const themeHeaderLogo =
256
256
  ? { src: headerLogoSrc, alt: tenant.displayName }
257
257
  : undefined;
258
258
 
259
- // chrome.header.brand (lib/chrome/model.ts ChromeBrand) is the governed,
259
+ // chrome.header.brand (lib/content/chrome/model.ts ChromeBrand) is the governed,
260
260
  // schema-validated brand identity — SOURCE OF TRUTH per field when set,
261
261
  // falling back to the theme-derived values above only where a field is
262
262
  // absent, so a tenant that hasn't authored a brand config is unaffected.
@@ -268,7 +268,7 @@ const headerBrandHref = brand?.href;
268
268
 
269
269
  // Footer bottom bar: a "Legal"-titled column MOVES out of the grid and its
270
270
  // links render beside the copyright — one shared split with the raw renderer
271
- // (lib/chrome/footerLegal.ts), so neither surface can duplicate them.
271
+ // (lib/content/chrome/footerLegal.ts), so neither surface can duplicate them.
272
272
  const { gridColumns: footerColumns, legalLinks: bottomLinks } = splitFooterLegal(
273
273
  chrome.footer.columns,
274
274
  );
@@ -636,7 +636,7 @@ const footerWidgets = await renderWidgetSlot(
636
636
 
637
637
  {/* Swaps every <AsyncStylesheet>-rendered preload link to rel="stylesheet"
638
638
  once fetched. ONE nonced script per document handles every such link,
639
- however many <AsyncStylesheet> instances rendered (lib/asyncCss.ts —
639
+ however many <AsyncStylesheet> instances rendered (lib/content/shared/asyncCss.ts —
640
640
  the onload="" attribute trick can't carry a nonce under this CSP). A
641
641
  no-op when the page has none. */}
642
642
  <script is:inline nonce={cspNonce} set:html={ASYNC_CSS_SWAP_JS}></script>
@@ -8,7 +8,7 @@
8
8
  * - referenced Shopify CDN -> Shopify's native ?width= scheme
9
9
  * - anything else usable -> the URL as-is, no srcset
10
10
  */
11
- import { placeholderDataUri, isUsableImageUrl } from "../../placeholder.js";
11
+ import { placeholderDataUri, isUsableImageUrl } from "../../content/shared/placeholder.js";
12
12
 
13
13
  const RESPONSIVE_IMAGE_WIDTHS = [320, 480, 640, 960, 1280, 1600] as const;
14
14
 
@@ -34,7 +34,7 @@
34
34
  * covers that one, so the two cannot drift apart unnoticed.
35
35
  *
36
36
  * Consumers: {@link withBase} (and through it {@link bindBasePathAnchors}) and
37
- * `prefixTenantLinks` (lib/rawMarketingHtml.ts).
37
+ * `prefixTenantLinks` (lib/content/shared/rawMarketingHtml.ts).
38
38
  */
39
39
  export const ROOT_SERVED_HREF_NAMESPACES = [
40
40
  "_a",
@@ -1,4 +1,4 @@
1
- import type { FeaturedProductsBlock } from "@/lib/storyblok/content-model";
1
+ import type { FeaturedProductsBlock } from "@/lib/content/storyblok/content-model";
2
2
 
3
3
  export function featuredProductsPresentationView(presentation: FeaturedProductsBlock["presentation"]) {
4
4
  return presentation === "carousel" ? "carousel" : "grid";
@@ -26,7 +26,7 @@ import {
26
26
  readCatalogListing,
27
27
  type CatalogStore,
28
28
  } from "@tot/public-runtime/catalog-files";
29
- import { LocalContentProvider, type ContentProvider } from "../../storyblok/provider.js";
29
+ import { LocalContentProvider, type ContentProvider } from "../../content/storyblok/provider.js";
30
30
 
31
31
  export type CatalogArtifactSource = Pick<
32
32
  ContentProvider,
@@ -6,7 +6,7 @@ import {
6
6
  } from "@tot/public-runtime";
7
7
  import type { AuthorBio, BlogPost, BlogPostSummary, BlogSettings, PostStatus } from "./types.js";
8
8
  import type { ContentProvider } from "../storyblok/provider.js";
9
- import { readEnv } from "../env.js";
9
+ import { readEnv } from "../../env.js";
10
10
 
11
11
  type ArtifactSource = Pick<ContentProvider, "readArtifact" | "listArtifactPaths">;
12
12
  function canReadArtifacts(value: ArtifactSource | undefined): value is ArtifactSource {
@@ -29,29 +29,29 @@ export interface Collection {
29
29
  // is the set of `posts/*.json` files — there is no hand-maintained index.json.
30
30
  const postGlobs = import.meta.glob<BlogPost>(
31
31
  [
32
- "../../../../../tenants/*/content/*/posts/*.json",
33
- "../../../../../tenants/e2e/*/content/*/posts/*.json",
32
+ "../../../../../../tenants/*/content/*/posts/*.json",
33
+ "../../../../../../tenants/e2e/*/content/*/posts/*.json",
34
34
  ],
35
35
  { import: "default" },
36
36
  );
37
37
  const redirectGlobs = import.meta.glob<Record<string, string>>(
38
38
  [
39
- "../../../../../tenants/*/content/*/redirects.json",
40
- "../../../../../tenants/e2e/*/content/*/redirects.json",
39
+ "../../../../../../tenants/*/content/*/redirects.json",
40
+ "../../../../../../tenants/e2e/*/content/*/redirects.json",
41
41
  ],
42
42
  { import: "default" },
43
43
  );
44
44
  const authorsGlobs = import.meta.glob<Record<string, AuthorBio>>(
45
45
  [
46
- "../../../../../tenants/*/content/*/authors.json",
47
- "../../../../../tenants/e2e/*/content/*/authors.json",
46
+ "../../../../../../tenants/*/content/*/authors.json",
47
+ "../../../../../../tenants/e2e/*/content/*/authors.json",
48
48
  ],
49
49
  { import: "default" },
50
50
  );
51
51
  const settingsGlobs = import.meta.glob<BlogSettings>(
52
52
  [
53
- "../../../../../tenants/*/content/*/settings.json",
54
- "../../../../../tenants/e2e/*/content/*/settings.json",
53
+ "../../../../../../tenants/*/content/*/settings.json",
54
+ "../../../../../../tenants/e2e/*/content/*/settings.json",
55
55
  ],
56
56
  { import: "default" },
57
57
  );
@@ -15,12 +15,12 @@ import {
15
15
  type BlogPresentation,
16
16
  type ShareLink,
17
17
  } from "./presentation.js";
18
- import { homeCrumbLabel, siteTrail, type Crumb } from "@/lib/breadcrumbs.js";
18
+ import { homeCrumbLabel, siteTrail, type Crumb } from "@/lib/content/shared/breadcrumbs.js";
19
19
  import { viewerHasBlogAccess } from "./access.js";
20
20
  import { articleBodyHtml } from "./teaser.js";
21
21
  import { readViewerSession, safeNext } from "@/lib/auth/route.js";
22
- import { buildAlternates, type Alternate } from "@/lib/seo/alternates.js";
23
- import { breadcrumbLd, blogPostingLd } from "@/lib/jsonld.js";
22
+ import { buildAlternates, type Alternate } from "@/lib/content/seo/alternates.js";
23
+ import { breadcrumbLd, blogPostingLd } from "@/lib/content/shared/jsonld.js";
24
24
  import { collectionPathsV1, blogPathOptsV1 } from "./collectionPaths.js";
25
25
  import type { BlogPost } from "./types.js";
26
26
  import type { SessionRecord } from "@/lib/auth/session.js";
@@ -13,7 +13,7 @@ import {
13
13
  import { getIndexSettings, listPosts } from "./collection.js";
14
14
  import type { BlogPost, BlogPostSummary, BlogSettings } from "./types.js";
15
15
  import type { ContentProvider } from "../storyblok/provider.js";
16
- import { readEnv } from "../env.js";
16
+ import { readEnv } from "../../env.js";
17
17
 
18
18
  /** The collection id `/blog` reads — the derived fallback's second argument. */
19
19
  const BLOG_COLLECTION = "blog";
@@ -34,22 +34,22 @@ async function visibilityTimestamp(explicit?: string | null): Promise<string | n
34
34
  // tenant's keys back up.
35
35
  const indexGlobs = import.meta.glob<BlogPostSummary[]>(
36
36
  [
37
- "../../../../../tenants/*/content/blog/index.json",
38
- "../../../../../tenants/e2e/*/content/blog/index.json",
37
+ "../../../../../../tenants/*/content/blog/index.json",
38
+ "../../../../../../tenants/e2e/*/content/blog/index.json",
39
39
  ],
40
40
  { import: "default" },
41
41
  );
42
42
  const postGlobs = import.meta.glob<BlogPost>(
43
43
  [
44
- "../../../../../tenants/*/content/blog/posts/*.json",
45
- "../../../../../tenants/e2e/*/content/blog/posts/*.json",
44
+ "../../../../../../tenants/*/content/blog/posts/*.json",
45
+ "../../../../../../tenants/e2e/*/content/blog/posts/*.json",
46
46
  ],
47
47
  { import: "default" },
48
48
  );
49
49
  const redirectGlobs = import.meta.glob<Record<string, string>>(
50
50
  [
51
- "../../../../../tenants/*/content/blog/redirects.json",
52
- "../../../../../tenants/e2e/*/content/blog/redirects.json",
51
+ "../../../../../../tenants/*/content/blog/redirects.json",
52
+ "../../../../../../tenants/e2e/*/content/blog/redirects.json",
53
53
  ],
54
54
  { import: "default" },
55
55
  );
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The footer's Legal split — ONE source of truth for both renderers (the
3
- * raw-string footer in lib/rawChrome.ts and the component footer in
4
- * components/chrome/SiteFooter.astro), so a tenant's `Legal` column can never
3
+ * raw-string footer in lib/content/shared/rawChrome.ts and the component footer in
4
+ * components/content/storefront/chrome/SiteFooter.astro), so a tenant's `Legal` column can never
5
5
  * land in the grid on one surface and in the bottom bar on the other.
6
6
  *
7
7
  * Contract, title-based (no extra schema field): a footer column titled
@@ -26,7 +26,7 @@ export const CHROME_PLACEMENT = {
26
26
  /**
27
27
  * Footer bottom legal/policy link row, on either surface — the links of a
28
28
  * `Legal`-titled footer column, which both renderers move out of the grid and
29
- * into the bottom bar (lib/chrome/footerLegal.ts). `ChromeFooter.bottom`
29
+ * into the bottom bar (lib/content/chrome/footerLegal.ts). `ChromeFooter.bottom`
30
30
  * itself carries text only.
31
31
  */
32
32
  footerBottom: "footer-bottom",
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The question/answer pairs a page visibly carries, for a declared FAQPage node
3
- * (lib/seo/structuredData.ts). Derived from the rendered content itself, so the markup can never
3
+ * (lib/content/seo/structuredData.ts). Derived from the rendered content itself, so the markup can never
4
4
  * claim an answer the page does not show: a heading phrased as a question, answered by the text
5
5
  * up to the next heading. Fewer than two pairs is not an FAQ.
6
6
  */
@@ -16,7 +16,7 @@ import type {
16
16
  StructuredDataPageType,
17
17
  TenantConfig,
18
18
  } from "@tot/public-runtime";
19
- import { productLd } from "../jsonld.js";
19
+ import { productLd } from "../shared/jsonld.js";
20
20
  import { pageUrlForm } from "./urlForm.js";
21
21
 
22
22
  type Node = Record<string, unknown>;
@@ -1,4 +1,4 @@
1
- import type { ChromeConfig } from "./chrome/model.js";
1
+ import type { ChromeConfig } from "../chrome/model.js";
2
2
 
3
3
  /**
4
4
  * One breadcrumb trail per page. A page builds it ONCE with `siteTrail` and hands the same array
@@ -1,4 +1,4 @@
1
- import type { HeroBlock } from "@/lib/storyblok/content-model";
1
+ import type { HeroBlock } from "@/lib/content/storyblok/content-model";
2
2
  import { withBase } from "@/lib/basePath";
3
3
 
4
4
  export function heroAutoplayAllowed(input: {
@@ -12,7 +12,7 @@ import type {
12
12
  MembershipBandBlock,
13
13
  NewsletterBlock,
14
14
  PromoTilesBlock,
15
- } from "@/lib/storyblok/content-model";
15
+ } from "@/lib/content/storyblok/content-model";
16
16
 
17
17
  export type CommerceStaticResolved =
18
18
  | { kind: "promo_tiles"; block: PromoTilesBlock }
@@ -3,7 +3,7 @@
3
3
  * BreadcrumbList, Organization. Kept pure so pages compose them and pass to <Seo>.
4
4
  */
5
5
  import type { CatalogProduct, Review, TenantConfig } from "@tot/public-runtime";
6
- import { isAvailable } from "./catalog/tot/query.js";
6
+ import { isAvailable } from "../../catalog/tot/query.js";
7
7
 
8
8
  export function organizationLd(tenant: TenantConfig, base: string) {
9
9
  // Logo sourced from the migrated brand assets (og image / logo), so the
@@ -2,12 +2,12 @@
2
2
  * Canonical RAW chrome renderer.
3
3
  *
4
4
  * ONE platform-shipped chrome wrapper, driven entirely by a tenant's `chrome.json`
5
- * (typed `ChromeConfig`, lib/chrome/model.ts) — CONTENT ONLY. It replaces the three
5
+ * (typed `ChromeConfig`, lib/content/chrome/model.ts) — CONTENT ONLY. It replaces the three
6
6
  * divergent, hand-authored `content/<tenant>/chrome.html` documents with a single
7
7
  * generator, so chrome lives in ONE place and a tenant supplies only data. The
8
8
  * output is a full wrapper document carrying the splice markers the rawMarketingHtml
9
9
  * pipeline understands (`<!--PAGE_HEAD-->` / `<!--PAGE_BODY-->`), so body-only page
10
- * fragments get wrapped exactly as before (see lib/rawMarketingHtml.ts,
10
+ * fragments get wrapped exactly as before (see lib/content/shared/rawMarketingHtml.ts,
11
11
  * wrapFragmentInChrome). Two governing constraints:
12
12
  * - Single stylesheet: the wrapper LINKS the platform stylesheet
13
13
  * (/shared/commerce-chrome.css) and emits NO inline chrome CSS — every
@@ -25,11 +25,11 @@
25
25
  * defense-in-depth, not a sanitizer for untrusted input.
26
26
  */
27
27
  import { CHROME_BODY_MARKER, CHROME_HEAD_MARKER } from "./rawMarketingHtml.js";
28
- import { isCurrentNavHref } from "./chrome/navCurrent.js";
29
- import { ctaIdentityAttr } from "./chrome/ctaIdentity.js";
30
- import { CHROME_PLACEMENT } from "./chrome/trackingPlacements.js";
31
- import { LEGAL_NAV_LABEL, splitFooterLegal } from "./chrome/footerLegal.js";
32
- import { resolveNewsletterAgeAttestation } from "./chrome/newsletterAgeAttestation.js";
28
+ import { isCurrentNavHref } from "../chrome/navCurrent.js";
29
+ import { ctaIdentityAttr } from "../chrome/ctaIdentity.js";
30
+ import { CHROME_PLACEMENT } from "../chrome/trackingPlacements.js";
31
+ import { LEGAL_NAV_LABEL, splitFooterLegal } from "../chrome/footerLegal.js";
32
+ import { resolveNewsletterAgeAttestation } from "../chrome/newsletterAgeAttestation.js";
33
33
  import { trackingAttributesHtml } from "@tot/public-runtime";
34
34
  import type {
35
35
  ChromeAgeGate,
@@ -46,9 +46,9 @@ import type {
46
46
  ChromeUtilityNav,
47
47
  HeaderVariant,
48
48
  SocialLink,
49
- } from "./chrome/model.js";
50
- import { isSafeAgeGateHref, resolveAgeGateCopy, resolveChromeAssignment } from "./chrome/model.js";
51
- import { resolveHeaderVariant } from "./chrome/variant.js";
49
+ } from "../chrome/model.js";
50
+ import { isSafeAgeGateHref, resolveAgeGateCopy, resolveChromeAssignment } from "../chrome/model.js";
51
+ import { resolveHeaderVariant } from "../chrome/variant.js";
52
52
 
53
53
  /** HTML-escape text/attribute content. Covers the five significant characters. */
54
54
  function esc(value: string): string {
@@ -295,7 +295,7 @@ function renderSearchForm(search: ChromeSearch, inMenu = false): string {
295
295
 
296
296
  /**
297
297
  * Labelled header action links, in authored order. A `kind: "cart"` link carries
298
- * the `cart` class, so bindManagedCartAnchors (lib/chrome/managedCart.ts) binds it
298
+ * the `cart` class, so bindManagedCartAnchors (lib/content/chrome/managedCart.ts) binds it
299
299
  * to the managed checkout exactly like the icon cart.
300
300
  */
301
301
  function renderActionLinks(links: ChromeHeaderActionLink[]): string {
@@ -526,7 +526,7 @@ function renderFooter(footer: ChromeFooter): string {
526
526
  return ` <div class="footer-brand">${logo}${text}${news}</div>\n`;
527
527
  })()
528
528
  : "";
529
- // A `Legal`-titled column moves to the bottom bar (lib/chrome/footerLegal.ts)
529
+ // A `Legal`-titled column moves to the bottom bar (lib/content/chrome/footerLegal.ts)
530
530
  // — scope indices count RENDERED grid columns, so they describe where a link
531
531
  // actually is rather than where it sat in the authored array.
532
532
  const { gridColumns, legalLinks } = splitFooterLegal(footer.columns);
@@ -22,9 +22,9 @@ import {
22
22
  type EffectivePlan,
23
23
  type ConsentSnapshot,
24
24
  } from "@tot/public-runtime";
25
- import { reportTrackingChainHealth } from "./tracking/interactionHealth.js";
25
+ import { reportTrackingChainHealth } from "../../measurement/tracking/interactionHealth.js";
26
26
  import { ASYNC_CSS_SWAP_JS } from "./asyncCss.js";
27
- import { ROOT_SERVED_HREF_NAMESPACES } from "./basePath.js";
27
+ import { ROOT_SERVED_HREF_NAMESPACES } from "../../basePath.js";
28
28
 
29
29
  export { rawHtmlPolicy } from "@tot/public-runtime";
30
30
 
@@ -139,7 +139,7 @@ export function interactionTrackingScript(nonce: string): string {
139
139
  /**
140
140
  * Swaps every `data-async-css`-tagged `<link rel="preload">` to
141
141
  * `rel="stylesheet"` once fetched — the raw-mount half of the
142
- * `<AsyncStylesheet>` primitive (lib/asyncCss.ts; Layout.astro is the other,
142
+ * `<AsyncStylesheet>` primitive (lib/content/shared/asyncCss.ts; Layout.astro is the other,
143
143
  * same one-engine-two-mounts discipline as {@link interactionTrackingScript}).
144
144
  * A raw-HTML tenant hand-authors the plain `<link rel="preload" as="style"
145
145
  * data-async-css>` + `<noscript>` markup directly (no Astro component