efficient-storefront-blocks 0.89.0 → 0.91.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 (142) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/chunks/{EditorPreviewCheckout-R7XG75DW.js → EditorPreviewCheckout-NFLTZCIQ.js} +1 -1
  3. package/dist/chunks/{SiteEditorProvider-YNUCDQ2D.js → SiteEditorProvider-UWRLDKJS.js} +1 -1
  4. package/dist/chunks/chunk-4VRLGKYU.js +387 -0
  5. package/dist/chunks/chunk-HRTZ7SYX.js +1 -0
  6. package/dist/chunks/chunk-PHQQRGQZ.js +1 -0
  7. package/dist/chunks/{chunk-E54FFOUS.js → chunk-YL2HPWVT.js} +1 -1
  8. package/dist/chunks/{fitment-data-URBK335I.js → fitment-data-6KHIA3AT.js} +1 -1
  9. package/dist/contract.js +3 -11
  10. package/dist/editor/components/GalleryPicturesSource.d.ts +33 -0
  11. package/dist/editor/components/GalleryPicturesSource.js +1 -0
  12. package/dist/editor/components/GalleryShowcaseSource.js +1 -1
  13. package/dist/editor/components/ProductSourceRows.d.ts +35 -0
  14. package/dist/editor/components/ProductSourceRows.js +1 -0
  15. package/dist/editor/components/ReviewsProductSource.js +1 -1
  16. package/dist/editor/lib/document/block-align-row.js +1 -1
  17. package/dist/editor/lib/document/blocks/commerce/GalleryB/fields.js +1 -1
  18. package/dist/editor/lib/document/blocks/commerce/GalleryItem/fields.js +1 -1
  19. package/dist/editor/lib/document/blocks/service/FooterDivider/fields.js +1 -1
  20. package/dist/editor/lib/document/blocks/service/index.d.ts +1 -1
  21. package/dist/editor/lib/document/config.d.ts +1 -0
  22. package/dist/editor/lib/document/config.js +1 -1
  23. package/dist/editor/lib/efficient-block-sources.js +1 -1
  24. package/dist/editor/lib/storefront-editor-words-kept.js +1 -0
  25. package/dist/editor/lib/storefront-editor-words.d.ts +7 -0
  26. package/dist/editor/lib/storefront-editor-words.js +1 -1
  27. package/dist/editor.css +1 -1
  28. package/dist/index.js +62 -43
  29. package/dist/links.js +1 -1
  30. package/dist/render/app/globals.css +10 -1
  31. package/dist/render/built-with.json +1 -1
  32. package/dist/render/components/AppointmentBooking.js +1 -1
  33. package/dist/render/components/ArticleBody.js +1 -1
  34. package/dist/render/components/BoxHeaderBar.js +1 -1
  35. package/dist/render/components/CollectionCard.d.ts +1 -1
  36. package/dist/render/components/CollectionCard.js +1 -1
  37. package/dist/render/components/ContactRouting.js +1 -1
  38. package/dist/render/components/EuTyreLabels.d.ts +2 -1
  39. package/dist/render/components/EuTyreLabels.js +1 -1
  40. package/dist/render/components/Events.js +1 -1
  41. package/dist/render/components/FooterDivider.d.ts +1 -2
  42. package/dist/render/components/FooterDivider.js +1 -1
  43. package/dist/render/components/FooterEmailSignup.js +1 -1
  44. package/dist/render/components/FooterGroup.js +1 -1
  45. package/dist/render/components/FooterLogo.js +1 -1
  46. package/dist/render/components/FooterMenu.d.ts +3 -1
  47. package/dist/render/components/FooterMenu.js +1 -1
  48. package/dist/render/components/FooterMessaging.js +1 -1
  49. package/dist/render/components/FooterPayment.js +1 -1
  50. package/dist/render/components/FooterSection.js +1 -1
  51. package/dist/render/components/FooterSocial.js +1 -1
  52. package/dist/render/components/FooterText.js +1 -1
  53. package/dist/render/components/GalleryCard.js +1 -1
  54. package/dist/render/components/GalleryGrid.d.ts +3 -1
  55. package/dist/render/components/GalleryGrid.js +3 -1
  56. package/dist/render/components/GalleryItem.d.ts +1 -0
  57. package/dist/render/components/GalleryItem.js +1 -1
  58. package/dist/render/components/GalleryShowcase.js +1 -1
  59. package/dist/render/components/GridCardTemplate.js +1 -1
  60. package/dist/render/components/HeaderNavItem.d.ts +1 -1
  61. package/dist/render/components/HeaderNavItem.js +1 -1
  62. package/dist/render/components/HeaderToolBlocks.js +1 -1
  63. package/dist/render/components/HeaderTools.d.ts +5 -3
  64. package/dist/render/components/HeaderTools.js +1 -1
  65. package/dist/render/components/LegalLine.js +1 -1
  66. package/dist/render/components/MenuLinkBlock.js +1 -1
  67. package/dist/render/components/MenuPlaceholderLabel.js +1 -1
  68. package/dist/render/components/ProductGallery.d.ts +2 -1
  69. package/dist/render/components/ProductGallery.js +1 -1
  70. package/dist/render/components/ProductRef.js +1 -1
  71. package/dist/render/components/PublishedFooter.js +1 -1
  72. package/dist/render/components/QuoteLink.d.ts +2 -1
  73. package/dist/render/components/QuoteLink.js +1 -1
  74. package/dist/render/components/RatingStars.js +1 -1
  75. package/dist/render/components/ReviewForm.js +1 -1
  76. package/dist/render/components/SectionBand.js +1 -1
  77. package/dist/render/components/SectionFootnote.d.ts +2 -1
  78. package/dist/render/components/SectionFootnote.js +1 -1
  79. package/dist/render/components/SectionGroupBody.js +1 -1
  80. package/dist/render/components/SectionNotice.js +1 -1
  81. package/dist/render/components/TyreFitVerdicts.js +1 -1
  82. package/dist/render/components/booking/BookingBox.js +1 -1
  83. package/dist/render/components/booking/BookingRegions.js +1 -1
  84. package/dist/render/components/card-pieces/CardBuyButton.d.ts +3 -1
  85. package/dist/render/components/card-pieces/CardBuyButton.js +1 -1
  86. package/dist/render/components/card-pieces/CardEyebrow.js +1 -1
  87. package/dist/render/components/card-pieces/CardName.js +1 -1
  88. package/dist/render/components/card-pieces/CardPrice.js +1 -1
  89. package/dist/render/components/card-pieces/CardProductPicture.js +1 -1
  90. package/dist/render/components/card-pieces/CardSpecs.js +1 -1
  91. package/dist/render/components/card-pieces/HostPart.js +1 -1
  92. package/dist/render/components/card-pieces/card-row.js +1 -1
  93. package/dist/render/components/catalog/ShopperChips.js +1 -1
  94. package/dist/render/components/catalog/ShopperFilters.js +1 -1
  95. package/dist/render/components/fitment/FitmentPickerGrid.js +1 -1
  96. package/dist/render/components/fitment/StockFitmentCard.js +1 -1
  97. package/dist/render/components/fitment/StockFitmentPart.js +1 -1
  98. package/dist/render/components/pdp-dynamic/DynamicEuTyreLabel.d.ts +4 -0
  99. package/dist/render/components/pdp-dynamic/DynamicEuTyreLabel.js +1 -1
  100. package/dist/render/components/pdp-dynamic/DynamicGalleryGrid.js +1 -1
  101. package/dist/render/components/pdp-dynamic/DynamicProductGallery.js +1 -1
  102. package/dist/render/components/pdp-dynamic/RecordPhotoGallery.d.ts +2 -1
  103. package/dist/render/components/pdp-dynamic/RecordPhotoGallery.js +1 -1
  104. package/dist/render/components/submit/SubmitBox.js +1 -1
  105. package/dist/render/lib/content/menu-card-seed.d.ts +4 -0
  106. package/dist/render/lib/content/menu-card-seed.js +1 -1
  107. package/dist/render/lib/content/menu-entry-type.d.ts +2 -0
  108. package/dist/render/lib/content/menu-entry-type.js +1 -0
  109. package/dist/render/lib/content/served-lists.d.ts +8 -0
  110. package/dist/render/lib/content/served-lists.js +1 -0
  111. package/dist/render/lib/document/blocks/commerce/GalleryB/render.js +1 -1
  112. package/dist/render/lib/document/blocks/commerce/ProductHero/render.js +1 -1
  113. package/dist/render/lib/document/blocks/commerce/ProductPrice/render.js +1 -1
  114. package/dist/render/lib/document/blocks/service/Events/render.js +1 -1
  115. package/dist/render/lib/document/blocks/service/FooterDivider/meta.js +1 -1
  116. package/dist/render/lib/document/blocks/service/FooterDivider/render.js +1 -1
  117. package/dist/render/lib/document/blocks/service/RatingBlock/render.js +1 -1
  118. package/dist/render/lib/document/card-templates.d.ts +2 -0
  119. package/dist/render/lib/document/card-templates.js +1 -1
  120. package/dist/render/lib/document/footer-page-blocks.js +1 -1
  121. package/dist/render/lib/document/lazy-draws.js +1 -1
  122. package/dist/render/lib/document/render-config.d.ts +1 -0
  123. package/dist/render/lib/document/render-config.js +1 -1
  124. package/dist/render/lib/document/section-to-box-rows-productgrid.d.ts +1 -0
  125. package/dist/render/lib/document/section-to-box-rows-productgrid.js +1 -0
  126. package/dist/render/lib/sections/product-pictures.d.ts +26 -0
  127. package/dist/render/lib/sections/product-pictures.js +1 -0
  128. package/dist/render/lib/sections/product-source.d.ts +8 -0
  129. package/dist/render/lib/sections/product-source.js +1 -0
  130. package/dist/render/lib/sections/reviews.js +1 -1
  131. package/dist/words.d.ts +18 -0
  132. package/dist/words.js +5 -5
  133. package/package.json +4 -3
  134. package/dist/chunks/chunk-BYBBZS7L.js +0 -1
  135. package/dist/chunks/chunk-G4Y7XXRV.js +0 -1
  136. package/dist/chunks/chunk-WRDUOJZO.js +0 -382
  137. package/dist/editor/lib/editor-words-kept.js +0 -1
  138. package/dist/render/lib/content/legacy-block-align.d.ts +0 -2
  139. package/dist/render/lib/content/legacy-block-align.js +0 -1
  140. /package/dist/chunks/{chunk-WRDUOJZO.js.LEGAL.txt → chunk-4VRLGKYU.js.LEGAL.txt} +0 -0
  141. /package/dist/chunks/{chunk-ZA3ULZOA.js → chunk-XMTQMRA3.js} +0 -0
  142. /package/dist/editor/lib/{editor-words-kept.d.ts → storefront-editor-words-kept.d.ts} +0 -0
