efficient-storefront-blocks 0.86.0 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/chunks/{EditorPreviewCheckout-4LNXFNN7.js → EditorPreviewCheckout-ZGPS3Q3X.js} +1 -1
  3. package/dist/chunks/{SiteEditorProvider-A2HMVDKS.js → SiteEditorProvider-HZ47WOEX.js} +1 -1
  4. package/dist/chunks/{chunk-TGBNREUJ.js → chunk-7C2YH2AQ.js} +1 -1
  5. package/dist/chunks/chunk-O7GCI2MP.js +1 -0
  6. package/dist/chunks/chunk-RHNDIM7Z.js +382 -0
  7. package/dist/chunks/chunk-VOK5N3IB.js +1 -0
  8. package/dist/chunks/{fitment-data-TSYW6AFA.js → fitment-data-SH4US3BV.js} +1 -1
  9. package/dist/contract.js +32 -2
  10. package/dist/editor/components/CategorySource.d.ts +8 -1
  11. package/dist/editor/components/CategorySource.js +1 -1
  12. package/dist/editor/components/CollectionPicker.js +1 -1
  13. package/dist/editor/components/EditProductLink.js +1 -1
  14. package/dist/editor/components/FinishPicker.js +1 -1
  15. package/dist/editor/components/FormPicker.js +1 -1
  16. package/dist/editor/components/GalleryShowcaseSource.js +1 -1
  17. package/dist/editor/components/HeaderSettingsPanel.js +1 -1
  18. package/dist/editor/components/ProductHeroSource.js +1 -1
  19. package/dist/editor/components/ProductPicker.js +1 -1
  20. package/dist/editor/components/ReviewsProductSource.js +1 -1
  21. package/dist/editor/components/SocialLinksDoor.js +1 -1
  22. package/dist/editor/components/SpecTableSource.js +1 -1
  23. package/dist/editor/lib/document/blocks/commerce/BundleOffer/fields.js +1 -1
  24. package/dist/editor/lib/document/blocks/commerce/FilterBlock/fields.d.ts +2 -0
  25. package/dist/editor/lib/document/blocks/commerce/FilterBlock/fields.js +1 -0
  26. package/dist/editor/lib/document/blocks/commerce/FilterChipsBlock/fields.d.ts +2 -0
  27. package/dist/editor/lib/document/blocks/commerce/FilterChipsBlock/fields.js +1 -0
  28. package/dist/editor/lib/document/blocks/commerce/GalleryItem/fields.js +1 -1
  29. package/dist/editor/lib/document/blocks/commerce/ProductBuy/fields.d.ts +2 -0
  30. package/dist/editor/lib/document/blocks/commerce/ProductBuy/fields.js +1 -0
  31. package/dist/editor/lib/document/blocks/commerce/ProductBuyButton/fields.d.ts +2 -0
  32. package/dist/editor/lib/document/blocks/commerce/ProductBuyButton/fields.js +1 -0
  33. package/dist/editor/lib/document/blocks/commerce/ProductEyebrow/fields.d.ts +2 -0
  34. package/dist/editor/lib/document/blocks/commerce/ProductEyebrow/fields.js +1 -0
  35. package/dist/editor/lib/document/blocks/commerce/ProductGrid/fields.js +1 -1
  36. package/dist/editor/lib/document/blocks/commerce/ProductName/fields.d.ts +2 -0
  37. package/dist/editor/lib/document/blocks/commerce/ProductName/fields.js +1 -0
  38. package/dist/editor/lib/document/blocks/commerce/ProductPicture/fields.d.ts +2 -0
  39. package/dist/editor/lib/document/blocks/commerce/ProductPicture/fields.js +1 -0
  40. package/dist/editor/lib/document/blocks/commerce/ProductSpecs/fields.d.ts +2 -0
  41. package/dist/editor/lib/document/blocks/commerce/ProductSpecs/fields.js +1 -0
  42. package/dist/editor/lib/document/blocks/commerce/RelatedProducts/fields.js +1 -1
  43. package/dist/editor/lib/document/blocks/commerce/controls.d.ts +4 -0
  44. package/dist/editor/lib/document/blocks/commerce/controls.js +1 -1
  45. package/dist/editor/lib/document/blocks/commerce/index.d.ts +1 -1
  46. package/dist/editor/lib/document/blocks/commerce/index.js +1 -1
  47. package/dist/editor/lib/document/config.js +1 -1
  48. package/dist/editor/lib/document/section-text-regions.js +1 -1
  49. package/dist/editor/lib/editor-words-kept.d.ts +1 -0
  50. package/dist/editor/lib/editor-words-kept.js +1 -0
  51. package/dist/editor/lib/efficient-backend.d.ts +7 -1
  52. package/dist/editor/lib/efficient-backend.js +1 -1
  53. package/dist/editor/lib/storefront-document.js +1 -1
  54. package/dist/editor/lib/storefront-editor-words.d.ts +40 -12
  55. package/dist/editor/lib/storefront-editor-words.js +1 -1
  56. package/dist/editor.css +1 -1
  57. package/dist/fitment.js +1 -1
  58. package/dist/index.js +136 -83
  59. package/dist/links.js +1 -1
  60. package/dist/render/app/fonts/fallbacks.css +8 -0
  61. package/dist/render/app/fonts/jost/OFL.txt +93 -0
  62. package/dist/render/app/fonts/jost/cyrillic-italic.woff2 +0 -0
  63. package/dist/render/app/fonts/jost/cyrillic.woff2 +0 -0
  64. package/dist/render/app/fonts/jost/latin-ext-italic.woff2 +0 -0
  65. package/dist/render/app/fonts/jost/latin-ext.woff2 +0 -0
  66. package/dist/render/app/fonts/jost/latin-italic.woff2 +0 -0
  67. package/dist/render/app/fonts/jost/latin.woff2 +0 -0
  68. package/dist/render/app/globals.css +122 -11
  69. package/dist/render/built-with.json +1 -1
  70. package/dist/render/components/BundleCard.d.ts +2 -1
  71. package/dist/render/components/BundleCard.js +1 -1
  72. package/dist/render/components/Events.js +1 -1
  73. package/dist/render/components/FitmentTable.d.ts +1 -1
  74. package/dist/render/components/FitmentTable.js +1 -1
  75. package/dist/render/components/FooterMenu.d.ts +5 -1
  76. package/dist/render/components/FooterMenu.js +1 -1
  77. package/dist/render/components/GalleryGrid.js +1 -1
  78. package/dist/render/components/GalleryItem.d.ts +11 -1
  79. package/dist/render/components/GalleryItem.js +1 -1
  80. package/dist/render/components/GridCardTemplate.d.ts +40 -0
  81. package/dist/render/components/GridCardTemplate.js +1 -0
  82. package/dist/render/components/MenuLinkBlock.d.ts +5 -1
  83. package/dist/render/components/MenuLinkBlock.js +1 -1
  84. package/dist/render/components/ProductCardChrome.d.ts +1 -1
  85. package/dist/render/components/ProductCardChrome.js +1 -1
  86. package/dist/render/components/ProductGridSection.d.ts +9 -15
  87. package/dist/render/components/ProductGridSection.js +1 -1
  88. package/dist/render/components/ProductHeroPanel.js +1 -1
  89. package/dist/render/components/ProductRef.d.ts +8 -2
  90. package/dist/render/components/ProductRef.js +1 -1
  91. package/dist/render/components/SectionBand.d.ts +3 -2
  92. package/dist/render/components/SectionBand.js +1 -1
  93. package/dist/render/components/StorefrontProviders.d.ts +1 -1
  94. package/dist/render/components/StorefrontProviders.js +1 -1
  95. package/dist/render/components/TyreCard.js +1 -1
  96. package/dist/render/components/TyreFitVerdicts.d.ts +2 -1
  97. package/dist/render/components/TyreFitVerdicts.js +1 -1
  98. package/dist/render/components/TyrePlpCard.js +1 -1
  99. package/dist/render/components/card-pieces/CardBuyButton.d.ts +8 -1
  100. package/dist/render/components/card-pieces/CardBuyButton.js +1 -1
  101. package/dist/render/components/card-pieces/CardEyebrow.d.ts +3 -1
  102. package/dist/render/components/card-pieces/CardEyebrow.js +1 -1
  103. package/dist/render/components/card-pieces/CardName.d.ts +4 -1
  104. package/dist/render/components/card-pieces/CardName.js +1 -1
  105. package/dist/render/components/card-pieces/CardPrice.d.ts +2 -6
  106. package/dist/render/components/card-pieces/CardPrice.js +1 -1
  107. package/dist/render/components/card-pieces/CardProductBadge.d.ts +2 -1
  108. package/dist/render/components/card-pieces/CardProductBadge.js +1 -1
  109. package/dist/render/components/card-pieces/CardProductPicture.d.ts +13 -0
  110. package/dist/render/components/card-pieces/CardProductPicture.js +1 -0
  111. package/dist/render/components/card-pieces/CardSpecs.js +1 -1
  112. package/dist/render/components/card-pieces/HostPart.js +1 -1
  113. package/dist/render/components/card-pieces/ProductCardState.d.ts +25 -6
  114. package/dist/render/components/card-pieces/ProductCardState.js +1 -1
  115. package/dist/render/components/card-pieces/card-text-region.d.ts +18 -0
  116. package/dist/render/components/card-pieces/card-text-region.js +1 -0
  117. package/dist/render/components/catalog/CatalogFilterContext.d.ts +4 -1
  118. package/dist/render/components/catalog/CatalogFilterContext.js +1 -1
  119. package/dist/render/components/catalog/ClearAllButton.d.ts +4 -0
  120. package/dist/render/components/catalog/ClearAllButton.js +1 -0
  121. package/dist/render/components/catalog/FilterPill.d.ts +4 -2
  122. package/dist/render/components/catalog/FilterPill.js +1 -1
  123. package/dist/render/components/catalog/ShopperChips.d.ts +13 -0
  124. package/dist/render/components/catalog/ShopperChips.js +1 -0
  125. package/dist/render/components/catalog/ShopperFilters.d.ts +20 -0
  126. package/dist/render/components/catalog/ShopperFilters.js +1 -0
  127. package/dist/render/components/catalog/ShopperScope.d.ts +72 -0
  128. package/dist/render/components/catalog/ShopperScope.js +3 -0
  129. package/dist/render/components/catalog/SortSelect.js +1 -1
  130. package/dist/render/components/fitment/StockFitmentPart.d.ts +8 -1
  131. package/dist/render/components/fitment/StockFitmentPart.js +1 -1
  132. package/dist/render/components/fitment/fitment-answer-source.d.ts +12 -0
  133. package/dist/render/components/fitment/fitment-answer-source.js +1 -0
  134. package/dist/render/components/pdp-dynamic/DynamicFitmentTable.js +1 -1
  135. package/dist/render/components/pdp-dynamic/DynamicRelatedProducts.d.ts +10 -12
  136. package/dist/render/components/pdp-dynamic/DynamicRelatedProducts.js +1 -1
  137. package/dist/render/components/pdp-dynamic/DynamicSpecTable.js +1 -1
  138. package/dist/render/components/pdp-dynamic/DynamicTyreSizes.js +1 -1
  139. package/dist/render/components/wheels-plp/AlloyWheelsListing.js +1 -1
  140. package/dist/render/components/wheels-plp/PlpActiveChips.js +1 -1
  141. package/dist/render/components/wheels-plp/PlpCard.d.ts +1 -1
  142. package/dist/render/components/wheels-plp/PlpCard.js +1 -1
  143. package/dist/render/components/wheels-plp/PlpPagination.d.ts +2 -1
  144. package/dist/render/components/wheels-plp/PlpPagination.js +1 -1
  145. package/dist/render/components/wheels-plp/PlpSidebar.js +1 -1
  146. package/dist/render/components/wheels-plp/usePlpFiltersInUrl.d.ts +2 -0
  147. package/dist/render/components/wheels-plp/usePlpFiltersInUrl.js +1 -1
  148. package/dist/render/lib/api/index.d.ts +6 -0
  149. package/dist/render/lib/api/index.js +1 -1
  150. package/dist/render/lib/catalog/related-cards.d.ts +4 -1
  151. package/dist/render/lib/catalog/relationships.d.ts +9 -2
  152. package/dist/render/lib/catalog/relationships.js +1 -1
  153. package/dist/render/lib/commerce.d.ts +2 -0
  154. package/dist/render/lib/commerce.js +1 -1
  155. package/dist/render/lib/content/article-body.js +1 -5
  156. package/dist/render/lib/content/field-usage.d.ts +1 -0
  157. package/dist/render/lib/content/field-usage.js +1 -1
  158. package/dist/render/lib/content/filter-card-seed.d.ts +10 -0
  159. package/dist/render/lib/content/filter-card-seed.js +1 -0
  160. package/dist/render/lib/content/product-card-seed.d.ts +34 -0
  161. package/dist/render/lib/content/product-card-seed.js +1 -0
  162. package/dist/render/lib/content/tab-strip.d.ts +17 -0
  163. package/dist/render/lib/content/tab-strip.js +1 -0
  164. package/dist/render/lib/document/blocks/commerce/BundleOffer/meta.js +1 -1
  165. package/dist/render/lib/document/blocks/commerce/BundleOffer/render.js +1 -1
  166. package/dist/render/lib/document/blocks/commerce/FilterBlock/meta.d.ts +8 -0
  167. package/dist/render/lib/document/blocks/commerce/FilterBlock/meta.js +1 -0
  168. package/dist/render/lib/document/blocks/commerce/FilterBlock/render.d.ts +2 -0
  169. package/dist/render/lib/document/blocks/commerce/FilterBlock/render.js +1 -0
  170. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/meta.d.ts +8 -0
  171. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/meta.js +1 -0
  172. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/render.d.ts +2 -0
  173. package/dist/render/lib/document/blocks/commerce/FilterChipsBlock/render.js +1 -0
  174. package/dist/render/lib/document/blocks/commerce/GalleryB/meta.js +1 -1
  175. package/dist/render/lib/document/blocks/commerce/GalleryItem/render.js +1 -1
  176. package/dist/render/lib/document/blocks/commerce/ProductBuy/meta.d.ts +2 -0
  177. package/dist/render/lib/document/blocks/commerce/ProductBuy/meta.js +1 -0
  178. package/dist/render/lib/document/blocks/commerce/ProductBuy/render.d.ts +2 -0
  179. package/dist/render/lib/document/blocks/commerce/ProductBuy/render.js +1 -0
  180. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/meta.d.ts +2 -0
  181. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/meta.js +1 -0
  182. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/render.d.ts +2 -0
  183. package/dist/render/lib/document/blocks/commerce/ProductBuyButton/render.js +1 -0
  184. package/dist/render/lib/document/blocks/commerce/ProductEyebrow/meta.d.ts +2 -0
  185. package/dist/render/lib/document/blocks/commerce/ProductEyebrow/meta.js +1 -0
  186. package/dist/render/lib/document/blocks/commerce/ProductEyebrow/render.d.ts +2 -0
  187. package/dist/render/lib/document/blocks/commerce/ProductEyebrow/render.js +1 -0
  188. package/dist/render/lib/document/blocks/commerce/ProductGrid/meta.d.ts +4 -0
  189. package/dist/render/lib/document/blocks/commerce/ProductGrid/meta.js +1 -1
  190. package/dist/render/lib/document/blocks/commerce/ProductGrid/render.js +1 -1
  191. package/dist/render/lib/document/blocks/commerce/ProductHero/meta.js +1 -1
  192. package/dist/render/lib/document/blocks/commerce/ProductName/meta.d.ts +2 -0
  193. package/dist/render/lib/document/blocks/commerce/ProductName/meta.js +1 -0
  194. package/dist/render/lib/document/blocks/commerce/ProductName/render.d.ts +2 -0
  195. package/dist/render/lib/document/blocks/commerce/ProductName/render.js +1 -0
  196. package/dist/render/lib/document/blocks/commerce/ProductPicture/meta.d.ts +2 -0
  197. package/dist/render/lib/document/blocks/commerce/ProductPicture/meta.js +1 -0
  198. package/dist/render/lib/document/blocks/commerce/ProductPicture/render.d.ts +2 -0
  199. package/dist/render/lib/document/blocks/commerce/ProductPicture/render.js +1 -0
  200. package/dist/render/lib/document/blocks/commerce/ProductPrice/render.js +1 -1
  201. package/dist/render/lib/document/blocks/commerce/ProductSpecs/meta.d.ts +2 -0
  202. package/dist/render/lib/document/blocks/commerce/ProductSpecs/meta.js +1 -0
  203. package/dist/render/lib/document/blocks/commerce/ProductSpecs/render.d.ts +2 -0
  204. package/dist/render/lib/document/blocks/commerce/ProductSpecs/render.js +1 -0
  205. package/dist/render/lib/document/blocks/commerce/RelatedProducts/meta.d.ts +0 -4
  206. package/dist/render/lib/document/blocks/commerce/RelatedProducts/meta.js +1 -1
  207. package/dist/render/lib/document/blocks/commerce/RelatedProducts/render.js +1 -1
  208. package/dist/render/lib/document/blocks/commerce/StockFitment/meta.js +1 -1
  209. package/dist/render/lib/document/blocks/commerce/metas.d.ts +8 -0
  210. package/dist/render/lib/document/blocks/commerce/metas.js +1 -1
  211. package/dist/render/lib/document/blocks/commerce/renders.d.ts +8 -0
  212. package/dist/render/lib/document/blocks/commerce/renders.js +1 -1
  213. package/dist/render/lib/document/blocks/text-part-shapes.json +0 -16
  214. package/dist/render/lib/document/card-templates.d.ts +1 -0
  215. package/dist/render/lib/document/card-templates.js +1 -1
  216. package/dist/render/lib/document/document-nodes.d.ts +24 -0
  217. package/dist/render/lib/document/document-nodes.js +1 -0
  218. package/dist/render/lib/document/footer-page-blocks.js +1 -1
  219. package/dist/render/lib/document/lazy-draws.js +1 -1
  220. package/dist/render/lib/document/render-config.js +1 -1
  221. package/dist/render/lib/document/storefront-root.js +1 -1
  222. package/dist/render/lib/font-table.json +209 -1
  223. package/dist/render/lib/links/link-rules.js +1 -1
  224. package/dist/render/lib/menu-link.d.ts +2 -0
  225. package/dist/render/lib/menu-link.js +1 -1
  226. package/dist/render/lib/next-fonts.js +1 -1
  227. package/dist/render/lib/sections/bundle-to-grid.d.ts +8 -0
  228. package/dist/render/lib/sections/bundle-to-grid.js +1 -0
  229. package/dist/render/lib/sections/catalog-text-size.d.ts +2 -0
  230. package/dist/render/lib/sections/catalog-text-size.js +1 -1
  231. package/dist/render/lib/sections/filter-option-rows.d.ts +37 -0
  232. package/dist/render/lib/sections/filter-option-rows.js +1 -0
  233. package/dist/render/lib/sections/gallery-toolbar.d.ts +27 -0
  234. package/dist/render/lib/sections/gallery-toolbar.js +1 -0
  235. package/dist/render/lib/sections/grid-no-hole.d.ts +4 -0
  236. package/dist/render/lib/sections/grid-no-hole.js +1 -1
  237. package/dist/render/lib/sections/product-card-text-regions.d.ts +3 -0
  238. package/dist/render/lib/sections/product-card-text-regions.js +1 -0
  239. package/dist/render/lib/sections/product-grid-columns.d.ts +13 -1
  240. package/dist/render/lib/sections/product-grid-columns.js +1 -1
  241. package/dist/render/lib/sections/product-grid-pages.d.ts +42 -0
  242. package/dist/render/lib/sections/product-grid-pages.js +1 -0
  243. package/dist/render/lib/sections/related-to-grid.d.ts +8 -0
  244. package/dist/render/lib/sections/related-to-grid.js +1 -0
  245. package/dist/render/lib/sections/shopper-filters.d.ts +45 -0
  246. package/dist/render/lib/sections/shopper-filters.js +1 -0
  247. package/dist/render/lib/storefront-page-groups.d.ts +0 -4
  248. package/dist/render/lib/storefront-page-groups.js +1 -1
  249. package/dist/render/lib/tyres/tyre-vehicle-fitment.d.ts +1 -0
  250. package/dist/render/lib/tyres/tyre-vehicle-fitment.js +1 -1
  251. package/dist/render/lib/wheels/plp-filters.d.ts +6 -3
  252. package/dist/render/lib/wheels/plp-filters.js +1 -1
  253. package/dist/render/lib/wheels/plp-hydrate.d.ts +5 -3
  254. package/dist/render/lib/wheels/plp-hydrate.js +1 -1
  255. package/dist/render/lib/wheels/selected-ranges.d.ts +16 -0
  256. package/dist/render/lib/wheels/selected-ranges.js +1 -0
  257. package/dist/render/lib/wheels/set-mode.d.ts +10 -0
  258. package/dist/render/lib/wheels/set-mode.js +1 -1
  259. package/dist/render/lib/wheels/shopper-first-paint.d.ts +28 -0
  260. package/dist/render/lib/wheels/shopper-first-paint.js +1 -0
  261. package/dist/render/lib/wheels/shopper-scope.d.ts +11 -0
  262. package/dist/render/lib/wheels/shopper-scope.js +1 -0
  263. package/dist/words.d.ts +92 -15
  264. package/dist/words.js +6 -6
  265. package/package.json +4 -4
  266. package/dist/chunks/chunk-EUKK2IN6.js +0 -1
  267. package/dist/chunks/chunk-FJRKNPNN.js +0 -340
  268. package/dist/chunks/chunk-SLRULFYY.js +0 -1
  269. package/dist/render/components/pdp-dynamic/DynamicBundleOffer.d.ts +0 -13
  270. package/dist/render/components/pdp-dynamic/DynamicBundleOffer.js +0 -1
  271. /package/dist/chunks/{chunk-ALMIS7CK.js → chunk-NQLVRCTI.js} +0 -0
  272. /package/dist/chunks/{chunk-FJRKNPNN.js.LEGAL.txt → chunk-RHNDIM7Z.js.LEGAL.txt} +0 -0
@@ -1 +1 @@
1
- "use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import{TYRE_FIT_LABEL as m,tyreFitHeadline as d}from"../lib/tyres/tyre-fit-copy.js";import{variantFitStatus as g}from"../lib/tyres/tyre-vehicle-fitment.js";const t={body:"text-[length:var(--size-body,18px)]",labelSmall:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"},p={fits:{className:"font-medium",style:{color:"var(--green)"}},doesNotFit:{className:"text-fg-dim"},unknown:{className:"text-fg-dim"}};function u({variants:c,answer:l,loading:o=!1,onRetry:s}){return l?i("div",{className:"mt-10",children:[e("p",{className:`max-w-[68ch] font-serif ${t.body} italic leading-[1.55] text-fg-dim`,children:d(l)}),l.failed&&s?e("button",{type:"button",onClick:s,className:`mt-4 cursor-pointer font-mono ${t.labelLarge} uppercase tracking-[0.18em] text-accent underline-offset-4 hover:underline`,children:"Try again"}):null,e("ul",{className:"mt-6 grid gap-[2px] border border-line bg-line",children:c.map(a=>{const r=g(l,a.sku),n=p[r];return i("li",{className:"flex items-baseline justify-between gap-6 bg-bg px-5 py-4",children:[e("span",{className:`font-mono ${t.labelLarge} uppercase tracking-[0.14em] text-fg`,children:a.size}),e("span",{className:`font-mono ${t.labelSmall} uppercase tracking-[0.24em] ${n.className}`,style:n.style,children:m[r]})]},a.sku)})})]}):o?e("p",{className:`mt-10 border border-line bg-bg p-6 font-mono ${t.labelLarge} uppercase tracking-[0.24em] text-fg-dim`,children:"Checking your car…"}):null}export{u as default};
1
+ "use client";import{jsx as e,jsxs as i}from"react/jsx-runtime";import{TYRE_FIT_LABEL as d,tyreFitHeadline as g}from"../lib/tyres/tyre-fit-copy.js";import{variantFitStatus as p}from"../lib/tyres/tyre-vehicle-fitment.js";const t={body:"text-[length:var(--size-body,18px)]",labelSmall:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"},u={fits:{className:"font-medium",style:{color:"var(--green)"}},doesNotFit:{className:"text-fg-dim"},unknown:{className:"text-fg-dim"}};function f({variants:c,answer:l,loading:o=!1,onRetry:s,headline:m}){return l?i("div",{className:"mt-10",children:[e("p",{className:`max-w-[68ch] font-serif ${t.body} italic leading-[1.55] text-fg-dim`,children:m??g(l)}),l.failed&&s?e("button",{type:"button",onClick:s,className:`mt-4 cursor-pointer font-mono ${t.labelLarge} uppercase tracking-[0.18em] text-accent underline-offset-4 hover:underline`,children:"Try again"}):null,e("ul",{className:"mt-6 grid gap-[2px] border border-line bg-line",children:c.map(a=>{const r=p(l,a.sku),n=u[r];return i("li",{className:"flex items-baseline justify-between gap-6 bg-bg px-5 py-4",children:[e("span",{className:`font-mono ${t.labelLarge} uppercase tracking-[0.14em] text-fg`,children:a.size}),e("span",{className:`font-mono ${t.labelSmall} uppercase tracking-[0.24em] ${n.className}`,style:n.style,children:d[r]})]},a.sku)})})]}):o?e("p",{className:`mt-10 border border-line bg-bg p-6 font-mono ${t.labelLarge} uppercase tracking-[0.24em] text-fg-dim`,children:"Checking your car…"}):null}export{f as default};
@@ -1 +1 @@
1
- "use client";import{jsx as r}from"react/jsx-runtime";import w from"./BrandPlate.js";import g from"./card-pieces/CardBuyButton.js";import C from"./card-pieces/CardFinishSwatches.js";import P from"./card-pieces/CardPrice.js";import b from"./card-pieces/CardSizes.js";import{TyreCardStateProvider as x,useProductCardState as S}from"./card-pieces/ProductCardState.js";import{productCardEyebrow as z}from"./ProductCardEyebrow.js";import B from"./TyreImage.js";import k from"./WheelCardFrame.js";import{keepForCard as T}from"../lib/content/field-usage.js";import{tyreModelLine as L}from"../lib/tyres/tyre-brand-name.js";import{formatSizeRange as E}from"../lib/wheels/size-range.js";const F=[];function j({brand:i,brandLogo:m,brandPlate:s=!0,kindLabel:l=null,showBrand:a=!0,name:d,slug:p,sizes:e,fitSize:t=null,rimDiameters:u,prices:c,image:o,currency:f,editing:h=!1,fieldUsage:n=F}){return r(x,{tyre:{brand:i,brandLogo:m,name:d,slug:p,sizes:e,fitSize:t,rimDiameters:u,prices:c,image:o},currency:f,editing:h,children:r(v,{brandPlate:s,kindLabel:l,showBrand:a,fieldUsage:n})})}function v({brandPlate:i,kindLabel:m,showBrand:s,fieldUsage:l}){const a=S();if(a.kind!=="tyre")throw new Error("TyrePlpCard drew outside its own tyre state.");const{tyre:d,pagePath:p,arm:e}=a,{brand:t,brandLogo:u,name:c,sizes:o,rimDiameters:f,image:h}=d,n=T(l),y=[o.length>0?`${o.length} ${o.length===1?"size":"sizes"}`:null,n("rim_diameter")?E(f):null].filter(Boolean).join(" · ");return r(k,{href:p,identityLink:!0,containerProps:{onPointerEnter:e,onTouchStart:e,onFocusCapture:e},image:r(B,{image:h,className:"h-full w-full",sizes:"(max-width: 640px) 90vw, (max-width: 1024px) 45vw, 280px",showBackground:!1}),plate:i?r(w,{brand:t,logo:u}):null,eyebrow:z(m,s&&n("brand")&&t||null),name:L(t??"",c),spec:y,price:r(P,{}),swatches:r(C,{}),sizes:r(b,{}),buy:r(g,{})})}export{j as default};
1
+ "use client";import{jsx as r}from"react/jsx-runtime";import w from"./BrandPlate.js";import g from"./card-pieces/CardBuyButton.js";import C from"./card-pieces/CardFinishSwatches.js";import P from"./card-pieces/CardPrice.js";import b from"./card-pieces/CardSizes.js";import{TyreCardStateProvider as x,useProductCardState as S}from"./card-pieces/ProductCardState.js";import{productCardEyebrow as z}from"./ProductCardEyebrow.js";import B from"./TyreImage.js";import k from"./WheelCardFrame.js";import{keepForCard as L,NO_FIELD_ANSWERS as T}from"../lib/content/field-usage.js";import{tyreModelLine as E}from"../lib/tyres/tyre-brand-name.js";import{formatSizeRange as F}from"../lib/wheels/size-range.js";function _({brand:n,brandLogo:m,brandPlate:l=!0,kindLabel:s=null,showBrand:a=!0,name:d,slug:p,sizes:e,fitSize:t=null,rimDiameters:u,prices:f,image:o,currency:c,editing:h=!1,fieldUsage:i=T}){return r(x,{tyre:{brand:n,brandLogo:m,name:d,slug:p,sizes:e,fitSize:t,rimDiameters:u,prices:f,image:o},currency:c,editing:h,children:r(j,{brandPlate:l,kindLabel:s,showBrand:a,fieldUsage:i})})}function j({brandPlate:n,kindLabel:m,showBrand:l,fieldUsage:s}){const a=S();if(a.kind!=="tyre")throw new Error("TyrePlpCard drew outside its own tyre state.");const{tyre:d,pagePath:p,arm:e}=a,{brand:t,brandLogo:u,name:f,sizes:o,rimDiameters:c,image:h}=d,i=L(s),y=[o.length>0?`${o.length} ${o.length===1?"size":"sizes"}`:null,i("rim_diameter")?F(c):null].filter(Boolean).join(" · ");return r(k,{href:p,identityLink:!0,containerProps:{onPointerEnter:e,onTouchStart:e,onFocusCapture:e},image:r(B,{image:h,className:"h-full w-full",sizes:"(max-width: 640px) 90vw, (max-width: 1024px) 45vw, 280px",showBackground:!1}),plate:n?r(w,{brand:t,logo:u}):null,eyebrow:z(m,l&&i("brand")&&t||null),name:E(t??"",f),spec:y,price:r(P,{}),swatches:r(C,{}),sizes:r(b,{}),buy:r(g,{})})}export{_ as default};
@@ -1,7 +1,14 @@
1
+ import { type CartLine } from "../CartContext.js";
2
+ import { type HeroBuyState } from "./ProductCardState.js";
1
3
  export declare const CARD_PAGE_WORDS = "View sizes & fitment";
2
4
  export interface CardBuyButtonSettings {
3
5
  buy?: boolean;
4
6
  page?: boolean;
5
7
  }
6
- export default function CardBuyButton({ buy, page }: CardBuyButtonSettings): import("react").JSX.Element;
8
+ export declare function HeroBuyButton({ buy, takesOrders, add, }: {
9
+ buy: HeroBuyState;
10
+ takesOrders: boolean;
11
+ add: (line: CartLine) => void;
12
+ }): import("react").JSX.Element;
13
+ export default function CardBuyButton({ buy, page }: CardBuyButtonSettings): import("react").JSX.Element | null;
7
14
  export declare function CardBuyDialog(): import("react").JSX.Element | null;
@@ -1 +1 @@
1
- "use client";import{jsx as r,jsxs as b}from"react/jsx-runtime";import O from"next/link";import{useEffect as h}from"react";import{useCart as g}from"../CartContext.js";import C from"../QuoteLink.js";import{useSiteTakesOrders as S}from"../SiteRecordContext.js";import D from"../wheels-plp/PlpNotifyMeDialog.js";import{DEFAULT_PURCHASE_STATE as k}from"../../lib/catalog/purchase.js";import{ADD_TO_BASKET_ATTR as _}from"../../lib/commerce.js";import{tyreCartLine as R}from"../../lib/tyres/tyre-purchase.js";import{priceIn as E,resolveWheelPrice as v}from"../../lib/wheels/price-display.js";import{isOneWheelDesign as B,setLabel as z}from"../../lib/wheels/variants.js";import{splitWheelName as L}from"../../lib/wheels/wheel-name.js";import{CARD_TEXT_SIZE as A,CardButtonRow as N}from"./card-row.js";import{useProductCardState as $,useWheelCardState as P}from"./ProductCardState.js";const T="mt-3 flex flex-col gap-2",u=`cursor-pointer bg-btn px-4 py-3 font-mono ${A.labelSmall} font-bold uppercase tracking-[0.24em] text-btn-ink transition-colors hover:bg-fg`,w=`border border-btn px-4 py-3 text-center font-mono ${A.labelSmall} font-bold uppercase tracking-[0.24em] text-btn transition-colors hover:bg-btn hover:text-btn-ink`,W="View sizes & fitment",j="mt-3 block font-mono text-[length:var(--size-label,11px)] font-bold uppercase tracking-[0.18em] text-accent underline-offset-4 group-hover:underline";function V({wheel:t,sel:e,price:o,editing:i}){const{addAndOpen:s,warmCatalog:c}=g();h(()=>{i||c()},[i,c]);const{arm:a}=e;h(()=>{a()},[a]);function l(){const n=e.selectedVariant;!n||!e.canAdd||o.priced&&(i||s({id:`${t.slug}|${n.finishName}|${n.size}|quick`,slug:t.slug,name:L(t.name),process:t.process,positionNo:"01",config:[{label:n.size},{label:n.finishName,gold:!0},{label:z(n)}],finishName:n.finishName,size:n.size,components:n.components,qty:1}))}return r("button",{type:"button",onClick:l,[_]:"",disabled:!e.canAdd,className:e.canAdd?u:`${u} opacity-80`,children:"Add to basket"})}function q(t,e,o){return B(t)?e.outOfStock?"notify":e.unsellable||!o||e.detailState==="ready"&&!e.canAdd?"choose":"add":"choose"}function F({state:t,buy:e,page:o}){const{wheel:i,sel:s,price:c,editing:a,setNotifyOpen:l}=t,n=S(),d=q(i,s,c.priced),m=e?d==="notify"?r("button",{type:"button",onClick:()=>l(!0),className:u,children:"Notify me when back"}):d==="add"?n?r(V,{wheel:i,sel:s,price:c,editing:a}):r(C,{className:u}):null:null,f=!o||m?null:b("span",{"aria-hidden":!0,className:j,children:[W," →"]});return r(N,{children:m||f?b("div",{className:T,children:[m,f]}):null})}function G({state:t}){const{tyre:e,currency:o,pagePath:i,detail:s,variant:c,canAdd:a,detailReady:l,unsellable:n,editing:d}=t,{addAndOpen:m,warmCatalog:f}=g(),p=S();h(()=>{!d&&p&&f("tyre")},[d,p,f]);const y=v(E(e.prices,o),null).priced;function x(){!s||!c||!a||d||m(R(s,c,k.choice,k.qty))}return r(N,{children:b("div",{className:T,children:[!n&&y&&!p&&r(C,{className:u}),!n&&y&&p&&r("button",{type:"button",onClick:x,[_]:"",disabled:l&&!a,className:a||!l?`${u}${a?"":" opacity-80"}`:`cursor-not-allowed border border-dashed border-accent/50 px-4 py-3 font-mono ${A.labelSmall} font-bold uppercase tracking-[0.24em] text-accent/70`,children:l&&!a?"Select a size":"Add to basket"}),i&&r(O,{href:i,className:w,children:"Open product page"})]})})}function I({buy:t=!0,page:e=!0}){const o=$();return o.kind==="tyre"?r(G,{state:o}):r(F,{state:o,buy:t,page:e})}function ae(){const{wheel:t,sel:e,editing:o,notifyOpen:i,setNotifyOpen:s}=P();return i?r(D,{wheelName:t.name,productSlug:t.slug,finishName:e.confirmedFinishName,variants:e.outOfStockVariants,initialSize:e.selectedVariant?.size,onClose:()=>s(!1),editing:o}):null}export{W as CARD_PAGE_WORDS,ae as CardBuyDialog,I as default};
1
+ "use client";import{jsx as n,jsxs as b}from"react/jsx-runtime";import D from"next/link";import{useEffect as h}from"react";import{useCart as A}from"../CartContext.js";import g from"../QuoteLink.js";import{useSiteTakesOrders as k}from"../SiteRecordContext.js";import E from"../wheels-plp/PlpNotifyMeDialog.js";import{DEFAULT_PURCHASE_STATE as _}from"../../lib/catalog/purchase.js";import{ADD_TO_BASKET_ATTR as x}from"../../lib/commerce.js";import{STOCK_WORDS as R}from"../../lib/content/stock-words.js";import{tyreCartLine as B}from"../../lib/tyres/tyre-purchase.js";import{UNPRICED_LABEL as L,priceIn as w,resolveWheelPrice as z}from"../../lib/wheels/price-display.js";import{isOneWheelDesign as $,setLabel as P}from"../../lib/wheels/variants.js";import{splitWheelName as H}from"../../lib/wheels/wheel-name.js";import{CARD_TEXT_SIZE as C,CardButtonRow as S}from"./card-row.js";import{useHeroStateOrNull as W,useProductCardStateOrNull as j,useWheelCardState as q}from"./ProductCardState.js";const O="mt-3 flex flex-col gap-2",u=`cursor-pointer bg-btn px-4 py-3 font-mono ${C.labelSmall} font-bold uppercase tracking-[0.24em] text-btn-ink transition-colors hover:bg-fg`,F=`border border-btn px-4 py-3 text-center font-mono ${C.labelSmall} font-bold uppercase tracking-[0.24em] text-btn transition-colors hover:bg-btn hover:text-btn-ink`,I="View sizes & fitment",V="mt-3 block font-mono text-[length:var(--size-label,11px)] font-bold uppercase tracking-[0.18em] text-accent underline-offset-4 group-hover:underline";function G({wheel:e,sel:t,price:o,editing:r}){const{addAndOpen:i,warmCatalog:s}=A();h(()=>{r||s()},[r,s]);const{arm:c}=t;h(()=>{c()},[c]);function d(){const a=t.selectedVariant;!a||!t.canAdd||o.priced&&(r||i({id:`${e.slug}|${a.finishName}|${a.size}|quick`,slug:e.slug,name:H(e.name),process:e.process,positionNo:"01",config:[{label:a.size},{label:a.finishName,gold:!0},{label:P(a)}],finishName:a.finishName,size:a.size,components:a.components,qty:1}))}return n("button",{type:"button",onClick:d,[x]:"",disabled:!t.canAdd,className:t.canAdd?u:`${u} opacity-80`,children:"Add to basket"})}function K(e,t,o){return $(e)?t.outOfStock?"notify":t.unsellable||!o||t.detailState==="ready"&&!t.canAdd?"choose":"add":"choose"}function U({state:e,buy:t,page:o}){const{wheel:r,sel:i,price:s,editing:c,setNotifyOpen:d}=e,a=k(),l=K(r,i,s.priced),f=t?l==="notify"?n("button",{type:"button",onClick:()=>d(!0),className:u,children:"Notify me when back"}):l==="add"?a?n(G,{wheel:r,sel:i,price:s,editing:c}):n(g,{className:u}):null:null,p=!o||f?null:b("span",{"aria-hidden":!0,className:V,children:[I," →"]});return n(S,{children:f||p?b("div",{className:O,children:[f,p]}):null})}function M({state:e}){const{tyre:t,currency:o,pagePath:r,detail:i,variant:s,canAdd:c,detailReady:d,unsellable:a,editing:l}=e,{addAndOpen:f,warmCatalog:p}=A(),m=k();h(()=>{!l&&m&&p("tyre")},[l,m,p]);const y=z(w(t.prices,o),null).priced;function v(){!i||!s||!c||l||f(B(i,s,_.choice,_.qty))}return n(S,{children:b("div",{className:O,children:[!a&&y&&!m&&n(g,{className:u}),!a&&y&&m&&n("button",{type:"button",onClick:v,[x]:"",disabled:d&&!c,className:c||!d?`${u}${c?"":" opacity-80"}`:`cursor-not-allowed border border-dashed border-accent/50 px-4 py-3 font-mono ${C.labelSmall} font-bold uppercase tracking-[0.24em] text-accent/70`,children:d&&!c?"Select a size":"Add to basket"}),r&&n(D,{href:r,className:F,children:"Open product page"})]})})}const X="flex-1 px-6 py-4 font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em]",Q="flex-1 cursor-not-allowed border-2 border-dashed border-fg-dim/20 px-6 py-4 font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] text-fg-dim/40";function N(e,t){return!t||e.isSet&&!e.priced?"quote":e.priced?e.outOfStock?"outOfStock":"add":"unpriced"}function T({buy:e,takesOrders:t,add:o}){const r=N(e,t);return r==="quote"?n(g,{className:"flex-1 cursor-pointer bg-btn px-6 py-4 text-center font-mono text-[length:var(--size-label,14px)] font-bold uppercase tracking-[0.32em] text-btn-ink transition-colors hover:bg-fg"}):r!=="add"?n("button",{type:"button",disabled:!0,"aria-disabled":!0,className:Q,children:r==="outOfStock"?R.outOfStock:L}):b("button",{type:"button",[x]:"",onClick:()=>{const i=e.lineToAdd();i&&o(i)},"aria-disabled":!e.canAdd,className:[`${X} transition-colors`,e.canAdd?"cursor-pointer bg-btn text-btn-ink hover:bg-fg hover:text-bg":"cursor-pointer border-2 border-dashed border-accent/50 text-accent/80 hover:border-accent hover:text-accent"].join(" "),style:e.canAdd?void 0:{background:"color-mix(in oklab, var(--accent) 6%, transparent)"},children:["Add to Cart",e.totalLabel!=null?` · ${e.totalLabel}`:""]})}const Y=()=>{};function Z({buy:e}){const{addAndOpen:t}=A();return n(T,{buy:e,takesOrders:!0,add:o=>t(o)})}function J({buy:e}){const t=k();return N(e,t)==="add"?n(Z,{buy:e}):n(T,{buy:e,takesOrders:t,add:Y})}function ee({buy:e=!0,page:t=!0}){const o=W(),r=j();if(o)return o.buy?n(J,{buy:o.buy}):null;if(!r)throw new Error("A product card piece was drawn outside a product card (no ProductCardState).");return r.kind==="bundle"?n(S,{}):r.kind==="tyre"?n(M,{state:r}):n(U,{state:r,buy:e,page:t})}function Ae(){const{wheel:e,sel:t,editing:o,notifyOpen:r,setNotifyOpen:i}=q();return r?n(E,{wheelName:e.name,productSlug:e.slug,finishName:t.confirmedFinishName,variants:t.outOfStockVariants,initialSize:t.selectedVariant?.size,onClose:()=>i(!1),editing:o}):null}export{I as CARD_PAGE_WORDS,Ae as CardBuyDialog,T as HeroBuyButton,ee as default};
@@ -1,6 +1,8 @@
1
1
  import type { ReactNode } from "react";
2
+ import { type CardTextRegion } from "./card-text-region.js";
2
3
  export interface CardEyebrowSettings {
3
4
  children?: ReactNode;
4
5
  reserve?: boolean;
6
+ region?: CardTextRegion;
5
7
  }
6
- export default function CardEyebrow({ children: eyebrow, reserve }: CardEyebrowSettings): import("react").JSX.Element;
8
+ export default function CardEyebrow({ children: eyebrow, reserve, region }: CardEyebrowSettings): import("react").JSX.Element;
@@ -1 +1 @@
1
- "use client";import{jsx as e}from"react/jsx-runtime";import{CARD_TEXT_SIZE as o,CardRow as s,useCatalogCard as c}from"./card-row.js";function i({children:a,reserve:n=!1}){const r=c(),t=`font-mono ${o.label} uppercase text-accent ${r?"tracking-[0.3em]":"tracking-[0.25em]"}`,l=a?e("div",{className:t,children:a}):r&&n?e("div",{"aria-hidden":!0,className:t,children:" "}):null;return e(s,{children:l})}export{i as default};
1
+ "use client";import{jsx as e}from"react/jsx-runtime";import{CARD_TEXT_SIZE as c,CardRow as l,useCatalogCard as s}from"./card-row.js";import{RegionBridge as d,RegionWords as m,regionAttr as u}from"./card-text-region.js";function g({children:o,reserve:a=!1,region:r}){const t=s(),n=`font-mono ${c.label} uppercase text-accent ${t?"tracking-[0.3em]":"tracking-[0.25em]"}`,i=o?e("div",{...u(r,"eyebrow"),className:n,children:e(m,{region:r,at:"eyebrow",children:o})}):t&&a?e("div",{"aria-hidden":!0,className:n,children:" "}):null;return e(d,{region:r,sectionType:"ProductEyebrow",children:e(l,{children:i})})}export{g as default};
@@ -1,4 +1,7 @@
1
1
  import type { ReactNode } from "react";
2
- export default function CardName({ children: name }: {
2
+ import { type CardTextRegion } from "./card-text-region.js";
3
+ export default function CardName({ children: name, region, fixedHeight, }: {
3
4
  children?: ReactNode;
5
+ region?: CardTextRegion;
6
+ fixedHeight?: boolean;
4
7
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- "use client";import{jsx as r}from"react/jsx-runtime";import{withRMark as t}from"efficient-web-builder/render/components/RMark";import{CARD_TEXT_SIZE as n,useCatalogCard as d}from"./card-row.js";import{useProductCardStateOrNull as i}from"./ProductCardState.js";function m({children:a}){const o=d(),e=i();return a===void 0&&e?.kind!=="wheel"&&process.env.NODE_ENV!=="production"&&console.warn("[CardName] no name given and no wheel card state: the name block is empty"),r("div",{className:o?`mt-2 h-[60px] overflow-hidden break-words [.sf-card-rows_&]:h-auto [.sf-card-rows_&]:max-h-[60px] font-heading3 ${n.headingSmall2} font-medium uppercase leading-none tracking-[-0.02em]`:`mt-2 font-heading3 ${n.headingSmall1} font-medium tracking-[-0.02em]`,children:a??(e?.kind==="wheel"?t(e.wheel.name):null)})}export{m as default};
1
+ "use client";import{jsx as a}from"react/jsx-runtime";import{withRMark as m}from"efficient-web-builder/render/components/RMark";import{CARD_TEXT_SIZE as o,useCatalogCard as l}from"./card-row.js";import{useProductCardStateOrNull as s}from"./ProductCardState.js";import{RegionBridge as c,RegionWords as u,regionAttr as h}from"./card-text-region.js";function f({children:r,region:n,fixedHeight:d=!0}){const t=l(),e=s(),i=e?.kind==="wheel"?m(e.wheel.name):e?.kind==="bundle"?e.bundle.name:null;return r===void 0&&i===null&&process.env.NODE_ENV!=="production"&&console.warn("[CardName] no name given and no wheel card state: the name block is empty"),a(c,{region:n,sectionType:"ProductName",children:a("div",{...h(n,"name"),className:t&&!d?`font-heading3 ${o.headingSmall2} font-medium uppercase leading-none tracking-[-0.02em]`:t?`mt-2 h-[60px] overflow-hidden break-words [.sf-card-rows_&]:h-auto [.sf-card-rows_&]:max-h-[60px] font-heading3 ${o.headingSmall2} font-medium uppercase leading-none tracking-[-0.02em]`:`mt-2 font-heading3 ${o.headingSmall1} font-medium tracking-[-0.02em]`,children:a(u,{region:n,at:"name",children:r??i})})})}export{f as default};
@@ -1,15 +1,11 @@
1
- import type { PartStyles } from "efficient-web-builder/render/lib/document/part-styles";
1
+ import { type CardTextRegion } from "./card-text-region.js";
2
2
  export interface CardPriceSettings {
3
3
  show?: boolean;
4
4
  quoteSets?: boolean;
5
5
  setTotal?: boolean;
6
6
  wasFollowsSize?: boolean;
7
7
  }
8
- export interface CardPriceRegion {
9
- nodeId?: string;
10
- partStyles?: PartStyles;
11
- editing: boolean;
12
- }
8
+ export type CardPriceRegion = CardTextRegion;
13
9
  export default function CardPrice({ show, region, ...settings }: CardPriceSettings & {
14
10
  region?: CardPriceRegion;
15
11
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- "use client";import{jsx as n,jsxs as c,Fragment as b}from"react/jsx-runtime";import P from"efficient-web-builder/render/components/TextRegionRun";import{SectionTextParts as S}from"efficient-web-builder/render/lib/document/editing-bridges";import{TEXT_REGION_ATTR as T}from"efficient-web-builder/format/lib/sections/text-regions";import{formatPrice as v}from"../../lib/commerce.js";import{setLabel as y}from"../../lib/wheels/variants.js";import{wheelCardPriceLine as d}from"../../lib/wheels/set-mode.js";import{EACH_UNIT as N,formatSelectionPrice as _,formatSelectionWasPrice as w,formatWheelPrice as p,formatWheelWasPrice as L,FROM_PREFIX as u,priceIn as k,resolveWheelPrice as f,SET_QUOTE_LABEL as E}from"../../lib/wheels/price-display.js";import{CARD_TEXT_SIZE as h,CardRow as x}from"./card-row.js";import{useHeroPriceStateOrNull as R,useProductCardState as I}from"./ProductCardState.js";function C(e,t){if(e.kind==="tyre"){const m=f(k(e.tyre.prices,e.currency),null);return{was:null,amount:p(m,e.currency,u),note:m.priced?N:null}}const{wheel:o,currency:r,price:i,sel:l,isSet:g}=e,a=f(o.prices[r],o.msrpPrices?.[r]),s=t.setTotal&&i.priced&&i.setTotal!=null&&l.selectedVariant?`${y(l.selectedVariant)} · ${v(i.setTotal,r)}`:null;return g&&t.quoteSets?{was:null,amount:a.priced?d(p(a,r,u),!0):E,note:s}:{was:t.wasFollowsSize?w(i,r):L(a,r),amount:d(_(i,r),i.priced),note:s}}function W({state:e,region:t}){const o=!!t?.editing,r=c("div",{className:"flex items-baseline gap-5 border-t border-line pt-[18px]",children:[e.msrpLabel&&n("div",{className:"font-mono text-[length:var(--size-label,15px)] text-fg-dim line-through",children:e.msrpLabel}),n("div",{className:"font-heading2 text-[length:min(var(--size-headingMedium,36px),var(--sf-heading-max,9999px))] font-bold leading-none tracking-[-0.01em] text-fg",...o?{[T]:"price"}:{},children:n(P,{region:"price",partStyles:t?.partStyles,children:e.amount})}),e.unitLabel&&n("div",{className:"font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:e.unitLabel}),e.packBadge&&n("div",{className:"ml-auto border border-accent px-3 py-2 font-mono text-[length:var(--size-label,13px)] font-bold uppercase tracking-[0.18em] text-accent",style:{background:"color-mix(in oklab, var(--accent) 14%, transparent)"},children:e.packBadge})]});return!o||!t?.nodeId?r:n(S,{nodeId:t.nodeId,sectionType:"ProductPrice",partStyles:t.partStyles,children:r})}function z({show:e=!0,region:t,...o}){const r=R();return r?n(W,{state:r,region:t}):n(F,{show:e,...o})}function F({show:e,...t}){const o=I(),{was:r,amount:i,note:l}=C(o,t);return c(b,{children:[n(x,{children:e?c("div",{className:`mt-2 font-mono ${h.labelLarge}`,children:[r&&n("span",{className:"mr-2 text-fg-dim line-through",children:r}),i]}):null}),n(x,{children:e&&l?n("div",{className:`mt-[2px] font-mono ${h.labelSmall} tracking-[0.08em] text-fg-dim`,children:l}):null})]})}export{z as default};
1
+ "use client";import{jsx as r,jsxs as c,Fragment as b}from"react/jsx-runtime";import{formatPrice as v}from"../../lib/commerce.js";import{say as P}from"efficient-web-builder/format/lib/editor-words";import{setLabel as k}from"../../lib/wheels/variants.js";import{wheelCardPriceLine as u}from"../../lib/wheels/set-mode.js";import{EACH_UNIT as S,formatSelectionPrice as L,formatSelectionWasPrice as N,formatWheelPrice as p,formatWheelWasPrice as w,FROM_PREFIX as f,priceIn as y,resolveWheelPrice as h,SET_QUOTE_LABEL as T}from"../../lib/wheels/price-display.js";import{CARD_TEXT_SIZE as m,CardRow as g}from"./card-row.js";import{RegionBridge as _,RegionWords as C,regionAttr as E}from"./card-text-region.js";import{useHeroStateOrNull as R,useProductCardState as W}from"./ProductCardState.js";function z(e,n){if(e.kind==="tyre"){const d=h(y(e.tyre.prices,e.currency),null);return{was:null,amount:p(d,e.currency,f),note:d.priced?S:null}}const{wheel:i,currency:t,price:o,sel:l,isSet:x}=e,a=h(i.prices[t],i.msrpPrices?.[t]),s=n.setTotal&&o.priced&&o.setTotal!=null&&l.selectedVariant?`${k(l.selectedVariant)} · ${v(o.setTotal,t)}`:null;return x&&n.quoteSets?{was:null,amount:a.priced?u(p(a,t,f),!0):T,note:s}:{was:n.wasFollowsSize?N(o,t):w(a,t),amount:u(L(o,t),o.priced),note:s}}function B({state:e,region:n}){const i=c("div",{className:"flex items-baseline gap-5 border-t border-line pt-[18px]",children:[e.msrpLabel&&r("div",{className:"font-mono text-[length:var(--size-label,15px)] text-fg-dim line-through",children:e.msrpLabel}),r("div",{className:"font-heading2 text-[length:min(var(--size-headingMedium,36px),var(--sf-heading-max,9999px))] font-bold leading-none tracking-[-0.01em] text-fg",...E(n,"price"),children:r(C,{region:n,at:"price",children:e.amount})}),e.unitLabel&&r("div",{className:"font-mono text-[length:var(--size-label,13px)] font-semibold uppercase tracking-[0.22em] text-fg",children:e.unitLabel}),e.packBadge&&r("div",{className:"ml-auto border border-accent px-3 py-2 font-mono text-[length:var(--size-label,13px)] font-bold uppercase tracking-[0.18em] text-accent",style:{background:"color-mix(in oklab, var(--accent) 14%, transparent)"},children:e.packBadge})]});return r(_,{region:n,sectionType:"ProductPrice",children:i})}function F({show:e=!0,region:n,...i}){const t=R();return t?r(B,{state:t,region:n}):r(j,{show:e,...i})}function $({state:e,show:n}){return!n||e.bundle.inStock?null:r("div",{className:`mt-1 font-mono ${m.labelSmall} uppercase tracking-[0.24em] text-fg-dim`,children:P("Currently unavailable")})}function j({show:e=!0,...n}){const i=W();if(i.kind==="bundle")return r($,{state:i,show:e});const{was:t,amount:o,note:l}=z(i,n);return c(b,{children:[r(g,{children:e?c("div",{className:`mt-2 font-mono ${m.labelLarge}`,children:[t&&r("span",{className:"mr-2 text-fg-dim line-through",children:t}),o]}):null}),r(g,{children:e&&l?r("div",{className:`mt-[2px] font-mono ${m.labelSmall} tracking-[0.08em] text-fg-dim`,children:l}):null})]})}export{F as default};
@@ -3,5 +3,6 @@ export interface CardProductBadgeSettings {
3
3
  sale?: boolean;
4
4
  numbered?: boolean;
5
5
  axleSets?: boolean;
6
+ edge?: boolean;
6
7
  }
7
- export default function CardProductBadge({ show, sale, numbered, axleSets, }: CardProductBadgeSettings): import("react").JSX.Element | null;
8
+ export default function CardProductBadge({ show, sale, numbered, axleSets, edge, }: CardProductBadgeSettings): import("react").JSX.Element | null;
@@ -1 +1 @@
1
- "use client";import{jsx as e,Fragment as x,jsxs as h}from"react/jsx-runtime";import{Fragment as _}from"react";import{CARD_TEXT_SIZE as S,useCatalogCard as A}from"./card-row.js";import{useProductCardState as C}from"./ProductCardState.js";const b=`border px-2 py-1 font-mono ${S.labelSmall} uppercase tracking-[0.3em]`,B="absolute right-[18px] top-[18px] z-10",E="absolute left-[18px] top-[18px] z-10";function t({tone:n,children:l}){return e("span",{className:[b,n==="solid"?"border-accent bg-accent text-bg":"border-accent text-accent"].join(" "),children:l})}function D({show:n=!0,sale:l=!1,numbered:a=!1,axleSets:u=!1}){const o=C();if(!A()||o.kind!=="wheel")return null;const{wheel:p,price:m,isSet:c}=o,i=c||u?o.setWords:null,s=n?p.badge:null,r=c?e(t,{tone:"solid",children:"Set"}):null,d=[a?r:null,l&&m.onSale?e(t,{tone:"solid",children:"Sale"}):null,i?e(t,{tone:"outline",children:i}):s?e(t,{tone:s==="new"?"solid":"outline",children:s==="new"?"New":"Bestseller"}):null].filter(Boolean);return h(x,{children:[r&&!a&&e("div",{className:`${E} pointer-events-none flex flex-col items-start gap-1`,children:r}),d.length>0&&e("div",{className:`${B} pointer-events-none flex flex-col items-end gap-1`,children:d.map((f,g)=>e(_,{children:f},g))})]})}export{D as default};
1
+ "use client";import{jsx as e,Fragment as A,jsxs as E}from"react/jsx-runtime";import{Fragment as b}from"react";import{CARD_TEXT_SIZE as g,useCatalogCard as C}from"./card-row.js";import{bundleSaving as B}from"../../lib/commerce.js";import{useProductCardState as D}from"./ProductCardState.js";const v=`border px-2 py-1 font-mono ${g.labelSmall} uppercase tracking-[0.3em]`,x="absolute right-[18px] top-[18px] z-10",N="absolute left-[18px] top-[18px] z-10",G="absolute left-0 top-4 z-10 pointer-events-none flex flex-col items-start gap-1",R="absolute left-0 top-[52px] z-10 pointer-events-none flex flex-col items-start gap-1",w=`bg-accent px-3 py-2 font-mono ${g.labelSmall} uppercase tracking-[0.24em] text-bg`;function r({tone:s,children:t}){return e("span",{className:[v,s==="solid"?"border-accent bg-accent text-bg":"border-accent text-accent"].join(" "),children:t})}function T({show:s=!0,sale:t=!1,numbered:l=!1,axleSets:_=!1,edge:p=!1}){const o=D();if(!C()||o.kind==="tyre")return null;if(o.kind==="bundle"){const n=B(o.bundle,o.currency);return n&&p?e(S,{flags:[n]}):n?e("div",{className:`${x} pointer-events-none flex flex-col items-end gap-1`,children:e(r,{tone:"solid",children:n})}):null}const{wheel:h,price:f,isSet:c}=o,i=c||_?o.setWords:null,a=s?h.badge:null,d=c?e(r,{tone:"solid",children:"Set"}):null,m=[l?d:null,t&&f.onSale?e(r,{tone:"solid",children:"Sale"}):null,i?e(r,{tone:"outline",children:i}):a?e(r,{tone:a==="new"?"solid":"outline",children:a==="new"?"New":"Bestseller"}):null].filter(Boolean);if(p){const n=[c?"Set":null,t&&f.onSale?"Sale":null,i??(a?a==="new"?"New":"Bestseller":null)].filter(u=>!!u);return n.length?e(S,{flags:n,numbered:l}):null}return E(A,{children:[d&&!l&&e("div",{className:`${N} pointer-events-none flex flex-col items-start gap-1`,children:d}),m.length>0&&e("div",{className:`${x} pointer-events-none flex flex-col items-end gap-1`,children:m.map((n,u)=>e(b,{children:n},u))})]})}function S({flags:s,numbered:t=!1}){return e("div",{className:t?R:G,children:s.map(l=>e("span",{className:w,children:l},l))})}export{T as default};
@@ -0,0 +1,13 @@
1
+ export interface CardProductPictureSettings {
2
+ imageBackground?: unknown;
3
+ cardImage?: unknown;
4
+ coverIndex?: unknown;
5
+ indexBadge?: unknown;
6
+ showBadge?: unknown;
7
+ frame?: unknown;
8
+ setPicture?: unknown;
9
+ }
10
+ export declare const PICTURE_FRAMES: readonly ["well", "full"];
11
+ export type PictureFrame = (typeof PICTURE_FRAMES)[number];
12
+ export declare const DEFAULT_PICTURE_FRAME: PictureFrame;
13
+ export default function CardProductPicture(settings: CardProductPictureSettings): import("react").JSX.Element | null;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as m,Fragment as x}from"react/jsx-runtime";import P from"next/image";import{useState as W}from"react";import{CARD_INDEX_BADGE_CLASS as $,CARD_INDEX_CLASS as j,parseCardIndexFormat as X}from"efficient-web-builder/format/lib/sections/product-card-style";import{CARD_IMAGE_BG_OFF as z,cardImageBackgroundPaints as H,resolveCardImageBackground as B}from"efficient-web-builder/format/lib/content/card-image-background";import{cardImageShapeTokens as _}from"efficient-web-builder/format/lib/content/card-image-shape";import{sayCount as K}from"efficient-web-builder/format/lib/editor-words";import{parseSetPicture as Z,setSecondSrc as q}from"../../lib/wheels/set-mode.js";import{coverSrcForWheel as J,parseCoverIndex as Q,resolvePaintedSrc as V}from"../../lib/wheels/cover-rendering.js";import Y from"../WheelPlaceholder.js";import{cardSpinOf as ee}from"../card-spin.js";import{useGridCard as D}from"../GridCardTemplate.js";import R from"./CardPicture.js";import k from"./CardProductBadge.js";import{useHeldCardPicture as re}from"./useHeldCardPicture.js";import{useProductCardState as te}from"./ProductCardState.js";const Pe=["well","full"],ne="well",G=r=>r==="full"?"full":ne;function ae({children:r}){return e("div",{className:"h-full w-full transition-transform duration-500 motion-safe:group-hover:scale-[1.03]",children:r})}function L({fill:r,badge:a,children:o}){const c=H(r);return m("div",{className:`sf-card-image relative aspect-[4/3] overflow-hidden${c?"":" bg-surface"}`,style:c?{backgroundColor:r}:void 0,children:[o,a]})}function ie(r){const a=te();return a.kind==="bundle"?e(le,{state:a,...r}):a.kind!=="wheel"?null:e(se,{state:a,...r})}function le({state:r,imageBackground:a,cardImage:o,showBadge:c,frame:w}){const{bundle:l}=r,{imageSizes:g}=D(),f=G(w)==="full",s=l.components.length,t=l.image?f?e(P,{alt:l.name,src:l.image,fill:!0,sizes:g,className:"object-cover",draggable:!1}):e(P,{alt:l.name,src:l.image,width:1e3,height:1e3,sizes:g,className:"block h-full w-full object-cover",draggable:!1}):e("div",{className:"flex h-full w-full items-center justify-center font-mono text-[length:var(--size-label,12px)] uppercase tracking-[0.3em] text-fg-dim",children:K("{n} piece","{n} pieces",s,{})}),d=e(ae,{children:t}),p=B(a,z),u=c!==!1?e(k,{edge:f}):null;return e("div",{style:_(o),children:f?e(L,{fill:p,badge:u,children:d}):m(x,{children:[u,e(R,{image:d,imageBackgroundFill:p})]})})}function se({state:r,imageBackground:a,cardImage:o,coverIndex:c,indexBadge:w,showBadge:l,frame:g,setPicture:f}){const{wheel:s,sel:t,isSet:d}=r,{hover:p,imageSizes:u}=D(),C=ee(p),T=J(s,Q(c),t.finish?.name,t.shownSrc),[N,M]=W(()=>new Set),A=n=>{t.pictureFailed(n),M(h=>h.has(n)?h:new Set(h).add(n))},E=V({overrideSrc:T,hookSrc:t.shownSrc,failed:N}),v=(n,h)=>e(P,{alt:h,src:n,width:1e3,height:1e3,sizes:u,className:`block h-full w-full object-contain ${C.className}`,style:C.style,draggable:!1,onError:()=>A(n)},n),O=t.finish?`${s.name} — ${t.finish.name}`:s.name,S=d&&Z(f)==="pair",U=S?q(s.finishes?.find(n=>n.name===t.finish?.name),E):null,i=re({src:E,second:U,alt:O,sizes:u,failed:N,onFailed:A,near:t.nearScreen,holdEmpty:t.awaitingProbe}),y=m(x,{children:[i.src?v(i.src,i.alt):e(Y,{imageLabel:s.name,spin:C}),i.trial]}),F=X(w),b=F!=="off",I=B(a,z);if(G(g)==="full"){const n=m(x,{children:[b?e("span",{"aria-hidden":!0,"data-format":F,className:`${j} ${$}`}):null,e(k,{show:l!==!1,numbered:b,axleSets:!0,edge:!0})]});return e("div",{style:_(o),"data-set-picture":d&&!S?"one":void 0,children:e(L,{fill:I,badge:n,children:m("div",{className:"flex h-full w-full items-center justify-center",children:[y,i.second?v(i.second,`${i.alt} — right`):null]})})})}return m("div",{style:_(o),"data-set-picture":d&&!S?"one":void 0,children:[b?e("span",{"aria-hidden":!0,"data-format":F,className:`${j} ${$}`}):null,e(k,{show:l!==!1,numbered:b,axleSets:!0}),e(R,{image:y,imageSecond:i.second?v(i.second,`${i.alt} — right`):void 0,wide:S,imageBackgroundFill:I})]})}export{ne as DEFAULT_PICTURE_FRAME,Pe as PICTURE_FRAMES,ie as default};
@@ -1 +1 @@
1
- "use client";import{jsx as a,jsxs as m,Fragment as l}from"react/jsx-runtime";import{Fragment as i}from"react";import{applyCardAnswers as d}from"../../lib/content/field-usage.js";import{wheelCardSpecFacts as x}from"../../lib/wheels/plp-fitment-match.js";import{CARD_TEXT_SIZE as s,useCatalogCard as u}from"./card-row.js";import{useProductCardState as f}from"./ProductCardState.js";const g="whitespace-nowrap",h=t=>typeof t=="string"?t:t.text;function C(t,r="·"){return t.map((n,o)=>{const e=h(n),c=typeof n!="string"&&n.accent;return m(i,{children:[a("span",{className:`${g}${c?" text-accent":""}`,children:o<t.length-1?`${e} ${r}`:e}),o<t.length-1?" ":null]},e)})}function S({children:t}){const r=u();return a("div",{className:r?`mt-2 h-[38px] overflow-hidden [.sf-card-rows_&]:h-auto [.sf-card-rows_&]:max-h-[76px] font-mono ${s.labelLarge} leading-[19px] tracking-[0.14em] text-fg-dim`:`mt-[4px] font-mono ${s.labelLarge} tracking-[0.1em] text-fg-dim`,children:t})}function _({sizes:t=!1,car:r=null,separator:n,fieldUsage:o=[]}){const e=f();if(e.kind!=="wheel")return null;const c=d(x(e.wheel,r,{sizes:t}),o).map(p=>p.text);return a(l,{children:C(c,n)})}function w(t){return a(S,{children:a(_,{...t})})}export{g as CARD_SPEC_FIELD_CLASS,_ as CardSpecFacts,S as CardSpecLine,C as cardSpecFields,w as default};
1
+ "use client";import{jsx as n,Fragment as m,jsxs as p}from"react/jsx-runtime";import{Fragment as x}from"react";import{applyCardAnswers as u}from"../../lib/content/field-usage.js";import{wheelCardSpecFacts as h}from"../../lib/wheels/plp-fitment-match.js";import{CARD_TEXT_SIZE as i,useCatalogCard as f}from"./card-row.js";import{useProductCardState as g}from"./ProductCardState.js";const C="whitespace-nowrap",S=t=>typeof t=="string"?t:t.text,_=/^(.*\S) (\+\d+ more)$/;function w(t,r="·"){return t.map((a,c)=>{const e=S(a),l=typeof a!="string"&&a.accent,o=`${C}${l?" text-accent":""}`,d=c<t.length-1?`${e} ${r}`:e,s=_.exec(e);return p(x,{children:[s?p(m,{children:[n("span",{className:o,children:s[1]})," ",n("span",{className:o,children:c<t.length-1?`${s[2]} ${r}`:s[2]})]}):n("span",{className:o,children:d}),c<t.length-1?" ":null]},e)})}function $({children:t}){const r=f();return n("div",{className:r?`mt-2 h-[38px] overflow-hidden [.sf-card-rows_&]:h-auto [.sf-card-rows_&]:max-h-[76px] font-mono ${i.labelLarge} leading-[19px] tracking-[0.14em] text-fg-dim`:`mt-[4px] font-mono ${i.labelLarge} tracking-[0.1em] text-fg-dim`,children:t})}function F({sizes:t=!1,car:r=null,separator:a,fieldUsage:c=[]}){const e=g();if(e.kind!=="wheel")return null;const l=u(h(e.wheel,r,{sizes:t}),c).map(o=>o.text);return n(m,{children:w(l,a)})}function E(t){return n($,{children:n(F,{...t})})}export{C as CARD_SPEC_FIELD_CLASS,F as CardSpecFacts,$ as CardSpecLine,w as cardSpecFields,E as default};
@@ -1 +1 @@
1
- "use client";import{Fragment as l,jsx as r}from"react/jsx-runtime";import{say as i}from"efficient-web-builder/format/lib/editor-words";import{useHeroPriceStateOrNull as n,useProductCardStateOrNull as u}from"./ProductCardState.js";function m({label:t,editing:e,onHero:a=!1,children:o}){const s=n();return u()||a&&s?r(l,{children:o}):e?r("div",{"data-host-part-sample":"",className:"opacity-60",children:i(t)}):null}export{m as default};
1
+ "use client";import{Fragment as l,jsx as r}from"react/jsx-runtime";import{say as n}from"efficient-web-builder/format/lib/editor-words";import{useHeroStateOrNull as u,useProductCardStateOrNull as i}from"./ProductCardState.js";function m({label:t,editing:e,onHero:a=!1,children:o}){const s=u();return i()||a&&s?r(l,{children:o}):e?r("div",{"data-host-part-sample":"",className:"opacity-60",children:n(t)}):null}export{m as default};
@@ -1,8 +1,9 @@
1
1
  import { type ReactNode } from "react";
2
+ import type { CartLine } from "../CartContext.js";
2
3
  import { type TyreDetailState } from "../useTyreDetail.js";
3
4
  import type { TyrePlpCardProps } from "../TyrePlpCard.js";
4
5
  import { type PlpCardSelection } from "../wheels-plp/usePlpCardSelection.js";
5
- import type { Tyre, TyreVariant, WheelSummary } from "../../lib/api/index.js";
6
+ import type { Bundle, Tyre, TyreVariant, WheelSummary } from "../../lib/api/index.js";
6
7
  import { type SelectionPriceDisplay } from "../../lib/wheels/price-display.js";
7
8
  export interface WheelCardState {
8
9
  readonly kind: "wheel";
@@ -35,17 +36,31 @@ export interface TyreCardState {
35
36
  readonly unsellable: boolean;
36
37
  readonly editing: boolean;
37
38
  }
38
- export type ProductCardState = WheelCardState | TyreCardState;
39
- export interface HeroPriceState {
39
+ export interface BundleCardState {
40
+ readonly kind: "bundle";
41
+ readonly bundle: Bundle;
42
+ readonly currency: string;
43
+ }
44
+ export type ProductCardState = WheelCardState | TyreCardState | BundleCardState;
45
+ export interface HeroBuyState {
46
+ readonly isSet: boolean;
47
+ readonly priced: boolean;
48
+ readonly outOfStock: boolean;
49
+ readonly canAdd: boolean;
50
+ readonly totalLabel: string | null;
51
+ readonly lineToAdd: () => CartLine | null;
52
+ }
53
+ export interface HeroState {
40
54
  readonly kind: "hero";
41
55
  readonly msrpLabel: string | null;
42
56
  readonly amount: string;
43
57
  readonly unitLabel: string | null;
44
58
  readonly packBadge: string | null;
59
+ readonly buy: HeroBuyState | null;
45
60
  }
46
- export declare function useHeroPriceStateOrNull(): HeroPriceState | null;
47
- export declare function HeroPriceStateProvider({ value, children }: {
48
- value: HeroPriceState;
61
+ export declare function useHeroStateOrNull(): HeroState | null;
62
+ export declare function HeroStateProvider({ value, children }: {
63
+ value: HeroState;
49
64
  children: ReactNode;
50
65
  }): import("react").JSX.Element;
51
66
  export declare function useProductCardState(): ProductCardState;
@@ -58,6 +73,10 @@ export declare function WheelCardStateProvider({ wheel, colours, defaultFinish,
58
73
  editing?: boolean;
59
74
  children: ReactNode;
60
75
  }): import("react").JSX.Element;
76
+ export declare function BundleCardStateProvider({ bundle, children }: {
77
+ bundle: Bundle;
78
+ children: ReactNode;
79
+ }): import("react").JSX.Element;
61
80
  export declare function TyreCardStateProvider({ tyre, currency, editing, children, }: {
62
81
  tyre: TyreCardProduct;
63
82
  currency: string;
@@ -1 +1 @@
1
- "use client";import{jsx as P}from"react/jsx-runtime";import{createContext as z,useCallback as A,useContext as S,useMemo as N,useState as v}from"react";import{useCurrency as C}from"../CurrencyContext.js";import{useTyreDetail as W}from"../useTyreDetail.js";import{usePlpCardSelection as b}from"../wheels-plp/usePlpCardSelection.js";import{tyrePagePath as B}from"../../lib/tyres/tyre-page-path.js";import{canOrderTyreVariant as T}from"../../lib/tyres/tyre-purchase.js";import{resolveSelectionPrice as j}from"../../lib/wheels/price-display.js";import{setBuildLabel as E,setIsWide as H,summarySetBuild as L}from"../../lib/wheels/set-mode.js";const r=z(null);function K(){const e=S(r);return e?.kind==="hero"?e:null}function Q({value:e,children:n}){return P(r.Provider,{value:e,children:n})}function R(){const e=S(r);if(!e||e.kind==="hero")throw new Error("A product card piece was drawn outside a product card (no ProductCardState).");return e}function X(){const e=S(r);return e?.kind==="hero"?null:e}function Y(){const e=R();if(e.kind!=="wheel")throw new Error("A wheel card piece was drawn on a tyre card.");return e}const V=[];function Z({wheel:e,colours:n=V,defaultFinish:u,editing:l=!1,children:c}){const{currency:t}=C(),o=b(e,n,u),[d,f]=v(!1),i=L(e),a={kind:"wheel",wheel:e,sel:o,currency:t,price:j(e,o.selectedVariant,t,1),isSet:H(i),setWords:E(i),editing:l,notifyOpen:d,setNotifyOpen:f};return P(r.Provider,{value:a,children:c})}function $({tyre:e,currency:n,editing:u=!1,children:l}){const{currency:c}=C(),{slug:t}=e,o=B(t),[d,f]=v(!1),i=A(()=>{t&&f(!0)},[t]),{state:a,tyre:p}=W(t??null,d),s=N(()=>p?.variants??[],[p]),[x,w]=v(null),O=s.length===1?s[0].size:null,y=x??O,m=s.find(g=>g.size===y),h=a==="ready",k={kind:"tyre",tyre:e,currency:n,activeCurrency:c,pagePath:o,arm:i,detailState:a,detail:p,variants:s,chosen:y,setSize:w,variant:m,canAdd:m!=null&&T(m,c),detailReady:h,unsellable:!o||a==="error"||h&&s.length===0,editing:u};return P(r.Provider,{value:k,children:l})}export{Q as HeroPriceStateProvider,$ as TyreCardStateProvider,Z as WheelCardStateProvider,K as useHeroPriceStateOrNull,R as useProductCardState,X as useProductCardStateOrNull,Y as useWheelCardState};
1
+ "use client";import{jsx as l}from"react/jsx-runtime";import{createContext as b,useCallback as z,useContext as S,useMemo as A,useState as P}from"react";import{useCurrency as h}from"../CurrencyContext.js";import{useTyreDetail as B}from"../useTyreDetail.js";import{usePlpCardSelection as N}from"../wheels-plp/usePlpCardSelection.js";import{tyrePagePath as W}from"../../lib/tyres/tyre-page-path.js";import{canOrderTyreVariant as T}from"../../lib/tyres/tyre-purchase.js";import{resolveSelectionPrice as j}from"../../lib/wheels/price-display.js";import{setBuildLabel as E,setIsWide as H,summarySetBuild as L}from"../../lib/wheels/set-mode.js";const n=b(null);function J(){const e=S(n);return e?.kind==="hero"?e:null}function K({value:e,children:t}){return l(n.Provider,{value:e,children:t})}function R(){const e=S(n);if(!e||e.kind==="hero")throw new Error("A product card piece was drawn outside a product card (no ProductCardState).");return e}function Q(){const e=S(n);return e?.kind==="hero"?null:e}function X(){const e=R();if(e.kind!=="wheel")throw new Error(`A wheel card piece was drawn on a ${e.kind} card.`);return e}const V=[];function Y({wheel:e,colours:t=V,defaultFinish:o,editing:a=!1,children:u}){const{currency:r}=h(),s=N(e,t,o),[f,p]=P(!1),d=L(e),c={kind:"wheel",wheel:e,sel:s,currency:r,price:j(e,s.selectedVariant,r,1),isSet:H(d),setWords:E(d),editing:a,notifyOpen:f,setNotifyOpen:p};return l(n.Provider,{value:c,children:u})}function Z({bundle:e,children:t}){const{currency:o}=h(),a={kind:"bundle",bundle:e,currency:o};return l(n.Provider,{value:a,children:t})}function ee({tyre:e,currency:t,editing:o=!1,children:a}){const{currency:u}=h(),{slug:r}=e,s=W(r),[f,p]=P(!1),d=z(()=>{r&&p(!0)},[r]),{state:c,tyre:m}=B(r??null,f),i=A(()=>m?.variants??[],[m]),[x,k]=P(null),w=i.length===1?i[0].size:null,y=x??w,v=i.find(g=>g.size===y),C=c==="ready",O={kind:"tyre",tyre:e,currency:t,activeCurrency:u,pagePath:s,arm:d,detailState:c,detail:m,variants:i,chosen:y,setSize:k,variant:v,canAdd:v!=null&&T(v,u),detailReady:C,unsellable:!s||c==="error"||C&&i.length===0,editing:o};return l(n.Provider,{value:O,children:a})}export{Z as BundleCardStateProvider,K as HeroStateProvider,ee as TyreCardStateProvider,Y as WheelCardStateProvider,J as useHeroStateOrNull,R as useProductCardState,Q as useProductCardStateOrNull,X as useWheelCardState};
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from "react";
2
+ import type { PartStyles } from "efficient-web-builder/render/lib/document/part-styles";
3
+ export interface CardTextRegion {
4
+ nodeId?: string;
5
+ partStyles?: PartStyles;
6
+ editing: boolean;
7
+ }
8
+ export declare function regionAttr(region: CardTextRegion | undefined, key: string): Record<string, string>;
9
+ export declare function RegionWords({ region, at, children }: {
10
+ region?: CardTextRegion;
11
+ at: string;
12
+ children: ReactNode;
13
+ }): import("react").JSX.Element;
14
+ export declare function RegionBridge({ region, sectionType, children }: {
15
+ region?: CardTextRegion;
16
+ sectionType: string;
17
+ children: ReactNode;
18
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as o,jsx as n}from"react/jsx-runtime";import i from"efficient-web-builder/render/components/TextRegionRun";import{SectionTextParts as d}from"efficient-web-builder/render/lib/document/editing-bridges";import{TEXT_REGION_ATTR as p}from"efficient-web-builder/format/lib/sections/text-regions";function f(t,r){return t?.editing?{[p]:r}:{}}function c({region:t,at:r,children:e}){return t?n(i,{region:r,partStyles:t.partStyles,children:e}):n(o,{children:e})}function l({region:t,sectionType:r,children:e}){return!t?.editing||!t.nodeId?n(o,{children:e}):n(d,{nodeId:t.nodeId,sectionType:r,partStyles:t.partStyles,children:e})}export{l as RegionBridge,c as RegionWords,f as regionAttr};
@@ -1,3 +1,4 @@
1
+ import type { SelectedRanges } from "efficient-web-builder/render/lib/content/box-show-for";
1
2
  import type { FinishFamily } from "../../lib/api/index.js";
2
3
  import { type CatalogFilterState, type SortKey } from "../../lib/wheels/catalog-filters.js";
3
4
  import type { VehicleFitment } from "../../lib/wheels/plp-fitment-match.js";
@@ -34,8 +35,10 @@ interface CatalogFilterContextValue {
34
35
  publishVehicle: (v: CatalogVehicleState) => void;
35
36
  }
36
37
  export declare const COLLECTION_ATTR = "data-catalog-collection";
37
- export declare function CatalogFilterProvider({ children }: {
38
+ export declare function CatalogFilterProvider({ children, address, editing, }: {
38
39
  children: React.ReactNode;
40
+ address?: SelectedRanges | null;
41
+ editing?: boolean;
39
42
  }): import("react").JSX.Element;
40
43
  export declare function useCatalogFilter(): CatalogFilterContextValue;
41
44
  export {};
@@ -1 +1 @@
1
- "use client";import{jsx as Z}from"react/jsx-runtime";import{createContext as ee,useCallback as n,useContext as te,useEffect as oe,useMemo as se,useRef as k,useState as a}from"react";import{EMPTY_FILTERS as F}from"../../lib/wheels/catalog-filters.js";import{compareFinishFamily as ne}from"../../lib/wheels/finish-defaults.js";const q={fit:null,name:"",resolving:!1,unresolved:!1};function re(s,o){return s.fit===o.fit&&s.name===o.name&&s.resolving===o.resolving&&s.unresolved===o.unresolved}const r=()=>{},D=ee({filters:F,setProcess:r,setSize:r,setLugs:r,setFinish:r,setPriceMin:r,setPriceMax:r,setSort:r,clearAll:r,reportCount:r,total:0,reportLugs:r,lugOptions:[],reportSizes:r,sizeOptions:[],reportFinishes:r,finishOptions:[],reportCategories:r,categoryOptions:[],optionsReported:!1,scrollProcess:null,vehicle:q,publishVehicle:r}),B="data-catalog-collection",H=(s,o)=>s-o,ie=()=>0;function $(s,o){return s.length===o.length&&s.every((i,u)=>i===o[u])}function C(s){const o=k(new Map),[i,u]=a([]),d=n((p,f)=>{const g=o.current.get(p);if(g&&$(g,f))return;o.current.set(p,f);const v=new Set;for(const c of o.current.values())for(const h of c)v.add(h);const m=[...v].sort(s);u(c=>$(c,m)?c:m)},[s]);return[i,d]}function pe({children:s}){const[o,i]=a(F),u=n(t=>i(e=>({...e,process:t})),[]),d=n(t=>i(e=>({...e,size:t})),[]),p=n(t=>i(e=>({...e,lugs:t})),[]),f=n(t=>i(e=>({...e,finish:t})),[]),g=n(t=>i(e=>({...e,priceMin:t})),[]),v=n(t=>i(e=>({...e,priceMax:t})),[]),m=n(t=>i(e=>({...e,sort:t})),[]),c=n(()=>i(t=>({...F,sort:t.sort})),[]),[h,J]=a(q),L=n(t=>{J(e=>re(e,t)?e:t)},[]),E=k(new Map),[P,K]=a(0),x=n((t,e)=>{if(E.current.get(t)===e)return;E.current.set(t,e);let l=0;for(const R of E.current.values())l+=R;K(l)},[]),[w,z]=C(H),[M,T]=C(H),[_,A]=C(ne),[G,I]=C(ie),[y,O]=a(!1),N=n((t,e)=>{O(!0),z(t,e)},[z]),V=n((t,e)=>{O(!0),T(t,e)},[T]),U=n((t,e)=>{O(!0),A(t,e)},[A]),[Y,Q]=a(null);oe(()=>{let e=0;const S=()=>{e=0;let R=null;const X=document.querySelectorAll(`[${B}]`);for(const b of X){const j=b.getBoundingClientRect();if(j.top<=140&&j.bottom>140){R=b.getAttribute(B)??null;break}}Q(R)},l=()=>{e||(e=requestAnimationFrame(S))};return S(),window.addEventListener("scroll",l,{passive:!0}),window.addEventListener("resize",l),()=>{window.removeEventListener("scroll",l),window.removeEventListener("resize",l),e&&cancelAnimationFrame(e)}},[]);const W=se(()=>({filters:o,setProcess:u,setSize:d,setLugs:p,setFinish:f,setPriceMin:g,setPriceMax:v,setSort:m,clearAll:c,reportCount:x,total:P,reportLugs:N,lugOptions:w,reportSizes:V,sizeOptions:M,reportFinishes:U,finishOptions:_,reportCategories:I,categoryOptions:G,optionsReported:y,scrollProcess:Y,vehicle:h,publishVehicle:L}),[o,u,d,p,f,g,v,m,c,x,P,N,w,V,M,U,_,I,G,y,Y,h,L]);return Z(D.Provider,{value:W,children:s})}function fe(){return te(D)}export{B as COLLECTION_ATTR,pe as CatalogFilterProvider,q as NO_VEHICLE,fe as useCatalogFilter};
1
+ "use client";import{jsx as D}from"react/jsx-runtime";import{createContext as oe,useCallback as n,useContext as se,useEffect as ne,useMemo as re,useRef as B,useState as p}from"react";import{EMPTY_FILTERS as F}from"../../lib/wheels/catalog-filters.js";import{compareFinishFamily as ie}from"../../lib/wheels/finish-defaults.js";import{ShopperScopeProvider as ce}from"./ShopperScope.js";const H={fit:null,name:"",resolving:!1,unresolved:!1};function le(s,o){return s.fit===o.fit&&s.name===o.name&&s.resolving===o.resolving&&s.unresolved===o.unresolved}const r=()=>{},$=oe({filters:F,setProcess:r,setSize:r,setLugs:r,setFinish:r,setPriceMin:r,setPriceMax:r,setSort:r,clearAll:r,reportCount:r,total:0,reportLugs:r,lugOptions:[],reportSizes:r,sizeOptions:[],reportFinishes:r,finishOptions:[],reportCategories:r,categoryOptions:[],optionsReported:!1,scrollProcess:null,vehicle:H,publishVehicle:r}),J="data-catalog-collection",K=(s,o)=>s-o,ue=()=>0;function Q(s,o){return s.length===o.length&&s.every((a,u)=>a===o[u])}function S(s){const o=B(new Map),[a,u]=p([]),i=n((f,d)=>{const g=o.current.get(f);if(g&&Q(g,d))return;o.current.set(f,d);const m=new Set;for(const c of o.current.values())for(const h of c)m.add(h);const v=[...m].sort(s);u(c=>Q(c,v)?c:v)},[s]);return[a,i]}function me({children:s,address:o=null,editing:a=!1}){const[u,i]=p(F),f=n(t=>i(e=>({...e,process:t})),[]),d=n(t=>i(e=>({...e,size:t})),[]),g=n(t=>i(e=>({...e,lugs:t})),[]),m=n(t=>i(e=>({...e,finish:t})),[]),v=n(t=>i(e=>({...e,priceMin:t})),[]),c=n(t=>i(e=>({...e,priceMax:t})),[]),h=n(t=>i(e=>({...e,sort:t})),[]),L=n(()=>i(t=>({...F,sort:t.sort})),[]),[P,W]=p(H),x=n(t=>{W(e=>le(e,t)?e:t)},[]),C=B(new Map),[w,X]=p(0),z=n((t,e)=>{if(C.current.get(t)===e)return;C.current.set(t,e);let l=0;for(const R of C.current.values())l+=R;X(l)},[]),[M,T]=S(K),[_,A]=S(K),[G,I]=S(ie),[y,N]=S(ue),[V,E]=p(!1),U=n((t,e)=>{E(!0),T(t,e)},[T]),Y=n((t,e)=>{E(!0),A(t,e)},[A]),b=n((t,e)=>{E(!0),I(t,e)},[I]),[j,Z]=p(null);ne(()=>{let e=0;const O=()=>{e=0;let R=null;const te=document.querySelectorAll(`[${J}]`);for(const k of te){const q=k.getBoundingClientRect();if(q.top<=140&&q.bottom>140){R=k.getAttribute(J)??null;break}}Z(R)},l=()=>{e||(e=requestAnimationFrame(O))};return O(),window.addEventListener("scroll",l,{passive:!0}),window.addEventListener("resize",l),()=>{window.removeEventListener("scroll",l),window.removeEventListener("resize",l),e&&cancelAnimationFrame(e)}},[]);const ee=re(()=>({filters:u,setProcess:f,setSize:d,setLugs:g,setFinish:m,setPriceMin:v,setPriceMax:c,setSort:h,clearAll:L,reportCount:z,total:w,reportLugs:U,lugOptions:M,reportSizes:Y,sizeOptions:_,reportFinishes:b,finishOptions:G,reportCategories:N,categoryOptions:y,optionsReported:V,scrollProcess:j,vehicle:P,publishVehicle:x}),[u,f,d,g,m,v,c,h,L,z,w,U,M,Y,_,b,G,N,y,V,j,P,x]);return D($.Provider,{value:ee,children:D(ce,{address:o,editing:a,children:s})})}function ve(){return se($)}export{J as COLLECTION_ATTR,me as CatalogFilterProvider,H as NO_VEHICLE,ve as useCatalogFilter};
@@ -0,0 +1,4 @@
1
+ export default function ClearAllButton({ onClick, size, }: {
2
+ onClick: () => void;
3
+ size?: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as o}from"react/jsx-runtime";import{say as r}from"efficient-web-builder/format/lib/editor-words";import{CATALOG_TEXT_SIZE as l}from"../../lib/sections/catalog-text-size.js";function n({onClick:t,size:e=l.labelSmall}){return o("button",{type:"button",onClick:t,className:`cursor-pointer font-mono ${e} uppercase tracking-[0.16em] text-accent hover:text-fg`,children:r("Clear all")})}export{n as default};
@@ -1,5 +1,6 @@
1
1
  import type React from "react";
2
- export declare function PillButton({ label, badge, open, onToggle, controls, buttonRef, }: {
2
+ export declare function PillButton({ labelSize, label, badge, open, onToggle, controls, buttonRef, }: {
3
+ labelSize?: string;
3
4
  label: React.ReactNode;
4
5
  badge: number;
5
6
  open: boolean;
@@ -7,7 +8,8 @@ export declare function PillButton({ label, badge, open, onToggle, controls, but
7
8
  controls?: string;
8
9
  buttonRef?: React.Ref<HTMLButtonElement>;
9
10
  }): React.JSX.Element;
10
- export declare function FilterPill({ label, badge, open, onToggle, children, }: {
11
+ export declare function FilterPill({ labelSize, label, badge, open, onToggle, children, }: {
12
+ labelSize?: string;
11
13
  name: string;
12
14
  label: React.ReactNode;
13
15
  badge: number;
@@ -1 +1 @@
1
- "use client";import{jsx as i,jsxs as m}from"react/jsx-runtime";import{useEffect as x,useId as g,useRef as f}from"react";const l={body:"text-[length:var(--size-body,11px)]",labelSmall:"text-[length:var(--size-label,12px)]",labelLarge:"text-[length:var(--size-label,13px)]"};function h({label:n,badge:r,open:e,onToggle:t,controls:c,buttonRef:s}){const o=r>0;return m("button",{ref:s,type:"button","aria-haspopup":"dialog","aria-expanded":e,"aria-controls":c,onClick:t,className:[`inline-flex items-center gap-2 whitespace-nowrap border px-4 py-3 font-mono ${l.labelLarge} uppercase tracking-[0.2em] transition-colors`,o?"border-accent text-accent":"border-line hover:border-fg-dim"].join(" "),style:o?void 0:{color:"color-mix(in oklab, currentColor 80%, transparent)"},children:[n,r>0&&i("span",{className:`px-2 ${l.body} tracking-[0.1em] text-bg`,style:{background:"var(--accent)"},children:r}),i("span",{className:`${l.body} opacity-65 transition-transform ${e?"rotate-180":""}`,children:"▾"})]})}function k({label:n,badge:r,open:e,onToggle:t,children:c}){const s=g(),o=f(null),u=f(null);return x(()=>{if(!e)return;const a=o.current?.ownerDocument??document,p=d=>{d.key==="Escape"&&(t(),u.current?.focus())},b=d=>{o.current?.contains(d.target)||t()};return a.addEventListener("keydown",p),a.addEventListener("pointerdown",b),()=>{a.removeEventListener("keydown",p),a.removeEventListener("pointerdown",b)}},[e,t]),m("div",{ref:o,className:"relative",children:[i(h,{label:n,badge:r,open:e,onToggle:t,controls:e?s:void 0,buttonRef:u}),e&&i("div",{id:s,className:"absolute left-0 top-[calc(100%+6px)] z-[60] min-w-[280px] border border-line bg-surface p-5 shadow-[0_24px_60px_rgba(0,0,0,0.4)]",onClick:a=>a.stopPropagation(),children:c})]})}function w({children:n}){return i("div",{className:`mb-3 font-mono ${l.labelSmall} uppercase tracking-[0.32em] text-fg-dim`,children:n})}function E({active:n,onClick:r,children:e,role:t,ariaChecked:c}){return i("button",{type:"button",role:t,"aria-checked":t==="radio"?c:void 0,onClick:r,className:[`border px-3 py-2 font-mono ${l.labelLarge} uppercase tracking-[0.18em] transition-colors`,n?"border-accent bg-accent text-bg":"border-line hover:border-fg-dim"].join(" "),style:n?void 0:{color:"color-mix(in oklab, currentColor 75%, transparent)"},children:e})}export{k as FilterPill,E as OptButton,w as PanelTitle,h as PillButton};
1
+ "use client";import{jsx as i,jsxs as b}from"react/jsx-runtime";import{useEffect as g,useId as k,useRef as x}from"react";import{CATALOG_TEXT_SIZE as s}from"../../lib/sections/catalog-text-size.js";function h({labelSize:r=s.labelLarge,label:c,badge:t,open:e,onToggle:n,controls:d,buttonRef:l}){const o=t>0;return b("button",{ref:l,type:"button","aria-haspopup":"dialog","aria-expanded":e,"aria-controls":d,onClick:n,className:[`inline-flex items-center gap-2 whitespace-nowrap border px-4 py-3 font-mono ${r} uppercase tracking-[0.2em] transition-colors`,o?"border-accent text-accent":"border-line hover:border-fg-dim"].join(" "),style:o?void 0:{color:"color-mix(in oklab, currentColor 80%, transparent)"},children:[c,t>0&&i("span",{className:`px-2 ${s.badge} tracking-[0.1em] text-bg`,style:{background:"var(--accent)"},children:t}),i("span",{className:`${s.badge} opacity-65 transition-transform ${e?"rotate-180":""}`,children:"▾"})]})}function w({labelSize:r,label:c,badge:t,open:e,onToggle:n,children:d}){const l=k(),o=x(null),p=x(null);return g(()=>{if(!e)return;const a=o.current?.ownerDocument??document,m=u=>{u.key==="Escape"&&(n(),p.current?.focus())},f=u=>{o.current?.contains(u.target)||n()};return a.addEventListener("keydown",m),a.addEventListener("pointerdown",f),()=>{a.removeEventListener("keydown",m),a.removeEventListener("pointerdown",f)}},[e,n]),b("div",{ref:o,className:"relative",children:[i(h,{labelSize:r,label:c,badge:t,open:e,onToggle:n,controls:e?l:void 0,buttonRef:p}),e&&i("div",{id:l,className:"absolute left-0 top-[calc(100%+6px)] z-[60] min-w-[280px] border border-line bg-surface p-5 shadow-[0_24px_60px_rgba(0,0,0,0.4)]",onClick:a=>a.stopPropagation(),children:d})]})}function _({children:r}){return i("div",{className:`mb-3 font-mono ${s.labelSmall} uppercase tracking-[0.32em] text-fg-dim`,children:r})}function L({active:r,onClick:c,children:t,role:e,ariaChecked:n}){return i("button",{type:"button",role:e,"aria-checked":e==="radio"?n:void 0,onClick:c,className:[`border px-3 py-2 font-mono ${s.labelLarge} uppercase tracking-[0.18em] transition-colors`,r?"border-accent bg-accent text-bg":"border-line hover:border-fg-dim"].join(" "),style:r?void 0:{color:"color-mix(in oklab, currentColor 75%, transparent)"},children:t})}export{w as FilterPill,L as OptButton,_ as PanelTitle,h as PillButton};
@@ -0,0 +1,13 @@
1
+ import type { SlotComponent } from "efficient-easel/blocks";
2
+ import type { FirstShown } from "../../lib/wheels/shopper-first-paint.js";
3
+ export default function ShopperChips({ owner, showCount, showClear, showSort, firstShown, editing, }: {
4
+ owner: {
5
+ id: string;
6
+ template?: SlotComponent;
7
+ };
8
+ showCount: boolean;
9
+ showClear: boolean;
10
+ showSort: boolean;
11
+ firstShown?: FirstShown;
12
+ editing?: boolean;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,Fragment as C,jsxs as L}from"react/jsx-runtime";import{CardTemplateRows as N}from"efficient-web-builder/render/components/CardRowContext";import{cardRow as G}from"efficient-web-builder/format/lib/content/card-template";import{say as K}from"efficient-web-builder/format/lib/editor-words";import{useCurrency as O}from"../CurrencyContext.js";import{formatPrice as B}from"../../lib/commerce.js";import{filterChipItems as I,filterStateWithoutChip as Y}from"../../lib/sections/filter-option-rows.js";import{PlpResultRange as T,PlpToolbar as R}from"../wheels-plp/PlpToolbar.js";import S from"./ClearAllButton.js";import A from"./SortSelect.js";import{hasActivePlpFilters as j,plpSortKeysFor as M,PLP_SORT_LABELS as U}from"../../lib/wheels/plp-filters.js";import{itemKind as W,plpKindNoun as X}from"../../lib/catalog/plp-item.js";import{CATALOG_TEXT_SIZE as Z}from"../../lib/sections/catalog-text-size.js";import{EMPTY_PLP_FILTERS as $}from"../../lib/wheels/plp-filters.js";import{GALLERY_SORT_KEYS as q,GALLERY_SORT_LABELS as z}from"../../lib/sections/gallery-toolbar.js";import{useShopperMember as D}from"./ShopperScope.js";const H="✕";function J({owner:n,showCount:r,showClear:l,showSort:s,firstShown:t,editing:a}){const{ref:i,scope:o,gallery:f}=D("chips",null,{count:r,sort:s}),{currency:c}=O(),m=(!o?.live&&t?{state:o?.state??{...$,sort:t.sort},update:()=>{},clear:()=>{},total:t.total,range:t.range,kinds:t.kinds}:null)??(o?{...o,kinds:[...new Set(o.rows.map(W))]}:null);if(!m&&f)return e("div",{ref:i,"data-shopper-chips":"",children:e(Q,{owner:n,gallery:f,showCount:r,showClear:l,showSort:s,editing:a})});if(!m)return e("div",{ref:i,"data-shopper-chips":"",children:a&&e("p",{className:`font-mono ${Z.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:"Filter chips show the picks of a Filters block, or the Tags of a Gallery, in this Box"})});const{state:d,update:u,clear:_,total:p,range:v,kinds:h}=m,x=X(h.length?h:["alloy-wheel"]),E=j(d),y=I(d,c,B).map(g=>({...g,mark:H,press:()=>u(F=>Y(F,g))})),P=L(C,{children:[r&&e("div",{"data-shopper-count":"",className:"contents",children:e(T,{total:p,range:v??{from:p?1:0,to:p},noun:x})}),y.length>0&&e(b,{owner:n,chips:y,editing:a}),l&&E&&e(S,{onClick:_})]}),w=M(h.length?h:["alloy-wheel"]);return e("div",{ref:i,"data-shopper-chips":"",children:e(R,{start:P,end:s?e(A,{value:d.sort,keys:w,labels:U,onChange:g=>u({sort:g,page:1})}):void 0})})}function b({owner:n,chips:r,selected:l,editing:s}){return e("ul",{className:"flex list-none flex-wrap items-center gap-2",children:e(N,{ownerId:n.id,ownerType:"FilterChipsBlock",Template:n.template,rows:r.map(G),items:r,states:l===void 0?void 0:r.map((t,a)=>a===l?{selected:!0}:void 0),actions:s?void 0:r.map(t=>({press:t.press})),fallback:null,wrapCopy:t=>e("li",{children:t}),children:t=>t})})}function Q({owner:n,gallery:r,showCount:l,showClear:s,showSort:t,editing:a}){const{tags:i,tag:o,sort:f,shown:c,pick:k,setSort:m,clear:d}=r,u=[{label:K("All"),mark:"",press:()=>k(null)},...i.map(p=>({label:p,mark:"",press:()=>k(p)}))],_=L(C,{children:[l&&e("div",{"data-shopper-count":"",className:"contents",children:e(T,{total:c,range:{from:c?1:0,to:c},noun:V})}),i.length>0&&e(b,{owner:n,chips:u,selected:o===null?0:i.indexOf(o)+1,editing:a}),s&&o!==null&&e(S,{onClick:d})]});return e(R,{start:_,end:t?e(A,{value:f,keys:q,labels:z,onChange:m}):void 0})}const V={many:"items"};export{J as default};
@@ -0,0 +1,20 @@
1
+ import type { SlotComponent } from "efficient-easel/blocks";
2
+ import { type PlpItem } from "../../lib/catalog/plp-item.js";
3
+ import type { FieldUsageAnswer } from "../../lib/content/field-usage.js";
4
+ import { type PlpSortKey } from "../../lib/wheels/plp-filters.js";
5
+ import type { FilterLook, FilterLookPhone, ShownFilter } from "../../lib/sections/shopper-filters.js";
6
+ export default function ShopperFilters({ owner, look, lookPhone, shown, showSort, openingSort, filtersBelow, fieldUsage, firstRows, editing, }: {
7
+ owner: {
8
+ id: string;
9
+ template?: SlotComponent;
10
+ };
11
+ look: FilterLook;
12
+ lookPhone: FilterLookPhone;
13
+ shown: readonly ShownFilter[];
14
+ showSort: boolean;
15
+ openingSort: PlpSortKey;
16
+ filtersBelow: boolean;
17
+ fieldUsage?: readonly FieldUsageAnswer[];
18
+ firstRows?: readonly PlpItem[];
19
+ editing?: boolean;
20
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as l,Fragment as G,jsxs as d}from"react/jsx-runtime";import{useCallback as K,useMemo as F,useState as z}from"react";import{say as W}from"efficient-web-builder/format/lib/editor-words";import{CardTemplateRows as ee}from"efficient-web-builder/render/components/CardRowContext";import{cardRow as le}from"efficient-web-builder/format/lib/content/card-template";import{useCurrency as te}from"../CurrencyContext.js";import{useEnglish as re}from"../EnglishVariant.js";import ne from"./ClearAllButton.js";import se from"./PriceRange.js";import oe from"./SortSelect.js";import{DEFAULT_CATALOG_FILTER_LABELS as U}from"../../lib/content/catalog-filter-labels.js";import{itemKind as X}from"../../lib/catalog/plp-item.js";import{itemLugs as ie,lugFilterLabel as ce}from"../../lib/wheels/lug-count.js";import{CATALOG_TEXT_SIZE as L}from"../../lib/sections/catalog-text-size.js";import{buildPlpFacets as ae,itemMatchesPlp as ue,plpInStockCount as pe,plpPriceBounds as me,plpSortKeysFor as de,PLP_ONE_VALUE_MAX as fe,PLP_SORT_LABELS as ge}from"../../lib/wheels/plp-filters.js";import{FILTER_IN_STOCK_KEY as he,FILTER_PRICE_KEY as T,filterGroupItems as Se}from"../../lib/sections/filter-option-rows.js";import{hasActivePlpFilters as xe}from"../../lib/wheels/plp-filters.js";import{FilterPill as be,PillButton as we}from"./FilterPill.js";import{useShopperFilter as ye}from"./ShopperScope.js";const Y="lugs";function ke({owner:r,look:e,lookPhone:n,shown:s,showSort:c,openingSort:i,filtersBelow:t,fieldUsage:u,firstRows:b,editing:N}){const{currency:p}=te(),M=re(),{ref:V,scope:f}=ye({filtersBelow:t,openingSort:i}),{state:g}=f,h=f.live?f.rows:b??f.rows,w=F(()=>[...new Set(h.map(X))],[h]),A=F(()=>{const a=ae(h,g,p,w,u??[],"pass").filter(o=>o.key!=="collections"||s.includes("category"));if(s.includes("lugs")){const o=Ne(h,g,p);o&&a.push(o)}return a.map(o=>({...o,label:M(o.label)}))},[h,g,p,w,u,s,M]),I=s.includes("price")?me(h,p):null,P=s.includes("inStock")&&h.length>0?pe(h,g,p):null,Z=de(w.length?w:["alloy-wheel"]),y=f.update,v=K(a=>y({...a,page:1}),[y]),B=K((a,o)=>y(m=>{if(a===Y){const x=Number(o),J=(m.lugs??[]).includes(x);return{...m,page:1,lugs:J?(m.lugs??[]).filter(Q=>Q!==x):[...m.lugs??[],x]}}const _=m[a].map(String),j=_.includes(o)?_.filter(x=>x!==o):[..._,o];return{...m,page:1,[a]:a==="diameters"?j.map(Number):j}}),[y]),$=c&&!f.sortInChips,q=F(()=>{const a=Se(A,g,P).map(o=>({...o,options:o.options.map(m=>({...m,press:o.key===he?()=>v({inStockOnly:!g.inStockOnly}):()=>B(o.key,m.value)}))}));return I?[...a,{key:T,label:U.price,options:[]}]:a},[A,g,P,I,v,B]),S={owner:r,items:q,state:g,sorts:Z,showSort:$,set:v,clear:f.clear},O=e==="rail"?l(H,{...S}):l(E,{...S,columns:e==="bar-columns"}),R=(n==="rail"?e==="rail":n==="bar"&&e!=="rail")?null:n==="button"?l(ve,{...S}):n==="rail"?l(H,{...S}):l(E,{...S,columns:!1});return d("div",{ref:V,"data-shopper-filters":"",className:"w-full",children:[R?d(G,{children:[l("div",{className:"max-view-wide:hidden",children:O}),l("div",{className:"view-wide:hidden",children:R})]}):O,N&&f.grids===0&&l("p",{className:`mt-2 font-mono ${L.labelSmall} uppercase tracking-[0.2em] text-fg-dim`,children:"Filters a Product Grid in this Box"})]})}function Ne(r,e,n){const s=new Map,c=new Set;for(const t of r){const u=X(t)==="alloy-wheel"?ie(t):null;u!==null&&(c.add(u),ue(t,e,n,"lugs","pass")&&s.set(u,(s.get(u)??0)+1))}if(c.size<=fe)return null;const i=e.lugs??[];return{key:Y,label:U.lugs,options:[...c].sort((t,u)=>t-u).map(t=>({value:String(t),label:ce(t),count:s.get(t)??0,checked:i.includes(t),swatch:null}))}}function k({state:r,sorts:e,set:n}){return l(oe,{value:r.sort,keys:e,labels:ge,onChange:s=>n({sort:s})})}function D(r,e){return r.key===T?(e.priceMin!=null?1:0)+(e.priceMax!=null?1:0):r.options.filter(n=>n.state.selected).length}function C({owner:r,items:e,state:n,set:s,wrap:c}){const i=(t,u)=>{const b=e[u.index],N=b.key===T?d(G,{children:[t,l(se,{min:n.priceMin,max:n.priceMax,onMin:p=>s({priceMin:p}),onMax:p=>s({priceMax:p})})]}):t;return c(N,b)};return l(ee,{ownerId:r.id,ownerType:"FilterBlock",Template:r.template,rows:e.map(le),items:e,fallback:null,wrapCopy:i,children:t=>t})}function E({columns:r,...e}){const[n,s]=z(null),c=i=>()=>s(t=>t===i?null:i);return r?d("div",{className:"flex flex-col gap-4",children:[l("div",{className:"grid grid-cols-[repeat(auto-fit,minmax(200px,1fr))] gap-6 border-y border-line py-4",children:l(C,{...e,wrap:(i,t)=>l("div",{children:i},t.key)})}),e.showSort&&l("div",{className:"flex flex-wrap items-center justify-end gap-4",children:l(k,{...e})})]}):d("div",{className:"flex flex-wrap items-center gap-2",children:[l(C,{...e,wrap:(i,t)=>l(be,{labelSize:L.labelSmall,name:t.key,label:t.label,badge:D(t,e.state),open:n===t.key,onToggle:c(t.key),children:i},t.key)}),e.showSort&&l("div",{className:"ml-auto",children:l(k,{...e})})]})}function H(r){return d("aside",{className:"flex w-full flex-col gap-4 lg:w-[268px]",children:[d("div",{className:"flex items-center justify-between",children:[l("h2",{className:"font-display text-[18px] font-medium uppercase tracking-[-0.01em]",children:W("Filter")}),xe(r.state)&&l(ne,{onClick:r.clear})]}),l("div",{className:"flex flex-col",children:l(C,{...r,wrap:(e,n)=>l("div",{className:"border-t border-line py-4",children:e},n.key)})}),r.showSort&&l(k,{...r})]})}function ve(r){const[e,n]=z(!1),s=r.items.reduce((c,i)=>c+D(i,r.state),0);return d("div",{className:"flex flex-col gap-4",children:[d("div",{className:"flex items-center justify-between gap-4",children:[l(we,{labelSize:L.labelSmall,label:"Filters",badge:s,open:e,onToggle:()=>n(c=>!c)}),r.showSort&&l(k,{...r})]}),e&&l(E,{...r,columns:!0,showSort:!1})]})}export{ke as default};
@@ -0,0 +1,72 @@
1
+ import { useEffect, type ComponentType, type ReactNode } from "react";
2
+ import { type SelectedRanges } from "efficient-web-builder/render/lib/content/box-show-for";
3
+ import type { PlpItem } from "../../lib/catalog/plp-item.js";
4
+ import { type PlpFilterState, type PlpSortKey } from "../../lib/wheels/plp-filters.js";
5
+ import { type ShopperAddressMark as AddressMark } from "../../lib/wheels/selected-ranges.js";
6
+ import { type GallerySortKey, type GalleryTile, type GalleryToolbarState } from "../../lib/sections/gallery-toolbar.js";
7
+ export declare const useIsoLayoutEffect: typeof useEffect;
8
+ type Patch = Partial<PlpFilterState> | ((f: PlpFilterState) => PlpFilterState);
9
+ export interface GridShown {
10
+ total: number;
11
+ range: {
12
+ from: number;
13
+ to: number;
14
+ } | null;
15
+ }
16
+ export interface ChipParts {
17
+ count: boolean;
18
+ sort: boolean;
19
+ }
20
+ export declare function ShopperScopeProvider({ children, address: stamped, editing, }: {
21
+ children: ReactNode;
22
+ address?: SelectedRanges | null;
23
+ editing?: boolean;
24
+ }): import("react").JSX.Element;
25
+ export declare function ShopperAddressMark({ mark, children }: {
26
+ mark: AddressMark | null;
27
+ children?: ReactNode;
28
+ }): import("react").JSX.Element;
29
+ export declare function withShopperAddressMark<P extends Record<string, unknown>>(Draw: ComponentType<P>): (props: P) => ReactNode;
30
+ export interface ShopperScope {
31
+ key: string;
32
+ live: boolean;
33
+ state: PlpFilterState;
34
+ update: (patch: Patch) => void;
35
+ clear: () => void;
36
+ rows: readonly PlpItem[];
37
+ total: number;
38
+ grids: number;
39
+ countInChips: boolean;
40
+ sortInChips: boolean;
41
+ range: {
42
+ from: number;
43
+ to: number;
44
+ } | null;
45
+ }
46
+ export declare function useShopperFilter({ filtersBelow, openingSort, }: {
47
+ filtersBelow: boolean;
48
+ openingSort: PlpSortKey;
49
+ }): {
50
+ ref: (el: Element | null) => void;
51
+ scope: ShopperScope;
52
+ };
53
+ export declare function useShopperMember(role: "chips" | "grid", rows?: readonly PlpItem[] | null, parts?: ChipParts): {
54
+ ref: (el: Element | null) => void;
55
+ scope: ShopperScope | null;
56
+ reportShown: (shown: GridShown | null) => void;
57
+ gallery: GalleryToolbarScope | null;
58
+ };
59
+ export interface GalleryToolbarScope {
60
+ tags: readonly string[];
61
+ tag: string | null;
62
+ sort: GallerySortKey;
63
+ shown: number;
64
+ pick: (tag: string | null) => void;
65
+ setSort: (sort: GallerySortKey) => void;
66
+ clear: () => void;
67
+ }
68
+ export declare function useShopperGallery(tiles: readonly GalleryTile[]): {
69
+ ref: (el: Element | null) => void;
70
+ toolbar: GalleryToolbarState | null;
71
+ };
72
+ export {};
@@ -0,0 +1,3 @@
1
+ "use client";import{jsx as M}from"react/jsx-runtime";import{createContext as U,useCallback as k,useContext as R,useEffect as A,useId as ct,useLayoutEffect as it,useMemo as b,useRef as V,useState as I}from"react";import{useBoxId as ut}from"efficient-web-builder/render/components/InBoxContext";import{SelectedRangesProvider as ft}from"efficient-web-builder/render/lib/content/box-show-for";import{EMPTY_PLP_FILTERS as x,plpFiltersToParams as j}from"../../lib/wheels/plp-filters.js";import{VEHICLE_PARAM as pt}from"../../lib/wheels/plp-vehicle-params.js";import{readSelectedRanges as dt,shopperAddressMarkOf as wt}from"../../lib/wheels/selected-ranges.js";import{resolveGalleryFollows as gt,resolveShopperScopes as ht}from"../../lib/wheels/shopper-scope.js";import{clampGalleryTag as St,EMPTY_GALLERY_TOOLBAR as Y,galleryShownIds as mt,galleryTags as Pt}from"../../lib/sections/gallery-toolbar.js";import{filtersFromQuery as _t,watchLocation as kt}from"../wheels-plp/usePlpFiltersInUrl.js";const vt=typeof window<"u",E=vt?it:A,L=U(null),xt={assign:new Map,states:{},rows:{},shown:{},chipParts:{},galleryFollow:new Map,tiles:{},galleryStates:{}};function W(o,r){if(o.size!==r.size)return!1;for(const[u,s]of o)if(r.get(u)!==s)return!1;return!0}function X(o,r){return typeof r=="function"?r(o):{...o,...r}}function Ct(o,r){return j(o).toString()===j(r).toString()}function zt({children:o,address:r=null,editing:u=!1}){const s=V(new Map),[l,f]=I(xt),[p,d]=I(0),w=!u&&r?JSON.stringify(r):"",c=b(()=>w?r:null,[w]),[g,P]=I(null),_=k((t,n,e)=>{if(s.current.set(t.key,t),t.role==="filter"){const a=n??x;f(i=>i.states[t.key]?i:{...i,states:{...i.states,[t.key]:a}}),e&&P(i=>i??{key:t.key,opening:a.sort})}d(a=>a+1)},[]),S=k(t=>{P(n=>n?.key===t?null:n),s.current.delete(t),f(n=>{if(!(t in n.states)&&!(t in n.rows)&&!(t in n.shown)&&!(t in n.chipParts)&&!(t in n.tiles)&&!(t in n.galleryStates))return n;const{[t]:e,...a}=n.states,{[t]:i,...m}=n.rows,{[t]:C,...ot}=n.shown,{[t]:It,...st}=n.chipParts,{[t]:Tt,...lt}=n.tiles,{[t]:yt,...at}=n.galleryStates;return{...n,states:a,rows:m,shown:ot,chipParts:st,tiles:lt,galleryStates:at}}),d(n=>n+1)},[]);A(()=>{if(p===0)return;const t=[...s.current.values()],n=ht(t),e=gt(t);f(a=>{const i=W(a.assign,n),m=W(a.galleryFollow,e);return i&&m?a:{...a,assign:i?a.assign:n,galleryFollow:m?a.galleryFollow:e}})},[p]);const v=k((t,n)=>{f(e=>{const a=e.states[t];return a?{...e,states:{...e.states,[t]:X(a,n)}}:e})},[]),T=k((t,n)=>{f(e=>{if(n===null){if(!(t in e.rows))return e;const{[t]:a,...i}=e.rows;return{...e,rows:i}}return e.rows[t]===n?e:{...e,rows:{...e.rows,[t]:n}}})},[]),y=k((t,n)=>{f(e=>{if(n===null){if(!(t in e.shown))return e;const{[t]:m,...C}=e.shown;return{...e,shown:C}}const a=e.shown[t];return a&&a.total===n.total&&a.range?.from===n.range?.from&&a.range?.to===n.range?.to?e:{...e,shown:{...e.shown,[t]:n}}})},[]),D=k((t,n)=>{f(e=>{const a=e.chipParts[t],i=n.count||n.sort;if(!i&&!a||a&&a.count===n.count&&a.sort===n.sort)return e;const{[t]:m,...C}=e.chipParts;return{...e,chipParts:i?{...C,[t]:n}:C}})},[]),H=k((t,n)=>{f(e=>{if(n===null){if(!(t in e.tiles))return e;const{[t]:a,...i}=e.tiles;return{...e,tiles:i}}return e.tiles[t]===n?e:{...e,tiles:{...e.tiles,[t]:n}}})},[]),q=k((t,n)=>{f(e=>({...e,galleryStates:{...e.galleryStates,[t]:{...e.galleryStates[t]??Y,...n}}}))},[]),[G,nt]=I(null),h=g?.key??null,B=g?.opening??x.sort;A(()=>{if(!c||typeof window>"u")return;const t=()=>{const n=window.location.search,e=dt(n,c.known);if(nt(i=>i&&i.writer===h&&i.ranges.join(`
2
+ `)===e.join(`
3
+ `)?i:{ranges:e,writer:h}),!h)return;const a={..._t(n,B),collections:[...e]};f(i=>{const m=i.states[h];return!m||Ct(m,a)?i:{...i,states:{...i.states,[h]:{...m,...a}}}})};return t(),kt(t)},[c,h,B]);const F=h?l.states[h]:void 0;A(()=>{if(!c||!h||!F||G?.writer!==h||typeof window>"u")return;const t=j(F),n=new URLSearchParams(window.location.search);for(const i of Object.values(pt))for(const m of n.getAll(i))t.append(i,m);const e=t.toString(),a=e?`?${e}`:"";a!==window.location.search&&window.history.replaceState(null,"",`${window.location.pathname}${a}`)},[c,h,F,G]);const O=c?.known,J=F?.collections,Q=G?.ranges,et=b(()=>!c||!O?null:{selected:(J??Q??c.selected).filter(n=>O.includes(n)),known:O},[c,O,J,Q]),rt=b(()=>({snap:l,address:c,writer:h,register:_,unregister:S,update:v,reportRows:T,reportShown:y,reportChipParts:D,reportTiles:H,updateGallery:q}),[l,c,h,_,S,v,T,y,D,H,q]);return M(L.Provider,{value:rt,children:M(ft,{value:et,children:o})})}const N=U(null);function Mt({mark:o,children:r}){return M(N.Provider,{value:o,children:r})}function Dt(o){return function(u){return M(Mt,{mark:wt(u),children:M(o,{...u})})}}function Z(o,r){return{...x,sort:r,collections:[...o.selected]}}function $(o,r){if(!r)return null;const u=o.snap.states[r];if(!u)return null;const s=[];let l=0,f=0,p=!1,d=!1,w=null;for(const[c,g]of o.snap.assign){if(g!==r||c===r)continue;const P=o.snap.chipParts[c];P?.count&&(p=!0),P?.sort&&(d=!0);const _=o.snap.rows[c];if(!_)continue;f+=1,s.push(..._);const S=o.snap.shown[c];l+=S?.total??0,w=S?.range??null}return f!==1&&(w=null),{key:r,live:!0,state:u,update:c=>o.update(r,c),clear:()=>o.update(r,c=>({...x,sort:c.sort})),rows:s,total:l,grids:f,countInChips:p,sortInChips:d,range:w}}const K={count:!1,sort:!1};function z(o,r,u,s,l){const f=ct(),p=ut(),d=V(null),w=k(P=>{d.current=P},[]),c=o?.register,g=o?.unregister;return E(()=>{if(!(!c||!g))return c({key:f,role:r,boxId:p,node:d.current,filtersBelow:u},s,l),()=>g(f)},[c,g,f,r,p,u,l]),{key:f,ref:w}}function Ht({filtersBelow:o,openingSort:r}){const u=R(L),s=R(N),l=u?.address??null,f=!!s?.writes&&l!==null,p=f?Z(l,r):{...x,sort:r},{key:d,ref:w}=z(u,"filter",o,p,f),[c,g]=I(p),_=(u?$(u,d):null)??{key:d,live:!1,state:c,update:S=>g(v=>X(v,S)),clear:()=>g(S=>({...x,sort:S.sort})),rows:[],total:0,grids:0,countInChips:!1,sortInChips:!1,range:null};return{ref:w,scope:_}}function qt(o,r=null,u=K){const s=R(L),{key:l,ref:f}=z(s,o,!1),p=s?.reportRows,d=s?.reportShown;E(()=>{if(!(!p||o!=="grid"))return p(l,r),()=>p(l,null)},[p,l,o,r]);const w=k(y=>d?.(l,y),[d,l]);A(()=>()=>d?.(l,null),[d,l]);const c=s?.reportChipParts,{count:g,sort:P}=u;E(()=>{if(!(!c||o!=="chips"))return c(l,{count:g,sort:P}),()=>c(l,K)},[c,l,o,g,P]);const _=s?.snap.assign.get(l),S=R(N);let v=s?$(s,_):null;!v&&_===void 0&&s?.address&&S&&(v=(s.writer?$(s,s.writer):null)??At(Z(s.address,S.sort)));const T=s&&o==="chips"&&!v?Rt(s,s.snap.galleryFollow.get(l)):null;return{ref:f,scope:v,reportShown:w,gallery:T}}function Rt(o,r){if(!r)return null;const u=o.snap.tiles[r]??[],s=o.snap.galleryStates[r]??Y;return{tags:Pt(u),tag:St(s.tag,u),sort:s.sort,shown:mt(u,s).length,pick:l=>o.updateGallery(r,{tag:l}),setSort:l=>o.updateGallery(r,{sort:l}),clear:()=>o.updateGallery(r,{tag:null})}}function Bt(o){const r=R(L),{key:u,ref:s}=z(r,"gallery",!1),l=r?.reportTiles;E(()=>{if(l)return l(u,o),()=>l(u,null)},[l,u,o]);let f=!1;if(r)for(const[d,w]of r.snap.galleryFollow)w===u&&!r.snap.assign.get(d)&&(f=!0);const p=r&&f?r.snap.galleryStates[u]??Y:null;return{ref:s,toolbar:p}}const tt=()=>{};function At(o){return{key:"",live:!1,state:o,update:tt,clear:tt,rows:[],total:0,grids:0,countInChips:!1,sortInChips:!1,range:null}}export{Mt as ShopperAddressMark,zt as ShopperScopeProvider,E as useIsoLayoutEffect,Ht as useShopperFilter,Bt as useShopperGallery,qt as useShopperMember,Dt as withShopperAddressMark};