package/dist/contract.js CHANGED
@@ -1,4 +1,4 @@
1
- var y=["general","commerce","service"],i=[{key:"openers",title:"Hero & intros",defaultExpanded:!0,templateable:!0,sections:[{type:"Hero",label:"Hero",set:"general"},{type:"HeroSingle",label:"Hero Single",set:"general"},{type:"IntroBleed",label:"Scroll-Over Text",set:"general"}]},{key:"shop",title:"Shop & galleries",templateable:!0,sections:[{type:"Collections",label:"Collections",set:"commerce"},{type:"AlloyWheelsListing",label:"List",set:"commerce"},{type:"CatalogFilterBar",label:"Catalog Filter Bar",set:"commerce"},{type:"ProductGrid",label:"Product Grid",set:"commerce"},{type:"FitmentFinder",label:"Fitment Form",set:"commerce"},{type:"Gallery",label:"Tabbed Gallery",set:"commerce"},{type:"GalleryB",label:"Customer Photo Grid",set:"commerce"}]},{key:"product",title:"Product page",templateable:!0,sections:[{type:"ProductHero",label:"Product Hero",set:"commerce"},{type:"SpecTable",label:"Spec Table",set:"commerce"},{type:"ProcessSteps",label:"Image & Text Columns",set:"general"},{type:"DetailRows",label:"Feature Rows",set:"commerce"},{type:"FitmentTable",label:"Fitment Table",set:"commerce"},{type:"TyreSizes",label:"Tyre Sizes",set:"commerce"},{type:"EuTyreLabel",label:"EU Tyre Label",set:"commerce"}]},{key:"checkout",title:"Checkout & ordering",templateable:!0,sections:[{type:"OrderSummary",label:"Order Table",set:"general"},{type:"PaymentBadges",label:"Payment Methods",set:"general"},{type:"CheckoutCTA",label:"Ready-to-Order Banner",set:"commerce"}]},{key:"about",title:"About & brand story",templateable:!0,sections:[{type:"Footprint",label:"Locations Map",set:"general"}]},{key:"content",title:"Text & content",templateable:!0,sections:[{type:"Prose",label:"Editorial Text",set:"general"},{type:"ParagraphsA",label:"Lead Text",set:"general"},{type:"Cards",label:"Cards",set:"general"}]},{key:"proof",title:"Stats & social proof",templateable:!0,sections:[{type:"Stats",label:"Stats",set:"general"},{type:"Chart",label:"Chart",set:"general"},{type:"Mockup",label:"Mockup Card",set:"general"},{type:"Reviews",label:"Reviews",set:"service"}]},{key:"promo",title:"Promotions & sign-ups",templateable:!0,sections:[{type:"Banner",label:"Banner",set:"general"},{type:"TitleWithButtons",label:"Call-to-Action Heading",set:"general"},{type:"Countdown",label:"Countdown",set:"general"}]},{key:"blog",title:"Blog & journal",templateable:!0,sections:[{type:"FeaturedCover",label:"Feature Banner",set:"general"},{type:"LongRead",label:"Article Text",set:"general"},{type:"ArticleBody",label:"Article Body",set:"service"},{type:"Events",label:"Latest Posts",set:"service"}]},{key:"navigation",title:"Navigation & wayfinding",templateable:!0,sections:[{type:"Breadcrumb",label:"Breadcrumb",set:"general"},{type:"CategoryBar",label:"Category Bar",set:"general"},{type:"DocTabs",label:"Document Tabs",set:"general"}]},{key:"legal",title:"Legal & documents",templateable:!0,sections:[{type:"DocBody",label:"Document Text",set:"general"}]},{key:"contact",title:"Contact, FAQ & forms",templateable:!0,sections:[{type:"FAQ",label:"Q&A",set:"general"},{type:"ContactRouting",label:"Contact Form",set:"service"},{type:"ContactLocations",label:"Contact / Locations",set:"general"},{type:"SubmitBuild",label:"Photo Submission Form",set:"service"},{type:"ReviewForm",label:"Review Form",set:"service"},{type:"Form",label:"Form",set:"service"},{type:"AppointmentBooking",label:"Booking Form",set:"service"}]},{key:"structure",title:"Layout, structure & embeds",templateable:!1,sections:[{type:"SectionHeader",label:"Section Header",set:"general"},{type:"Flex",label:"Box",set:"general"},{type:"Divider",label:"Divider",set:"general"},{type:"CustomHTML",label:"Custom HTML",set:"general"}]},{key:"layouts",title:"Layouts",templateable:!0,sections:[{type:"Manifesto",label:"Brand Text",set:"general"},{type:"Split",label:"Image & Text Split",set:"general"},{type:"Subscribe",label:"Signup Form",set:"service"},{type:"Ticker",label:"Scrolling Bar",set:"general"},{type:"SpecStrip",label:"Spec Strip",set:"general"},{type:"TimelineTrack",label:"Milestone Timeline",set:"general"},{type:"Timeline",label:"Story Timeline",set:"general"},{type:"Logos",label:"Logos",set:"general"},{type:"DocMasthead",label:"Page Header",set:"general"}]}];var b={Masthead:`Owner, 2026-10-10 (the page headers become ONE Layouts row): Issue Header and Document Header are one Page Header. Retired from the Add menu with no second preset (reviewer, 2026-11-06).
1
+ var y=["general","commerce","service"],i=[{key:"openers",title:"Hero & intros",defaultExpanded:!0,templateable:!0,sections:[{type:"Hero",label:"Hero",set:"general"},{type:"HeroSingle",label:"Hero Single",set:"general"},{type:"IntroBleed",label:"Scroll-Over Text",set:"general"}]},{key:"shop",title:"Shop & galleries",templateable:!0,sections:[{type:"Collections",label:"Collections",set:"commerce"},{type:"AlloyWheelsListing",label:"List",set:"commerce"},{type:"CatalogFilterBar",label:"Catalog Filter Bar",set:"commerce"},{type:"ProductGrid",label:"Product Grid",set:"commerce"},{type:"FitmentFinder",label:"Fitment Form",set:"commerce"},{type:"Gallery",label:"Tabbed Gallery",set:"commerce"},{type:"GalleryB",label:"Customer Photo Grid",set:"commerce"}]},{key:"product",title:"Product page",templateable:!0,sections:[{type:"ProductHero",label:"Product Hero",set:"commerce"},{type:"SpecTable",label:"Spec Table",set:"commerce"},{type:"ProcessSteps",label:"Image & Text Columns",set:"general"},{type:"DetailRows",label:"Feature Rows",set:"commerce"},{type:"FitmentTable",label:"Fitment Table",set:"commerce"},{type:"TyreSizes",label:"Tyre Sizes",set:"commerce"},{type:"EuTyreLabel",label:"EU Tyre Label",set:"commerce"}]},{key:"checkout",title:"Checkout & ordering",templateable:!0,sections:[{type:"OrderSummary",label:"Order Table",set:"general"},{type:"CheckoutCTA",label:"Ready-to-Order Banner",set:"commerce"}]},{key:"about",title:"About & brand story",templateable:!0,sections:[{type:"Footprint",label:"Locations Map",set:"general"}]},{key:"content",title:"Text & content",templateable:!0,sections:[{type:"Prose",label:"Editorial Text",set:"general"},{type:"ParagraphsA",label:"Lead Text",set:"general"},{type:"Cards",label:"Cards",set:"general"}]},{key:"proof",title:"Stats & social proof",templateable:!0,sections:[{type:"Stats",label:"Stats",set:"general"},{type:"Chart",label:"Chart",set:"general"},{type:"Mockup",label:"Mockup Card",set:"general"},{type:"Reviews",label:"Reviews",set:"service"}]},{key:"promo",title:"Promotions & sign-ups",templateable:!0,sections:[{type:"Banner",label:"Banner",set:"general"},{type:"TitleWithButtons",label:"Call-to-Action Heading",set:"general"},{type:"Countdown",label:"Countdown",set:"general"}]},{key:"blog",title:"Blog & journal",templateable:!0,sections:[{type:"FeaturedCover",label:"Feature Banner",set:"general"},{type:"LongRead",label:"Article Text",set:"general"},{type:"ArticleBody",label:"Article Body",set:"service"},{type:"Events",label:"Latest Posts",set:"service"}]},{key:"navigation",title:"Navigation & wayfinding",templateable:!0,sections:[{type:"Breadcrumb",label:"Breadcrumb",set:"general"},{type:"CategoryBar",label:"Category Bar",set:"general"},{type:"DocTabs",label:"Document Tabs",set:"general"}]},{key:"legal",title:"Legal & documents",templateable:!0,sections:[{type:"DocBody",label:"Document Text",set:"general"}]},{key:"contact",title:"Contact, FAQ & forms",templateable:!0,sections:[{type:"FAQ",label:"Q&A",set:"general"},{type:"ContactRouting",label:"Contact Form",set:"service"},{type:"ContactLocations",label:"Contact / Locations",set:"general"},{type:"SubmitBuild",label:"Photo Submission Form",set:"service"},{type:"ReviewForm",label:"Review Form",set:"service"},{type:"Form",label:"Form",set:"service"},{type:"AppointmentBooking",label:"Booking Form",set:"service"}]},{key:"structure",title:"Layout, structure & embeds",templateable:!1,sections:[{type:"SectionHeader",label:"Section Header",set:"general"},{type:"Flex",label:"Box",set:"general"},{type:"Divider",label:"Divider",set:"general"},{type:"CustomHTML",label:"Custom HTML",set:"general"}]},{key:"layouts",title:"Layouts",templateable:!0,sections:[{type:"Manifesto",label:"Brand Text",set:"general"},{type:"Split",label:"Image & Text Split",set:"general"},{type:"Subscribe",label:"Signup Form",set:"service"},{type:"Ticker",label:"Scrolling Bar",set:"general"},{type:"SpecStrip",label:"Spec Strip",set:"general"},{type:"TimelineTrack",label:"Milestone Timeline",set:"general"},{type:"Timeline",label:"Story Timeline",set:"general"},{type:"Logos",label:"Logos",set:"general"},{type:"DocMasthead",label:"Page Header",set:"general"}]}];var b={Masthead:`Owner, 2026-10-10 (the page headers become ONE Layouts row): Issue Header and Document Header are one Page Header. Retired from the Add menu with no second preset (reviewer, 2026-11-06).
2
2
 
3
3
  WHAT REPLACES IT: Page Header, a Box of Text blocks: a Header Box (the eyebrow, the title, a Details Box of one Text per line) over a Deck Box. Every Issue Header field is plain words with no data source, so the merchant makes the issue shape from Text blocks in that Box: the issue lines are Details lines, the lead is the Deck, and the "In this issue" panel is a Box of Texts beside it. Its converter row (\`section-to-box-rows-pageheader\` \`masthead\`, OFF) stays for a stored page that moves later.
4
4
 
@@ -20,15 +20,7 @@ WHAT REPLACES IT: a Cards section with Card style set to Label only. It draws th
20
20
 
21
21
  WHAT A MERCHANT LOSES on a NEW Label only section: nothing this section had. It GAINS the Cards head split (its head can move into a box of its own), which Key Features never had: that head draws the shared \`simple\` head, eyebrow ABOVE the heading, where Key Features drew it beside.
22
22
 
23
- THE TYPE KEY STAYS AND SO DOES THE COMPONENT. Every page holding a Key Features still renders through it and can still be edited; no document is rewritten and NO MIGRATION RUNS.`,DeliveryOptions:`Lewis, 2026-10-10 (section-merges.md group 4, approved): one Cards section holds the five card grids \u2014 Cards, Key Features, Document Detail Cards, Recurring Columns and Delivery Options. Card content = Manual / Delivery options; the card's parts are Display chips; one Highlighted card row with its Highlight badge. Retired by card [MERGE] Delivery Options, Detail Cards And Recurring Columns Into Cards (M3, 2026-11-04).
24
-
25
- WHAT REPLACES IT: Cards with Card content set to Delivery options, drawn from its card template: the backend's \`delivery-options\` rows (name, price, time, note), one card each, in the website's own currency. The one Highlighted card row and the Highlight badge replace the per-option Highlight switch.
26
-
27
- WHAT A MERCHANT LOSES: more than one highlighted option (Lewis approved ONE Highlighted card row, 2026-10-10). No stored node held two.
28
-
29
- NO CONVERTER ROW: 0 DeliveryOptions nodes on the US sites, draft or published (read only, 2026-11-04). This entry is its reason in the guard (\`scripts/test-section-to-box.tsx\` \xA75).
30
-
31
- THE TYPE KEY STAYS AND SO DOES THE COMPONENT (efficient-storefront-blocks). A Delivery Options anywhere still renders through it and can still be edited; no document is rewritten.`,Series:`Lewis, 2026-10-10 (section-merges.md group 4, approved): one Cards section holds the five card grids \u2014 Cards, Key Features, Document Detail Cards, Recurring Columns and Delivery Options. Card content = Manual / Delivery options; the card's parts are Display chips; one Highlighted card row with its Highlight badge. Retired by card [MERGE] Delivery Options, Detail Cards And Recurring Columns Into Cards (M3, 2026-11-04).
23
+ THE TYPE KEY STAYS AND SO DOES THE COMPONENT. Every page holding a Key Features still renders through it and can still be edited; no document is rewritten and NO MIGRATION RUNS.`,DeliveryOptions:"Lewis, 2026-10-10 (section-merges.md group 4, approved): one Cards section holds the five card grids \u2014 Cards, Key Features, Document Detail Cards, Recurring Columns and Delivery Options. Card content = Manual / Delivery options; the card's parts are Display chips; one Highlighted card row with its Highlight badge. Retired by card [MERGE] Delivery Options, Detail Cards And Recurring Columns Into Cards (M3, 2026-11-04).\n\nWHAT REPLACES IT: Cards with Card content set to Delivery options, drawn from its card template: the backend's `delivery-options` rows (name, price, time, note), one card each, in the website's own currency. The one Highlighted card row and the Highlight badge replace the per-option Highlight switch.\n\nWHAT A MERCHANT LOSES: more than one highlighted option (Lewis approved ONE Highlighted card row, 2026-10-10). No stored node held two.\n\nNO CONVERTER ROW: 0 DeliveryOptions nodes on the US sites, draft or published (read only, 2026-11-04). This entry is its reason in the guard (`scripts/test-section-to-box.tsx` \xA75).\n\nTHE TYPE KEY STAYS AND SO DOES THE COMPONENT (efficient-storefront-blocks). A Delivery Options anywhere still renders through it and can still be edited; no document is rewritten.\n\nDELETE DATE 2026-12-18: the retired component in efficient-storefront-blocks (`components/DeliveryOptions`, `DeliveryOptionsSource`, `blocks/commerce/DeliveryOptions`) goes then, in a storefront-blocks follow-up. 0 stored DeliveryOptions nodes on the 34 US pages, draft or published (read only, 2026-11-08), and no converter row is coming.",Series:`Lewis, 2026-10-10 (section-merges.md group 4, approved): one Cards section holds the five card grids \u2014 Cards, Key Features, Document Detail Cards, Recurring Columns and Delivery Options. Card content = Manual / Delivery options; the card's parts are Display chips; one Highlighted card row with its Highlight badge. Retired by card [MERGE] Delivery Options, Detail Cards And Recurring Columns Into Cards (M3, 2026-11-04).
32
24
 
33
25
  WHAT REPLACES IT: Cards drawn from its card template. A column's number is Number, its "Right Top Text" Corner note, its title Card title, its words Card body, its count and label one Count, and the one \`viewLabel\` a plain Text typed once in the template, so every card shows it; the background is the Box's. The converter row (\`section-to-box-rows-cards.ts\`, OFF) lays down that Cards inside a Box.
34
26
 
@@ -62,4 +54,4 @@ WHAT A MERCHANT LOSES: the tyre-only head copy ("Will it fit your car?"); a pres
62
54
 
63
55
  NO CONVERTER ROW: 0 TyreFitment nodes on the US sites, draft or published (read only, 2026-11-07). Old sites stay as they are (owner, 2026-11-06).
64
56
 
65
- THE TYPE KEY STAYS AND SO DOES THE COMPONENT (efficient-storefront-blocks). A stored Tyre Fitment Form still renders through it and can still be edited, its head split, width, heading level, settings groups and cover included; no document is rewritten.`};var O=Array.from(new Set([...i.flatMap(e=>e.sections.map(t=>t.type)),...Object.keys(b)])),A=Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.label]))),g={Heading:"general",Text:"general",Eyebrow:"general",ImageBlock:"general",LogoBlock:"general",LocationMap:"general",Contents:"general",ButtonBlock:"general",CardList:"general",PostCard:"general",HeroSlide:"general",HeroGroup:"general",Integrations:"general",Grid:"general",KeyFeatures:"general",Spacer:"general",Series:"general",DocMetaCards:"general",StatsParagraph:"general",Testimonials:"general",Masthead:"general",CollectionCard:"commerce",GalleryItem:"commerce",ProductRef:"commerce",CompatibleTyres:"commerce",DeliveryOptions:"commerce",Header:"commerce",SearchBlock:"commerce",CartBlock:"commerce",CountrySwitchBlock:"commerce",AccountBlock:"commerce",ThemeSwitchBlock:"commerce",ProductGallery:"commerce",EuTyreLabelBlock:"commerce",SubmitBox:"service",BookingBox:"service",SubscribeBlogs:"service",RatingBlock:"service",Footer:"service",FooterLogo:"service",FooterMenu:"service",FooterDivider:"service",FooterGroup:"service",FooterText:"service",FooterEmailSignup:"service",FooterSocial:"service",FooterPayment:"service",MenuBlock:"service",MenuLinkBlock:"service",ProductPrice:"commerce",ProductSize:"commerce",ProductColour:"commerce",ProductPicture:"commerce",ProductEyebrow:"commerce",ProductName:"commerce",ProductSpecs:"commerce",ProductBuy:"commerce",FitmentPicker:"commerce",StockFitment:"commerce",RelatedProducts:"commerce",BundleOffer:"commerce",TyreFitment:"commerce",EmailFormBlock:"service",SocialLogosBlock:"service",PaymentLogosBlock:"service",LegalLineBlock:"service",SiteHeader:"service",SiteFooter:"service"},a={...g,...Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.set])))};function T(e){return Object.prototype.hasOwnProperty.call(a,e)?a[e]:void 0}function l(e){return Object.keys(a).filter(t=>a[t]===e).sort()}var E=l("general"),w=l("commerce"),S=l("service");var f="Box",C=`${f}es`;var h=e=>!!e&&typeof e=="object"&&!Array.isArray(e),p=e=>h(e)&&typeof e.type=="string"&&h(e.props);var s=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),d=e=>p(e)&&e.type!=="";function u(e,t,o){if(Array.isArray(e))for(let r of e)d(r)?c(r,t,o):s(r)&&typeof r.type=="string"&&r.type!==""&&t.add(r.type)}function n(e,t,o){if(Array.isArray(e)){if(o.has(e))return;o.add(e);for(let r of e)d(r)?c(r,t,o):n(r,t,o)}else if(s(e)&&!o.has(e)){o.add(e);for(let r of Object.values(e))n(r,t,o)}}function c(e,t,o){if(!o.has(e)){o.add(e),t.add(e.type);for(let r of Object.values(e.props))n(r,t,o)}}function m(e){let t=new Set,o=new Set;if(d(e))c(e,t,o);else if(s(e)){if(u(e.content,t,o),s(e.zones))for(let r of Object.values(e.zones))u(r,t,o);s(e.root)&&n(e.root,t,o)}return[...t].sort()}export{y as BLOCK_SETS,w as COMMERCE_BLOCKS,E as GENERAL_BLOCKS,S as SERVICE_BLOCKS,T as blockSetOf,m as blockTypesIn};
57
+ THE TYPE KEY STAYS AND SO DOES THE COMPONENT (efficient-storefront-blocks). A stored Tyre Fitment Form still renders through it and can still be edited, its head split, width, heading level, settings groups and cover included; no document is rewritten.`,PaymentBadges:"Owner, 2026-10-10: Logos and Payment Methods are one block, and a payment wall is a Logos block with the payment chip for its look. 2026-11-07: the dot before each line is a Mark Box at full strength (approved).\n\nWHAT REPLACES IT: the Logos row (Layouts group), Logo style Cards. Field by field, as its converter row (`section-to-box-rows-logos`) moves it: `heading` is a Text block; each of `badges` is a Logo block in the wall, its name the Logo's name and its `src` the Logo's picture; `dataSource` is the wall's own Logo content row (\"Ways to pay here\" or \"Ways to pay at checkout\", served by the backend to Logos too), and the wall draws ONE Logo card template per served method, the same chip; `assurances` are a Reassurance Box of lines, each a Mark Box (an empty Box, 4 x 4, Corners 2, Fill main) before a Text; `contained` is the Box's site frame. A press of this type lays down that Box (SECTION_TO_BOX_PRESS).\n\nWHAT A MERCHANT LOSES: the 60% and 70% opacity of the old dot and words (a Box and a Text have no opacity: the dot is the main colour, the words the label ink) and the 4px gap between wrapped lines (a Box has one Gap). No field is lost.\n\n4 Payment Methods nodes are stored on the US sites, all on template pages, draft only, all fed by a source; 0 on pages (read only, 2026-11-07). Old sites stay as they are (owner, 2026-11-06); moving a page is a separate write.\n\nTHE TYPE KEY STAYS AND SO DOES THE COMPONENT. A stored Payment Methods node still renders through it, its dot included, and can still be edited; no document is rewritten."};var O=Array.from(new Set([...i.flatMap(e=>e.sections.map(t=>t.type)),...Object.keys(b)])),A=Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.label]))),g={Heading:"general",Text:"general",Eyebrow:"general",ImageBlock:"general",LogoBlock:"general",LocationMap:"general",Contents:"general",ListSearch:"general",ButtonBlock:"general",CardList:"general",PostCard:"general",HeroSlide:"general",HeroGroup:"general",Integrations:"general",Grid:"general",KeyFeatures:"general",Spacer:"general",Series:"general",DocMetaCards:"general",StatsParagraph:"general",Testimonials:"general",Masthead:"general",CollectionCard:"commerce",GalleryItem:"commerce",ProductRef:"commerce",CompatibleTyres:"commerce",DeliveryOptions:"commerce",Header:"commerce",SearchBlock:"commerce",CartBlock:"commerce",CountrySwitchBlock:"commerce",AccountBlock:"commerce",ThemeSwitchBlock:"commerce",ProductGallery:"commerce",EuTyreLabelBlock:"commerce",SubmitBox:"service",BookingBox:"service",SubscribeBlogs:"service",RatingBlock:"service",Footer:"service",FooterLogo:"service",FooterMenu:"service",FooterDivider:"service",FooterGroup:"service",FooterText:"service",FooterEmailSignup:"service",FooterSocial:"service",FooterPayment:"service",MenuBlock:"service",MenuLinkBlock:"service",ProductPrice:"commerce",ProductSize:"commerce",ProductColour:"commerce",ProductPicture:"commerce",ProductEyebrow:"commerce",ProductName:"commerce",ProductSpecs:"commerce",ProductBuy:"commerce",FitmentPicker:"commerce",StockFitment:"commerce",RelatedProducts:"commerce",BundleOffer:"commerce",TyreFitment:"commerce",PaymentBadges:"general",EmailFormBlock:"service",SocialLogosBlock:"service",PaymentLogosBlock:"service",LegalLineBlock:"service",SiteHeader:"service",SiteFooter:"service"},a={...g,...Object.fromEntries(i.flatMap(e=>e.sections.map(t=>[t.type,t.set])))};function w(e){return Object.prototype.hasOwnProperty.call(a,e)?a[e]:void 0}function l(e){return Object.keys(a).filter(t=>a[t]===e).sort()}var T=l("general"),E=l("commerce"),S=l("service");var f="Box",C=`${f}es`;var h=e=>!!e&&typeof e=="object"&&!Array.isArray(e),p=e=>h(e)&&typeof e.type=="string"&&h(e.props);var s=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),d=e=>p(e)&&e.type!=="";function u(e,t,o){if(Array.isArray(e))for(let r of e)d(r)?c(r,t,o):s(r)&&typeof r.type=="string"&&r.type!==""&&t.add(r.type)}function n(e,t,o){if(Array.isArray(e)){if(o.has(e))return;o.add(e);for(let r of e)d(r)?c(r,t,o):n(r,t,o)}else if(s(e)&&!o.has(e)){o.add(e);for(let r of Object.values(e))n(r,t,o)}}function c(e,t,o){if(!o.has(e)){o.add(e),t.add(e.type);for(let r of Object.values(e.props))n(r,t,o)}}function m(e){let t=new Set,o=new Set;if(d(e))c(e,t,o);else if(s(e)){if(u(e.content,t,o),s(e.zones))for(let r of Object.values(e.zones))u(r,t,o);s(e.root)&&n(e.root,t,o)}return[...t].sort()}export{y as BLOCK_SETS,E as COMMERCE_BLOCKS,T as GENERAL_BLOCKS,S as SERVICE_BLOCKS,w as blockSetOf,m as blockTypesIn};
@@ -0,0 +1,33 @@
1
+ import { type AdminStorefrontCategory, type WheelSummary } from "../../render/lib/api/index.js";
2
+ import { type ProductPicturesOptions } from "../../render/lib/sections/product-pictures.js";
3
+ export declare const GALLERY_MEDIA_ZONES: readonly [{
4
+ readonly label: "All media groups";
5
+ readonly value: "all";
6
+ }, {
7
+ readonly label: "Lifestyle photos";
8
+ readonly value: "lifestyle";
9
+ }, {
10
+ readonly label: "Product photos";
11
+ readonly value: "photos";
12
+ }, {
13
+ readonly label: "Accessories";
14
+ readonly value: "accessories";
15
+ }, {
16
+ readonly label: "Others";
17
+ readonly value: "others";
18
+ }];
19
+ export declare function galleryPicturesOptionsFor(choice: string, wheels: readonly WheelSummary[] | null, value: ProductPicturesOptions | null | undefined): ProductPicturesOptions;
20
+ interface RowsProps {
21
+ value: ProductPicturesOptions | null | undefined;
22
+ onChange: (value: ProductPicturesOptions) => void;
23
+ wheels: WheelSummary[] | null;
24
+ categories: AdminStorefrontCategory[] | null;
25
+ loading: boolean;
26
+ }
27
+ export declare function GalleryPicturesSourceRows({ value, onChange, wheels, categories, loading }: RowsProps): import("react").JSX.Element;
28
+ interface Props {
29
+ value?: ProductPicturesOptions | null;
30
+ onChange: (value: ProductPicturesOptions) => void;
31
+ }
32
+ export default function GalleryPicturesSource({ value, onChange }: Props): import("react").JSX.Element;
33
+ export {};
@@ -0,0 +1 @@
1
+ "use client";import{jsx as s}from"react/jsx-runtime";import{SettingsField as m}from"efficient-easel/panel";import{FieldSelect as d}from"efficient-easel/fields";import{ImageIcon as f}from"efficient-easel/icons";import{ProductSourceRows as h,productSourceOptionsFor as g,useProductSourceCatalog as P}from"./ProductSourceRows.js";import{say as l}from"efficient-web-builder/format/lib/editor-words";import{EVERY_IMAGE_ZONE as y}from"../../render/lib/sections/product-pictures.js";const b=[{label:"All media groups",value:"all"},{label:"Lifestyle photos",value:"lifestyle"},{label:"Product photos",value:"photos"},{label:"Accessories",value:"accessories"},{label:"Others",value:"others"}],i={thisProduct:!1,codeWithoutProduct:!1,untouched:"pick",keepsCategory:!0},n=e=>typeof e?.mediaZone=="string"&&e.mediaZone?e.mediaZone:y,u=(e,o)=>e.product?{...e,mediaZone:n(o)}:e;function _(e,o,r){return u(g(e,o,r,i),r)}function E({value:e,onChange:o,wheels:r,categories:a,loading:c}){const p=n(e);return s(h,{value:e,onChange:t=>o(u(t,e)),wheels:r,categories:a,onProductPage:!1,loading:c,rules:i,noProductHint:l("No product chosen yet, so no pictures show."),children:s(m,{label:l("Images from"),icon:s(f,{}),children:s(d,{value:p,ariaLabel:l("Images from"),onChange:t=>o({...e??{},mediaZone:t}),readOnly:c,options:b.map(t=>({label:l(t.label),value:t.value}))})})})}function S({value:e,onChange:o}){const{wheels:r,categories:a}=P();return s(E,{value:e,onChange:o,wheels:r,categories:a,loading:r===null})}export{b as GALLERY_MEDIA_ZONES,E as GalleryPicturesSourceRows,S as default,_ as galleryPicturesOptionsFor};
@@ -1 +1 @@
1
- "use client";import{jsx as G,jsxs as J}from"react/jsx-runtime";import{mediaGroupVehicle as K}from"../../render/lib/content/source-values.js";import{useEffect as R,useMemo as Q,useRef as b,useState as k}from"react";import{storefrontAdmin as U}from"../../render/lib/api/index.js";import{useEaselHost as X}from"efficient-easel/screen/lib/host";import{getEditorToken as Y}from"efficient-web-builder/render/lib/editor-auth";import{getEditorSiteId as Z}from"efficient-web-builder/render/lib/editor-site";import{loadProductCatalog as F}from"../../render/components/useProductCatalog.js";import{loadStorefrontCategories as v}from"./useStorefrontCategories.js";import{useCategoryFilter as ee}from"./useCategoryFilter.js";import te from"./CategoryProductFields.js";import{snapshotChanged as re}from"efficient-web-builder/editor/components/useSnapshotSource";import se from"efficient-web-builder/editor/components/SourceStatus";import{say as n,sayCount as H}from"efficient-web-builder/format/lib/editor-words";const a="__all__";function oe(e,r){return r===a?e:e.filter(o=>o.process===r)}function m(e,r){return e.map(o=>({image:o.items[0]?.url,photos:o.items.map(s=>({src:s.url})),href:`/wheels/${r.slug}`,process:r.process,eyebrow:K(o),name:r.name,meta:o.finish})).filter(o=>!!o.image)}function W(e){const r=Y();return r?U.getWheelDetail(r,e,{siteId:Z()}):Promise.reject(new Error("editor not authenticated"))}async function ne(e){const r=await W(e),o={slug:r.slug,name:r.name,process:r.process},s=r.mediaGroups??{photos:[],lifestyle:[],videos:[],accessories:[],others:[]};return{...o,vehicleCards:m(s.lifestyle??[],o),wheelCards:m(s.photos??[],o),othersCards:m(s.others??[],o)}}async function ae(e,r){const o=await Promise.all(e.map(i=>W(i.slug).catch(()=>null))),s=[],h=[],p=[];for(const i of o){if(!i)continue;const l={slug:i.slug,name:i.name,process:i.process},d=i.mediaGroups??{photos:[],lifestyle:[],videos:[],accessories:[],others:[]};s.push(...m(d.lifestyle??[],l)),h.push(...m(d.photos??[],l)),p.push(...m(d.others??[],l))}return{slug:a,name:r===a?"All products":r,process:"",vehicleCards:s,wheelCards:h,othersCards:p,category:r}}function ie({value:e,onChange:r}){const o=X(),[s,h]=k(null),[p,i]=k(null),[l,d]=k(!1),[L,P]=k(!1),u=b(!0),g=b(e);g.current=e;const O=b(r);O.current=r;const x=(t,f=!1)=>{d(!0),f||P(!1),t().then(B=>{u.current&&(re(B,g.current)&&O.current(B),P(!1))}).catch(()=>{u.current&&!f&&P(!0)}).finally(()=>{u.current&&d(!1)})},A=(t,f=!1)=>x(()=>ne(t),f),y=(t,f=!1)=>x(()=>ae(oe(s??[],t),t),f);R(()=>(u.current=!0,F().then(t=>{u.current&&h(t)}),v().then(t=>{u.current&&i(t)}),()=>{u.current=!1}),[]);const C=b(!1);R(()=>{if(C.current)return;const t=g.current;if(!t?.slug){C.current=!0;return}if(t.slug===a){if(s===null)return;C.current=!0,y(t.category??a,!0)}else C.current=!0,A(t.slug,!0)},[s]);const c=e?.slug===a,w=Q(()=>s&&e?.slug&&!c?s.find(t=>t.slug===e.slug)??null:null,[s,e?.slug,c]),{category:N,setCategory:E,categoryNames:D,filtered:T}=ee(s,p);R(()=>{c?e?.category&&E(e.category):w?.process&&E(w.process)},[w,c,e?.category]);const S=s===null,_=!!e?.slug&&!c&&s!==null&&!w,I=t=>{if(!t){r(null);return}if(t===a){y(N);return}A(t)},M=t=>{E(t),g.current?.slug===a&&y(t)},V=()=>{e?.slug&&(F(!0).then(t=>{u.current&&h(t)}),c?y(e.category??a):A(e.slug))},$=()=>{e?.slug&&o.send("storefront-editor:open-product",{slug:e.slug,name:e.name})},j=(e?.vehicleCards.length??0)+(e?.wheelCards.length??0)+(e?.othersCards?.length??0),q=L?"error":l?"loading":"idle",z=L?n("Couldn’t reach the product catalog."):l?n("Syncing media from the catalog…"):_?n("Linked to “{name}” — no longer in the catalog.",{name:e?.name??""}):c?H("Linked to “{name}” · {n} card from all products’ media groups.","Linked to “{name}” · {n} cards from all products’ media groups.",j,{name:e?.name??""}):H("Linked to “{name}” · {n} card from its media groups.","Linked to “{name}” · {n} cards from its media groups.",j,{name:e?.name??""});return J("div",{children:[G(te,{category:N,onChange:M,categoryNames:D,readOnly:S,products:T,allProducts:s??[],product:e?.slug??"",onProductChange:I,productReadOnly:S||l,emptyLabel:S?n("Loading…"):n("None (write the cards yourself)"),extraOptions:[{label:n("All products"),value:a},..._?[{label:n("{name} (unavailable)",{name:e.name}),value:e.slug}]:[]]}),e?.slug?G(se,{status:q,statusText:z,onRefresh:V,busy:l,edit:c?void 0:{label:n("Edit product ✎"),onClick:$},hint:c?n("Pools every product’s grouped media: each one’s Relative / lifestyle photos feed Gallery A, its Product photos Gallery B and its Others the Others gallery. Every media group becomes a card, attributed to its own product (title, link and tag). Narrow the set with the Category filter above. Headings, intro copy and stats stay yours."):n("Gallery A comes from the product’s Relative / lifestyle photos, Gallery B from its Product photos and the Others gallery from its Others — edit those in the product’s Media tab and refresh. Each media group is a card: its name is the eyebrow, its finish the meta line; the card’s title is the product name and its tag the category. Headings, intro copy and stats stay yours.")}):G("p",{className:"es-field-hint",children:n("Pick a product — or All products — to build the galleries from media groups, or keep “None” to author the cards yourself.")})]})}export{ie as default};
1
+ "use client";import{jsx as A,jsxs as $}from"react/jsx-runtime";import{mediaGroupVehicle as q}from"../../render/lib/content/source-values.js";import{useEffect as _,useMemo as J,useRef as E,useState as C}from"react";import{storefrontAdmin as K}from"../../render/lib/api/index.js";import{useEaselHost as Q}from"efficient-easel/screen/lib/host";import{getEditorToken as X}from"efficient-web-builder/render/lib/editor-auth";import{getEditorSiteId as Y}from"efficient-web-builder/render/lib/editor-site";import{loadProductCatalog as j}from"../../render/components/useProductCatalog.js";import{loadStorefrontCategories as Z}from"./useStorefrontCategories.js";import{useCategoryFilter as v}from"./useCategoryFilter.js";import ee from"./CategoryProductFields.js";import{snapshotChanged as te}from"efficient-web-builder/editor/components/useSnapshotSource";import re from"efficient-web-builder/editor/components/SourceStatus";import{say as l,sayCount as F}from"efficient-web-builder/format/lib/editor-words";const f="__all__";function se(e,t){return t===f?e:e.filter(o=>o.process===t)}function m(e,t){return e.map(o=>({image:o.items[0]?.url,photos:o.items.map(r=>({src:r.url})),href:`/wheels/${t.slug}`,process:t.process,eyebrow:q(o),name:t.name,meta:o.finish})).filter(o=>!!o.image)}function oe(e,t){if(!t)return e;const o=c=>[c.image,...(c.photos??[]).map(u=>u.src)].filter(u=>!!u),r=(c,u)=>{const a=new Map;for(const n of u??[])if(n.eyebrow)for(const i of o(n))a.has(i)||a.set(i,n.eyebrow);return a.size===0?c:c.map(n=>{if(n.eyebrow)return n;const i=o(n).find(p=>a.has(p));return i?{...n,eyebrow:a.get(i)}:n})};return{...e,vehicleCards:r(e.vehicleCards,t.vehicleCards),wheelCards:r(e.wheelCards,t.wheelCards),othersCards:r(e.othersCards,t.othersCards)}}function x(e){const t=X();return t?K.getWheelDetail(t,e,{siteId:Y()}):Promise.reject(new Error("editor not authenticated"))}async function ne(e){const t=await x(e),o={slug:t.slug,name:t.name,process:t.process},r=t.mediaGroups??{photos:[],lifestyle:[],videos:[],accessories:[],others:[]};return{...o,vehicleCards:m(r.lifestyle??[],o),wheelCards:m(r.photos??[],o),othersCards:m(r.others??[],o)}}async function ae(e,t){const o=await Promise.all(e.map(a=>x(a.slug).catch(()=>null))),r=[],c=[],u=[];for(const a of o){if(!a)continue;const n={slug:a.slug,name:a.name,process:a.process},i=a.mediaGroups??{photos:[],lifestyle:[],videos:[],accessories:[],others:[]};r.push(...m(i.lifestyle??[],n)),c.push(...m(i.photos??[],n)),u.push(...m(i.others??[],n))}return{slug:f,name:t===f?"All products":t,process:"",vehicleCards:r,wheelCards:c,othersCards:u,category:t}}function ie({value:e,onChange:t}){const o=Q(),[r,c]=C(null),[u,a]=C(null),[n,i]=C(!1),[p,w]=C(!1),h=E(!0),g=E(e);g.current=e;const S=E(t);S.current=t;const G=s=>{i(!0),w(!1),s().then(V=>{if(!h.current)return;const N=oe(V,g.current);te(N,g.current)&&S.current(N),w(!1)}).catch(()=>{h.current&&w(!0)}).finally(()=>{h.current&&i(!1)})},O=s=>G(()=>ne(s)),b=s=>G(()=>ae(se(r??[],s),s));_(()=>(h.current=!0,j().then(s=>{h.current&&c(s)}),Z().then(s=>{h.current&&a(s)}),()=>{h.current=!1}),[]);const d=e?.slug===f,y=J(()=>r&&e?.slug&&!d?r.find(s=>s.slug===e.slug)??null:null,[r,e?.slug,d]),{category:R,setCategory:k,categoryNames:H,filtered:W}=v(r,u);_(()=>{d?e?.category&&k(e.category):y?.process&&k(y.process)},[y,d,e?.category]);const P=r===null,L=!!e?.slug&&!d&&r!==null&&!y,M=s=>{if(!s){t(null);return}if(s===f){b(R);return}O(s)},T=s=>{k(s),g.current?.slug===f&&b(s)},D=()=>{e?.slug&&(j(!0).then(s=>{h.current&&c(s)}),d?b(e.category??f):O(e.slug))},I=()=>{e?.slug&&o.send("storefront-editor:open-product",{slug:e.slug,name:e.name})},B=(e?.vehicleCards.length??0)+(e?.wheelCards.length??0)+(e?.othersCards?.length??0),z=p?"error":n?"loading":"idle",U=p?l("Couldn’t reach the product catalog."):n?l("Syncing media from the catalog…"):L?l("Linked to “{name}” — no longer in the catalog.",{name:e?.name??""}):d?F("Linked to “{name}” · {n} card from all products’ media groups.","Linked to “{name}” · {n} cards from all products’ media groups.",B,{name:e?.name??""}):F("Linked to “{name}” · {n} card from its media groups.","Linked to “{name}” · {n} cards from its media groups.",B,{name:e?.name??""});return $("div",{children:[A(ee,{category:R,onChange:T,categoryNames:H,readOnly:P,products:W,allProducts:r??[],product:e?.slug??"",onProductChange:M,productReadOnly:P||n,emptyLabel:P?l("Loading…"):l("None (write the cards yourself)"),extraOptions:[{label:l("All products"),value:f},...L?[{label:l("{name} (unavailable)",{name:e.name}),value:e.slug}]:[]]}),e?.slug?A(re,{status:z,statusText:U,onRefresh:D,busy:n,edit:d?void 0:{label:l("Edit product ✎"),onClick:I},hint:d?l("Pools every product’s grouped media: each one’s Relative / lifestyle photos feed Gallery A, its Product photos Gallery B and its Others the Others gallery. Every media group becomes a card, attributed to its own product (title, link and tag). Narrow the set with the Category filter above. Headings, intro copy and stats stay yours."):l("Gallery A comes from the product’s Relative / lifestyle photos, Gallery B from its Product photos and the Others gallery from its Others — edit those in the product’s Media tab and refresh. Each media group is a card: the car set on the group is the eyebrow (a card keeps its caption when the group has no car), its finish the meta line; the card’s title is the product name and its tag the category. Headings, intro copy and stats stay yours.")}):A("p",{className:"es-field-hint",children:l("Pick a product — or All products — to build the galleries from media groups, or keep “None” to author the cards yourself.")})]})}export{ie as default};
@@ -0,0 +1,35 @@
1
+ import { type ReactNode } from "react";
2
+ import { type AdminStorefrontCategory, type WheelSummary } from "../../render/lib/api/index.js";
3
+ import { type ProductSourceOptions } from "../../render/lib/sections/product-source.js";
4
+ export declare const PRODUCT_SOURCE_CHOICE: {
5
+ readonly all: "";
6
+ readonly this: "@this";
7
+ readonly pick: "@pick";
8
+ readonly kept: "@kept";
9
+ };
10
+ export interface ProductSourceRules {
11
+ thisProduct: boolean;
12
+ codeWithoutProduct: boolean;
13
+ untouched: "all" | "pick";
14
+ keepsCategory: boolean;
15
+ }
16
+ export declare const choosableWheels: (wheels: readonly WheelSummary[] | null) => WheelSummary[];
17
+ export declare function productSourceChoice(value: ProductSourceOptions | null | undefined, wheels: readonly WheelSummary[] | null, onProductPage: boolean, rules: ProductSourceRules): string;
18
+ export declare function productSourceOptionsFor<T extends ProductSourceOptions>(choice: string, wheels: readonly WheelSummary[] | null, value: T | null | undefined, rules: ProductSourceRules): T;
19
+ export declare function withSourceCategory<T extends ProductSourceOptions>(value: T | null | undefined, category: string): T;
20
+ export interface ProductSourceRowsProps<T extends ProductSourceOptions> {
21
+ value: T | null | undefined;
22
+ onChange: (value: T) => void;
23
+ wheels: WheelSummary[] | null;
24
+ categories: AdminStorefrontCategory[] | null;
25
+ onProductPage: boolean;
26
+ loading: boolean;
27
+ rules: ProductSourceRules;
28
+ noProductHint: string;
29
+ children?: ReactNode;
30
+ }
31
+ export declare function ProductSourceRows<T extends ProductSourceOptions>({ value, onChange, wheels, categories, onProductPage, loading, rules, noProductHint, children, }: ProductSourceRowsProps<T>): import("react").JSX.Element;
32
+ export declare function useProductSourceCatalog(): {
33
+ wheels: WheelSummary[] | null;
34
+ categories: AdminStorefrontCategory[] | null;
35
+ };
@@ -0,0 +1 @@
1
+ "use client";import{jsx as O,jsxs as N}from"react/jsx-runtime";import{useEffect as j,useMemo as P,useState as A}from"react";import{useProductCatalog as U}from"../../render/components/useProductCatalog.js";import{loadStorefrontCategories as D}from"./useStorefrontCategories.js";import{ALL_CATEGORY as _,categoryOptions as F,useCategoryFilter as H}from"./useCategoryFilter.js";import W from"./CategoryProductFields.js";import{say as g}from"efficient-web-builder/format/lib/editor-words";import{CHOSEN_PRODUCT as y,EVERY_PRODUCT as R}from"../../render/lib/sections/product-source.js";const o={all:"",this:"@this",pick:"@pick",kept:"@kept"},d=t=>typeof t=="string"?t.trim():"",h=t=>(t??[]).filter(e=>d(e.designCode)!=="");function Y(t,e,s,r){const a=t?.product;if(a===R)return o.all;const c=d(t?.designCode),n=r.thisProduct&&s;if(a===y||r.codeWithoutProduct&&!n&&c!==""){if(c==="")return o.pick;const u=h(e).find(p=>d(p.designCode)===c);return u?u.slug:o.kept}return n?o.this:r.untouched==="all"?o.all:o.pick}function G(t,e,s,r){const{product:a,designCode:c,category:n,...u}=s??{};if(t===o.kept)return{...s??{}};if(t===o.all){const i=r.keepsCategory&&d(n)?{category:d(n)}:{};return{...u,product:R,...i}}if(t===o.this)return u;const p=t===o.pick?null:h(e).find(i=>i.slug===t);return p?{...u,product:y,designCode:d(p.designCode)}:{...u,product:y}}function I(t,e){const{category:s,...r}=t??{};return e===_||!e.trim()?r:{...r,category:e.trim()}}function M(t,e,s){return[...t?[{label:g("This product"),value:o.this}]:[],{label:g("Choose a product"),value:o.pick},...e!==null?[{label:s?e:g("{name} (unavailable)",{name:e}),value:o.kept}]:[]]}function X({value:t,onChange:e,wheels:s,categories:r,onProductPage:a,loading:c,rules:n,noProductHint:u,children:p}){const i=P(()=>h(s),[s]),l=Y(t,i,a,n),S=P(()=>i.find(f=>f.slug===l)??null,[i,l]),C=H(i,r,S),k=l===o.all,w=!k&&l!==o.this,b=l===o.kept,E=d(t?.designCode),x=d(t?.category)||_,m=n.keepsCategory&&k,T=m?x:C.category,L=m?F(r,x):C.categoryNames;return N("div",{"data-product-source":"",children:[O(W,{category:T,onChange:m?f=>e(I(t,f)):C.setCategory,categoryNames:L,allLabel:g("All categories"),categoryHidden:!w&&!m,readOnly:c,products:C.filtered,allProducts:i,product:l,onProductChange:f=>e(G(f,i,t,n)),productReadOnly:c,emptyLabel:c?g("Loading…"):g("All products"),extraOptions:M(n.thisProduct&&a,b?E:null,c),showPicked:!0}),p,l===o.pick&&!c?O("p",{className:"es-field-hint",style:{marginTop:"var(--space-8)"},children:u}):null]})}function Z(){const t=U(),[e,s]=A(null);return j(()=>{let r=!1;return D().then(a=>{r||s(a)}),()=>{r=!0}},[]),{wheels:t,categories:e}}export{o as PRODUCT_SOURCE_CHOICE,X as ProductSourceRows,h as choosableWheels,Y as productSourceChoice,G as productSourceOptionsFor,Z as useProductSourceCatalog,I as withSourceCategory};
@@ -1 +1 @@
1
- "use client";import{jsx as p,jsxs as _}from"react/jsx-runtime";import{useEffect as x,useMemo as g,useState as v}from"react";import{useProductCatalog as S}from"../../render/components/useProductCatalog.js";import{loadStorefrontCategories as b}from"./useStorefrontCategories.js";import{useCategoryFilter as D}from"./useCategoryFilter.js";import F from"./CategoryProductFields.js";import{useEasel as N}from"efficient-easel/easel";import{isEditorOnDynamicPage as T}from"efficient-web-builder/format/lib/document/editor-page-context";import{editorPageDrawsOtherRecord as j}from"../../render/lib/document/current-record.js";import{say as u}from"efficient-web-builder/format/lib/editor-words";import{REVIEWS_OF_CHOSEN_PRODUCT as f,REVIEWS_OF_EVERY_PRODUCT as C}from"../../render/lib/sections/reviews.js";const o={all:"",this:"@this",pick:"@pick",kept:"@kept"},a=e=>typeof e=="string"?e.trim():"",m=e=>(e??[]).filter(s=>a(s.designCode)!=="");function I(e,s,n){const l=e?.product;if(l===C)return o.all;const c=a(e?.designCode);if(l===f||!n&&c!==""){if(c==="")return o.pick;const r=m(s).find(t=>a(t.designCode)===c);return r?r.slug:o.kept}return n?o.this:o.all}function V(e){return T()&&!j({appState:e})}function W(e,s,n){const{product:l,designCode:c,...r}=n??{};if(e===o.kept)return{...n??{}};if(e===o.all)return{...r,product:C};if(e===o.this)return r;const t=e===o.pick?null:m(s).find(i=>i.slug===e);return t?{...r,product:f,designCode:a(t.designCode)}:{...r,product:f}}function H(e,s,n){return[...e?[{label:u("This product"),value:o.this}]:[],{label:u("Choose a product"),value:o.pick},...s!==null?[{label:n?s:u("{name} (unavailable)",{name:s}),value:o.kept}]:[]]}function L({value:e,onChange:s,wheels:n,categories:l,onProductPage:c,loading:r}){const t=g(()=>m(n),[n]),i=I(e,t,c),h=g(()=>t.find(d=>d.slug===i)??null,[t,i]),{category:y,setCategory:w,categoryNames:P,filtered:O}=D(t,l,h),E=i!==o.all&&i!==o.this,R=i===o.kept,k=a(e?.designCode);return _("div",{children:[p(F,{category:y,onChange:w,categoryNames:P,allLabel:u("All categories"),categoryHidden:!E,readOnly:r,products:O,allProducts:t,product:i,onProductChange:d=>s(W(d,t,e)),productReadOnly:r,emptyLabel:r?u("Loading…"):u("All products"),extraOptions:H(c,R?k:null,r),showPicked:!0}),i===o.pick&&!r?p("p",{className:"es-field-hint",style:{marginTop:"var(--space-8)"},children:u("No product chosen yet, so reviews of every product show.")}):null]})}function U({value:e,onChange:s}){const n=N(t=>V(t.appState)),l=S(),[c,r]=v(null);return x(()=>{let t=!1;return b().then(i=>{t||r(i)}),()=>{t=!0}},[]),p(L,{value:e,onChange:s,wheels:l,categories:c,onProductPage:n,loading:l===null})}export{o as REVIEWS_PRODUCT_CHOICE,L as ReviewsProductRows,U as default,V as reviewsOnProductPage,I as reviewsProductChoice,W as reviewsSourceOptionsFor};
1
+ "use client";import{jsx as s}from"react/jsx-runtime";import{PRODUCT_SOURCE_CHOICE as i,ProductSourceRows as a,productSourceChoice as d,productSourceOptionsFor as p,useProductSourceCatalog as P}from"./ProductSourceRows.js";import{useEasel as l}from"efficient-easel/easel";import{isEditorOnDynamicPage as g}from"efficient-web-builder/format/lib/document/editor-page-context";import{editorPageDrawsOtherRecord as f}from"../../render/lib/document/current-record.js";import{say as h}from"efficient-web-builder/format/lib/editor-words";const _=i,n={thisProduct:!0,codeWithoutProduct:!0,untouched:"all",keepsCategory:!1};function y(o,e,r){return d(o,e,r,n)}function m(o){return g()&&!f({appState:o})}function D(o,e,r){return p(o,e,r,n)}function w({value:o,onChange:e,wheels:r,categories:t,onProductPage:u,loading:c}){return s(a,{value:o,onChange:e,wheels:r,categories:t,onProductPage:u,loading:c,rules:n,noProductHint:h("No product chosen yet, so reviews of every product show.")})}function C({value:o,onChange:e}){const r=l(c=>m(c.appState)),{wheels:t,categories:u}=P();return s(w,{value:o,onChange:e,wheels:t,categories:u,onProductPage:r,loading:t===null})}export{_ as REVIEWS_PRODUCT_CHOICE,w as ReviewsProductRows,C as default,m as reviewsOnProductPage,y as reviewsProductChoice,D as reviewsSourceOptionsFor};
@@ -1 +1 @@
1
- import{blockAlignmentField as o}from"efficient-easel/screen/lib/document/box-fields";import{legacyBlockAlignOf as r}from"../../../render/lib/content/legacy-block-align.js";function c(n){const l=o(n);return{...l,render:e=>l.render({...e,value:r(e.value)??e.value})}}export{c as blockAlignRow};
1
+ import{blockAlignmentField as o}from"efficient-easel/screen/lib/document/box-fields";import{legacyBlockAlignOf as r}from"efficient-web-builder/format/lib/content/block-align";function c(n){const l=o(n);return{...l,render:e=>l.render({...e,value:r(e.value)??e.value})}}export{c as blockAlignRow};
@@ -1 +1 @@
1
- import{jsx as l}from"react/jsx-runtime";import{ProductFieldIcon as n,ImageIcon as c,EyeIcon as d,HashIcon as p}from"efficient-easel/icons";import{toggle as _,text as r,textarea as u,linkField as t,galleryLayoutField as g,containerGapRows as y,displayFields as f}from"efficient-web-builder/editor/lib/document/controls";import{group as e}from"efficient-easel/screen/lib/document/box-fields";import{select as i,slider as R}from"efficient-web-builder/editor/lib/document/box-fields";import{blockSourceField as E,blockSourceFields as L,NO_BLOCK_SOURCE as O}from"efficient-web-builder/editor/lib/document/block-source-fields";import{GALLERY_TILE_PARTS as h}from"../../../../../../render/components/GalleryItem.js";import{headFieldsForPlacement as A,SPLITTABLE_SECTIONS as I}from"efficient-web-builder/format/lib/sections/section-head-placement";import{slotRowsField as S}from"efficient-web-builder/editor/lib/document/blocks/shared-fields";import{withRowRules as G}from"efficient-web-builder/render/lib/document/show-when";import{BOUND_TO_THE_RECORD as s,BOUND_TO_THE_RECORD_ROW as H,DRAWS_OTHER_RECORD as v,ON_DYNAMIC_PAGE_ROW as B,PAGE_FACTS as D}from"../page-rules.js";import{GALLERY_B_PH as o,GalleryBSlots as F}from"../../../../../../render/lib/document/blocks/commerce/GalleryB/meta.js";const T=[{label:"All media groups",value:"all"},{label:"Lifestyle photos",value:"lifestyle"},{label:"Product photos",value:"photos"},{label:"Accessories",value:"accessories"},{label:"Others",value:"others"}],b=[{label:"Group covers",value:"covers"},{label:"Every photo",value:"all"},{label:"Auto (covers if 4+ groups)",value:"auto"}],q={fields:G({_gDynamic:e("Product page"),dynamic:_("Connect to product data",!1,l(n,{})),mediaZone:i("Images from",l(c,{}),T,"all"),photoDisplay:i("Show",l(d,{}),b,"covers"),_gHeader:e("Header"),num:r("Section number",o.num),title:u("Heading",o.title),_gHeaderLink:e("Header link"),linkText:r("Header button",o.link),linkHref:t("Header link"),_gImages:e("Images"),imageList:S("GalleryB"),items:F.items,...f(h),dataSource:E("Image source","Images typed here"),limit:R("Images to show",l(p,{}),1,24,1,24),_gGalleryLink:e("Gallery link"),galleryHref:t("“See gallery” link"),_gArrangement:e("Arrangement"),layout:g(),...y("GalleryB")},[[["_gDynamic","dynamic"],B],[["mediaZone","photoDisplay"],{all:[H,{not:v}]}],[["_gImages"],{not:s}],[["items","imageList"],{all:[{not:s},O]}],[["limit"],{field:"dataSource",set:!0}]]),resolveFields:(a,{fields:m,parent:k})=>A(L("GalleryB",m,a.props),a.props.headPlacement,I.GalleryB.headRows),showWhenFacts:D};export{q as GalleryBFields};
1
+ import{jsx as o}from"react/jsx-runtime";import{ProductFieldIcon as n,ImageIcon as d,EyeIcon as c,HashIcon as _}from"efficient-easel/icons";import{toggle as p,text as a,textarea as u,linkField as t,galleryLayoutField as g,containerGapRows as y,displayFields as R,sourceField as S}from"efficient-web-builder/editor/lib/document/controls";import{group as e}from"efficient-easel/screen/lib/document/box-fields";import{select as i,slider as f}from"efficient-web-builder/editor/lib/document/box-fields";import{blockSourceField as E,blockSourceFields as O,NO_BLOCK_SOURCE as I}from"efficient-web-builder/editor/lib/document/block-source-fields";import{GALLERY_TILE_PARTS as L}from"../../../../../../render/components/GalleryItem.js";import G,{GALLERY_MEDIA_ZONES as A}from"../../../../../components/GalleryPicturesSource.js";import{PRODUCT_PICTURES_SOURCE as H}from"../../../../../../render/lib/sections/product-pictures.js";import{headFieldsForPlacement as T,SPLITTABLE_SECTIONS as D}from"efficient-web-builder/format/lib/sections/section-head-placement";import{slotRowsField as F}from"efficient-web-builder/editor/lib/document/blocks/shared-fields";import{withRowRules as P}from"efficient-web-builder/render/lib/document/show-when";import{BOUND_TO_THE_RECORD as m,BOUND_TO_THE_RECORD_ROW as h,DRAWS_OTHER_RECORD as k,ON_DYNAMIC_PAGE_ROW as B,PAGE_FACTS as C}from"../page-rules.js";import{GALLERY_B_PH as r,GalleryBSlots as v}from"../../../../../../render/lib/document/blocks/commerce/GalleryB/meta.js";const w=[{label:"Group covers",value:"covers"},{label:"Every photo",value:"all"},{label:"Auto (covers if 4+ groups)",value:"auto"}],X={fields:P({_gDynamic:e("Product page"),dynamic:p("Connect to product data",!1,o(n,{})),mediaZone:i("Images from",o(d,{}),A,"all"),photoDisplay:i("Show",o(c,{}),w,"covers"),_gHeader:e("Header"),num:a("Section number",r.num),title:u("Heading",r.title),_gHeaderLink:e("Header link"),linkText:a("Header button",r.link),linkHref:t("Header link"),_gImages:e("Images"),imageList:F("GalleryB"),items:v.items,...R(L),dataSource:E("Image source","Images typed here"),dataSourceOptions:S(G),limit:f("Images to show",o(_,{}),1,24,1,24),_gGalleryLink:e("Gallery link"),galleryHref:t("“See gallery” link"),_gArrangement:e("Arrangement"),layout:g(),...y("GalleryB")},[[["_gDynamic","dynamic"],B],[["mediaZone","photoDisplay"],{all:[h,{not:k}]}],[["_gImages"],{not:m}],[["items","imageList"],{all:[{not:m},I]}],[["limit"],{field:"dataSource",set:!0}],[["dataSourceOptions"],{field:"dataSource",is:H}]]),resolveFields:(l,{fields:s,parent:b})=>T(O("GalleryB",s,l.props),l.props.headPlacement,D.GalleryB.headRows),showWhenFacts:C};export{X as GalleryBFields};
@@ -1 +1 @@
1
- import{jsx as e}from"react/jsx-runtime";import u from"../../../../../components/GalleryProductBinding.js";import{ProductFieldIcon as s,SquareIcon as n,PlacementIcon as p}from"efficient-easel/icons";import{upload as l,text as a,linkField as c}from"efficient-web-builder/editor/lib/document/controls";import{group as o}from"efficient-easel/screen/lib/document/box-fields";import{segmented as d,select as i}from"efficient-web-builder/editor/lib/document/box-fields";import{withRowRules as g}from"efficient-web-builder/render/lib/document/show-when";const m={field:"fromProduct",is:!0},P={fields:g({_gSource:o("Content source"),fromProduct:d("Image content",e(s,{}),[{label:"Manual",value:!1},{label:"Choose a product",value:!0}],!1),product:{type:"custom",render:({value:t,onChange:r})=>e(u,{value:t,onChange:r})},_gMedia:o("Media"),image:l("Cover image","image/*"),photos:{type:"array",label:"More images",arrayFields:{src:l("Image","image/*")},getItemSummary:(t,r)=>`Image ${(r??0)+1}`},_gText:o("Text"),process:a("Tag"),eyebrow:a("Eyebrow"),name:a("Title"),meta:a("Meta"),_gLink:o("Link"),href:c("Product link"),ratio:i("Shape",e(n,{}),[{label:"Square",value:"square"},{label:"Wide (2:1)",value:"wide"},{label:"Landscape (4:3)",value:"landscape"},{label:"Portrait (4:5)",value:"portrait"},{label:"The photo's own shape",value:"auto"}],"square"),captionPlace:i("Card text",e(p,{}),[{label:"On the photo",value:"overlay"},{label:"Below the photo",value:"below"}],"overlay")},[[["_gMedia","image","photos","_gText","process","eyebrow","name","meta","_gLink","href"],{not:m}],[["product"],m]])};export{P as GalleryItemFields};
1
+ import{jsx as e}from"react/jsx-runtime";import u from"../../../../../components/GalleryProductBinding.js";import{ProductFieldIcon as n,SquareIcon as s,PlacementIcon as p}from"efficient-easel/icons";import{upload as l,text as a,linkField as c}from"efficient-web-builder/editor/lib/document/controls";import{group as o}from"efficient-easel/screen/lib/document/box-fields";import{segmented as d,select as i}from"efficient-web-builder/editor/lib/document/box-fields";import{withRowRules as g}from"efficient-web-builder/render/lib/document/show-when";const m={field:"fromProduct",is:!0},f={context:"parent.layout",set:!0},P={fields:g({_gSource:o("Content source"),fromProduct:d("Image content",e(n,{}),[{label:"Manual",value:!1},{label:"Choose a product",value:!0}],!1),product:{type:"custom",render:({value:r,onChange:t})=>e(u,{value:r,onChange:t})},_gMedia:o("Media"),image:l("Cover image","image/*"),photos:{type:"array",label:"More images",arrayFields:{src:l("Image","image/*")},getItemSummary:(r,t)=>`Image ${(t??0)+1}`},_gText:o("Text"),process:a("Tag"),eyebrow:a("Eyebrow"),name:a("Title"),meta:a("Meta"),_gLink:o("Link"),href:c("Product link"),ratio:i("Shape",e(s,{}),[{label:"Square",value:"square"},{label:"Wide (2:1)",value:"wide"},{label:"Landscape (4:3)",value:"landscape"},{label:"Portrait (4:5)",value:"portrait"},{label:"The photo's own shape",value:"auto"}],"square"),captionPlace:i("Card text",e(p,{}),[{label:"On the photo",value:"overlay"},{label:"Below the photo",value:"below"}],"overlay")},[[["_gMedia","image","photos","_gText","process","eyebrow","name","meta","_gLink","href"],{not:m}],[["product"],m],[["ratio"],{not:f}]])};export{P as GalleryItemFields};
@@ -1 +1 @@
1
- import{jsx as e}from"react/jsx-runtime";import{EyeOffIcon as i,WeightIcon as t,WidthIcon as r}from"efficient-easel/icons";import{deviceField as m}from"efficient-easel/screen/lib/document/device-fields";import{toggle as s}from"efficient-web-builder/editor/lib/document/controls";import{group as l}from"efficient-easel/screen/lib/document/box-fields";import{slider as o}from"efficient-web-builder/editor/lib/document/box-fields";const h={fields:{_gStyle:l("Style"),thickness:o("Thickness",e(t,{}),1,8,1,1,"px"),lengthPct:o("Length",e(r,{}),10,100,1,100,"%"),hideOnMobile:m("mobile",s("Hide",!1,e(i,{})))}};export{h as FooterDividerFields};
1
+ import{jsx as o}from"react/jsx-runtime";import{WeightIcon as e,WidthIcon as i}from"efficient-easel/icons";import{group as r}from"efficient-easel/screen/lib/document/box-fields";import{slider as t}from"efficient-web-builder/editor/lib/document/box-fields";const c={fields:{_gStyle:r("Style"),thickness:t("Thickness",o(e,{}),1,8,1,1,"px"),lengthPct:t("Length",o(i,{}),10,100,1,100,"%")}};export{c as FooterDividerFields};
@@ -1 +1 @@
1
- export declare const serviceBlocks: Record<"Form" | "Reviews" | "Footer" | "FooterGroup" | "Events" | "MenuLinkBlock" | "ArticleBody" | "FooterMenu" | "SiteHeader" | "SiteFooter" | "AppointmentBooking" | "BookingBox" | "SubmitBuild" | "SubmitBox" | "FooterLogo" | "FooterDivider" | "FooterText" | "FooterEmailSignup" | "FooterSocial" | "FooterPayment" | "Subscribe" | "OpeningHours" | "RateTable" | "MessagingCards" | "FooterMessaging" | "ReviewForm" | "ContactRouting" | "LegalLineBlock" | "ContactCards" | "RatingBlock" | "SubscribeBlogs", import("efficient-easel/blocks").ComponentConfig<any, any, Omit<import("efficient-easel/blocks").ComponentData<any, string, Record<string, import("efficient-easel/blocks").DefaultComponentProps>>, "type">>>;
1
+ export declare const serviceBlocks: Record<"Form" | "MenuLinkBlock" | "Reviews" | "Footer" | "FooterGroup" | "Events" | "ArticleBody" | "FooterMenu" | "SiteHeader" | "SiteFooter" | "AppointmentBooking" | "BookingBox" | "SubmitBuild" | "SubmitBox" | "FooterLogo" | "FooterDivider" | "FooterText" | "FooterEmailSignup" | "FooterSocial" | "FooterPayment" | "Subscribe" | "OpeningHours" | "RateTable" | "MessagingCards" | "FooterMessaging" | "ReviewForm" | "ContactRouting" | "LegalLineBlock" | "ContactCards" | "RatingBlock" | "SubscribeBlogs", import("efficient-easel/blocks").ComponentConfig<any, any, Omit<import("efficient-easel/blocks").ComponentData<any, string, Record<string, import("efficient-easel/blocks").DefaultComponentProps>>, "type">>>;
@@ -4,6 +4,7 @@ import "../../../render/lib/document/slot-seeds.js";
4
4
  import "../../../render/lib/document/card-templates.js";
5
5
  import "../../../render/lib/document/section-to-box-rows-reviews.js";
6
6
  import "../../../render/lib/document/section-to-box-rows-spec.js";
7
+ import "../../../render/lib/document/section-to-box-rows-productgrid.js";
7
8
  import "../../../render/lib/document/section-to-box-rows-detail.js";
8
9
  import "./section-text-regions.js";
9
10
  export declare const subscribePopupFields: {
@@ -1 +1 @@
1
- import{jsx as l,Fragment as Y,jsxs as j}from"react/jsx-runtime";import{assignSectionGroups as L,reseatBucketTabs as O}from"efficient-web-builder/editor/lib/document/field-groups";import{buildBlockCategories as q}from"efficient-web-builder/format/lib/document/section-catalog";import{FONT_ROLES as z,FONT_ROLE_LABELS as V}from"efficient-web-builder/format/lib/fonts";import{CONTAINER_DIRECTION_LABELS as C}from"efficient-web-builder/format/lib/content/container-direction";import{SITE_FOOTER_TYPE as X,SITE_HEADER_TYPE as Q}from"efficient-web-builder/format/lib/document/section-groups";import J from"../../components/MenuLinkRangeField.js";import Z from"../../components/EditorPreviewChat.js";import $ from"../../components/EditorPreviewSurface.js";import{isSystemPageSlug as ee,POPUP_DAYS_RANGE as R,POPUP_DELAY_RANGE as A,POPUP_HIDE_AFTER as te,POPUP_SCROLL_RANGE as v,POPUP_SHOW_ON as oe,POPUP_TRIGGERS as w,SUBSCRIBE_POPUP_DEFAULTS as re,SUBSCRIBE_POPUP_KIND as ie}from"efficient-web-builder/format/lib/content/subscribe";import{shownForOption as b,withRowRules as ae,withShowWhen as h}from"efficient-web-builder/render/lib/document/show-when";import{POPUP_KIND_PROP as le,POPUP_TEXT_KIND_LABELS as D,POPUP_TEXT_KINDS as ne}from"efficient-web-builder/format/lib/popup/text-kinds";import{loadPages as se}from"efficient-web-builder/editor/components/StorefrontLinkField";import{pagePath as ce}from"../../../render/lib/links/link-rules.js";import{getEditorSiteId as me}from"efficient-web-builder/render/lib/editor-site";import{CART_DRAWER_DEFAULTS as ue,CART_DRAWER_KIND as T}from"efficient-web-builder/format/lib/content/cart-drawer";import{POPUP_PAGE_KIND as I}from"efficient-web-builder/format/lib/popup/look";import{popupLookFields as de}from"./popup-look-fields.js";import{CONSENT_BANNER_KIND as N}from"efficient-web-builder/format/lib/content/consent-banner";import{consentBannerLayoutField as pe}from"../../components/ConsentBannerLayoutTiles.js";import{CategoryIcon as ge,CheckIcon as Pe,ClockIcon as B,ColumnsIcon as fe,DirectionIcon as be,EyeIcon as Se,ListIcon as ye,PageIcon as he,PlacementIcon as Te,ScrollPointIcon as Be,TabsIcon as ke,TriggerIcon as Ee}from"efficient-easel/icons";import{deviceField as x}from"efficient-easel/screen/lib/document/device-fields";import{FieldGlyph as Fe}from"efficient-web-builder/editor/components/FieldGlyph";import{DisplayRow as _e,multiSelect as Le,panelNote as Oe,plainText as a,plainTextarea as p,sectionShapeFields as Ce,sectionThemeFields as Re,textList as k,toggle as H}from"efficient-web-builder/editor/lib/document/controls";import{group as c}from"efficient-easel/screen/lib/document/box-fields";import{segmented as g,select as M,slider as E}from"efficient-web-builder/editor/lib/document/box-fields";import{blockAlignRow as Ae}from"./block-align-row.js";import{formPicker as ve}from"./blocks/service/controls.js";import{SECTION_THEME_FOLLOW_LABEL as we}from"efficient-web-builder/editor/components/SectionThemePicker";import{nestedAccentValue as De}from"efficient-web-builder/format/lib/content/section-surface";import{isEditorOnDynamicPage as Ie}from"efficient-web-builder/format/lib/document/editor-page-context";import{TEMPLATE_PRODUCT_TYPE_PROP as Ne}from"efficient-web-builder/format/lib/content/product-page";import{PRODUCT_KIND_OPTIONS as xe}from"../../../render/lib/catalog/plp-item.js";import{PH as F}from"efficient-web-builder/format/lib/document/blocks/placeholders";import{textKindGlyph as He}from"efficient-web-builder/editor/lib/document/blocks/shared-fields";import"../efficient-backend.js";import"../../../render/lib/document/slot-seeds.js";import"../../../render/lib/document/card-templates.js";import"../../../render/lib/document/section-to-box-rows-reviews.js";import"../../../render/lib/document/section-to-box-rows-spec.js";import"../../../render/lib/document/section-to-box-rows-detail.js";import"./section-text-regions.js";import{generalBlocks as e}from"efficient-web-builder/editor/lib/document/blocks/general/index";import{commerceBlocks as t}from"./blocks/commerce/index.js";import{serviceBlocks as i}from"./blocks/service/index.js";import{EditorThemedBody as Me,suppressPreviewNav as Ge}from"efficient-web-builder/editor/lib/document/page-root";import Ue from"../../components/HeaderSection.js";import{addPageBlocksFromFooter as Ke,PAGE_MENU_DIRECTION_DEFAULT as _}from"../../../render/lib/document/footer-page-blocks.js";import{MENU_STYLE_PLAIN as G,MENU_STYLE_TABS as U}from"../../../render/components/FooterMenu.js";import{drawPopupPage as We,drawPublishedStorefrontRoot as Ye,drawSystemPage as je,StorefrontPageProviders as qe}from"../../../render/lib/document/storefront-root.js";import{GENERAL_ROOT_FIELDS as ze}from"efficient-web-builder/editor/lib/document/page-root-fields";import{finishRegistry as Ve}from"efficient-web-builder/editor/lib/document/registry";const Xe="Newsletter (built in)",Qe=[{id:"currentPage",label:"Current page"}],ao=[{value:"00",label:F.label},{value:"00",label:F.label},{value:"00",label:F.label}],r=re,P={field:"autoOpen",is:!0},Je={all:[b("hideAfter",te,r.hideAfter,["days"]),{not:{all:[{field:"hideAfter",is:null,default:null},{field:"oncePerSession",in:[!0,!1]}]}}]},Ze=[[["trigger","showOn","hideAfter"],P],[["autoOpenDelaySec"],{all:[P,b("trigger",w,r.trigger,["delay","exit"])]}],[["scrollPercent"],{all:[P,b("trigger",w,r.trigger,["scroll"])]}],[["showOnPages"],{all:[P,b("showOn",oe,r.showOn,["chosen"])]}],[["hideDays"],{all:[P,Je]}]],$e=ae({formSlug:ve(void 0,Xe),_gLeft:c("Left panel"),metaLabel:a("Meta label",r.metaLabel),issueLabel:a("Issue label",r.issueLabel),issueNumber:a("Issue number",r.issueNumber),kicker:a("Eyebrow",r.kicker),heading:p("Heading",r.heading),deck:p("Deck",r.deck),stats:{type:"array",label:"Stats",arrayFields:{label:a("Label"),value:a("Value")},getItemSummary:o=>o?.label||o?.value||"Stat"},_gForm:c("Right panel · form"),formLabel:a("Section label",r.formLabel),formHeading:a("Heading",r.formHeading),formIntro:p("Intro",r.formIntro),firstNameLabel:a("First-name label",r.firstNameLabel),firstNamePlaceholder:a("First-name placeholder",r.firstNamePlaceholder),emailLabel:a("Email label",r.emailLabel),emailPlaceholder:a("Email placeholder",r.emailPlaceholder),_gChoices:c("Right panel · choices"),interestsLabel:a("Interests label",r.interestsLabel),interests:k("Interest chips",l(Fe,{noun:"tag"}),"Chip label","verbatim"),frequencyLabel:a("Frequency label",r.frequencyLabel),frequencies:k("Frequency options",l(ye,{}),"Option label","verbatim"),_gActions:c("Right panel · actions"),submitText:a("Submit button",r.submitText),finePrint:a("Fine print",r.finePrint),dismissText:a("Dismiss link",r.dismissText),emailInvalidText:a("Invalid-email error",r.emailInvalidText),submitErrorText:a("Submit-failed error",r.submitErrorText),_gSuccess:c("Success state"),successHeading:a("Heading",r.successHeading),successBody:p("Message",r.successBody),keepBrowsingText:a("Dismiss button",r.keepBrowsingText),...Re(De,we),...Ce(),_gTextStyle:c("Text style"),...Object.fromEntries(ne.map(o=>[le[o],M(D[o],He(D[o]),[{label:"Popup's own",value:""},...z.map(n=>({label:V[n],value:n}))],"")])),_gBehaviour:c("Behavior"),autoOpen:H("Show by itself",r.autoOpen,l(Se,{})),trigger:g("Trigger",l(Ee,{}),[{label:"Delay",value:"delay"},{label:"Scroll",value:"scroll"},{label:"Exit",value:"exit"}],r.trigger),autoOpenDelaySec:E("Delay",l(B,{}),A.min,A.max,1,r.autoOpenDelaySec,"s"),scrollPercent:E("Scroll",l(Be,{}),v.min,v.max,5,r.scrollPercent,"%"),showOn:g("Pages",l(he,{}),[{label:"All",value:"all"},{label:"Chosen",value:"chosen"}],r.showOn),showOnPages:Le("Chosen pages",[],"None"),hideAfter:g("After close",l(B,{}),[{label:"This visit",value:"visit"},{label:"Days",value:"days"},{label:"Never",value:"never"}],r.hideAfter),hideDays:E("Days",l(B,{}),R.min,R.max,1,r.hideDays),_gArrangement:c("Arrangement"),formSide:g("Form side",l(Te,{}),[{label:"Right",value:"right"},{label:"Left",value:"left"}],r.formSide),_gPhone:x("mobile",c("On a phone")),valuePanelOnPhone:x("mobile",H("Left panel",r.valuePanelOnPhone,l(fe,{})))},Ze),K=L($e,"SubscribePopup");async function et(){return(await se(me()??"")).filter(n=>!ee(n.slug)).map(n=>({label:n.label,value:ce(n.slug)}))}async function tt(){return O({...K,showOnPages:{...K.showOnPages,options:await et().catch(()=>[])}})}const u=ue,ot={_gHeader:c("Header"),kickerBadge:a("Eyebrow badge",u.kickerBadge),kickerText:a("Eyebrow text",u.kickerText),titleLead:a("Heading",u.titleLead),titleAccent:a("Heading accent",u.titleAccent),subtitleEmpty:p("Sub-line · empty",u.subtitleEmpty),subtitleOne:p("Sub-line · one set",u.subtitleOne),subtitleMany:p("Sub-line · several sets",u.subtitleMany,"{count} becomes the number of sets"),_gStatus:c("Status rail"),leadTimeValue:a("Lead time",u.leadTimeValue),shipsToFallback:a("Ships to · fallback",u.shipsToFallback,"Shown only while the site serves no countries — otherwise the site's default country is stated"),_gPromises:c("Promise row"),promises:k("Trust markers",l(Pe,{}),"Marker","verbatim"),_gEmpty:c("Empty basket"),emptyKicker:a("Eyebrow",u.emptyKicker),emptyBody:p("Message",u.emptyBody)},W=(o,n,m)=>O({...o,...L(de(n),m)}),rt=W(ot,T,"CartDrawer"),it={layout:pe,_nConsentWhere:Oe("The banner's words follow each visitor's country. Turn consent on or off, and pick the privacy page, in Admin › Storefront › Marketing › Privacy.")};function at({kind:o}){return l("div",{style:{padding:"14px 18px",fontFamily:"var(--font-mono, monospace)",fontSize:12,letterSpacing:"0.18em",textTransform:"uppercase",color:"var(--fg-dim)",borderBottom:"1px solid var(--site-line)"},children:o===T?"This is the cart drawer — edit its copy in the Settings panel →":o===N?"This is the cookie banner — pick its layout in the Settings panel →":"This is the site popup — edit it in the Settings panel →"})}const f={root:{fields:{...ze},resolveFields:async(o,{fields:n})=>{if(o?.props?.kind===ie)return tt();if(o?.props?.kind===I)return W(n,I,"PopupPage");if(o?.props?.kind===T)return rt;if(o?.props?.kind===N)return it;const m=n;return Ie()?{[Ne]:M("Product type",l(ge,{}),xe,"alloy-wheel"),...m}:m},render:o=>{const{editor:n,pageBackground:m,theme:s,fonts:d}=o;if(!n?.isEditing)return Ye(o);const S=je(o,l(at,{kind:o.kind}));if(S)return S;const y=We(o,!0);return l(Me,{propsTheme:s,propsFonts:d,pageBackground:typeof m=="string"?m:void 0,suppressPreviewNav:Ge,overlay:j(Y,{children:[l(Z,{}),l($,{})]}),children:y??l(qe,{rootProps:o,children:o.children})})}},categories:q(),components:{Heading:e.Heading,Text:e.Text,Eyebrow:e.Eyebrow,ImageBlock:e.ImageBlock,LogoBlock:e.LogoBlock,ButtonBlock:e.ButtonBlock,Spacer:e.Spacer,Divider:e.Divider,Grid:e.Grid,Flex:e.Flex,Breadcrumb:e.Breadcrumb,Masthead:e.Masthead,CategoryBar:e.CategoryBar,FeaturedCover:e.FeaturedCover,LongRead:e.LongRead,Series:e.Series,Subscribe:i.Subscribe,SubscribeBlogs:i.SubscribeBlogs,Banner:e.Banner,ParagraphsA:e.ParagraphsA,StatsParagraph:e.StatsParagraph,Timeline:e.Timeline,Footprint:e.Footprint,TimelineTrack:e.TimelineTrack,TitleWithButtons:e.TitleWithButtons,Stats:e.Stats,Integrations:e.Integrations,Mockup:e.Mockup,Chart:e.Chart,KeyFeatures:e.KeyFeatures,Testimonials:e.Testimonials,Reviews:i.Reviews,RatingBlock:i.RatingBlock,Prose:e.Prose,Cards:e.Cards,Logos:e.Logos,Ticker:e.Ticker,ContactRouting:i.ContactRouting,ContactLocations:e.ContactLocations,HeroSingle:e.HeroSingle,Hero:e.Hero,HeroSlide:e.HeroSlide,HeroGroup:e.HeroGroup,Collections:t.Collections,CollectionCard:t.CollectionCard,Events:i.Events,RateTable:i.RateTable,MessagingCards:i.MessagingCards,ContactCards:i.ContactCards,OpeningHours:i.OpeningHours,PostCard:e.PostCard,DocMetaCards:e.DocMetaCards,DocTabs:e.DocTabs,DocMasthead:e.DocMasthead,DocBody:e.DocBody,Contents:e.Contents,FAQ:e.FAQ,Gallery:t.Gallery,GalleryB:t.GalleryB,SpecStrip:e.SpecStrip,GalleryItem:t.GalleryItem,Manifesto:e.Manifesto,SectionHeader:e.SectionHeader,IntroBleed:e.IntroBleed,Split:e.Split,SubmitBuild:i.SubmitBuild,SubmitBox:i.SubmitBox,ReviewForm:i.ReviewForm,Form:i.Form,AppointmentBooking:i.AppointmentBooking,BookingBox:i.BookingBox,CatalogFilterBar:t.CatalogFilterBar,AlloyWheelsListing:t.AlloyWheelsListing,ProductGrid:t.ProductGrid,ProductHero:t.ProductHero,ProductGallery:t.ProductGallery,SpecTable:t.SpecTable,ProcessSteps:e.ProcessSteps,DetailRows:t.DetailRows,FitmentTable:t.FitmentTable,RelatedProducts:t.RelatedProducts,BundleOffer:t.BundleOffer,CompatibleTyres:t.CompatibleTyres,TyreSizes:t.TyreSizes,TyreFitment:t.TyreFitment,EuTyreLabel:t.EuTyreLabel,EuTyreLabelBlock:t.EuTyreLabelBlock,ProductSize:t.ProductSize,ProductColour:t.ProductColour,ProductPrice:t.ProductPrice,ProductBuyButton:t.ProductBuyButton,FilterBlock:t.FilterBlock,FilterChipsBlock:t.FilterChipsBlock,ProductPicture:t.ProductPicture,ProductSpecs:t.ProductSpecs,ProductBuy:t.ProductBuy,ProductEyebrow:t.ProductEyebrow,ProductName:t.ProductName,FitmentFinder:t.FitmentFinder,FitmentPicker:t.FitmentPicker,StockFitment:t.StockFitment,OrderSummary:e.OrderSummary,DeliveryOptions:t.DeliveryOptions,PaymentBadges:e.PaymentBadges,CheckoutCTA:t.CheckoutCTA,ProductRef:t.ProductRef,CustomHTML:e.CustomHTML,CardList:e.CardList,Header:t.Header,Footer:i.Footer,FooterLogo:i.FooterLogo,FooterMenu:i.FooterMenu,ArticleBody:i.ArticleBody,MenuLinkBlock:i.MenuLinkBlock,FooterDivider:i.FooterDivider,FooterGroup:i.FooterGroup,FooterText:i.FooterText,FooterEmailSignup:i.FooterEmailSignup,FooterSocial:i.FooterSocial,FooterMessaging:i.FooterMessaging,FooterPayment:i.FooterPayment,LegalLineBlock:i.LegalLineBlock,SearchBlock:t.SearchBlock,CartBlock:t.CartBlock,CountrySwitchBlock:t.CountrySwitchBlock,AccountBlock:t.AccountBlock,ThemeSwitchBlock:t.ThemeSwitchBlock,[Q]:i.SiteHeader,[X]:i.SiteFooter}};Ke(f.components);{const o=f.components.MenuBlock;o.fields={...o.fields,direction:g("Direction",l(be,{}),[{label:C.column,value:"column"},{label:C.row,value:"row"}],_)};const n={type:"custom",render:({value:s,onChange:d})=>l(J,{value:s,onChange:d})},m=h({type:"custom",render:({value:s,onChange:d})=>l(_e,{parts:Qe,changed:s===!0,shown:()=>s===!0,onPress:(S,y)=>d(y),onReset:()=>d(void 0)})},{not:{field:"direction",is:"column",default:_}});o.fields=Object.fromEntries(Object.entries(o.fields).flatMap(([s,d])=>s==="menu"?[[s,d],["linkRange",n],["currentPage",m]]:[[s,d]])),o.fields={...o.fields,linkAlign:Ae({label:"Link alignment"}),menuStyle:h(g("Menu style",l(ke,{}),[{label:"Plain",value:G},{label:"Tabs",value:U}],G),{not:{field:"direction",is:"column",default:_}})};for(const s of["linkRange","linkAlign"])o.fields[s]=h(o.fields[s],{not:{field:"menuStyle",is:U}})}{const o=f.components.Header,n=o.render;o.render=m=>m.editor?.isEditing?l(Ue,{editing:!0}):n(m)}const lt=Ve(f),lo=lt.sectionGroupAllow;var no=f;export{lo as SECTION_GROUP_ALLOW,f as config,no as default,$e as subscribePopupFields};
1
+ import{jsx as l,Fragment as j,jsxs as q}from"react/jsx-runtime";import{assignSectionGroups as L,reseatBucketTabs as O}from"efficient-web-builder/editor/lib/document/field-groups";import{buildBlockCategories as z}from"efficient-web-builder/format/lib/document/section-catalog";import{FONT_ROLES as V,FONT_ROLE_LABELS as X}from"efficient-web-builder/format/lib/fonts";import{CONTAINER_DIRECTION_LABELS as C}from"efficient-web-builder/format/lib/content/container-direction";import{SITE_FOOTER_TYPE as Q,SITE_HEADER_TYPE as J}from"efficient-web-builder/format/lib/document/section-groups";import Z from"../../components/MenuLinkRangeField.js";import $ from"../../components/EditorPreviewChat.js";import ee from"../../components/EditorPreviewSurface.js";import{isSystemPageSlug as te,POPUP_DAYS_RANGE as R,POPUP_DELAY_RANGE as v,POPUP_HIDE_AFTER as oe,POPUP_SCROLL_RANGE as A,POPUP_SHOW_ON as re,POPUP_TRIGGERS as w,SUBSCRIBE_POPUP_DEFAULTS as ie,SUBSCRIBE_POPUP_KIND as ae}from"efficient-web-builder/format/lib/content/subscribe";import{shownForOption as h,withRowRules as le,withShowWhen as y}from"efficient-web-builder/render/lib/document/show-when";import{POPUP_KIND_PROP as ne,POPUP_TEXT_KIND_LABELS as D,POPUP_TEXT_KINDS as se}from"efficient-web-builder/format/lib/popup/text-kinds";import{loadPages as ce}from"efficient-web-builder/editor/components/StorefrontLinkField";import{pagePath as me}from"../../../render/lib/links/link-rules.js";import{getEditorSiteId as ue}from"efficient-web-builder/render/lib/editor-site";import{CART_DRAWER_DEFAULTS as de,CART_DRAWER_KIND as T}from"efficient-web-builder/format/lib/content/cart-drawer";import{POPUP_PAGE_KIND as I}from"efficient-web-builder/format/lib/popup/look";import{popupLookFields as pe}from"./popup-look-fields.js";import{CONSENT_BANNER_KIND as N}from"efficient-web-builder/format/lib/content/consent-banner";import{consentBannerLayoutField as ge}from"../../components/ConsentBannerLayoutTiles.js";import{CategoryIcon as Pe,CheckIcon as fe,ClockIcon as B,ColumnsIcon as be,DirectionIcon as Se,EyeIcon as he,ListIcon as ye,PageIcon as Te,PlacementIcon as Be,ScrollPointIcon as ke,TabsIcon as Fe,TriggerIcon as Ee}from"efficient-easel/icons";import{deviceField as x}from"efficient-easel/screen/lib/document/device-fields";import{FieldGlyph as _e}from"efficient-web-builder/editor/components/FieldGlyph";import{DisplayRow as Le,multiSelect as Oe,panelNote as Ce,plainText as a,plainTextarea as p,sectionShapeFields as Re,sectionThemeFields as ve,textList as k,toggle as H}from"efficient-web-builder/editor/lib/document/controls";import{group as m}from"efficient-easel/screen/lib/document/box-fields";import{segmented as g,select as M,slider as F}from"efficient-web-builder/editor/lib/document/box-fields";import{blockAlignRow as Ae}from"./block-align-row.js";import{formPicker as we}from"./blocks/service/controls.js";import{SECTION_THEME_FOLLOW_LABEL as De}from"efficient-web-builder/editor/components/SectionThemePicker";import{nestedAccentValue as Ie}from"efficient-web-builder/format/lib/content/section-surface";import{isEditorOnDynamicPage as Ne}from"efficient-web-builder/format/lib/document/editor-page-context";import{TEMPLATE_PRODUCT_TYPE_PROP as xe}from"efficient-web-builder/format/lib/content/product-page";import{PRODUCT_KIND_OPTIONS as He}from"../../../render/lib/catalog/plp-item.js";import{PH as E}from"efficient-web-builder/format/lib/document/blocks/placeholders";import{textKindGlyph as Me}from"efficient-web-builder/editor/lib/document/blocks/shared-fields";import{NO_BLOCK_SOURCE as Ge,blockSourceField as Ue,blockSourceFields as Ke}from"efficient-web-builder/editor/lib/document/block-source-fields";import{menuTemplateFollowsContent as We}from"../../../render/lib/content/menu-card-seed.js";import"../efficient-backend.js";import"../../../render/lib/document/slot-seeds.js";import"../../../render/lib/document/card-templates.js";import"../../../render/lib/document/section-to-box-rows-reviews.js";import"../../../render/lib/document/section-to-box-rows-spec.js";import"../../../render/lib/document/section-to-box-rows-productgrid.js";import"../../../render/lib/document/section-to-box-rows-detail.js";import"./section-text-regions.js";import{generalBlocks as e}from"efficient-web-builder/editor/lib/document/blocks/general/index";import{commerceBlocks as t}from"./blocks/commerce/index.js";import{serviceBlocks as i}from"./blocks/service/index.js";import{EditorThemedBody as Ye,suppressPreviewNav as je}from"efficient-web-builder/editor/lib/document/page-root";import qe from"../../components/HeaderSection.js";import{addPageBlocksFromFooter as ze,PAGE_MENU_DIRECTION_DEFAULT as _}from"../../../render/lib/document/footer-page-blocks.js";import{MENU_STYLE_PLAIN as G,MENU_STYLE_TABS as U}from"../../../render/components/FooterMenu.js";import{drawPopupPage as Ve,drawPublishedStorefrontRoot as Xe,drawSystemPage as Qe,StorefrontPageProviders as Je}from"../../../render/lib/document/storefront-root.js";import{GENERAL_ROOT_FIELDS as Ze}from"efficient-web-builder/editor/lib/document/page-root-fields";import{finishRegistry as $e}from"efficient-web-builder/editor/lib/document/registry";const et="Newsletter (built in)",tt=[{id:"currentPage",label:"Current page"}],Po=[{value:"00",label:E.label},{value:"00",label:E.label},{value:"00",label:E.label}],r=ie,P={field:"autoOpen",is:!0},ot={all:[h("hideAfter",oe,r.hideAfter,["days"]),{not:{all:[{field:"hideAfter",is:null,default:null},{field:"oncePerSession",in:[!0,!1]}]}}]},rt=[[["trigger","showOn","hideAfter"],P],[["autoOpenDelaySec"],{all:[P,h("trigger",w,r.trigger,["delay","exit"])]}],[["scrollPercent"],{all:[P,h("trigger",w,r.trigger,["scroll"])]}],[["showOnPages"],{all:[P,h("showOn",re,r.showOn,["chosen"])]}],[["hideDays"],{all:[P,ot]}]],it=le({formSlug:we(void 0,et),_gLeft:m("Left panel"),metaLabel:a("Meta label",r.metaLabel),issueLabel:a("Issue label",r.issueLabel),issueNumber:a("Issue number",r.issueNumber),kicker:a("Eyebrow",r.kicker),heading:p("Heading",r.heading),deck:p("Deck",r.deck),stats:{type:"array",label:"Stats",arrayFields:{label:a("Label"),value:a("Value")},getItemSummary:o=>o?.label||o?.value||"Stat"},_gForm:m("Right panel · form"),formLabel:a("Section label",r.formLabel),formHeading:a("Heading",r.formHeading),formIntro:p("Intro",r.formIntro),firstNameLabel:a("First-name label",r.firstNameLabel),firstNamePlaceholder:a("First-name placeholder",r.firstNamePlaceholder),emailLabel:a("Email label",r.emailLabel),emailPlaceholder:a("Email placeholder",r.emailPlaceholder),_gChoices:m("Right panel · choices"),interestsLabel:a("Interests label",r.interestsLabel),interests:k("Interest chips",l(_e,{noun:"tag"}),"Chip label","verbatim"),frequencyLabel:a("Frequency label",r.frequencyLabel),frequencies:k("Frequency options",l(ye,{}),"Option label","verbatim"),_gActions:m("Right panel · actions"),submitText:a("Submit button",r.submitText),finePrint:a("Fine print",r.finePrint),dismissText:a("Dismiss link",r.dismissText),emailInvalidText:a("Invalid-email error",r.emailInvalidText),submitErrorText:a("Submit-failed error",r.submitErrorText),_gSuccess:m("Success state"),successHeading:a("Heading",r.successHeading),successBody:p("Message",r.successBody),keepBrowsingText:a("Dismiss button",r.keepBrowsingText),...ve(Ie,De),...Re(),_gTextStyle:m("Text style"),...Object.fromEntries(se.map(o=>[ne[o],M(D[o],Me(D[o]),[{label:"Popup's own",value:""},...V.map(n=>({label:X[n],value:n}))],"")])),_gBehaviour:m("Behavior"),autoOpen:H("Show by itself",r.autoOpen,l(he,{})),trigger:g("Trigger",l(Ee,{}),[{label:"Delay",value:"delay"},{label:"Scroll",value:"scroll"},{label:"Exit",value:"exit"}],r.trigger),autoOpenDelaySec:F("Delay",l(B,{}),v.min,v.max,1,r.autoOpenDelaySec,"s"),scrollPercent:F("Scroll",l(ke,{}),A.min,A.max,5,r.scrollPercent,"%"),showOn:g("Pages",l(Te,{}),[{label:"All",value:"all"},{label:"Chosen",value:"chosen"}],r.showOn),showOnPages:Oe("Chosen pages",[],"None"),hideAfter:g("After close",l(B,{}),[{label:"This visit",value:"visit"},{label:"Days",value:"days"},{label:"Never",value:"never"}],r.hideAfter),hideDays:F("Days",l(B,{}),R.min,R.max,1,r.hideDays),_gArrangement:m("Arrangement"),formSide:g("Form side",l(Be,{}),[{label:"Right",value:"right"},{label:"Left",value:"left"}],r.formSide),_gPhone:x("mobile",m("On a phone")),valuePanelOnPhone:x("mobile",H("Left panel",r.valuePanelOnPhone,l(be,{})))},rt),K=L(it,"SubscribePopup");async function at(){return(await ce(ue()??"")).filter(n=>!te(n.slug)).map(n=>({label:n.label,value:me(n.slug)}))}async function lt(){return O({...K,showOnPages:{...K.showOnPages,options:await at().catch(()=>[])}})}const d=de,nt={_gHeader:m("Header"),kickerBadge:a("Eyebrow badge",d.kickerBadge),kickerText:a("Eyebrow text",d.kickerText),titleLead:a("Heading",d.titleLead),titleAccent:a("Heading accent",d.titleAccent),subtitleEmpty:p("Sub-line · empty",d.subtitleEmpty),subtitleOne:p("Sub-line · one set",d.subtitleOne),subtitleMany:p("Sub-line · several sets",d.subtitleMany,"{count} becomes the number of sets"),_gStatus:m("Status rail"),leadTimeValue:a("Lead time",d.leadTimeValue),shipsToFallback:a("Ships to · fallback",d.shipsToFallback,"Shown only while the site serves no countries — otherwise the site's default country is stated"),_gPromises:m("Promise row"),promises:k("Trust markers",l(fe,{}),"Marker","verbatim"),_gEmpty:m("Empty basket"),emptyKicker:a("Eyebrow",d.emptyKicker),emptyBody:p("Message",d.emptyBody)},W=(o,n,u)=>O({...o,...L(pe(n),u)}),st=W(nt,T,"CartDrawer"),ct={layout:ge,_nConsentWhere:Ce("The banner's words follow each visitor's country. Turn consent on or off, and pick the privacy page, in Admin › Storefront › Marketing › Privacy.")};function mt({kind:o}){return l("div",{style:{padding:"14px 18px",fontFamily:"var(--font-mono, monospace)",fontSize:12,letterSpacing:"0.18em",textTransform:"uppercase",color:"var(--fg-dim)",borderBottom:"1px solid var(--site-line)"},children:o===T?"This is the cart drawer — edit its copy in the Settings panel →":o===N?"This is the cookie banner — pick its layout in the Settings panel →":"This is the site popup — edit it in the Settings panel →"})}const f={root:{fields:{...Ze},resolveFields:async(o,{fields:n})=>{if(o?.props?.kind===ae)return lt();if(o?.props?.kind===I)return W(n,I,"PopupPage");if(o?.props?.kind===T)return st;if(o?.props?.kind===N)return ct;const u=n;return Ne()?{[xe]:M("Product type",l(Pe,{}),He,"alloy-wheel"),...u}:u},render:o=>{const{editor:n,pageBackground:u,theme:b,fonts:S}=o;if(!n?.isEditing)return Xe(o);const s=Qe(o,l(mt,{kind:o.kind}));if(s)return s;const c=Ve(o,!0);return l(Ye,{propsTheme:b,propsFonts:S,pageBackground:typeof u=="string"?u:void 0,suppressPreviewNav:je,overlay:q(j,{children:[l($,{}),l(ee,{})]}),children:c??l(Je,{rootProps:o,children:o.children})})}},categories:z(),components:{Heading:e.Heading,Text:e.Text,Eyebrow:e.Eyebrow,ImageBlock:e.ImageBlock,LogoBlock:e.LogoBlock,ButtonBlock:e.ButtonBlock,Spacer:e.Spacer,Divider:e.Divider,Grid:e.Grid,Flex:e.Flex,Breadcrumb:e.Breadcrumb,Masthead:e.Masthead,CategoryBar:e.CategoryBar,FeaturedCover:e.FeaturedCover,LongRead:e.LongRead,Series:e.Series,Subscribe:i.Subscribe,SubscribeBlogs:i.SubscribeBlogs,Banner:e.Banner,ParagraphsA:e.ParagraphsA,StatsParagraph:e.StatsParagraph,Timeline:e.Timeline,Footprint:e.Footprint,TimelineTrack:e.TimelineTrack,TitleWithButtons:e.TitleWithButtons,Stats:e.Stats,Integrations:e.Integrations,Mockup:e.Mockup,Chart:e.Chart,KeyFeatures:e.KeyFeatures,Testimonials:e.Testimonials,Reviews:i.Reviews,RatingBlock:i.RatingBlock,Prose:e.Prose,Cards:e.Cards,Logos:e.Logos,Ticker:e.Ticker,ContactRouting:i.ContactRouting,ContactLocations:e.ContactLocations,HeroSingle:e.HeroSingle,Hero:e.Hero,HeroSlide:e.HeroSlide,HeroGroup:e.HeroGroup,Collections:t.Collections,CollectionCard:t.CollectionCard,Events:i.Events,RateTable:i.RateTable,MessagingCards:i.MessagingCards,ContactCards:i.ContactCards,OpeningHours:i.OpeningHours,PostCard:e.PostCard,DocMetaCards:e.DocMetaCards,DocTabs:e.DocTabs,DocMasthead:e.DocMasthead,DocBody:e.DocBody,Contents:e.Contents,ListSearch:e.ListSearch,FAQ:e.FAQ,Gallery:t.Gallery,GalleryB:t.GalleryB,SpecStrip:e.SpecStrip,GalleryItem:t.GalleryItem,Manifesto:e.Manifesto,SectionHeader:e.SectionHeader,IntroBleed:e.IntroBleed,Split:e.Split,SubmitBuild:i.SubmitBuild,SubmitBox:i.SubmitBox,ReviewForm:i.ReviewForm,Form:i.Form,AppointmentBooking:i.AppointmentBooking,BookingBox:i.BookingBox,CatalogFilterBar:t.CatalogFilterBar,AlloyWheelsListing:t.AlloyWheelsListing,ProductGrid:t.ProductGrid,ProductHero:t.ProductHero,ProductGallery:t.ProductGallery,SpecTable:t.SpecTable,ProcessSteps:e.ProcessSteps,DetailRows:t.DetailRows,FitmentTable:t.FitmentTable,RelatedProducts:t.RelatedProducts,BundleOffer:t.BundleOffer,CompatibleTyres:t.CompatibleTyres,TyreSizes:t.TyreSizes,TyreFitment:t.TyreFitment,EuTyreLabel:t.EuTyreLabel,EuTyreLabelBlock:t.EuTyreLabelBlock,ProductSize:t.ProductSize,ProductColour:t.ProductColour,ProductPrice:t.ProductPrice,ProductBuyButton:t.ProductBuyButton,FilterBlock:t.FilterBlock,FilterChipsBlock:t.FilterChipsBlock,ProductPicture:t.ProductPicture,ProductSpecs:t.ProductSpecs,ProductBuy:t.ProductBuy,ProductEyebrow:t.ProductEyebrow,ProductName:t.ProductName,FitmentFinder:t.FitmentFinder,FitmentPicker:t.FitmentPicker,StockFitment:t.StockFitment,OrderSummary:e.OrderSummary,DeliveryOptions:t.DeliveryOptions,PaymentBadges:e.PaymentBadges,CheckoutCTA:t.CheckoutCTA,ProductRef:t.ProductRef,CustomHTML:e.CustomHTML,CardList:e.CardList,Header:t.Header,Footer:i.Footer,FooterLogo:i.FooterLogo,FooterMenu:i.FooterMenu,ArticleBody:i.ArticleBody,MenuLinkBlock:i.MenuLinkBlock,FooterDivider:i.FooterDivider,FooterGroup:i.FooterGroup,FooterText:i.FooterText,FooterEmailSignup:i.FooterEmailSignup,FooterSocial:i.FooterSocial,FooterMessaging:i.FooterMessaging,FooterPayment:i.FooterPayment,LegalLineBlock:i.LegalLineBlock,SearchBlock:t.SearchBlock,CartBlock:t.CartBlock,CountrySwitchBlock:t.CountrySwitchBlock,AccountBlock:t.AccountBlock,ThemeSwitchBlock:t.ThemeSwitchBlock,[J]:i.SiteHeader,[Q]:i.SiteFooter}};ze(f.components);{const o=f.components.MenuBlock;o.fields={...o.fields,direction:g("Direction",l(Se,{}),[{label:C.column,value:"column"},{label:C.row,value:"row"}],_)};const n={type:"custom",render:({value:s,onChange:c})=>l(Z,{value:s,onChange:c})},u=y({type:"custom",render:({value:s,onChange:c})=>l(Le,{parts:tt,changed:s===!0,shown:()=>s===!0,onPress:(dt,Y)=>c(Y),onReset:()=>c(void 0)})},{not:{field:"direction",is:"column",default:_}});o.fields=Object.fromEntries(Object.entries(o.fields).flatMap(([s,c])=>s==="menu"?[["dataSource",Ue("Menu content","Manual")],[s,c],["linkRange",n],["currentPage",u]]:[[s,c]]));const b=o;b.resolveFields=(s,{fields:c})=>Ke("MenuBlock",c,s.props,{hides:["menu"]}),b.resolveData=s=>{const c=We(s.props);return c===s.props?s:{...s,props:c}},o.fields={...o.fields,linkAlign:Ae({label:"Link alignment"}),menuStyle:y(g("Menu style",l(Fe,{}),[{label:"Plain",value:G},{label:"Tabs",value:U}],G),{not:{field:"direction",is:"column",default:_}})};const S={not:{field:"menuStyle",is:U}};o.fields.linkRange=y(o.fields.linkRange,{all:[S,Ge]}),o.fields.linkAlign=y(o.fields.linkAlign,S)}{const o=f.components.Header,n=o.render;o.render=u=>u.editor?.isEditing?l(qe,{editing:!0}):n(u)}const ut=$e(f),fo=ut.sectionGroupAllow;var bo=f;export{fo as SECTION_GROUP_ALLOW,f as config,bo as default,it as subscribePopupFields};
@@ -1 +1 @@
1
- import{registerBlockSources as p}from"efficient-web-builder/format/lib/content/block-sources";import{cardTemplateFields as u,hasCardTemplate as h}from"efficient-web-builder/format/lib/content/card-template";import{say as e}from"efficient-web-builder/format/lib/editor-words";import{OPENING_SAMPLE_WEEK as f}from"../../render/lib/sections/opening-hours.js";import{PRODUCT_REVIEWS_SOURCE as y}from"../../render/lib/sections/reviews.js";const k=[{key:"group-offices",label:"Group offices",blocks:["Footprint"]},{key:y,label:"Product reviews",blocks:["Reviews"]}];p(k);const c="+00 000 0000",S={rooms:()=>[{key:"sample-1",title:e("First room"),excerpt:e("What this room has.")},{key:"sample-2",title:e("Second room"),excerpt:e("What this room has.")},{key:"sample-3",title:e("Third room"),excerpt:e("What this room has.")}],"location-contact":()=>[{key:"location",name:e("Location name"),address:e("Street address"),state:e("State"),country:e("Country"),phone:c,hours:e("Opening hours")}],"location-cards":()=>[{key:"where",name:e("Address"),note:e("Street address")},{key:"hours",name:e("Opening hours"),note:e("A line about it appears here.")},{key:"call",name:e("Phone"),note:c}],"location-footer":()=>[{text:e("Street address")},{text:c},{text:e("Opening hours")}],"location-rate-table":()=>{const t=o=>JSON.stringify([{column:e("Standard"),amount:"$000",standard:!1},{column:e("VIP"),amount:"$000",standard:o}]);return[{group:e("In-house"),label:e("Session · 60 min"),cells:t(!1)},{group:e("In-house"),label:e("Session · 60 min · Night"),cells:t(!0)},{group:e("Away"),label:e("Session · 60 min"),cells:t(!1)}]},"location-opening":()=>[{week:f,zone:"Australia/Sydney",hours:""}],"site-messaging":()=>[{app:"wechat",name:"WeChat",handle:"yourvenue",href:"",qr:"https://u.wechat.com/yourvenue"},{app:"telegram",name:"Telegram",handle:"@yourvenue",href:"https://t.me/yourvenue",qr:"https://t.me/yourvenue"},{app:"whatsapp",name:"WhatsApp",handle:"0400 000 000",href:"https://wa.me/61400000000",qr:"https://wa.me/61400000000"},{app:"line",name:"LINE",handle:"yourvenue",href:"https://line.me/ti/p/~yourvenue",qr:"https://line.me/ti/p/~yourvenue"}],"location-payment-methods":()=>[{label:e("Cash"),kind:"cash"},{label:e("Card"),kind:"card"}],"shop-payment-methods":()=>[{label:"Visa / Mastercard / American Express",kind:"card"},{label:"PayPal",kind:""},{label:e("Bank transfer"),kind:"wire"}]},m=new Set(["Cards"]),b={name:()=>e("Name"),note:()=>e("Note"),price:()=>e("Price"),time:()=>e("Time")},g=t=>t.replace(/_([a-z0-9])/g,(o,a)=>a.toUpperCase());function E(t){const o=Array.isArray(t.blocks)?t.blocks:[];if(!o.some(n=>m.has(n))||o.some(n=>!m.has(n)&&h(n))||!Array.isArray(t.fields))return;const a=o.filter(n=>m.has(n)).flatMap(n=>u(n)),r=[];for(const n of t.fields){if(typeof n!="string"||!n.trim())continue;const s=g(n.trim());if(s==="key"||r.some(l=>l.key===s))continue;const i=a.find(l=>l.key===s),d=i?.kind==="image"||i?.kind==="link"?i.kind:void 0;r.push({key:s,label:i?.label??b[s]?.()??s,...d?{kind:d}:{}})}return r.length?r:void 0}function P(t){if(Array.isArray(t))for(const o of t){const a=typeof o?.key=="string"?S[o.key]?.():void 0;try{const r=E(o);p([{key:o.key,label:o.label,blocks:o.blocks,...a?{sample:a}:{},...r?{fields:r}:{}}])}catch{}}}export{k as EFFICIENT_BLOCK_SOURCES,P as registerServedBlockSources};
1
+ import{registerBlockSources as u}from"efficient-web-builder/format/lib/content/block-sources";import{cardTemplateFields as h,hasCardTemplate as f}from"efficient-web-builder/format/lib/content/card-template";import{say as e}from"efficient-web-builder/format/lib/editor-words";import{OPENING_SAMPLE_WEEK as y}from"../../render/lib/sections/opening-hours.js";import{PRODUCT_REVIEWS_SOURCE as k}from"../../render/lib/sections/reviews.js";import{MENU_BLOG_CATEGORIES_SOURCE as S,MENU_COUNT_FIELD as i}from"../../render/lib/content/menu-card-seed.js";const E=[{key:"group-offices",label:"Group offices",blocks:["Footprint"]},{key:k,label:"Product reviews",blocks:["Reviews"]}];u(E);const m="+00 000 0000",b={rooms:()=>[{key:"sample-1",title:e("First room"),excerpt:e("What this room has.")},{key:"sample-2",title:e("Second room"),excerpt:e("What this room has.")},{key:"sample-3",title:e("Third room"),excerpt:e("What this room has.")}],"location-contact":()=>[{key:"location",name:e("Location name"),address:e("Street address"),state:e("State"),country:e("Country"),phone:m,hours:e("Opening hours")}],"location-cards":()=>[{key:"where",name:e("Address"),note:e("Street address")},{key:"hours",name:e("Opening hours"),note:e("A line about it appears here.")},{key:"call",name:e("Phone"),note:m}],"location-footer":()=>[{text:e("Street address")},{text:m},{text:e("Opening hours")}],"location-rate-table":()=>{const t=o=>JSON.stringify([{column:e("Standard"),amount:"$000",standard:!1},{column:e("VIP"),amount:"$000",standard:o}]);return[{group:e("In-house"),label:e("Session · 60 min"),cells:t(!1)},{group:e("In-house"),label:e("Session · 60 min · Night"),cells:t(!0)},{group:e("Away"),label:e("Session · 60 min"),cells:t(!1)}]},"location-opening":()=>[{week:y,zone:"Australia/Sydney",hours:""}],"site-messaging":()=>[{app:"wechat",name:"WeChat",handle:"yourvenue",href:"",qr:"https://u.wechat.com/yourvenue"},{app:"telegram",name:"Telegram",handle:"@yourvenue",href:"https://t.me/yourvenue",qr:"https://t.me/yourvenue"},{app:"whatsapp",name:"WhatsApp",handle:"0400 000 000",href:"https://wa.me/61400000000",qr:"https://wa.me/61400000000"},{app:"line",name:"LINE",handle:"yourvenue",href:"https://line.me/ti/p/~yourvenue",qr:"https://line.me/ti/p/~yourvenue"}],[S]:()=>[{label:e("First category"),href:"/journal",[i]:"12"},{label:e("Second category"),href:"/journal",[i]:"8"},{label:e("Third category"),href:"/journal",[i]:"3"}],"location-payment-methods":()=>[{label:e("Cash"),kind:"cash"},{label:e("Card"),kind:"card"}],"shop-payment-methods":()=>[{label:"Visa / Mastercard / American Express",kind:"card"},{label:"PayPal",kind:""},{label:e("Bank transfer"),kind:"wire"}]},d=new Set(["Cards","MenuBlock"]),g={[i]:()=>e("Count"),name:()=>e("Name"),note:()=>e("Note"),price:()=>e("Price"),time:()=>e("Time")},_=t=>t.replace(/_([a-z0-9])/g,(o,a)=>a.toUpperCase());function C(t){const o=Array.isArray(t.blocks)?t.blocks:[];if(!o.some(r=>d.has(r))||o.some(r=>!d.has(r)&&f(r))||!Array.isArray(t.fields))return;const a=o.filter(r=>d.has(r)).flatMap(r=>h(r)),n=[];for(const r of t.fields){if(typeof r!="string"||!r.trim())continue;const s=_(r.trim());if(s==="key"||n.some(c=>c.key===s))continue;const l=a.find(c=>c.key===s),p=l?.kind==="image"||l?.kind==="link"?l.kind:void 0;n.push({key:s,label:l?.label??g[s]?.()??s,...p?{kind:p}:{}})}return n.length?n:void 0}function v(t){if(Array.isArray(t))for(const o of t){const a=typeof o?.key=="string"?b[o.key]?.():void 0;try{const n=C(o);u([{key:o.key,label:o.label,blocks:o.blocks,...a?{sample:a}:{},...n?{fields:n}:{}}])}catch{}}}export{E as EFFICIENT_BLOCK_SOURCES,v as registerServedBlockSources};
@@ -0,0 +1 @@
1
+ const t={galleryItemFillFromProduct:"Fill from a product",tabbedGalleryProductHint:"Gallery A comes from the product’s Relative / lifestyle photos, Gallery B from its Product photos and the Others gallery from its Others — edit those in the product’s Media tab and refresh. Each media group is a card: its name is the eyebrow, its finish the meta line; the card’s title is the product name and its tag the category. Headings, intro copy and stats stay yours."};export{t as KEPT_EDITOR_PHRASES};
@@ -226,6 +226,7 @@ export declare const STOREFRONT_BLOCKS_WORDS: {
226
226
  readonly "Find your *match.*": "Find your *match.*";
227
227
  readonly Finish: "Finish";
228
228
  readonly "First card": "First card";
229
+ readonly "First category": "First category";
229
230
  readonly "First detail": "First detail";
230
231
  readonly "First image on the left": "First image on the left";
231
232
  readonly "First name": "First name";
@@ -258,6 +259,7 @@ export declare const STOREFRONT_BLOCKS_WORDS: {
258
259
  readonly Gallery: "Gallery";
259
260
  readonly "Gallery A": "Gallery A";
260
261
  readonly "Gallery A comes from the product\u2019s Relative / lifestyle photos, Gallery B from its Product photos and the Others gallery from its Others \u2014 edit those in the product\u2019s Media tab and refresh. Each media group is a card: its name is the eyebrow, its finish the meta line; the card\u2019s title is the product name and its tag the category. Headings, intro copy and stats stay yours.": "Gallery A comes from the product’s Relative / lifestyle photos, Gallery B from its Product photos and the Others gallery from its Others — edit those in the product’s Media tab and refresh. Each media group is a card: its name is the eyebrow, its finish the meta line; the card’s title is the product name and its tag the category. Headings, intro copy and stats stay yours.";
262
+ readonly "Gallery A comes from the product\u2019s Relative / lifestyle photos, Gallery B from its Product photos and the Others gallery from its Others \u2014 edit those in the product\u2019s Media tab and refresh. Each media group is a card: the car set on the group is the eyebrow (a card keeps its caption when the group has no car), its finish the meta line; the card\u2019s title is the product name and its tag the category. Headings, intro copy and stats stay yours.": "Gallery A comes from the product’s Relative / lifestyle photos, Gallery B from its Product photos and the Others gallery from its Others — edit those in the product’s Media tab and refresh. Each media group is a card: the car set on the group is the eyebrow (a card keeps its caption when the group has no car), its finish the meta line; the card’s title is the product name and its tag the category. Headings, intro copy and stats stay yours.";
261
263
  readonly "Gallery B": "Gallery B";
262
264
  readonly "Gallery Item": "Gallery Item";
263
265
  readonly "Gallery link": "Gallery link";
@@ -365,6 +367,7 @@ export declare const STOREFRONT_BLOCKS_WORDS: {
365
367
  readonly Max: "Max";
366
368
  readonly "Media group": "Media group";
367
369
  readonly "Menu Item": "Menu Item";
370
+ readonly "Menu content": "Menu content";
368
371
  readonly "Menu link": "Menu link";
369
372
  readonly "Menu row": "Menu row";
370
373
  readonly "Menu style": "Menu style";
@@ -407,6 +410,7 @@ export declare const STOREFRONT_BLOCKS_WORDS: {
407
410
  readonly "No menus found": "No menus found";
408
411
  readonly "No menus yet. Create one in {place}, then pick it here.": "No menus yet. Create one in {place}, then pick it here.";
409
412
  readonly "No models listed": "No models listed";
413
+ readonly "No product chosen yet, so no pictures show.": "No product chosen yet, so no pictures show.";
410
414
  readonly "No product chosen yet, so reviews of every product show.": "No product chosen yet, so reviews of every product show.";
411
415
  readonly "No products in this category": "No products in this category";
412
416
  readonly "No products in this website's catalog yet \u2014 curate products to see them here.": "No products in this website's catalog yet — curate products to see them here.";
@@ -422,6 +426,7 @@ export declare const STOREFRONT_BLOCKS_WORDS: {
422
426
  readonly "None \u2014 this section will be empty": "None — this section will be empty";
423
427
  readonly "Not authorized yet \u2014 reopen once the editor has loaded.": "Not authorized yet — reopen once the editor has loaded.";
424
428
  readonly "Not your size": "Not your size";
429
+ readonly "Nothing to show yet: this menu's entries come from its Menu content.": "Nothing to show yet: this menu's entries come from its Menu content.";
425
430
  readonly "Number or ID": "Number or ID";
426
431
  readonly "OEM front": "OEM front";
427
432
  readonly "OEM front tyres": "OEM front tyres";
@@ -541,6 +546,7 @@ export declare const STOREFRONT_BLOCKS_WORDS: {
541
546
  readonly "Search forms\u2026": "Search forms…";
542
547
  readonly "Search your catalog\u2026": "Search your catalog…";
543
548
  readonly "Second card": "Second card";
549
+ readonly "Second category": "Second category";
544
550
  readonly "Second detail": "Second detail";
545
551
  readonly "Second place": "Second place";
546
552
  readonly "Second rate": "Second rate";
@@ -663,6 +669,7 @@ export declare const STOREFRONT_BLOCKS_WORDS: {
663
669
  readonly "The week": "The week";
664
670
  readonly "The whole hero comes from the product record \u2014 title, price, pictures, options and Add to Cart. Edit the product in the Products database and this hero updates to match.": "The whole hero comes from the product record — title, price, pictures, options and Add to Cart. Edit the product in the Products database and this hero updates to match.";
665
671
  readonly "Third card": "Third card";
672
+ readonly "Third category": "Third category";
666
673
  readonly "Third detail": "Third detail";
667
674
  readonly "Third room": "Third room";
668
675
  readonly "This column isn't linked to a menu, so the preview shows placeholder links. Pick a menu above.": "This column isn't linked to a menu, so the preview shows placeholder links. Pick a menu above.";